]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/asm: reject BSWAPW on amd64
authorIskander Sharipov <quasilyte@gmail.com>
Tue, 30 Apr 2019 21:01:39 +0000 (00:01 +0300)
committerBrad Fitzpatrick <bradfitz@golang.org>
Tue, 30 Apr 2019 21:21:14 +0000 (21:21 +0000)
Since BSWAP operation on 16-bit registers is undefined,
forbid the usage of BSWAPW. Users should rely on XCHGB instead.

This behavior is consistent with what GAS does.

Fixes #29167

Change-Id: I3b31e3dd2acfd039f7564a1c17e6068617bcde8d
Reviewed-on: https://go-review.googlesource.com/c/go/+/174312
Run-TryBot: Iskander Sharipov <quasilyte@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/cmd/asm/internal/asm/line_test.go
src/cmd/asm/internal/asm/testdata/amd64enc.s
src/cmd/internal/obj/x86/aenum.go
src/cmd/internal/obj/x86/anames.go
src/cmd/internal/obj/x86/asm6.go
src/cmd/internal/obj/x86/obj6.go

index 7462f24a1c6d834bda244e0e63eeca4a2fac757c..01b058bd956dca47b27dfce33582dbb31eb246b7 100644 (file)
@@ -28,6 +28,10 @@ func TestAMD64BadInstParser(t *testing.T) {
                {"VADDPD.BCST.Z.SAE X0, X1, X2", `Z suffix should be the last; can't combine rounding/SAE and broadcast`},
                {"VADDPD.SAE.SAE X0, X1, X2", `duplicate suffix "SAE"`},
                {"VADDPD.RZ_SAE.SAE X0, X1, X2", `bad suffix combination`},
+
+               // BSWAP on 16-bit registers is undefined. See #29167,
+               {"BSWAPW DX", `unrecognized instruction`},
+               {"BSWAPW R11", `unrecognized instruction`},
        })
 }
 
index 65aecf8faf40054e715c57af6b450e977a5ea159..c02f51d125916b84687fc8aba07428a37950ccd8 100644 (file)
@@ -588,8 +588,6 @@ TEXT asmtest(SB),DUPOK|NOSPLIT,$0
        BSRQ (R11), R11                         // 4d0fbd1b
        BSRQ DX, R11                            // 4c0fbdda
        BSRQ R11, R11                           // 4d0fbddb
-       BSWAPW DX                               // 660fca
-       BSWAPW R11                              // 66410fcb
        BSWAPL DX                               // 0fca
        BSWAPL R11                              // 410fcb
        BSWAPQ DX                               // 480fca
index 67cf5b1b46a22a16620e031b17b09390b9412d2b..0377b39a4166d42dc5d96d43c4c6a6dd007e2dac 100644 (file)
@@ -69,7 +69,6 @@ const (
        ABSRW
        ABSWAPL
        ABSWAPQ
-       ABSWAPW
        ABTCL
        ABTCQ
        ABTCW
index ba475242011c96db442775999b7c466cc8a07531..a928f67bae41c0437a5c4ab96f64b51865e9523f 100644 (file)
@@ -67,7 +67,6 @@ var Anames = []string{
        "BSRW",
        "BSWAPL",
        "BSWAPQ",
-       "BSWAPW",
        "BTCL",
        "BTCQ",
        "BTCW",
index 336446449b0e04e0f87938f351d26af340ce3201..93fd033460041a97f7c4c2f9efb0719311782d71 100644 (file)
@@ -961,7 +961,6 @@ var optab =
        {ABSRL, yml_rl, Pm, opBytes{0xbd}},
        {ABSRQ, yml_rl, Pw, opBytes{0x0f, 0xbd}},
        {ABSRW, yml_rl, Pq, opBytes{0xbd}},
-       {ABSWAPW, ybswap, Pe, opBytes{0x0f, 0xc8}},
        {ABSWAPL, ybswap, Px, opBytes{0x0f, 0xc8}},
        {ABSWAPQ, ybswap, Pw, opBytes{0x0f, 0xc8}},
        {ABTCL, ybtl, Pm, opBytes{0xba, 07, 0xbb}},
index 2fba397a87a2c923d7eb25bad6072f97549846df..d1ac707fd7af358e705c53d27f2cf60fe55b2f67 100644 (file)
@@ -1206,7 +1206,6 @@ func stacksplit(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog, newprog obj.ProgA
 var unaryDst = map[obj.As]bool{
        ABSWAPL:     true,
        ABSWAPQ:     true,
-       ABSWAPW:     true,
        ACLFLUSH:    true,
        ACLFLUSHOPT: true,
        ACMPXCHG16B: true,