Skip to content
  • Thomas Preud'homme's avatar
    [ARM] Fix expansion of ldr pseudo instruction · c0a55875
    Thomas Preud'homme authored
    The LDR rX, =cst pseudo-instruction suffers from two issues for loading
    integer constants in Thumb mode:
    
    - movs is used if the constant and register can be encoded using that
      instruction which leads to unexpected behavior due to its flag-setting
      behavior
    - mov.w, movw and mvn are used for r13 (sp) and r15 (pc) but these
      encoding are marked as UNPREDICTABLE
    
    This patch fixes those issues and update testing accordingly.
    
    2017-06-20  Thomas Preud'homme  <thomas.preudhomme@arm.com>
    
    	Backport from mainline
    	2017-04-24  Thomas Preud'homme  <thomas.preudhomme@arm.com>
    
    gas/
    	* config/tc-arm.c (move_or_literal_pool): Remove code generating MOVS.
    	Forbid MOV.W and MOVW if destination is SP or PC.
    	* testsuite/gas/arm/thumb2_ldr_immediate_highregs_armv6t2.s: Explain
    	expectation of LDR not generating a MOVS for low registers and small
    	constants.  Add tests of MOVW generation.
    	* testsuite/gas/arm/thumb2_ldr_immediate_highregs_armv6t2.d: Update
    	expected disassembly.
    c0a55875