From d827344236a4e852e15a74dfd23490c1fc2ac139 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Wed, 27 Jun 2001 08:15:52 +0000 Subject: [PATCH] Use MVN to build simple inverted constants. --- gas/ChangeLog | 5 ++++ gas/config/tc-arm.c | 63 ++++++++++++++++++++++++++++----------------- 2 files changed, 44 insertions(+), 24 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 426f6ac052c..936969d1c39 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2001-06-27 Nick Clifton + + * config/tc-arm.c (do_ldst): Use MVN to build simple inverted + constants. + 2001-06-27 Alan Modra * write.c (fixup_segment ): Don't diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index 57a82ef2062..da8ffc03b51 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 { -- 2.30.2