MOVD (R3)(R6*1), R5 // 656866f8
MOVD (R2)(R6), R4 // 446866f8
MOVWU (R19)(R20<<2), R20 // 747a74b8
+ MOVD (R2)(R3<<0), R1 // 416863f8
MOVD (R2)(R6<<3), R4 // 447866f8
MOVD (R3)(R7.SXTX<<3), R8 // 68f867f8
MOVWU (R5)(R4.UXTW), R10 // aa4864b8
MOVHU (R1)(R2<<1), R5 // 25786278
MOVB (R9)(R3.UXTW), R6 // 2649a338
MOVB (R10)(R6), R15 // 4f69a638
- MOVB (R29)(R30<<0), R14 // ae7bbe38
+ MOVB (R29)(R30<<0), R14 // ae6bbe38
MOVB (R29)(R30), R14 // ae6bbe38
MOVH (R5)(R7.SXTX<<1), R19 // b3f8a778
MOVH (R8)(R4<<1), R10 // 0a79a478
MOVBU.P 42(R2), R12 // 4ca44238
MOVBU.W -27(R2), R14 // 4e5c5e38
MOVBU 2916(R24), R3 // 03936d39
- MOVBU (R19)(R14<<0), R23 // 777a6e38
+ MOVBU (R19)(R14<<0), R23 // 776a6e38
MOVBU (R2)(R8.SXTX), R19 // 53e86838
MOVBU (R27)(R23), R14 // 6e6b7738
MOVHU.P 107(R14), R13 // cdb54678
case REG_UXTW <= r && r < REG_UXTX:
if a.Type == obj.TYPE_MEM {
if num == 0 {
+ // According to the arm64 specification, for instructions MOVB, MOVBU and FMOVB,
+ // the extension amount must be 0, encoded in "S" as 0 if omitted, or as 1 if present.
+ // But in Go, we don't distinguish between Rn.UXTW and Rn.UXTW<<0, so we encode it as
+ // that does not present. This makes no difference to the function of the instruction.
+ // This is also true for extensions LSL, SXTW and SXTX.
return roff(rm, 2, 2)
} else {
return roff(rm, 2, 6)
}
case REG_LSL <= r && r < REG_ARNG:
if a.Type == obj.TYPE_MEM { // (R1)(R2<<1)
- return roff(rm, 3, 6)
+ if num == 0 {
+ return roff(rm, 3, 2)
+ } else {
+ return roff(rm, 3, 6)
+ }
} else if isADDWop(p.As) {
return roff(rm, 2, num)
}