mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
[dev.simd] cmd/compile: change register mask names for simd ops
This CL contains codes generated by CL 686556. Change-Id: I4d7287476b478efdc186a64c12de33528c7fb0af Reviewed-on: https://go-review.googlesource.com/c/go/+/686476 Reviewed-by: David Chase <drchase@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
This commit is contained in:
parent
029d7ec3e9
commit
5429328b0c
4 changed files with 1000 additions and 959 deletions
|
|
@ -54,7 +54,7 @@ func ssaGenSIMDValue(s *ssagen.State, v *ssa.Value) bool {
|
|||
ssa.OpAMD64VSQRTPD128,
|
||||
ssa.OpAMD64VSQRTPD256,
|
||||
ssa.OpAMD64VSQRTPD512:
|
||||
p = simdFp11(s, v)
|
||||
p = simdV11(s, v)
|
||||
|
||||
case ssa.OpAMD64VADDPS128,
|
||||
ssa.OpAMD64VADDPS256,
|
||||
|
|
@ -318,7 +318,7 @@ func ssaGenSIMDValue(s *ssagen.State, v *ssa.Value) bool {
|
|||
ssa.OpAMD64VPXOR256,
|
||||
ssa.OpAMD64VPXORD512,
|
||||
ssa.OpAMD64VPXORQ512:
|
||||
p = simdFp21(s, v)
|
||||
p = simdV21(s, v)
|
||||
|
||||
case ssa.OpAMD64VADDPSMasked128,
|
||||
ssa.OpAMD64VADDPSMasked256,
|
||||
|
|
@ -545,7 +545,7 @@ func ssaGenSIMDValue(s *ssagen.State, v *ssa.Value) bool {
|
|||
ssa.OpAMD64VPXORQMasked128,
|
||||
ssa.OpAMD64VPXORQMasked256,
|
||||
ssa.OpAMD64VPXORQMasked512:
|
||||
p = simdFp2kfp(s, v)
|
||||
p = simdV2kv(s, v)
|
||||
|
||||
case ssa.OpAMD64VPABSBMasked128,
|
||||
ssa.OpAMD64VPABSBMasked256,
|
||||
|
|
@ -589,7 +589,7 @@ func ssaGenSIMDValue(s *ssagen.State, v *ssa.Value) bool {
|
|||
ssa.OpAMD64VSQRTPDMasked128,
|
||||
ssa.OpAMD64VSQRTPDMasked256,
|
||||
ssa.OpAMD64VSQRTPDMasked512:
|
||||
p = simdFpkfp(s, v)
|
||||
p = simdVkv(s, v)
|
||||
|
||||
case ssa.OpAMD64VROUNDPS128,
|
||||
ssa.OpAMD64VROUNDPS256,
|
||||
|
|
@ -621,7 +621,7 @@ func ssaGenSIMDValue(s *ssagen.State, v *ssa.Value) bool {
|
|||
ssa.OpAMD64VPRORQ128,
|
||||
ssa.OpAMD64VPRORQ256,
|
||||
ssa.OpAMD64VPRORQ512:
|
||||
p = simdFp11Imm8(s, v)
|
||||
p = simdV11Imm8(s, v)
|
||||
|
||||
case ssa.OpAMD64VRNDSCALEPSMasked128,
|
||||
ssa.OpAMD64VRNDSCALEPSMasked256,
|
||||
|
|
@ -647,7 +647,7 @@ func ssaGenSIMDValue(s *ssagen.State, v *ssa.Value) bool {
|
|||
ssa.OpAMD64VPRORQMasked128,
|
||||
ssa.OpAMD64VPRORQMasked256,
|
||||
ssa.OpAMD64VPRORQMasked512:
|
||||
p = simdFpkfpImm8(s, v)
|
||||
p = simdVkvImm8(s, v)
|
||||
|
||||
case ssa.OpAMD64VDPPD128,
|
||||
ssa.OpAMD64VCMPPS128,
|
||||
|
|
@ -680,7 +680,7 @@ func ssaGenSIMDValue(s *ssagen.State, v *ssa.Value) bool {
|
|||
ssa.OpAMD64VPSHRDQ128,
|
||||
ssa.OpAMD64VPSHRDQ256,
|
||||
ssa.OpAMD64VPSHRDQ512:
|
||||
p = simdFp21Imm8(s, v)
|
||||
p = simdV21Imm8(s, v)
|
||||
|
||||
case ssa.OpAMD64VCMPPS512,
|
||||
ssa.OpAMD64VCMPPD512,
|
||||
|
|
@ -708,7 +708,7 @@ func ssaGenSIMDValue(s *ssagen.State, v *ssa.Value) bool {
|
|||
ssa.OpAMD64VPCMPD128,
|
||||
ssa.OpAMD64VPCMPD256,
|
||||
ssa.OpAMD64VPCMPQ256:
|
||||
p = simdFp2kImm8(s, v)
|
||||
p = simdV2kImm8(s, v)
|
||||
|
||||
case ssa.OpAMD64VCMPPSMasked128,
|
||||
ssa.OpAMD64VCMPPSMasked256,
|
||||
|
|
@ -740,7 +740,7 @@ func ssaGenSIMDValue(s *ssagen.State, v *ssa.Value) bool {
|
|||
ssa.OpAMD64VPCMPUQMasked128,
|
||||
ssa.OpAMD64VPCMPUQMasked256,
|
||||
ssa.OpAMD64VPCMPUQMasked512:
|
||||
p = simdFp2kkImm8(s, v)
|
||||
p = simdV2kkImm8(s, v)
|
||||
|
||||
case ssa.OpAMD64VFMADD213PS128,
|
||||
ssa.OpAMD64VFMADD213PS256,
|
||||
|
|
@ -790,7 +790,7 @@ func ssaGenSIMDValue(s *ssagen.State, v *ssa.Value) bool {
|
|||
ssa.OpAMD64VPDPBUSD128,
|
||||
ssa.OpAMD64VPDPBUSD256,
|
||||
ssa.OpAMD64VPDPBUSD512:
|
||||
p = simdFp31ResultInArg0(s, v)
|
||||
p = simdV31ResultInArg0(s, v)
|
||||
|
||||
case ssa.OpAMD64VFMADD213PSMasked128,
|
||||
ssa.OpAMD64VFMADD213PSMasked256,
|
||||
|
|
@ -840,7 +840,7 @@ func ssaGenSIMDValue(s *ssagen.State, v *ssa.Value) bool {
|
|||
ssa.OpAMD64VPDPBUSDMasked128,
|
||||
ssa.OpAMD64VPDPBUSDMasked256,
|
||||
ssa.OpAMD64VPDPBUSDMasked512:
|
||||
p = simdFp3kfpResultInArg0(s, v)
|
||||
p = simdV3kvResultInArg0(s, v)
|
||||
|
||||
case ssa.OpAMD64VPSLLW128,
|
||||
ssa.OpAMD64VPSLLW256,
|
||||
|
|
@ -863,7 +863,7 @@ func ssaGenSIMDValue(s *ssagen.State, v *ssa.Value) bool {
|
|||
ssa.OpAMD64VPSRAQ128,
|
||||
ssa.OpAMD64VPSRAQ256,
|
||||
ssa.OpAMD64VPSRAQ512:
|
||||
p = simdFpXfp(s, v)
|
||||
p = simdVfpv(s, v)
|
||||
|
||||
case ssa.OpAMD64VPSLLQMasked128,
|
||||
ssa.OpAMD64VPSLLQMasked256,
|
||||
|
|
@ -874,19 +874,19 @@ func ssaGenSIMDValue(s *ssagen.State, v *ssa.Value) bool {
|
|||
ssa.OpAMD64VPSRAQMasked128,
|
||||
ssa.OpAMD64VPSRAQMasked256,
|
||||
ssa.OpAMD64VPSRAQMasked512:
|
||||
p = simdFpXkfp(s, v)
|
||||
p = simdVfpkv(s, v)
|
||||
|
||||
case ssa.OpAMD64VPINSRB128,
|
||||
ssa.OpAMD64VPINSRW128,
|
||||
ssa.OpAMD64VPINSRD128,
|
||||
ssa.OpAMD64VPINSRQ128:
|
||||
p = simdFpgpfpImm8(s, v)
|
||||
p = simdVgpvImm8(s, v)
|
||||
|
||||
case ssa.OpAMD64VPEXTRB128,
|
||||
ssa.OpAMD64VPEXTRW128,
|
||||
ssa.OpAMD64VPEXTRD128,
|
||||
ssa.OpAMD64VPEXTRQ128:
|
||||
p = simdFpgpImm8(s, v)
|
||||
p = simdVgpImm8(s, v)
|
||||
|
||||
case ssa.OpAMD64VGF2P8AFFINEINVQBMasked128,
|
||||
ssa.OpAMD64VGF2P8AFFINEINVQBMasked256,
|
||||
|
|
@ -912,7 +912,7 @@ func ssaGenSIMDValue(s *ssagen.State, v *ssa.Value) bool {
|
|||
ssa.OpAMD64VPSHRDQMasked128,
|
||||
ssa.OpAMD64VPSHRDQMasked256,
|
||||
ssa.OpAMD64VPSHRDQMasked512:
|
||||
p = simdFp2kfpImm8(s, v)
|
||||
p = simdV2kvImm8(s, v)
|
||||
|
||||
default:
|
||||
// Unknown reg shape
|
||||
|
|
|
|||
|
|
@ -1518,7 +1518,7 @@ func ssaGenValue(s *ssagen.State, v *ssa.Value) {
|
|||
}
|
||||
|
||||
// Example instruction: VRSQRTPS X1, X1
|
||||
func simdFp11(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
func simdV11(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
p := s.Prog(v.Op.Asm())
|
||||
p.From.Type = obj.TYPE_REG
|
||||
p.From.Reg = simdReg(v.Args[0])
|
||||
|
|
@ -1528,7 +1528,7 @@ func simdFp11(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
|||
}
|
||||
|
||||
// Example instruction: VPSUBD X1, X2, X3
|
||||
func simdFp21(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
func simdV21(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
p := s.Prog(v.Op.Asm())
|
||||
p.From.Type = obj.TYPE_REG
|
||||
// Vector registers operands follows a right-to-left order.
|
||||
|
|
@ -1543,7 +1543,7 @@ func simdFp21(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
|||
// This function is to accustomize the shifts.
|
||||
// The 2nd arg is an XMM, and this function merely checks that.
|
||||
// Example instruction: VPSLLQ Z1, X1, Z2
|
||||
func simdFpXfp(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
func simdVfpv(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
p := s.Prog(v.Op.Asm())
|
||||
p.From.Type = obj.TYPE_REG
|
||||
// Vector registers operands follows a right-to-left order.
|
||||
|
|
@ -1556,13 +1556,18 @@ func simdFpXfp(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
|||
}
|
||||
|
||||
// Example instruction: VPCMPEQW Z26, Z30, K4
|
||||
func simdFp2k(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
// simdReg handles mask and vector registers altogether
|
||||
return simdFp21(s, v)
|
||||
func simdV2k(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
p := s.Prog(v.Op.Asm())
|
||||
p.From.Type = obj.TYPE_REG
|
||||
p.From.Reg = simdReg(v.Args[1])
|
||||
p.AddRestSourceReg(simdReg(v.Args[0]))
|
||||
p.To.Type = obj.TYPE_REG
|
||||
p.To.Reg = maskReg(v)
|
||||
return p
|
||||
}
|
||||
|
||||
// Example instruction: VPMINUQ X21, X3, K3, X31
|
||||
func simdFp2kfp(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
func simdV2kv(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
p := s.Prog(v.Op.Asm())
|
||||
p.From.Type = obj.TYPE_REG
|
||||
p.From.Reg = simdReg(v.Args[1])
|
||||
|
|
@ -1572,7 +1577,7 @@ func simdFp2kfp(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
|||
// or "predicate" for "predicated AVX512 instructions"
|
||||
// sits right at the end of the operand list.
|
||||
// TODO: verify this assumption.
|
||||
p.AddRestSourceReg(simdReg(v.Args[2]))
|
||||
p.AddRestSourceReg(maskReg(v.Args[2]))
|
||||
p.To.Type = obj.TYPE_REG
|
||||
p.To.Reg = simdReg(v)
|
||||
return p
|
||||
|
|
@ -1581,35 +1586,42 @@ func simdFp2kfp(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
|||
// This function is to accustomize the shifts.
|
||||
// The 2nd arg is an XMM, and this function merely checks that.
|
||||
// Example instruction: VPSLLQ Z1, X1, K1, Z2
|
||||
func simdFpXkfp(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
func simdVfpkv(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
p := s.Prog(v.Op.Asm())
|
||||
p.From.Type = obj.TYPE_REG
|
||||
p.From.Reg = v.Args[1].Reg()
|
||||
p.AddRestSourceReg(simdReg(v.Args[0]))
|
||||
p.AddRestSourceReg(simdReg(v.Args[2]))
|
||||
p.AddRestSourceReg(maskReg(v.Args[2]))
|
||||
p.To.Type = obj.TYPE_REG
|
||||
p.To.Reg = simdReg(v)
|
||||
return p
|
||||
}
|
||||
|
||||
// Example instruction: VPCMPEQW Z26, Z30, K1, K4
|
||||
func simdFp2kk(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
return simdFp2kfp(s, v)
|
||||
func simdV2kk(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
p := s.Prog(v.Op.Asm())
|
||||
p.From.Type = obj.TYPE_REG
|
||||
p.From.Reg = simdReg(v.Args[1])
|
||||
p.AddRestSourceReg(simdReg(v.Args[0]))
|
||||
p.AddRestSourceReg(maskReg(v.Args[2]))
|
||||
p.To.Type = obj.TYPE_REG
|
||||
p.To.Reg = maskReg(v)
|
||||
return p
|
||||
}
|
||||
|
||||
// Example instruction: VPOPCNTB X14, K4, X16
|
||||
func simdFpkfp(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
func simdVkv(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
p := s.Prog(v.Op.Asm())
|
||||
p.From.Type = obj.TYPE_REG
|
||||
p.From.Reg = simdReg(v.Args[0])
|
||||
p.AddRestSourceReg(simdReg(v.Args[1]))
|
||||
p.AddRestSourceReg(maskReg(v.Args[1]))
|
||||
p.To.Type = obj.TYPE_REG
|
||||
p.To.Reg = simdReg(v)
|
||||
return p
|
||||
}
|
||||
|
||||
// Example instruction: VROUNDPD $7, X2, X2
|
||||
func simdFp11Imm8(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
func simdV11Imm8(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
p := s.Prog(v.Op.Asm())
|
||||
imm := v.AuxInt
|
||||
if imm < 0 || imm > 255 {
|
||||
|
|
@ -1624,7 +1636,7 @@ func simdFp11Imm8(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
|||
}
|
||||
|
||||
// Example instruction: VREDUCEPD $126, X1, K3, X31
|
||||
func simdFpkfpImm8(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
func simdVkvImm8(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
p := s.Prog(v.Op.Asm())
|
||||
imm := v.AuxInt
|
||||
if imm < 0 || imm > 255 {
|
||||
|
|
@ -1633,14 +1645,14 @@ func simdFpkfpImm8(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
|||
p.From.Offset = imm
|
||||
p.From.Type = obj.TYPE_CONST
|
||||
p.AddRestSourceReg(simdReg(v.Args[0]))
|
||||
p.AddRestSourceReg(simdReg(v.Args[1]))
|
||||
p.AddRestSourceReg(maskReg(v.Args[1]))
|
||||
p.To.Type = obj.TYPE_REG
|
||||
p.To.Reg = simdReg(v)
|
||||
return p
|
||||
}
|
||||
|
||||
// Example instruction: VCMPPS $7, X2, X9, X2
|
||||
func simdFp21Imm8(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
func simdV21Imm8(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
p := s.Prog(v.Op.Asm())
|
||||
imm := v.AuxInt
|
||||
if imm < 0 || imm > 255 {
|
||||
|
|
@ -1656,7 +1668,7 @@ func simdFp21Imm8(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
|||
}
|
||||
|
||||
// Example instruction: VPINSRB $3, DX, X0, X0
|
||||
func simdFpgpfpImm8(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
func simdVgpvImm8(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
p := s.Prog(v.Op.Asm())
|
||||
imm := v.AuxInt
|
||||
if imm < 0 || imm > 255 {
|
||||
|
|
@ -1672,12 +1684,7 @@ func simdFpgpfpImm8(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
|||
}
|
||||
|
||||
// Example instruction: VPCMPD $1, Z1, Z2, K1
|
||||
func simdFp2kImm8(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
return simdFp21Imm8(s, v)
|
||||
}
|
||||
|
||||
// Example instruction: VPCMPD $1, Z1, Z2, K2, K1
|
||||
func simdFp2kkImm8(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
func simdV2kImm8(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
p := s.Prog(v.Op.Asm())
|
||||
imm := v.AuxInt
|
||||
if imm < 0 || imm > 255 {
|
||||
|
|
@ -1687,18 +1694,34 @@ func simdFp2kkImm8(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
|||
p.From.Type = obj.TYPE_CONST
|
||||
p.AddRestSourceReg(simdReg(v.Args[1]))
|
||||
p.AddRestSourceReg(simdReg(v.Args[0]))
|
||||
p.AddRestSourceReg(simdReg(v.Args[2]))
|
||||
p.To.Type = obj.TYPE_REG
|
||||
p.To.Reg = simdReg(v)
|
||||
p.To.Reg = maskReg(v)
|
||||
return p
|
||||
}
|
||||
|
||||
func simdFp2kfpImm8(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
return simdFp2kkImm8(s, v)
|
||||
// Example instruction: VPCMPD $1, Z1, Z2, K2, K1
|
||||
func simdV2kkImm8(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[1]))
|
||||
p.AddRestSourceReg(simdReg(v.Args[0]))
|
||||
p.AddRestSourceReg(maskReg(v.Args[2]))
|
||||
p.To.Type = obj.TYPE_REG
|
||||
p.To.Reg = maskReg(v)
|
||||
return p
|
||||
}
|
||||
|
||||
func simdV2kvImm8(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
return simdV2kkImm8(s, v)
|
||||
}
|
||||
|
||||
// Example instruction: VFMADD213PD Z2, Z1, Z0
|
||||
func simdFp31ResultInArg0(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
func simdV31ResultInArg0(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
p := s.Prog(v.Op.Asm())
|
||||
p.From.Type = obj.TYPE_REG
|
||||
p.From.Reg = simdReg(v.Args[2])
|
||||
|
|
@ -1709,18 +1732,18 @@ func simdFp31ResultInArg0(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
|||
}
|
||||
|
||||
// Example instruction: VFMADD213PD Z2, Z1, K1, Z0
|
||||
func simdFp3kfpResultInArg0(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
func simdV3kvResultInArg0(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
p := s.Prog(v.Op.Asm())
|
||||
p.From.Type = obj.TYPE_REG
|
||||
p.From.Reg = simdReg(v.Args[2])
|
||||
p.AddRestSourceReg(simdReg(v.Args[1]))
|
||||
p.AddRestSourceReg(simdReg(v.Args[3]))
|
||||
p.AddRestSourceReg(maskReg(v.Args[3]))
|
||||
p.To.Type = obj.TYPE_REG
|
||||
p.To.Reg = simdReg(v)
|
||||
return p
|
||||
}
|
||||
|
||||
func simdFpgpImm8(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
func simdVgpImm8(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
p := s.Prog(v.Op.Asm())
|
||||
imm := v.AuxInt
|
||||
if imm < 0 || imm > 255 {
|
||||
|
|
@ -1735,7 +1758,7 @@ func simdFpgpImm8(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
|||
}
|
||||
|
||||
// Currently unused
|
||||
func simdFp31(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
func simdV31(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
p := s.Prog(v.Op.Asm())
|
||||
p.From.Type = obj.TYPE_REG
|
||||
p.From.Reg = simdReg(v.Args[2])
|
||||
|
|
@ -1747,13 +1770,13 @@ func simdFp31(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
|||
}
|
||||
|
||||
// Currently unused
|
||||
func simdFp3kfp(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
func simdV3kv(s *ssagen.State, v *ssa.Value) *obj.Prog {
|
||||
p := s.Prog(v.Op.Asm())
|
||||
p.From.Type = obj.TYPE_REG
|
||||
p.From.Reg = simdReg(v.Args[2])
|
||||
p.AddRestSourceReg(simdReg(v.Args[1]))
|
||||
p.AddRestSourceReg(simdReg(v.Args[0]))
|
||||
p.AddRestSourceReg(simdReg(v.Args[3]))
|
||||
p.AddRestSourceReg(maskReg(v.Args[3]))
|
||||
p.To.Type = obj.TYPE_REG
|
||||
p.To.Reg = simdReg(v)
|
||||
return p
|
||||
|
|
@ -1869,8 +1892,6 @@ func simdReg(v *ssa.Value) int16 {
|
|||
base.Fatalf("simdReg: not a simd type; v=%s, b=b%d, f=%s", v.LongString(), v.Block.ID, v.Block.Func.Name)
|
||||
}
|
||||
switch t.Size() {
|
||||
case 8:
|
||||
return v.Reg() // K registers
|
||||
case 16:
|
||||
return v.Reg()
|
||||
case 32:
|
||||
|
|
@ -1881,6 +1902,19 @@ func simdReg(v *ssa.Value) int16 {
|
|||
panic("unreachable")
|
||||
}
|
||||
|
||||
// XXX k mask
|
||||
func maskReg(v *ssa.Value) int16 {
|
||||
t := v.Type
|
||||
if !t.IsSIMD() {
|
||||
base.Fatalf("simdReg: not a simd type; v=%s, b=b%d, f=%s", v.LongString(), v.Block.ID, v.Block.Func.Name)
|
||||
}
|
||||
switch t.Size() {
|
||||
case 8:
|
||||
return v.Reg()
|
||||
}
|
||||
panic("unreachable")
|
||||
}
|
||||
|
||||
// XXX this is used for shift operations only.
|
||||
// regalloc will issue OpCopy with incorrect type, but the assigned
|
||||
// register should be correct, and this function is merely checking
|
||||
|
|
|
|||
|
|
@ -109,6 +109,7 @@ func init() {
|
|||
gp = buildReg("AX CX DX BX BP SI DI R8 R9 R10 R11 R12 R13 R15")
|
||||
g = buildReg("g")
|
||||
fp = buildReg("X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14")
|
||||
v = buildReg("X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14")
|
||||
x15 = buildReg("X15")
|
||||
mask = buildReg("K1 K2 K3 K4 K5 K6 K7")
|
||||
gpsp = gp | buildReg("SP")
|
||||
|
|
@ -120,6 +121,7 @@ func init() {
|
|||
var (
|
||||
gponly = []regMask{gp}
|
||||
fponly = []regMask{fp}
|
||||
vonly = []regMask{v}
|
||||
maskonly = []regMask{mask}
|
||||
)
|
||||
|
||||
|
|
@ -182,15 +184,20 @@ func init() {
|
|||
fpstore = regInfo{inputs: []regMask{gpspsb, fp, 0}}
|
||||
fpstoreidx = regInfo{inputs: []regMask{gpspsb, gpsp, fp, 0}}
|
||||
|
||||
fp1k1 = regInfo{inputs: fponly, outputs: maskonly}
|
||||
k1fp1 = regInfo{inputs: maskonly, outputs: fponly}
|
||||
fp2k1 = regInfo{inputs: []regMask{fp, fp}, outputs: maskonly}
|
||||
fp1k1fp1 = regInfo{inputs: []regMask{fp, mask}, outputs: fponly}
|
||||
fp2k1fp1 = regInfo{inputs: []regMask{fp, fp, mask}, outputs: fponly}
|
||||
fp2k1k1 = regInfo{inputs: []regMask{fp, fp, mask}, outputs: maskonly}
|
||||
fp3fp1 = regInfo{inputs: []regMask{fp, fp, fp}, outputs: fponly}
|
||||
fp3k1fp1 = regInfo{inputs: []regMask{fp, fp, fp, mask}, outputs: fponly}
|
||||
fp1gp1fp1 = regInfo{inputs: []regMask{fp, gp}, outputs: fponly}
|
||||
v11 = regInfo{inputs: vonly, outputs: vonly}
|
||||
v21 = regInfo{inputs: []regMask{v, v}, outputs: vonly}
|
||||
vk = regInfo{inputs: vonly, outputs: maskonly}
|
||||
kv = regInfo{inputs: maskonly, outputs: vonly}
|
||||
v2k = regInfo{inputs: []regMask{v, v}, outputs: maskonly}
|
||||
vkv = regInfo{inputs: []regMask{v, mask}, outputs: vonly}
|
||||
v2kv = regInfo{inputs: []regMask{v, v, mask}, outputs: vonly}
|
||||
v2kk = regInfo{inputs: []regMask{v, v, mask}, outputs: maskonly}
|
||||
v31 = regInfo{inputs: []regMask{v, v, v}, outputs: vonly}
|
||||
v3kv = regInfo{inputs: []regMask{v, v, v, mask}, outputs: vonly}
|
||||
vgpv = regInfo{inputs: []regMask{v, gp}, outputs: vonly}
|
||||
vgp = regInfo{inputs: vonly, outputs: gponly}
|
||||
vfpv = regInfo{inputs: []regMask{v, fp}, outputs: vonly}
|
||||
vfpkv = regInfo{inputs: []regMask{v, fp, mask}, outputs: vonly}
|
||||
|
||||
prefreg = regInfo{inputs: []regMask{gpspsbg}}
|
||||
)
|
||||
|
|
@ -1234,37 +1241,37 @@ func init() {
|
|||
{name: "VMOVDQUload512", argLength: 2, reg: fpload, asm: "VMOVDQU64", aux: "SymOff", faultOnNilArg0: true, symEffect: "Read"}, // load from arg0+auxint+aux, arg1 = mem
|
||||
{name: "VMOVDQUstore512", argLength: 3, reg: fpstore, asm: "VMOVDQU64", aux: "SymOff", faultOnNilArg0: true, symEffect: "Write"}, // store, *(arg0+auxint+aux) = arg1, arg2 = mem
|
||||
|
||||
{name: "VPMOVMToVec8x16", argLength: 1, reg: k1fp1, asm: "VPMOVM2B"},
|
||||
{name: "VPMOVMToVec8x32", argLength: 1, reg: k1fp1, asm: "VPMOVM2B"},
|
||||
{name: "VPMOVMToVec8x64", argLength: 1, reg: k1fp1, asm: "VPMOVM2B"},
|
||||
{name: "VPMOVMToVec8x16", argLength: 1, reg: kv, asm: "VPMOVM2B"},
|
||||
{name: "VPMOVMToVec8x32", argLength: 1, reg: kv, asm: "VPMOVM2B"},
|
||||
{name: "VPMOVMToVec8x64", argLength: 1, reg: kv, asm: "VPMOVM2B"},
|
||||
|
||||
{name: "VPMOVMToVec16x8", argLength: 1, reg: k1fp1, asm: "VPMOVM2W"},
|
||||
{name: "VPMOVMToVec16x16", argLength: 1, reg: k1fp1, asm: "VPMOVM2W"},
|
||||
{name: "VPMOVMToVec16x32", argLength: 1, reg: k1fp1, asm: "VPMOVM2W"},
|
||||
{name: "VPMOVMToVec16x8", argLength: 1, reg: kv, asm: "VPMOVM2W"},
|
||||
{name: "VPMOVMToVec16x16", argLength: 1, reg: kv, asm: "VPMOVM2W"},
|
||||
{name: "VPMOVMToVec16x32", argLength: 1, reg: kv, asm: "VPMOVM2W"},
|
||||
|
||||
{name: "VPMOVMToVec32x4", argLength: 1, reg: k1fp1, asm: "VPMOVM2D"},
|
||||
{name: "VPMOVMToVec32x8", argLength: 1, reg: k1fp1, asm: "VPMOVM2D"},
|
||||
{name: "VPMOVMToVec32x16", argLength: 1, reg: k1fp1, asm: "VPMOVM2D"},
|
||||
{name: "VPMOVMToVec32x4", argLength: 1, reg: kv, asm: "VPMOVM2D"},
|
||||
{name: "VPMOVMToVec32x8", argLength: 1, reg: kv, asm: "VPMOVM2D"},
|
||||
{name: "VPMOVMToVec32x16", argLength: 1, reg: kv, asm: "VPMOVM2D"},
|
||||
|
||||
{name: "VPMOVMToVec64x2", argLength: 1, reg: k1fp1, asm: "VPMOVM2Q"},
|
||||
{name: "VPMOVMToVec64x4", argLength: 1, reg: k1fp1, asm: "VPMOVM2Q"},
|
||||
{name: "VPMOVMToVec64x8", argLength: 1, reg: k1fp1, asm: "VPMOVM2Q"},
|
||||
{name: "VPMOVMToVec64x2", argLength: 1, reg: kv, asm: "VPMOVM2Q"},
|
||||
{name: "VPMOVMToVec64x4", argLength: 1, reg: kv, asm: "VPMOVM2Q"},
|
||||
{name: "VPMOVMToVec64x8", argLength: 1, reg: kv, asm: "VPMOVM2Q"},
|
||||
|
||||
{name: "VPMOVVec8x16ToM", argLength: 1, reg: fp1k1, asm: "VPMOVB2M"},
|
||||
{name: "VPMOVVec8x32ToM", argLength: 1, reg: fp1k1, asm: "VPMOVB2M"},
|
||||
{name: "VPMOVVec8x64ToM", argLength: 1, reg: fp1k1, asm: "VPMOVB2M"},
|
||||
{name: "VPMOVVec8x16ToM", argLength: 1, reg: vk, asm: "VPMOVB2M"},
|
||||
{name: "VPMOVVec8x32ToM", argLength: 1, reg: vk, asm: "VPMOVB2M"},
|
||||
{name: "VPMOVVec8x64ToM", argLength: 1, reg: vk, asm: "VPMOVB2M"},
|
||||
|
||||
{name: "VPMOVVec16x8ToM", argLength: 1, reg: fp1k1, asm: "VPMOVW2M"},
|
||||
{name: "VPMOVVec16x16ToM", argLength: 1, reg: fp1k1, asm: "VPMOVW2M"},
|
||||
{name: "VPMOVVec16x32ToM", argLength: 1, reg: fp1k1, asm: "VPMOVW2M"},
|
||||
{name: "VPMOVVec16x8ToM", argLength: 1, reg: vk, asm: "VPMOVW2M"},
|
||||
{name: "VPMOVVec16x16ToM", argLength: 1, reg: vk, asm: "VPMOVW2M"},
|
||||
{name: "VPMOVVec16x32ToM", argLength: 1, reg: vk, asm: "VPMOVW2M"},
|
||||
|
||||
{name: "VPMOVVec32x4ToM", argLength: 1, reg: fp1k1, asm: "VPMOVD2M"},
|
||||
{name: "VPMOVVec32x8ToM", argLength: 1, reg: fp1k1, asm: "VPMOVD2M"},
|
||||
{name: "VPMOVVec32x16ToM", argLength: 1, reg: fp1k1, asm: "VPMOVD2M"},
|
||||
{name: "VPMOVVec32x4ToM", argLength: 1, reg: vk, asm: "VPMOVD2M"},
|
||||
{name: "VPMOVVec32x8ToM", argLength: 1, reg: vk, asm: "VPMOVD2M"},
|
||||
{name: "VPMOVVec32x16ToM", argLength: 1, reg: vk, asm: "VPMOVD2M"},
|
||||
|
||||
{name: "VPMOVVec64x2ToM", argLength: 1, reg: fp1k1, asm: "VPMOVQ2M"},
|
||||
{name: "VPMOVVec64x4ToM", argLength: 1, reg: fp1k1, asm: "VPMOVQ2M"},
|
||||
{name: "VPMOVVec64x8ToM", argLength: 1, reg: fp1k1, asm: "VPMOVQ2M"},
|
||||
{name: "VPMOVVec64x2ToM", argLength: 1, reg: vk, asm: "VPMOVQ2M"},
|
||||
{name: "VPMOVVec64x4ToM", argLength: 1, reg: vk, asm: "VPMOVQ2M"},
|
||||
{name: "VPMOVVec64x8ToM", argLength: 1, reg: vk, asm: "VPMOVQ2M"},
|
||||
|
||||
{name: "Zero128", argLength: 0, reg: fp01, asm: "VPXOR"},
|
||||
{name: "Zero256", argLength: 0, reg: fp01, asm: "VPXOR"},
|
||||
|
|
@ -1301,7 +1308,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, fpgp)...), // AMD64ops,
|
||||
ops: append(AMD64ops, simdAMD64Ops(v11, v21, v2k, vkv, v2kv, v2kk, v31, v3kv, vgpv, vgp, vfpv, vfpkv)...), // AMD64ops,
|
||||
blocks: AMD64blocks,
|
||||
regnames: regNamesAMD64,
|
||||
ParamIntRegNames: "AX BX CX DI SI R8 R9 R10 R11",
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue