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