diff options
author | Evan Cheng <evan.cheng@apple.com> | 2009-07-14 01:49:27 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2009-07-14 01:49:27 +0000 |
commit | f6bc4ae4a1a2dbf986099ab7b74106e8d273cbe1 (patch) | |
tree | 86a9520389079c29533bf9b53ca320516516c7af | |
parent | 0df6e09d43d6d733555a10d22572ddb0006e7d23 (diff) |
1. In Thumb mode, select tBx instead of ARM variants.
2. BX does not "use" the link register, it defines it.
3. Fix a couple more places in thumb td file that still uses pre-UAL syntax.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@75585 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/ARM/ARMInstrInfo.td | 32 | ||||
-rw-r--r-- | lib/Target/ARM/ARMInstrThumb.td | 4 |
2 files changed, 16 insertions, 20 deletions
diff --git a/lib/Target/ARM/ARMInstrInfo.td b/lib/Target/ARM/ARMInstrInfo.td index 17e7365962..e53abefd72 100644 --- a/lib/Target/ARM/ARMInstrInfo.td +++ b/lib/Target/ARM/ARMInstrInfo.td @@ -617,15 +617,13 @@ let isCall = 1, Itinerary = IIC_Br, let Inst{27-20} = 0b00010010; } - let Uses = [LR] in { - // ARMv4T - def BX : ABXIx2<(outs), (ins GPR:$func, variable_ops), - "mov lr, pc\n\tbx $func", - [(ARMcall_nolink GPR:$func)]>, Requires<[IsNotDarwin]> { - let Inst{7-4} = 0b0001; - let Inst{19-8} = 0b111111111111; - let Inst{27-20} = 0b00010010; - } + // ARMv4T + def BX : ABXIx2<(outs), (ins GPR:$func, variable_ops), + "mov lr, pc\n\tbx $func", + [(ARMcall_nolink GPR:$func)]>, Requires<[IsNotDarwin]> { + let Inst{7-4} = 0b0001; + let Inst{19-8} = 0b111111111111; + let Inst{27-20} = 0b00010010; } } @@ -650,15 +648,13 @@ let isCall = 1, Itinerary = IIC_Br, let Inst{27-20} = 0b00010010; } - let Uses = [LR] in { - // ARMv4T - def BXr9 : ABXIx2<(outs), (ins GPR:$func, variable_ops), - "mov lr, pc\n\tbx $func", - [(ARMcall_nolink GPR:$func)]>, Requires<[IsDarwin]> { - let Inst{7-4} = 0b0001; - let Inst{19-8} = 0b111111111111; - let Inst{27-20} = 0b00010010; - } + // ARMv4T + def BXr9 : ABXIx2<(outs), (ins GPR:$func, variable_ops), + "mov lr, pc\n\tbx $func", + [(ARMcall_nolink GPR:$func)]>, Requires<[IsARM, IsDarwin]> { + let Inst{7-4} = 0b0001; + let Inst{19-8} = 0b111111111111; + let Inst{27-20} = 0b00010010; } } diff --git a/lib/Target/ARM/ARMInstrThumb.td b/lib/Target/ARM/ARMInstrThumb.td index f2c5a4654a..b1b97ad6ae 100644 --- a/lib/Target/ARM/ARMInstrThumb.td +++ b/lib/Target/ARM/ARMInstrThumb.td @@ -180,7 +180,7 @@ let isCall = 1, [(ARMtcall tGPR:$func)]>, Requires<[HasV5T]>; // ARMv4T def tBX : T1Ix2<(outs), (ins tGPR:$func, variable_ops), - "cpy lr, pc\n\tbx $func", + "mov lr, pc\n\tbx $func", [(ARMcall_nolink tGPR:$func)]>; } @@ -196,7 +196,7 @@ let isBranch = 1, isTerminator = 1 in { def tBR_JTr : T1JTI<(outs), (ins tGPR:$target, jtblock_operand:$jt, i32imm:$id), - "cpy pc, $target \n\t.align\t2\n$jt", + "mov pc, $target \n\t.align\t2\n$jt", [(ARMbrjt tGPR:$target, tjumptable:$jt, imm:$id)]>; } } |