@@ -140,6 +140,10 @@ fn emit_load_value(cb: &mut CodeBlock, rd: A64Opnd, value: u64) -> usize {
140140 // instruction, then we'll use that.
141141 movz ( cb, rd, A64Opnd :: new_uimm ( current) , 0 ) ;
142142 return 1 ;
143+ } else if u16:: try_from ( !value) . is_ok ( ) {
144+ // For small negative values, use a single movn
145+ movn ( cb, rd, A64Opnd :: new_uimm ( !value) , 0 ) ;
146+ return 1 ;
143147 } else if BitmaskImmediate :: try_from ( current) . is_ok ( ) {
144148 // Otherwise, if the immediate can be encoded
145149 // with the special bitmask immediate encoding,
@@ -1592,15 +1596,16 @@ mod tests {
15921596
15931597 // Test values that exercise various types of immediates.
15941598 // - 9 bit displacement for Load/Store
1595- // - 12 bit shifted immediate
1599+ // - 12 bit ADD/SUB shifted immediate
1600+ // - 16 bit MOV family shifted immediates
15961601 // - bit mask immediates
1597- for displacement in [ i32:: MAX , 0x10008 , 0x1800 , 0x208 , -0x208 , -0x1800 , -0x1008 , i32:: MIN ] {
1602+ for displacement in [ i32:: MAX , 0x10008 , 0x1800 , 0x208 , -0x208 , -0x1800 , -0x10008 , i32:: MIN ] {
15981603 let mem = Opnd :: mem ( 64 , NATIVE_STACK_PTR , displacement) ;
15991604 asm. lea_into ( Opnd :: Reg ( X0_REG ) , mem) ;
16001605 }
16011606
16021607 asm. compile_with_num_regs ( & mut cb, 0 ) ;
1603- assert_disasm ! ( cb, "e07b40b2e063208b000180d22000a0f2e063208b000083d2e063208be0230891e02308d100009dd2e0ffbff2e0ffdff2e0fffff2e063208b00ff9dd2e0ffbff2e0ffdff2e0fffff2e063208be08361b2e063208b " , "
1608+ assert_disasm ! ( cb, "e07b40b2e063208b000180d22000a0f2e063208b000083d2e063208be0230891e02308d1e0ff8292e063208b00ff9fd2c0ffbff2e0ffdff2e0fffff2e063208be08361b2e063208b " , "
16041609 0x0: orr x0, xzr, #0x7fffffff
16051610 0x4: add x0, sp, x0
16061611 0x8: mov x0, #8
@@ -1610,18 +1615,15 @@ mod tests {
16101615 0x18: add x0, sp, x0
16111616 0x1c: add x0, sp, #0x208
16121617 0x20: sub x0, sp, #0x208
1613- 0x24: mov x0, #0xe800
1614- 0x28: movk x0, #0xffff, lsl #16
1615- 0x2c: movk x0, #0xffff, lsl #32
1616- 0x30: movk x0, #0xffff, lsl #48
1617- 0x34: add x0, sp, x0
1618- 0x38: mov x0, #0xeff8
1619- 0x3c: movk x0, #0xffff, lsl #16
1620- 0x40: movk x0, #0xffff, lsl #32
1621- 0x44: movk x0, #0xffff, lsl #48
1622- 0x48: add x0, sp, x0
1623- 0x4c: orr x0, xzr, #0xffffffff80000000
1624- 0x50: add x0, sp, x0
1618+ 0x24: mov x0, #-0x1800
1619+ 0x28: add x0, sp, x0
1620+ 0x2c: mov x0, #0xfff8
1621+ 0x30: movk x0, #0xfffe, lsl #16
1622+ 0x34: movk x0, #0xffff, lsl #32
1623+ 0x38: movk x0, #0xffff, lsl #48
1624+ 0x3c: add x0, sp, x0
1625+ 0x40: orr x0, xzr, #0xffffffff80000000
1626+ 0x44: add x0, sp, x0
16251627 " ) ;
16261628 }
16271629
0 commit comments