forked from OSchip/llvm-project
Make helper functions static.
And remove header and cpp file that are empty after that. llvm-svn: 182746
This commit is contained in:
parent
d28ab7e802
commit
f30f2cce50
|
@ -1,6 +1,5 @@
|
||||||
add_llvm_library(LLVMMipsDesc
|
add_llvm_library(LLVMMipsDesc
|
||||||
MipsAsmBackend.cpp
|
MipsAsmBackend.cpp
|
||||||
MipsDirectObjLower.cpp
|
|
||||||
MipsMCAsmInfo.cpp
|
MipsMCAsmInfo.cpp
|
||||||
MipsMCCodeEmitter.cpp
|
MipsMCCodeEmitter.cpp
|
||||||
MipsMCTargetDesc.cpp
|
MipsMCTargetDesc.cpp
|
||||||
|
|
|
@ -1,81 +0,0 @@
|
||||||
//===-- MipsDirectObjLower.cpp - Mips LLVM direct object lowering -----===//
|
|
||||||
//
|
|
||||||
// The LLVM Compiler Infrastructure
|
|
||||||
//
|
|
||||||
// This file is distributed under the University of Illinois Open Source
|
|
||||||
// License. See LICENSE.TXT for details.
|
|
||||||
//
|
|
||||||
//===----------------------------------------------------------------------===//
|
|
||||||
//
|
|
||||||
// This file contains code to lower Mips MCInst records that are normally
|
|
||||||
// left to the assembler to lower such as large shifts.
|
|
||||||
//
|
|
||||||
//===----------------------------------------------------------------------===//
|
|
||||||
#include "MipsInstrInfo.h"
|
|
||||||
#include "MCTargetDesc/MipsDirectObjLower.h"
|
|
||||||
#include "llvm/MC/MCInst.h"
|
|
||||||
#include "llvm/MC/MCStreamer.h"
|
|
||||||
|
|
||||||
using namespace llvm;
|
|
||||||
|
|
||||||
// If the D<shift> instruction has a shift amount that is greater
|
|
||||||
// than 31 (checked in calling routine), lower it to a D<shift>32 instruction
|
|
||||||
void Mips::LowerLargeShift(MCInst& Inst) {
|
|
||||||
|
|
||||||
assert(Inst.getNumOperands() == 3 && "Invalid no. of operands for shift!");
|
|
||||||
assert(Inst.getOperand(2).isImm());
|
|
||||||
|
|
||||||
int64_t Shift = Inst.getOperand(2).getImm();
|
|
||||||
if (Shift <= 31)
|
|
||||||
return; // Do nothing
|
|
||||||
Shift -= 32;
|
|
||||||
|
|
||||||
// saminus32
|
|
||||||
Inst.getOperand(2).setImm(Shift);
|
|
||||||
|
|
||||||
switch (Inst.getOpcode()) {
|
|
||||||
default:
|
|
||||||
// Calling function is not synchronized
|
|
||||||
llvm_unreachable("Unexpected shift instruction");
|
|
||||||
case Mips::DSLL:
|
|
||||||
Inst.setOpcode(Mips::DSLL32);
|
|
||||||
return;
|
|
||||||
case Mips::DSRL:
|
|
||||||
Inst.setOpcode(Mips::DSRL32);
|
|
||||||
return;
|
|
||||||
case Mips::DSRA:
|
|
||||||
Inst.setOpcode(Mips::DSRA32);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pick a DEXT or DINS instruction variant based on the pos and size operands
|
|
||||||
void Mips::LowerDextDins(MCInst& InstIn) {
|
|
||||||
int Opcode = InstIn.getOpcode();
|
|
||||||
|
|
||||||
if (Opcode == Mips::DEXT)
|
|
||||||
assert(InstIn.getNumOperands() == 4 &&
|
|
||||||
"Invalid no. of machine operands for DEXT!");
|
|
||||||
else // Only DEXT and DINS are possible
|
|
||||||
assert(InstIn.getNumOperands() == 5 &&
|
|
||||||
"Invalid no. of machine operands for DINS!");
|
|
||||||
|
|
||||||
assert(InstIn.getOperand(2).isImm());
|
|
||||||
int64_t pos = InstIn.getOperand(2).getImm();
|
|
||||||
assert(InstIn.getOperand(3).isImm());
|
|
||||||
int64_t size = InstIn.getOperand(3).getImm();
|
|
||||||
|
|
||||||
if (size <= 32) {
|
|
||||||
if (pos < 32) // DEXT/DINS, do nothing
|
|
||||||
return;
|
|
||||||
// DEXTU/DINSU
|
|
||||||
InstIn.getOperand(2).setImm(pos - 32);
|
|
||||||
InstIn.setOpcode((Opcode == Mips::DEXT) ? Mips::DEXTU : Mips::DINSU);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// DEXTM/DINSM
|
|
||||||
assert(pos < 32 && "DEXT/DINS cannot have both size and pos > 32");
|
|
||||||
InstIn.getOperand(3).setImm(size - 32);
|
|
||||||
InstIn.setOpcode((Opcode == Mips::DEXT) ? Mips::DEXTM : Mips::DINSM);
|
|
||||||
return;
|
|
||||||
}
|
|
|
@ -1,28 +0,0 @@
|
||||||
//===-- MipsDirectObjLower.h - Mips LLVM direct object lowering *- C++ -*--===//
|
|
||||||
//
|
|
||||||
// The LLVM Compiler Infrastructure
|
|
||||||
//
|
|
||||||
// This file is distributed under the University of Illinois Open Source
|
|
||||||
// License. See LICENSE.TXT for details.
|
|
||||||
//
|
|
||||||
//===----------------------------------------------------------------------===//
|
|
||||||
|
|
||||||
#ifndef MIPSDIRECTOBJLOWER_H
|
|
||||||
#define MIPSDIRECTOBJLOWER_H
|
|
||||||
#include "llvm/ADT/SmallVector.h"
|
|
||||||
#include "llvm/Support/Compiler.h"
|
|
||||||
|
|
||||||
namespace llvm {
|
|
||||||
class MCInst;
|
|
||||||
class MCStreamer;
|
|
||||||
|
|
||||||
namespace Mips {
|
|
||||||
/// MipsDirectObjLower - This name space is used to lower MCInstr in cases
|
|
||||||
// where the assembler usually finishes the lowering
|
|
||||||
// such as large shifts.
|
|
||||||
void LowerLargeShift(MCInst &Inst);
|
|
||||||
void LowerDextDins(MCInst &Inst);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -13,7 +13,6 @@
|
||||||
//
|
//
|
||||||
#define DEBUG_TYPE "mccodeemitter"
|
#define DEBUG_TYPE "mccodeemitter"
|
||||||
#include "MCTargetDesc/MipsBaseInfo.h"
|
#include "MCTargetDesc/MipsBaseInfo.h"
|
||||||
#include "MCTargetDesc/MipsDirectObjLower.h"
|
|
||||||
#include "MCTargetDesc/MipsFixupKinds.h"
|
#include "MCTargetDesc/MipsFixupKinds.h"
|
||||||
#include "MCTargetDesc/MipsMCTargetDesc.h"
|
#include "MCTargetDesc/MipsMCTargetDesc.h"
|
||||||
#include "llvm/ADT/APFloat.h"
|
#include "llvm/ADT/APFloat.h"
|
||||||
|
@ -114,6 +113,69 @@ MCCodeEmitter *llvm::createMipsMCCodeEmitterEL(const MCInstrInfo &MCII,
|
||||||
return new MipsMCCodeEmitter(MCII, Ctx, STI, true);
|
return new MipsMCCodeEmitter(MCII, Ctx, STI, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// If the D<shift> instruction has a shift amount that is greater
|
||||||
|
// than 31 (checked in calling routine), lower it to a D<shift>32 instruction
|
||||||
|
static void LowerLargeShift(MCInst& Inst) {
|
||||||
|
|
||||||
|
assert(Inst.getNumOperands() == 3 && "Invalid no. of operands for shift!");
|
||||||
|
assert(Inst.getOperand(2).isImm());
|
||||||
|
|
||||||
|
int64_t Shift = Inst.getOperand(2).getImm();
|
||||||
|
if (Shift <= 31)
|
||||||
|
return; // Do nothing
|
||||||
|
Shift -= 32;
|
||||||
|
|
||||||
|
// saminus32
|
||||||
|
Inst.getOperand(2).setImm(Shift);
|
||||||
|
|
||||||
|
switch (Inst.getOpcode()) {
|
||||||
|
default:
|
||||||
|
// Calling function is not synchronized
|
||||||
|
llvm_unreachable("Unexpected shift instruction");
|
||||||
|
case Mips::DSLL:
|
||||||
|
Inst.setOpcode(Mips::DSLL32);
|
||||||
|
return;
|
||||||
|
case Mips::DSRL:
|
||||||
|
Inst.setOpcode(Mips::DSRL32);
|
||||||
|
return;
|
||||||
|
case Mips::DSRA:
|
||||||
|
Inst.setOpcode(Mips::DSRA32);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pick a DEXT or DINS instruction variant based on the pos and size operands
|
||||||
|
static void LowerDextDins(MCInst& InstIn) {
|
||||||
|
int Opcode = InstIn.getOpcode();
|
||||||
|
|
||||||
|
if (Opcode == Mips::DEXT)
|
||||||
|
assert(InstIn.getNumOperands() == 4 &&
|
||||||
|
"Invalid no. of machine operands for DEXT!");
|
||||||
|
else // Only DEXT and DINS are possible
|
||||||
|
assert(InstIn.getNumOperands() == 5 &&
|
||||||
|
"Invalid no. of machine operands for DINS!");
|
||||||
|
|
||||||
|
assert(InstIn.getOperand(2).isImm());
|
||||||
|
int64_t pos = InstIn.getOperand(2).getImm();
|
||||||
|
assert(InstIn.getOperand(3).isImm());
|
||||||
|
int64_t size = InstIn.getOperand(3).getImm();
|
||||||
|
|
||||||
|
if (size <= 32) {
|
||||||
|
if (pos < 32) // DEXT/DINS, do nothing
|
||||||
|
return;
|
||||||
|
// DEXTU/DINSU
|
||||||
|
InstIn.getOperand(2).setImm(pos - 32);
|
||||||
|
InstIn.setOpcode((Opcode == Mips::DEXT) ? Mips::DEXTU : Mips::DINSU);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// DEXTM/DINSM
|
||||||
|
assert(pos < 32 && "DEXT/DINS cannot have both size and pos > 32");
|
||||||
|
InstIn.getOperand(3).setImm(size - 32);
|
||||||
|
InstIn.setOpcode((Opcode == Mips::DEXT) ? Mips::DEXTM : Mips::DINSM);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/// EncodeInstruction - Emit the instruction.
|
/// EncodeInstruction - Emit the instruction.
|
||||||
/// Size the instruction (currently only 4 bytes
|
/// Size the instruction (currently only 4 bytes
|
||||||
void MipsMCCodeEmitter::
|
void MipsMCCodeEmitter::
|
||||||
|
@ -131,12 +193,12 @@ EncodeInstruction(const MCInst &MI, raw_ostream &OS,
|
||||||
case Mips::DSLL:
|
case Mips::DSLL:
|
||||||
case Mips::DSRL:
|
case Mips::DSRL:
|
||||||
case Mips::DSRA:
|
case Mips::DSRA:
|
||||||
Mips::LowerLargeShift(TmpInst);
|
LowerLargeShift(TmpInst);
|
||||||
break;
|
break;
|
||||||
// Double extract instruction is chosen by pos and size operands
|
// Double extract instruction is chosen by pos and size operands
|
||||||
case Mips::DEXT:
|
case Mips::DEXT:
|
||||||
case Mips::DINS:
|
case Mips::DINS:
|
||||||
Mips::LowerDextDins(TmpInst);
|
LowerDextDins(TmpInst);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t Binary = getBinaryCodeForInstr(TmpInst, Fixups);
|
uint32_t Binary = getBinaryCodeForInstr(TmpInst, Fixups);
|
||||||
|
|
Loading…
Reference in New Issue