src/cmd/asm/internal/asm/testdata/arm64.s | 8 ++++++++ src/cmd/internal/obj/arm64/asm7.go | 30 ++++++++++++++++++++++++------ diff --git a/src/cmd/asm/internal/asm/testdata/arm64.s b/src/cmd/asm/internal/asm/testdata/arm64.s index 859f71a26b579ce4695a7926136a49262a18b580..3a4410f10b4ad421c94335beaea44dc05049f372 100644 --- a/src/cmd/asm/internal/asm/testdata/arm64.s +++ b/src/cmd/asm/internal/asm/testdata/arm64.s @@ -716,6 +716,14 @@ STPW (R3, R4), 1024(RSP) // fb03109163130029 STPW (R3, R4), x(SB) STPW (R3, R4), x+8(SB) +// bit field operation + BFI $0, R1, $1, R2 // 220040b3 + BFIW $0, R1, $1, R2 // 22000033 + SBFIZ $0, R1, $1, R2 // 22004093 + SBFIZW $0, R1, $1, R2 // 22000013 + UBFIZ $0, R1, $1, R2 // 220040d3 + UBFIZW $0, R1, $1, R2 // 22000053 + // END // // LTYPEE comma diff --git a/src/cmd/internal/obj/arm64/asm7.go b/src/cmd/internal/obj/arm64/asm7.go index ff4b1d7ec11a3c0974f47572ec8a9dd1cb3991aa..e3bcce826594c5a8356c508ee0b89c138659b0f5 100644 --- a/src/cmd/internal/obj/arm64/asm7.go +++ b/src/cmd/internal/obj/arm64/asm7.go @@ -3264,10 +3264,16 @@ rf = rt } switch p.As { case ABFI: - o1 = c.opbfm(p, ABFM, 64-r, s-1, rf, rt) + if r != 0 { + r = 64 - r + } + o1 = c.opbfm(p, ABFM, r, s-1, rf, rt) case ABFIW: - o1 = c.opbfm(p, ABFMW, 32-r, s-1, rf, rt) + if r != 0 { + r = 32 - r + } + o1 = c.opbfm(p, ABFMW, r, s-1, rf, rt) case ABFXIL: o1 = c.opbfm(p, ABFM, r, r+s-1, rf, rt) @@ -3276,10 +3282,16 @@ case ABFXILW: o1 = c.opbfm(p, ABFMW, r, r+s-1, rf, rt) case ASBFIZ: - o1 = c.opbfm(p, ASBFM, 64-r, s-1, rf, rt) + if r != 0 { + r = 64 - r + } + o1 = c.opbfm(p, ASBFM, r, s-1, rf, rt) case ASBFIZW: - o1 = c.opbfm(p, ASBFMW, 32-r, s-1, rf, rt) + if r != 0 { + r = 32 - r + } + o1 = c.opbfm(p, ASBFMW, r, s-1, rf, rt) case ASBFX: o1 = c.opbfm(p, ASBFM, r, r+s-1, rf, rt) @@ -3288,10 +3300,16 @@ case ASBFXW: o1 = c.opbfm(p, ASBFMW, r, r+s-1, rf, rt) case AUBFIZ: - o1 = c.opbfm(p, AUBFM, 64-r, s-1, rf, rt) + if r != 0 { + r = 64 - r + } + o1 = c.opbfm(p, AUBFM, r, s-1, rf, rt) case AUBFIZW: - o1 = c.opbfm(p, AUBFMW, 32-r, s-1, rf, rt) + if r != 0 { + r = 32 - r + } + o1 = c.opbfm(p, AUBFMW, r, s-1, rf, rt) case AUBFX: o1 = c.opbfm(p, AUBFM, r, r+s-1, rf, rt)