Files
Egon Elbre 7ecd9096a2 cmd/compile/internal/amd64: use X15 for 4- and 8-byte zero stores
MOVQ $0, mem encodes two bytes longer than MOVQ X15, mem, and
MOVL $0, mem encodes one byte longer than MOVL X15, mem. In
ABIInternal functions on amd64, X15 is maintained as zero except on
Plan 9.

Use the XMM forms of MOVQ and MOVL when emitting plain and indexed
zero stores. Selecting the encoding during emission leaves the
existing SSA operations available to store-combining rules. Retain
immediate stores for ABI0 and Plan 9, where X15 is not known to
contain zero.

This replaces 5,598 stores when compiling the standard library,
reducing text by 11,004 bytes with no change in instruction count.

Change-Id: Ibccdce5fd17f81be8c2cf505c8144fa612e71101
Reviewed-on: https://go-review.googlesource.com/c/go/+/810120
Reviewed-by: Jorropo <jorropo.pgm@gmail.com>
Auto-Submit: Jorropo <jorropo.pgm@gmail.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Keith Randall <khr@google.com>
2026-08-10 10:59:49 -07:00

49 lines
915 B
Go

// asmcheck
//go:build !goexperiment.cgocheck2
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package codegen
// This file contains code generation tests related to the handling of
// struct types.
// ------------- //
// Zeroing //
// ------------- //
type Z1 struct {
a, b, c int
}
func Zero1(t *Z1) { // Issue #18370
// amd64:`MOVUPS X[0-9]+, \(.*\)` `MOVQ X15, 16\(.*\)`
*t = Z1{}
}
type Z2 struct {
a, b, c *int
}
func Zero2(t *Z2) {
// amd64:`MOVUPS X[0-9]+, \(.*\)` `MOVQ X15, 16\(.*\)`
// amd64:`.*runtime[.]gcWriteBarrier.*\(SB\)`
*t = Z2{}
}
// ------------------ //
// Initializing //
// ------------------ //
type I1 struct {
a, b, c, d int
}
func Init1(p *I1) { // Issue #18872
// amd64:`MOVQ [$]1` `MOVQ [$]2` `MOVQ [$]3` `MOVQ [$]4`
*p = I1{1, 2, 3, 4}
}