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
|
||||
MipsAsmBackend.cpp
|
||||
MipsDirectObjLower.cpp
|
||||
MipsMCAsmInfo.cpp
|
||||
MipsMCCodeEmitter.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"
|
||||
#include "MCTargetDesc/MipsBaseInfo.h"
|
||||
#include "MCTargetDesc/MipsDirectObjLower.h"
|
||||
#include "MCTargetDesc/MipsFixupKinds.h"
|
||||
#include "MCTargetDesc/MipsMCTargetDesc.h"
|
||||
#include "llvm/ADT/APFloat.h"
|
||||
|
@ -114,6 +113,69 @@ MCCodeEmitter *llvm::createMipsMCCodeEmitterEL(const MCInstrInfo &MCII,
|
|||
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.
|
||||
/// Size the instruction (currently only 4 bytes
|
||||
void MipsMCCodeEmitter::
|
||||
|
@ -131,12 +193,12 @@ EncodeInstruction(const MCInst &MI, raw_ostream &OS,
|
|||
case Mips::DSLL:
|
||||
case Mips::DSRL:
|
||||
case Mips::DSRA:
|
||||
Mips::LowerLargeShift(TmpInst);
|
||||
LowerLargeShift(TmpInst);
|
||||
break;
|
||||
// Double extract instruction is chosen by pos and size operands
|
||||
case Mips::DEXT:
|
||||
case Mips::DINS:
|
||||
Mips::LowerDextDins(TmpInst);
|
||||
LowerDextDins(TmpInst);
|
||||
}
|
||||
|
||||
uint32_t Binary = getBinaryCodeForInstr(TmpInst, Fixups);
|
||||
|
|
Loading…
Reference in New Issue