]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: update comment about x86 nop instruction generator
authorKeith Randall <khr@google.com>
Tue, 15 Jan 2019 23:00:43 +0000 (15:00 -0800)
committerKeith Randall <khr@golang.org>
Tue, 26 Feb 2019 20:41:14 +0000 (20:41 +0000)
The comment about losing the high bits is incorrect.  We now use these
nops in places where they really need to be a nop.  (Before inline
marks, we used them just before deferreturn calls, so they could
clobber any caller-saved values.)

Change-Id: I433d1ec455aa37dab8fef6eb7d407f3737dbb97f
Reviewed-on: https://go-review.googlesource.com/c/158057
Reviewed-by: Ilya Tocar <ilya.tocar@intel.com>
src/cmd/compile/internal/amd64/ggen.go
src/cmd/compile/internal/x86/ggen.go

index ee4f872bd87e7532f531147e2a7355e598afebc9..bd2c6720d305080f7b97160cd5ecaf862fca645e 100644 (file)
@@ -142,9 +142,12 @@ func zeroAuto(pp *gc.Progs, n *gc.Node) {
 }
 
 func ginsnop(pp *gc.Progs) *obj.Prog {
-       // This is actually not the x86 NOP anymore,
-       // but at the point where it gets used, AX is dead
-       // so it's okay if we lose the high bits.
+       // This is a hardware nop (1-byte 0x90) instruction,
+       // even though we describe it as an explicit XCHGL here.
+       // Particularly, this does not zero the high 32 bits
+       // like typical *L opcodes.
+       // (gas assembles "xchg %eax,%eax" to 0x87 0xc0, which
+       // does zero the high 32 bits.)
        p := pp.Prog(x86.AXCHGL)
        p.From.Type = obj.TYPE_REG
        p.From.Reg = x86.REG_AX
index 1851af57c4bd7b8647f6db790b12b75e59522db2..86bb782aab3d2936b9d52382b09e12a70336cc6c 100644 (file)
@@ -54,6 +54,7 @@ func zeroAuto(pp *gc.Progs, n *gc.Node) {
 }
 
 func ginsnop(pp *gc.Progs) *obj.Prog {
+       // See comment in ../amd64/ggen.go.
        p := pp.Prog(x86.AXCHGL)
        p.From.Type = obj.TYPE_REG
        p.From.Reg = x86.REG_AX