From 57976fe2b4cbd44d27e27af510494de0d182e703 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Tue, 15 Jan 2019 15:00:43 -0800 Subject: [PATCH] cmd/compile: update comment about x86 nop instruction generator 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 --- src/cmd/compile/internal/amd64/ggen.go | 9 ++++++--- src/cmd/compile/internal/x86/ggen.go | 1 + 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/cmd/compile/internal/amd64/ggen.go b/src/cmd/compile/internal/amd64/ggen.go index ee4f872bd87..bd2c6720d30 100644 --- a/src/cmd/compile/internal/amd64/ggen.go +++ b/src/cmd/compile/internal/amd64/ggen.go @@ -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 diff --git a/src/cmd/compile/internal/x86/ggen.go b/src/cmd/compile/internal/x86/ggen.go index 1851af57c4b..86bb782aab3 100644 --- a/src/cmd/compile/internal/x86/ggen.go +++ b/src/cmd/compile/internal/x86/ggen.go @@ -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