mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
Added Thumb IT instruction.
llvm-svn: 75198
This commit is contained in:
parent
b2d82a5f9f
commit
1b15e9611e
@ -66,6 +66,11 @@ def thumb_immshifted_shamt : SDNodeXForm<imm, [{
|
||||
return CurDAG->getTargetConstant(V, MVT::i32);
|
||||
}]>;
|
||||
|
||||
// IT block condition mask
|
||||
def it_mask : Operand<i32> {
|
||||
let PrintMethod = "printThumbITMask";
|
||||
}
|
||||
|
||||
// Define Thumb specific addressing modes.
|
||||
|
||||
// t_addrmode_rr := reg + reg
|
||||
@ -207,6 +212,10 @@ let isBranch = 1, isTerminator = 1 in
|
||||
def tBcc : T1I<(outs), (ins brtarget:$target, pred:$cc), "b$cc $target",
|
||||
[/*(ARMbrcond bb:$target, imm:$cc)*/]>;
|
||||
|
||||
// IT block
|
||||
def tIT : TI<(outs), (ins pred:$cc, it_mask:$mask),
|
||||
"it$mask $cc", []>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Load Store Instructions.
|
||||
//
|
||||
|
@ -111,6 +111,7 @@ namespace {
|
||||
const char *Modifier = 0);
|
||||
void printBitfieldInvMaskImmOperand (const MachineInstr *MI, int OpNum);
|
||||
|
||||
void printThumbITMask(const MachineInstr *MI, int OpNum);
|
||||
void printThumbAddrModeRROperand(const MachineInstr *MI, int OpNum);
|
||||
void printThumbAddrModeRI5Operand(const MachineInstr *MI, int OpNum,
|
||||
unsigned Scale);
|
||||
@ -635,6 +636,21 @@ ARMAsmPrinter::printBitfieldInvMaskImmOperand(const MachineInstr *MI, int Op) {
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
|
||||
void
|
||||
ARMAsmPrinter::printThumbITMask(const MachineInstr *MI, int Op) {
|
||||
// (3 - the number of trailing zeros) is the number of then / else.
|
||||
unsigned Mask = MI->getOperand(Op).getImm();
|
||||
unsigned NumTZ = CountTrailingZeros_32(Mask);
|
||||
assert(NumTZ <= 3 && "Invalid IT mask!");
|
||||
for (unsigned Pos = 3, e = NumTZ; Pos >= e; --Pos) {
|
||||
bool T = (Mask & (1 << Pos)) != 0;
|
||||
if (T)
|
||||
O << 't';
|
||||
else
|
||||
O << 'e';
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
ARMAsmPrinter::printThumbAddrModeRROperand(const MachineInstr *MI, int Op) {
|
||||
const MachineOperand &MO1 = MI->getOperand(Op);
|
||||
|
Loading…
Reference in New Issue
Block a user