From: Nick Clifton Date: Wed, 27 Jun 2001 16:22:47 +0000 (+0000) Subject: Use MVN to build simple inverted constants. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2607ece51b9b121727671aff22b6470b3a4c2977;p=thirdparty%2Fbinutils-gdb.git Use MVN to build simple inverted constants. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index 6f390b63031..8d1251a5a88 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. + 2000-06-20 Tom Rix * config/tc-ppc.c (ppc_comm): Change default alignment to 4 bytes. diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index 99aff8ef313..a6e13a9a87b 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -4431,38 +4431,52 @@ 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 {