summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/ARM/ARMAddressingModes.h
diff options
context:
space:
mode:
authorJohnny Chen <johnny.chen@apple.com>2010-03-17 17:52:21 +0000
committerJohnny Chen <johnny.chen@apple.com>2010-03-17 17:52:21 +0000
commit8f3004cff2d89196259ef5d60873f673aa121354 (patch)
tree41cb4a98c82d9186eaedd87fde500a5a24847e56 /llvm/lib/Target/ARM/ARMAddressingModes.h
parent6981c258f70884df8c980caf6a0fd7d7fa940225 (diff)
downloadbcm5719-llvm-8f3004cff2d89196259ef5d60873f673aa121354.tar.gz
bcm5719-llvm-8f3004cff2d89196259ef5d60873f673aa121354.zip
Added sub-formats to the NeonI/NeonXI instructions to further refine the NEONFrm
instructions to help disassembly. We also changed the output of the addressing modes to omit the '+' from the assembler syntax #+/-<imm> or +/-<Rm>. See, for example, A8.6.57/58/60. And modified test cases to not expect '+' in +reg or #+num. For example, ; CHECK: ldr.w r9, [r7, #28] llvm-svn: 98745
Diffstat (limited to 'llvm/lib/Target/ARM/ARMAddressingModes.h')
-rw-r--r--llvm/lib/Target/ARM/ARMAddressingModes.h20
1 files changed, 19 insertions, 1 deletions
diff --git a/llvm/lib/Target/ARM/ARMAddressingModes.h b/llvm/lib/Target/ARM/ARMAddressingModes.h
index abdd938cc18..0b3a7d41927 100644
--- a/llvm/lib/Target/ARM/ARMAddressingModes.h
+++ b/llvm/lib/Target/ARM/ARMAddressingModes.h
@@ -35,6 +35,10 @@ namespace ARM_AM {
add = '+', sub = '-'
};
+ static inline const char *getAddrOpcStr(AddrOpc Op) {
+ return Op == sub ? "-" : "";
+ }
+
static inline const char *getShiftOpcStr(ShiftOpc Op) {
switch (Op) {
default: assert(0 && "Unknown shift opc!");
@@ -127,6 +131,20 @@ namespace ARM_AM {
return (Imm >> 8) * 2;
}
+ /// getSOImmValOneRotate - Try to handle Imm with an immediate shifter
+ /// operand, computing the rotate amount to use. If this immediate value
+ /// cannot be handled with a single shifter-op, return 0.
+ static inline unsigned getSOImmValOneRotate(unsigned Imm) {
+ // A5.2.4 Constants with multiple encodings
+ // The lowest unsigned value of rotation wins!
+ for (unsigned R = 1; R <= 15; ++R)
+ if ((Imm & rotr32(~255U, 2*R)) == 0)
+ return 2*R;
+
+ // Failed to find a suitable rotate amount.
+ return 0;
+ }
+
/// getSOImmValRotate - Try to handle Imm with an immediate shifter operand,
/// computing the rotate amount to use. If this immediate value cannot be
/// handled with a single shifter-op, determine a good rotate amount that will
@@ -179,7 +197,7 @@ namespace ARM_AM {
// of zero.
if ((Arg & ~255U) == 0) return Arg;
- unsigned RotAmt = getSOImmValRotate(Arg);
+ unsigned RotAmt = getSOImmValOneRotate(Arg);
// If this cannot be handled with a single shifter_op, bail out.
if (rotr32(~255U, RotAmt) & Arg)
OpenPOWER on IntegriCloud