[llvm-commits] [llvm] r119774 - in /llvm/trunk: lib/Target/ARM/ARMInstrThumb.td test/MC/ARM/thumb.s
Bill Wendling
isanbard at gmail.com
Thu Nov 18 17:33:10 PST 2010
Author: void
Date: Thu Nov 18 19:33:10 2010
New Revision: 119774
URL: http://llvm.org/viewvc/llvm-project?rev=119774&view=rev
Log:
Add MC encodings for some Thumb instructions. Test for a few of them. The "bx
lr" instruction cannot be tested just yet. It requires matching a "condition
code", but adding one of those makes things go south quickly...
Added:
llvm/trunk/test/MC/ARM/thumb.s
Modified:
llvm/trunk/lib/Target/ARM/ARMInstrThumb.td
Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb.td?rev=119774&r1=119773&r2=119774&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMInstrThumb.td (original)
+++ llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Thu Nov 18 19:33:10 2010
@@ -190,7 +190,10 @@
def tBKPT : T1I<(outs), (ins i32imm:$val), NoItinerary, "bkpt\t$val",
[/* For disassembly only; pattern left blank */]>,
T1Encoding<0b101111> {
+ bits<8> val;
+
let Inst{9-8} = 0b10;
+ let Inst{7-0} = val;
}
// Change Processor State is a system instruction -- for disassembly only.
@@ -259,32 +262,48 @@
//
let isReturn = 1, isTerminator = 1, isBarrier = 1 in {
- def tBX_RET : TI<(outs), (ins), IIC_Br, "bx\tlr", [(ARMretflag)]>,
+ def tBX_RET : TI<(outs), (ins), IIC_Br, "bx\tlr",
+ [(ARMretflag)]>,
T1Special<{1,1,0,?}> { // A6.2.3 & A8.6.25
let Inst{6-3} = 0b1110; // Rm = lr
+ let Inst{2-0} = 0b000;
}
+
// Alternative return instruction used by vararg functions.
- def tBX_RET_vararg : TI<(outs), (ins tGPR:$target), IIC_Br, "bx\t$target",[]>,
- T1Special<{1,1,0,?}>; // A6.2.3 & A8.6.25
+ def tBX_RET_vararg : TI<(outs), (ins tGPR:$Rm),
+ IIC_Br, "bx\t$Rm",
+ []>,
+ T1Special<{1,1,0,?}> { // A6.2.3 & A8.6.25
+ bits<4> Rm;
+ let Inst{6-3} = Rm;
+ let Inst{2-0} = 0b000;
+ }
}
// Indirect branches
let isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1 in {
- def tBRIND : TI<(outs), (ins GPR:$dst), IIC_Br, "mov\tpc, $dst",
- [(brind GPR:$dst)]>,
+ def tBRIND : TI<(outs), (ins GPR:$Rm), IIC_Br, "mov\tpc, $Rm",
+ [(brind GPR:$Rm)]>,
T1Special<{1,0,1,?}> {
- // <Rd> = Inst{7:2-0} = pc
- let Inst{2-0} = 0b111;
+ bits<4> Rm;
+
+ let Inst{6-3} = Rm;
+ let Inst{2-0} = 0b111; // <Rd> = Inst{7:2-0} = pc
}
}
// FIXME: remove when we have a way to marking a MI with these properties.
let isReturn = 1, isTerminator = 1, isBarrier = 1, mayLoad = 1,
hasExtraDefRegAllocReq = 1 in
-def tPOP_RET : T1I<(outs), (ins pred:$p, reglist:$dsts, variable_ops),
+def tPOP_RET : T1I<(outs), (ins pred:$p, reglist:$regs, variable_ops),
IIC_iPop_Br,
- "pop${p}\t$dsts", []>,
- T1Misc<{1,1,0,?,?,?,?}>;
+ "pop${p}\t$regs", []>,
+ T1Misc<{1,1,0,?,?,?,?}> {
+ bits<16> regs;
+
+ let Inst{8} = regs{15};
+ let Inst{7-0} = regs{7-0};
+}
let isCall = 1,
Defs = [R0, R1, R2, R3, R12, LR,
@@ -563,10 +582,15 @@
} // neverHasSideEffects
let mayLoad = 1, Uses = [SP], Defs = [SP], hasExtraDefRegAllocReq = 1 in
-def tPOP : T1I<(outs), (ins pred:$p, reglist:$dsts, variable_ops),
+def tPOP : T1I<(outs), (ins pred:$p, reglist:$regs, variable_ops),
IIC_iPop,
- "pop${p}\t$dsts", []>,
- T1Misc<{1,1,0,?,?,?,?}>;
+ "pop${p}\t$regs", []>,
+ T1Misc<{1,1,0,?,?,?,?}> {
+ bits<16> regs;
+
+ let Inst{8} = regs{15};
+ let Inst{7-0} = regs{7-0};
+}
let mayStore = 1, Uses = [SP], Defs = [SP], hasExtraSrcRegAllocReq = 1 in
def tPUSH : T1I<(outs), (ins pred:$p, reglist:$srcs, variable_ops),
@@ -661,10 +685,17 @@
// CMP register
let isCompare = 1, Defs = [CPSR] in {
-def tCMPr : T1pI<(outs), (ins tGPR:$lhs, tGPR:$rhs), IIC_iCMPr,
- "cmp", "\t$lhs, $rhs",
- [(ARMcmp tGPR:$lhs, tGPR:$rhs)]>,
- T1DataProcessing<0b1010>;
+def tCMPr : T1pI<(outs), (ins tGPR:$Rn, tGPR:$Rm), IIC_iCMPr,
+ "cmp", "\t$Rn, $Rm",
+ [(ARMcmp tGPR:$Rn, tGPR:$Rm)]>,
+ T1DataProcessing<0b1010> {
+ bits<3> Rm;
+ bits<3> Rn;
+
+ let Inst{5-3} = Rm;
+ let Inst{2-0} = Rn;
+}
+
def tCMPzr : T1pI<(outs), (ins tGPR:$lhs, tGPR:$rhs), IIC_iCMPr,
"cmp", "\t$lhs, $rhs",
[(ARMcmpZ tGPR:$lhs, tGPR:$rhs)]>,
Added: llvm/trunk/test/MC/ARM/thumb.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/thumb.s?rev=119774&view=auto
==============================================================================
--- llvm/trunk/test/MC/ARM/thumb.s (added)
+++ llvm/trunk/test/MC/ARM/thumb.s Thu Nov 18 19:33:10 2010
@@ -0,0 +1,8 @@
+@ RUN: llvm-mc -triple thumb-apple-darwin -show-encoding < %s | FileCheck %s
+ .code 16
+
+@ CHECK: cmp r1, r2 @ encoding: [0x91,0x42]
+ cmp r1, r2
+
+@ CHECK: pop {r1, r2, r4} @ encoding: [0x16,0xbc]
+ pop {r1, r2, r4}
More information about the llvm-commits
mailing list