1
2
3 package wasm
4
5 import (
6 "cmd/compile/internal/ssa"
7 "cmd/compile/internal/ssagen"
8 "cmd/internal/obj"
9 "cmd/internal/obj/wasm"
10 )
11
12 func ssaGenSIMDValue(s *ssagen.State, v *ssa.Value, extend bool) bool {
13 switch v.Op {
14 case ssa.OpWasmF32x4ExtractLane, ssa.OpWasmI64x2ExtractLane, ssa.OpWasmF64x2ExtractLane:
15 getValue128(s, v.Args[0])
16 p := s.Prog(v.Op.Asm())
17 p.To = obj.Addr{Type: obj.TYPE_CONST, Offset: v.AuxInt}
18 case ssa.OpWasmI8x16ExtractLaneU, ssa.OpWasmI16x8ExtractLaneU:
19 getValue128(s, v.Args[0])
20 p := s.Prog(v.Op.Asm())
21 p.To = obj.Addr{Type: obj.TYPE_CONST, Offset: v.AuxInt}
22 if extend {
23 s.Prog(wasm.AI64ExtendI32U)
24 }
25 case ssa.OpWasmI8x16ExtractLaneS, ssa.OpWasmI16x8ExtractLaneS, ssa.OpWasmI32x4ExtractLane:
26 getValue128(s, v.Args[0])
27 p := s.Prog(v.Op.Asm())
28 p.To = obj.Addr{Type: obj.TYPE_CONST, Offset: v.AuxInt}
29 if extend {
30 s.Prog(wasm.AI64ExtendI32S)
31 }
32 case ssa.OpWasmI8x16ReplaceLane, ssa.OpWasmI16x8ReplaceLane, ssa.OpWasmI32x4ReplaceLane:
33 getValue128(s, v.Args[0])
34 getValue32(s, v.Args[1])
35 p := s.Prog(v.Op.Asm())
36 p.To = obj.Addr{Type: obj.TYPE_CONST, Offset: v.AuxInt}
37 case ssa.OpWasmF32x4ReplaceLane, ssa.OpWasmI64x2ReplaceLane, ssa.OpWasmF64x2ReplaceLane:
38 getValue128(s, v.Args[0])
39 getValue64(s, v.Args[1])
40 p := s.Prog(v.Op.Asm())
41 p.To = obj.Addr{Type: obj.TYPE_CONST, Offset: v.AuxInt}
42 case ssa.OpWasmI8x16Splat, ssa.OpWasmI16x8Splat, ssa.OpWasmI32x4Splat:
43 getValue32(s, v.Args[0])
44 s.Prog(v.Op.Asm())
45 case ssa.OpWasmI64x2Splat:
46 getValue64(s, v.Args[0])
47 s.Prog(v.Op.Asm())
48 case ssa.OpWasmF32x4Splat:
49 getValueFxx(s, v.Args[0])
50 s.Prog(v.Op.Asm())
51 case ssa.OpWasmF64x2Splat:
52 getValueFxx(s, v.Args[0])
53 s.Prog(v.Op.Asm())
54 case ssa.OpWasmI8x16AllTrue, ssa.OpWasmV128AnyTrue, ssa.OpWasmI16x8AllTrue,
55 ssa.OpWasmI32x4AllTrue, ssa.OpWasmI64x2AllTrue, ssa.OpWasmI8x16Abs,
56 ssa.OpWasmI16x8Abs, ssa.OpWasmI32x4Abs, ssa.OpWasmF32x4Abs,
57 ssa.OpWasmI64x2Abs, ssa.OpWasmF64x2Abs, ssa.OpWasmF32x4Ceil,
58 ssa.OpWasmF64x2Ceil, ssa.OpWasmF64x2ConvertLowI32x4S, ssa.OpWasmF64x2ConvertLowI32x4U,
59 ssa.OpWasmF32x4ConvertI32x4S, ssa.OpWasmF32x4ConvertI32x4U, ssa.OpWasmI32x4TruncSatF32x4S,
60 ssa.OpWasmI32x4TruncSatF32x4U, ssa.OpWasmI64x2ExtendHighI32x4S, ssa.OpWasmI64x2ExtendHighI32x4U,
61 ssa.OpWasmI32x4ExtendHighI16x8S, ssa.OpWasmI32x4ExtendHighI16x8U, ssa.OpWasmI16x8ExtendHighI8x16S,
62 ssa.OpWasmI16x8ExtendHighI8x16U, ssa.OpWasmI64x2ExtendLowI32x4S, ssa.OpWasmI64x2ExtendLowI32x4U,
63 ssa.OpWasmI32x4ExtendLowI16x8S, ssa.OpWasmI32x4ExtendLowI16x8U, ssa.OpWasmI16x8ExtendLowI8x16S,
64 ssa.OpWasmI16x8ExtendLowI8x16U, ssa.OpWasmF32x4Floor, ssa.OpWasmF64x2Floor,
65 ssa.OpWasmI8x16Neg, ssa.OpWasmI16x8Neg, ssa.OpWasmI32x4Neg,
66 ssa.OpWasmF32x4Neg, ssa.OpWasmI64x2Neg, ssa.OpWasmF64x2Neg,
67 ssa.OpWasmV128Not, ssa.OpWasmI8x16Popcnt, ssa.OpWasmF32x4Nearest,
68 ssa.OpWasmF64x2Nearest, ssa.OpWasmF32x4Sqrt, ssa.OpWasmF64x2Sqrt,
69 ssa.OpWasmF32x4Trunc, ssa.OpWasmF64x2Trunc:
70 getValue128(s, v.Args[0])
71 s.Prog(v.Op.Asm())
72 case ssa.OpWasmI16x8Q15MulrSatS, ssa.OpWasmI16x8RelaxedQ15MulrS, ssa.OpWasmF32x4Pmax,
73 ssa.OpWasmF32x4Pmin, ssa.OpWasmF32x4RelaxedMax, ssa.OpWasmF32x4RelaxedMin,
74 ssa.OpWasmF64x2Pmax, ssa.OpWasmF64x2Pmin, ssa.OpWasmF64x2RelaxedMax,
75 ssa.OpWasmF64x2RelaxedMin, ssa.OpWasmI8x16Add, ssa.OpWasmI16x8Add,
76 ssa.OpWasmI32x4Add, ssa.OpWasmF32x4Add, ssa.OpWasmI64x2Add,
77 ssa.OpWasmF64x2Add, ssa.OpWasmI8x16AddSatS, ssa.OpWasmI8x16AddSatU,
78 ssa.OpWasmI16x8AddSatS, ssa.OpWasmI16x8AddSatU, ssa.OpWasmV128And,
79 ssa.OpWasmV128Andnot, ssa.OpWasmI8x16AvgrU, ssa.OpWasmI16x8AvgrU,
80 ssa.OpWasmF32x4Div, ssa.OpWasmF64x2Div, ssa.OpWasmI8x16Eq,
81 ssa.OpWasmI16x8Eq, ssa.OpWasmI32x4Eq, ssa.OpWasmF32x4Eq,
82 ssa.OpWasmI64x2Eq, ssa.OpWasmF64x2Eq, ssa.OpWasmI8x16GtS,
83 ssa.OpWasmI8x16GtU, ssa.OpWasmI16x8GtS, ssa.OpWasmI16x8GtU,
84 ssa.OpWasmI32x4GtS, ssa.OpWasmI32x4GtU, ssa.OpWasmF32x4Gt,
85 ssa.OpWasmI64x2GtS, ssa.OpWasmF64x2Gt, ssa.OpWasmI8x16GeS,
86 ssa.OpWasmI8x16GeU, ssa.OpWasmI16x8GeS, ssa.OpWasmI16x8GeU,
87 ssa.OpWasmI32x4GeS, ssa.OpWasmI32x4GeU, ssa.OpWasmF32x4Ge,
88 ssa.OpWasmI64x2GeS, ssa.OpWasmF64x2Ge, ssa.OpWasmI8x16LtS,
89 ssa.OpWasmI8x16LtU, ssa.OpWasmI16x8LtS, ssa.OpWasmI16x8LtU,
90 ssa.OpWasmI32x4LtS, ssa.OpWasmI32x4LtU, ssa.OpWasmF32x4Lt,
91 ssa.OpWasmI64x2LtS, ssa.OpWasmF64x2Lt, ssa.OpWasmI8x16LeS,
92 ssa.OpWasmI8x16LeU, ssa.OpWasmI16x8LeS, ssa.OpWasmI16x8LeU,
93 ssa.OpWasmI32x4LeS, ssa.OpWasmI32x4LeU, ssa.OpWasmF32x4Le,
94 ssa.OpWasmI64x2LeS, ssa.OpWasmF64x2Le, ssa.OpWasmI8x16Swizzle,
95 ssa.OpWasmI8x16MaxS, ssa.OpWasmI8x16MaxU, ssa.OpWasmI16x8MaxS,
96 ssa.OpWasmI16x8MaxU, ssa.OpWasmI32x4MaxS, ssa.OpWasmI32x4MaxU,
97 ssa.OpWasmF32x4Max, ssa.OpWasmF64x2Max, ssa.OpWasmI8x16MinS,
98 ssa.OpWasmI8x16MinU, ssa.OpWasmI16x8MinS, ssa.OpWasmI16x8MinU,
99 ssa.OpWasmI32x4MinS, ssa.OpWasmI32x4MinU, ssa.OpWasmF32x4Min,
100 ssa.OpWasmF64x2Min, ssa.OpWasmI16x8Mul, ssa.OpWasmI32x4Mul,
101 ssa.OpWasmF32x4Mul, ssa.OpWasmI64x2Mul, ssa.OpWasmF64x2Mul,
102 ssa.OpWasmI16x8ExtmulHighI8x16S, ssa.OpWasmI16x8ExtmulHighI8x16U, ssa.OpWasmI32x4ExtmulHighI16x8S,
103 ssa.OpWasmI32x4ExtmulHighI16x8U, ssa.OpWasmI64x2ExtmulHighI32x4S, ssa.OpWasmI64x2ExtmulHighI32x4U,
104 ssa.OpWasmI16x8ExtmulLowI8x16S, ssa.OpWasmI16x8ExtmulLowI8x16U, ssa.OpWasmI32x4ExtmulLowI16x8S,
105 ssa.OpWasmI32x4ExtmulLowI16x8U, ssa.OpWasmI64x2ExtmulLowI32x4S, ssa.OpWasmI64x2ExtmulLowI32x4U,
106 ssa.OpWasmI8x16Ne, ssa.OpWasmI16x8Ne, ssa.OpWasmI32x4Ne,
107 ssa.OpWasmF32x4Ne, ssa.OpWasmI64x2Ne, ssa.OpWasmF64x2Ne,
108 ssa.OpWasmV128Or, ssa.OpWasmI8x16Sub, ssa.OpWasmI16x8Sub,
109 ssa.OpWasmI32x4Sub, ssa.OpWasmF32x4Sub, ssa.OpWasmI64x2Sub,
110 ssa.OpWasmF64x2Sub, ssa.OpWasmI8x16SubSatS, ssa.OpWasmI8x16SubSatU,
111 ssa.OpWasmI16x8SubSatS, ssa.OpWasmI16x8SubSatU, ssa.OpWasmV128Xor:
112 getValue128(s, v.Args[0])
113 getValue128(s, v.Args[1])
114 s.Prog(v.Op.Asm())
115 case ssa.OpWasmI8x16Shl, ssa.OpWasmI16x8Shl, ssa.OpWasmI32x4Shl,
116 ssa.OpWasmI64x2Shl, ssa.OpWasmI8x16ShrS, ssa.OpWasmI8x16ShrU,
117 ssa.OpWasmI16x8ShrS, ssa.OpWasmI16x8ShrU, ssa.OpWasmI32x4ShrS,
118 ssa.OpWasmI32x4ShrU, ssa.OpWasmI64x2ShrS, ssa.OpWasmI64x2ShrU:
119 getValue128(s, v.Args[0])
120 getValue32(s, v.Args[1])
121 s.Prog(v.Op.Asm())
122 case ssa.OpWasmF32x4RelaxedNmadd, ssa.OpWasmF64x2RelaxedNmadd, ssa.OpWasmV128Bitselect,
123 ssa.OpWasmF32x4RelaxedMadd, ssa.OpWasmF64x2RelaxedMadd:
124 getValue128(s, v.Args[0])
125 getValue128(s, v.Args[1])
126 getValue128(s, v.Args[2])
127 s.Prog(v.Op.Asm())
128
129 default:
130 return false
131 }
132 return true
133 }
134
View as plain text