aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2001-06-27 08:15:52 +0000
committerNick Clifton <nickc@redhat.com>2001-06-27 08:15:52 +0000
commitd827344236a4e852e15a74dfd23490c1fc2ac139 (patch)
tree2f857a26536459a8b470f2118b8d783e1d3230f1 /gas
parent1a16aca4b4da5fdb8613b3b0ee4285db7d9d26ce (diff)
downloadgdb-d827344236a4e852e15a74dfd23490c1fc2ac139.zip
gdb-d827344236a4e852e15a74dfd23490c1fc2ac139.tar.gz
gdb-d827344236a4e852e15a74dfd23490c1fc2ac139.tar.bz2
Use MVN to build simple inverted constants.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog5
-rw-r--r--gas/config/tc-arm.c63
2 files changed, 44 insertions, 24 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 426f6ac..936969d 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,8 @@
+2001-06-27 Nick Clifton <nickc@cambridge.redhat.com>
+
+ * config/tc-arm.c (do_ldst): Use MVN to build simple inverted
+ constants.
+
2001-06-27 Alan Modra <amodra@bigpond.net.au>
* write.c (fixup_segment <Difference of 2 syms same seg>): Don't
diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index 57a82ef..da8ffc0 100644
--- a/gas/config/tc-arm.c
+++ b/gas/config/tc-arm.c
@@ -4413,38 +4413,53 @@ do_ldst (str, flags)
return;
}
- if (inst.reloc.exp.X_op == O_constant
- && (value = validate_immediate (inst.reloc.exp.X_add_number)) != FAIL)
- {
- /* This can be done with a mov instruction. */
- inst.instruction &= LITERAL_MASK;
- inst.instruction |= INST_IMMEDIATE | (OPCODE_MOV << DATA_OP_SHIFT);
- inst.instruction |= (flags & COND_MASK) | (value & 0xfff);
- end_of_line (str);
- return;
- }
- else
+ if (inst.reloc.exp.X_op == O_constant)
{
- /* Insert into literal pool. */
- if (add_to_lit_pool () == FAIL)
+ value = validate_immediate (inst.reloc.exp.X_add_number);
+
+ if (value != FAIL)
{
- if (!inst.error)
- inst.error = _("literal pool insertion failed");
+ /* This can be done with a mov instruction. */
+ inst.instruction &= LITERAL_MASK;
+ inst.instruction |= INST_IMMEDIATE | (OPCODE_MOV << DATA_OP_SHIFT);
+ inst.instruction |= (flags & COND_MASK) | (value & 0xfff);
+ end_of_line (str);
return;
}
+
+ value = validate_immediate (~ inst.reloc.exp.X_add_number);
- /* Change the instruction exp to point to the pool. */
- if (halfword)
+ if (value != FAIL)
{
- inst.instruction |= HWOFFSET_IMM;
- inst.reloc.type = BFD_RELOC_ARM_HWLITERAL;
+ /* This can be done with a mvn instruction. */
+ inst.instruction &= LITERAL_MASK;
+ inst.instruction |= INST_IMMEDIATE | (OPCODE_MVN << DATA_OP_SHIFT);
+ inst.instruction |= (flags & COND_MASK) | (value & 0xfff);
+ end_of_line (str);
+ return;
}
- else
- inst.reloc.type = BFD_RELOC_ARM_LITERAL;
- inst.reloc.pc_rel = 1;
- inst.instruction |= (REG_PC << 16);
- pre_inc = 1;
}
+
+ /* Insert into literal pool. */
+ if (add_to_lit_pool () == FAIL)
+ {
+ if (!inst.error)
+ inst.error = _("literal pool insertion failed");
+ return;
+ }
+
+ /* Change the instruction exp to point to the pool. */
+ if (halfword)
+ {
+ inst.instruction |= HWOFFSET_IMM;
+ inst.reloc.type = BFD_RELOC_ARM_HWLITERAL;
+ }
+ else
+ inst.reloc.type = BFD_RELOC_ARM_LITERAL;
+
+ inst.reloc.pc_rel = 1;
+ inst.instruction |= (REG_PC << 16);
+ pre_inc = 1;
}
else
{