aboutsummaryrefslogtreecommitdiff
path: root/src/simd
diff options
context:
space:
mode:
authorJunyang Shao <shaojunyang@google.com>2025-09-17 14:44:49 +0000
committerJunyang Shao <shaojunyang@google.com>2025-09-18 11:06:52 -0700
commit4eb5c6e07b56b75033d98941c8fadd3304ee4965 (patch)
tree2f48610e7b8ebd6a2a893703fb1df8307560dee8 /src/simd
parent443b7aeddb82d90345b8e7c8a4ef7c145dac7ce4 (diff)
downloadgo-4eb5c6e07b56b75033d98941c8fadd3304ee4965.tar.xz
[dev.simd] cmd/compile, simd/_gen: add rewrite for const load ops
This CL adds rewrite rules for ops with const imm8 that takes a load to its memory form. Change-Id: I74d0df48715ab48b88b04c8e1bfb3c6b8e528aeb Reviewed-on: https://go-review.googlesource.com/c/go/+/704635 TryBot-Bypass: Junyang Shao <shaojunyang@google.com> Reviewed-by: David Chase <drchase@google.com>
Diffstat (limited to 'src/simd')
-rw-r--r--src/simd/_gen/simdgen/gen_simdrules.go18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/simd/_gen/simdgen/gen_simdrules.go b/src/simd/_gen/simdgen/gen_simdrules.go
index c9fae4eed7..2339a1910d 100644
--- a/src/simd/_gen/simdgen/gen_simdrules.go
+++ b/src/simd/_gen/simdgen/gen_simdrules.go
@@ -236,7 +236,7 @@ func writeSIMDRules(ops []Operation) *bytes.Buffer {
panic("simdgen sees unknwon special lower " + *gOp.SpecialLower + ", maybe implement it?")
}
}
- if gOp.MemFeatures != nil && *gOp.MemFeatures == "vbcst" && immType == NoImm {
+ if gOp.MemFeatures != nil && *gOp.MemFeatures == "vbcst" {
// sanity check
selected := true
for _, a := range gOp.In {
@@ -257,9 +257,21 @@ func writeSIMDRules(ops []Operation) *bytes.Buffer {
}
memOpData := data
// Remove the last vreg from the arg and change it to a load.
- memOpData.ArgsLoadAddr = data.Args[:len(data.Args)-1] + fmt.Sprintf("l:(VMOVDQUload%d {sym} [off] ptr mem)", *lastVreg.Bits)
+ origArgs := data.Args[:len(data.Args)-1]
+ // Prepare imm args.
+ immArg := ""
+ immArgCombineOff := " [off] "
+ if immType != NoImm && immType != InvalidImm {
+ _, after, found := strings.Cut(origArgs, "]")
+ if found {
+ origArgs = after
+ }
+ immArg = "[c] "
+ immArgCombineOff = " [makeValAndOff(int32(int8(c)),off)] "
+ }
+ memOpData.ArgsLoadAddr = immArg + origArgs + fmt.Sprintf("l:(VMOVDQUload%d {sym} [off] ptr mem)", *lastVreg.Bits)
// Remove the last vreg from the arg and change it to "ptr".
- memOpData.ArgsAddr = "{sym} [off] " + data.Args[:len(data.Args)-1] + "ptr"
+ memOpData.ArgsAddr = "{sym}" + immArgCombineOff + origArgs + "ptr"
if maskType == OneMask {
memOpData.ArgsAddr += " mask"
memOpData.ArgsLoadAddr += " mask"