]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.simd] cmd/compile: support simd(imm,fp) returns gp
authorDavid Chase <drchase@google.com>
Tue, 24 Jun 2025 20:26:47 +0000 (16:26 -0400)
committerDavid Chase <drchase@google.com>
Thu, 26 Jun 2025 12:22:45 +0000 (05:22 -0700)
These changes are required to make gp-returning simd
ops work.  amd64/ssa.go includes a new code generator
helper, gc/main.go initializes intrinsics AFTER
the types, ssa/_gen/*AMD64.go add another register
shape to the simd ops function.

This CL should be submitted after simdgen CL 683858
which generated some of the changes.

Change-Id: I0af752ba8882fa131b875ff9c741ef70afbc60d1
Reviewed-on: https://go-review.googlesource.com/c/go/+/683816
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Junyang Shao <shaojunyang@google.com>
src/cmd/compile/internal/amd64/ssa.go
src/cmd/compile/internal/gc/main.go
src/cmd/compile/internal/ssa/_gen/AMD64Ops.go
src/cmd/compile/internal/ssa/_gen/simdAMD64ops.go
src/simd/stubs_amd64.go

index 1d90da2375d1a082fdb8788acec9114930b0fbb5..0c9d12620afdb4bed1ab9d37f18c2e43b1b9a96a 100644 (file)
@@ -1720,6 +1720,20 @@ func simdFp3kfpResultInArg0(s *ssagen.State, v *ssa.Value) *obj.Prog {
        return p
 }
 
+func simdFpgpImm8(s *ssagen.State, v *ssa.Value) *obj.Prog {
+       p := s.Prog(v.Op.Asm())
+       imm := v.AuxInt
+       if imm < 0 || imm > 255 {
+               v.Fatalf("Invalid source selection immediate")
+       }
+       p.From.Offset = imm
+       p.From.Type = obj.TYPE_CONST
+       p.AddRestSourceReg(simdReg(v.Args[0]))
+       p.To.Type = obj.TYPE_REG
+       p.To.Reg = v.Reg()
+       return p
+}
+
 // Currently unused
 func simdFp31(s *ssagen.State, v *ssa.Value) *obj.Prog {
        p := s.Prog(v.Op.Asm())
index c486920f5b2b721d182beebe18f97447a67966f5..20899df04ddd3d254c68e3729f8fb55e62dcc11a 100644 (file)
@@ -191,7 +191,6 @@ func Main(archInit func(*ssagen.ArchInfo)) {
        ir.IsIntrinsicSym = ssagen.IsIntrinsicSym
        inline.SSADumpInline = ssagen.DumpInline
        ssagen.InitEnv()
-       ssagen.InitTables()
 
        types.PtrSize = ssagen.Arch.LinkArch.PtrSize
        types.RegSize = ssagen.Arch.LinkArch.RegSize
@@ -205,6 +204,11 @@ func Main(archInit func(*ssagen.ArchInfo)) {
        typecheck.InitRuntime()
        rttype.Init()
 
+       // Some intrinsics (notably, the simd intrinsics) mention
+       // types "eagerly", thus ssagen must be initialized AFTER
+       // the type system is ready.
+       ssagen.InitTables()
+
        // Parse and typecheck input.
        noder.LoadPackage(flag.Args())
 
index e2cbc65957c75fb52c4cc044f4564115c6a2095e..9ff77736f03cf7e172f138ca5975d7f0110d5971 100644 (file)
@@ -1301,7 +1301,7 @@ func init() {
                pkg:                "cmd/internal/obj/x86",
                genfile:            "../../amd64/ssa.go",
                genSIMDfile:        "../../amd64/simdssa.go",
-               ops:                append(AMD64ops, simdAMD64Ops(fp11, fp21, fp2k1, fp1k1fp1, fp2k1fp1, fp2k1k1, fp3fp1, fp3k1fp1, fp1gp1fp1)...), // AMD64ops,
+               ops:                append(AMD64ops, simdAMD64Ops(fp11, fp21, fp2k1, fp1k1fp1, fp2k1fp1, fp2k1k1, fp3fp1, fp3k1fp1, fp1gp1fp1, fpgp)...), // AMD64ops,
                blocks:             AMD64blocks,
                regnames:           regNamesAMD64,
                ParamIntRegNames:   "AX BX CX DI SI R8 R9 R10 R11",
index 9f8230946325afb5a6e7e286a29624add38c28e2..88d90c2f85aadbc3406612c0fefdf5f002bcbdd1 100644 (file)
@@ -1,7 +1,7 @@
 // Code generated by x/arch/internal/simdgen using 'go run . -xedPath $XED_PATH -o godefs -goroot $GOROOT go.yaml types.yaml categories.yaml'; DO NOT EDIT.
 package main
 
-func simdAMD64Ops(fp11, fp21, fp2k, fpkfp, fp2kfp, fp2kk, fp31, fp3kfp, fpgpfp regInfo) []opData {
+func simdAMD64Ops(fp11, fp21, fp2k, fpkfp, fp2kfp, fp2kk, fp31, fp3kfp, fpgpfp, fpgp regInfo) []opData {
        return []opData{
                {name: "VADDPS512", argLength: 2, reg: fp21, asm: "VADDPS", commutative: true, typ: "Vec512", resultInArg0: false},
                {name: "VANDPS512", argLength: 2, reg: fp21, asm: "VANDPS", commutative: true, typ: "Vec512", resultInArg0: false},
index ceccf1cf61c12e4377b73b75cf1f39dc76e0770b..66ff8c545e6978a72fb4c1d727a7a5d6683e40d9 100644 (file)
@@ -7257,7 +7257,7 @@ func (x Int16x8) SetElem(imm uint8, y int16) Int16x8
 // SetElem sets a single constant-indexed element's value.
 //
 // Asm: VPINSRD, CPU Feature: AVX
-func (x Int32x4) SetElem(imm uint8, y int8) Int32x4
+func (x Int32x4) SetElem(imm uint8, y int32) Int32x4
 
 // SetElem sets a single constant-indexed element's value.
 //
@@ -7277,7 +7277,7 @@ func (x Uint16x8) SetElem(imm uint8, y uint16) Uint16x8
 // SetElem sets a single constant-indexed element's value.
 //
 // Asm: VPINSRD, CPU Feature: AVX
-func (x Uint32x4) SetElem(imm uint8, y uint8) Uint32x4
+func (x Uint32x4) SetElem(imm uint8, y uint32) Uint32x4
 
 // SetElem sets a single constant-indexed element's value.
 //