mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
[mips][microMIPS] Implement ADDIUSP instruction
Differential Revision: http://reviews.llvm.org/D5084 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@219500 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
24335e60c7
commit
0bf4807a90
@ -1133,6 +1133,15 @@ bool MipsAsmParser::processInstruction(MCInst &Inst, SMLoc IDLoc,
|
||||
if (Imm < -8 || Imm > 7)
|
||||
return Error(IDLoc, "immediate operand value out of range");
|
||||
break;
|
||||
case Mips::ADDIUSP_MM:
|
||||
Opnd = Inst.getOperand(0);
|
||||
if (!Opnd.isImm())
|
||||
return Error(IDLoc, "expected immediate operand kind");
|
||||
Imm = Opnd.getImm();
|
||||
if (Imm < -1032 || Imm > 1028 || (Imm < 8 && Imm > -12) ||
|
||||
Imm % 4 != 0)
|
||||
return Error(IDLoc, "immediate operand value out of range");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -363,6 +363,20 @@ getUImm5Lsl2Encoding(const MCInst &MI, unsigned OpNo,
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned MipsMCCodeEmitter::
|
||||
getSImm9AddiuspValue(const MCInst &MI, unsigned OpNo,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const {
|
||||
|
||||
const MCOperand &MO = MI.getOperand(OpNo);
|
||||
if (MO.isImm()) {
|
||||
unsigned Binary = (MO.getImm() >> 2) & 0x0000ffff;
|
||||
return (((Binary & 0x8000) >> 7) | (Binary & 0x00ff));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned MipsMCCodeEmitter::
|
||||
getExprOpValue(const MCExpr *Expr,SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const {
|
||||
|
@ -80,6 +80,12 @@ public:
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const;
|
||||
|
||||
// getSImm9AddiuspValue - Return binary encoding of the microMIPS addiusp
|
||||
// instruction immediate operand.
|
||||
unsigned getSImm9AddiuspValue(const MCInst &MI, unsigned OpNo,
|
||||
SmallVectorImpl<MCFixup> &Fixups,
|
||||
const MCSubtargetInfo &STI) const;
|
||||
|
||||
// getBranchTargetOpValue - Return binary encoding of the branch
|
||||
// target operand. If the machine operand requires relocation,
|
||||
// record the relocation and return zero.
|
||||
|
@ -53,6 +53,16 @@ class ADDIUS5_FM_MM16 {
|
||||
let Inst{0} = 0;
|
||||
}
|
||||
|
||||
class ADDIUSP_FM_MM16 {
|
||||
bits<9> imm;
|
||||
|
||||
bits<16> Inst;
|
||||
|
||||
let Inst{15-10} = 0x13;
|
||||
let Inst{9-1} = imm;
|
||||
let Inst{0} = 1;
|
||||
}
|
||||
|
||||
class MOVE_FM_MM16<bits<6> funct> {
|
||||
bits<5> rs;
|
||||
bits<5> rd;
|
||||
|
@ -10,6 +10,10 @@ def uimm5_lsl2 : Operand<OtherVT> {
|
||||
let EncoderMethod = "getUImm5Lsl2Encoding";
|
||||
}
|
||||
|
||||
def simm9_addiusp : Operand<i32> {
|
||||
let EncoderMethod = "getSImm9AddiuspValue";
|
||||
}
|
||||
|
||||
def mem_mm_12 : Operand<i32> {
|
||||
let PrintMethod = "printMemOperand";
|
||||
let MIOperandInfo = (ops GPR32, simm12);
|
||||
@ -93,6 +97,10 @@ class AddImmUS5<string opstr, RegisterOperand RO> :
|
||||
let isCommutable = 1;
|
||||
}
|
||||
|
||||
class AddImmUSP<string opstr> :
|
||||
MicroMipsInst16<(outs), (ins simm9_addiusp:$imm),
|
||||
!strconcat(opstr, "\t$imm"), [], NoItinerary, FrmI>;
|
||||
|
||||
class MoveFromHILOMM<string opstr, RegisterOperand RO, Register UseReg> :
|
||||
MicroMipsInst16<(outs RO:$rd), (ins), !strconcat(opstr, "\t$rd"),
|
||||
[], II_MFHI_MFLO, FrmR> {
|
||||
@ -175,6 +183,7 @@ let isCall = 1, hasDelaySlot = 1, Defs = [RA] in {
|
||||
}
|
||||
|
||||
def ADDIUS5_MM : AddImmUS5<"addius5", GPR32Opnd>, ADDIUS5_FM_MM16;
|
||||
def ADDIUSP_MM : AddImmUSP<"addiusp">, ADDIUSP_FM_MM16;
|
||||
def MFHI16_MM : MoveFromHILOMM<"mfhi", GPR32Opnd, AC0>, MFHILO_FM_MM16<0x10>;
|
||||
def MFLO16_MM : MoveFromHILOMM<"mflo", GPR32Opnd, AC0>, MFHILO_FM_MM16<0x12>;
|
||||
def MOVE16_MM : MoveMM16<"move", GPR32Opnd>, MOVE_FM_MM16<0x03>;
|
||||
|
@ -10,6 +10,7 @@
|
||||
# Little endian
|
||||
#------------------------------------------------------------------------------
|
||||
# CHECK-EL: addius5 $7, -2 # encoding: [0xfc,0x4c]
|
||||
# CHECK-EL: addiusp -16 # encoding: [0xf9,0x4f]
|
||||
# CHECK-EL: mfhi $9 # encoding: [0x09,0x46]
|
||||
# CHECK-EL: mflo $9 # encoding: [0x49,0x46]
|
||||
# CHECK-EL: move $25, $1 # encoding: [0x21,0x0f]
|
||||
@ -25,6 +26,7 @@
|
||||
# Big endian
|
||||
#------------------------------------------------------------------------------
|
||||
# CHECK-EB: addius5 $7, -2 # encoding: [0x4c,0xfc]
|
||||
# CHECK-EB: addiusp -16 # encoding: [0x4f,0xf9]
|
||||
# CHECK-EB: mfhi $9 # encoding: [0x46,0x09]
|
||||
# CHECK-EB: mflo $9 # encoding: [0x46,0x49]
|
||||
# CHECK-EB: move $25, $1 # encoding: [0x0f,0x21]
|
||||
@ -38,6 +40,7 @@
|
||||
# CHECK-EB: nop # encoding: [0x00,0x00,0x00,0x00]
|
||||
|
||||
addius5 $7, -2
|
||||
addiusp -16
|
||||
mfhi $9
|
||||
mflo $9
|
||||
move $25, $1
|
||||
|
@ -2,3 +2,4 @@
|
||||
# RUN: FileCheck %s < %t1
|
||||
|
||||
addius5 $7, 9 # CHECK: :[[@LINE]]:{{[0-9]+}}: error: immediate operand value out of range
|
||||
addiusp 1032 # CHECK: :[[@LINE]]:{{[0-9]+}}: error: immediate operand value out of range
|
||||
|
Loading…
Reference in New Issue
Block a user