WebAssemblyInstrConv.td revision 341825
1286425Sdim//===-- WebAssemblyInstrConv.td-WebAssembly Conversion support -*- tablegen -*-=
2286425Sdim//
3286425Sdim//                     The LLVM Compiler Infrastructure
4286425Sdim//
5286425Sdim// This file is distributed under the University of Illinois Open Source
6286425Sdim// License. See LICENSE.TXT for details.
7286425Sdim//
8286425Sdim//===----------------------------------------------------------------------===//
9286425Sdim///
10286425Sdim/// \file
11341825Sdim/// WebAssembly datatype conversions, truncations, reinterpretations,
12286425Sdim/// promotions, and demotions operand code-gen constructs.
13286425Sdim///
14286425Sdim//===----------------------------------------------------------------------===//
15286425Sdim
16296417Sdimlet Defs = [ARGUMENTS] in {
17296417Sdim
18341825Sdimdefm I32_WRAP_I64 : I<(outs I32:$dst), (ins I64:$src), (outs), (ins),
19296417Sdim                      [(set I32:$dst, (trunc I64:$src))],
20341825Sdim                      "i32.wrap/i64\t$dst, $src", "i32.wrap/i64", 0xa7>;
21296417Sdim
22341825Sdimdefm I64_EXTEND_S_I32 : I<(outs I64:$dst), (ins I32:$src), (outs), (ins),
23296417Sdim                          [(set I64:$dst, (sext I32:$src))],
24341825Sdim                          "i64.extend_s/i32\t$dst, $src", "i64.extend_s/i32",
25341825Sdim                          0xac>;
26341825Sdimdefm I64_EXTEND_U_I32 : I<(outs I64:$dst), (ins I32:$src), (outs), (ins),
27341825Sdim                          [(set I64:$dst, (zext I32:$src))],
28341825Sdim                          "i64.extend_u/i32\t$dst, $src", "i64.extend_u/i32",
29341825Sdim                          0xad>;
30296417Sdim
31341825Sdimlet Predicates = [HasSignExt] in {
32341825Sdimdefm I32_EXTEND8_S_I32 : I<(outs I32:$dst), (ins I32:$src), (outs), (ins),
33341825Sdim                           [(set I32:$dst, (sext_inreg I32:$src, i8))],
34341825Sdim                           "i32.extend8_s\t$dst, $src", "i32.extend8_s",
35341825Sdim                           0xc0>;
36341825Sdimdefm I32_EXTEND16_S_I32 : I<(outs I32:$dst), (ins I32:$src), (outs), (ins),
37341825Sdim                            [(set I32:$dst, (sext_inreg I32:$src, i16))],
38341825Sdim                            "i32.extend16_s\t$dst, $src", "i32.extend16_s",
39341825Sdim                            0xc1>;
40341825Sdimdefm I64_EXTEND8_S_I64 : I<(outs I64:$dst), (ins I64:$src), (outs), (ins),
41341825Sdim                            [(set I64:$dst, (sext_inreg I64:$src, i8))],
42341825Sdim                            "i64.extend8_s\t$dst, $src", "i64.extend8_s",
43341825Sdim                            0xc2>;
44341825Sdimdefm I64_EXTEND16_S_I64 : I<(outs I64:$dst), (ins I64:$src), (outs), (ins),
45341825Sdim                            [(set I64:$dst, (sext_inreg I64:$src, i16))],
46341825Sdim                            "i64.extend16_s\t$dst, $src", "i64.extend16_s",
47341825Sdim                            0xc3>;
48341825Sdimdefm I64_EXTEND32_S_I64 : I<(outs I64:$dst), (ins I64:$src), (outs), (ins),
49341825Sdim                            [(set I64:$dst, (sext_inreg I64:$src, i32))],
50341825Sdim                            "i64.extend32_s\t$dst, $src", "i64.extend32_s",
51341825Sdim                            0xc4>;
52341825Sdim} // Predicates = [HasSignExt]
53327952Sdim
54296417Sdim} // defs = [ARGUMENTS]
55296417Sdim
56296417Sdim// Expand a "don't care" extend into zero-extend (chosen over sign-extend
57296417Sdim// somewhat arbitrarily, although it favors popular hardware architectures
58296417Sdim// and is conceptually a simpler operation).
59296417Sdimdef : Pat<(i64 (anyext I32:$src)), (I64_EXTEND_U_I32 I32:$src)>;
60296417Sdim
61296417Sdimlet Defs = [ARGUMENTS] in {
62296417Sdim
63327952Sdim// Conversion from floating point to integer instructions which don't trap on
64327952Sdim// overflow or invalid.
65341825Sdimdefm I32_TRUNC_S_SAT_F32 : I<(outs I32:$dst), (ins F32:$src), (outs), (ins),
66341825Sdim                             [(set I32:$dst, (fp_to_sint F32:$src))],
67341825Sdim                             "i32.trunc_s:sat/f32\t$dst, $src",
68341825Sdim                             "i32.trunc_s:sat/f32", 0xfc00>,
69341825Sdim                             Requires<[HasNontrappingFPToInt]>;
70341825Sdimdefm I32_TRUNC_U_SAT_F32 : I<(outs I32:$dst), (ins F32:$src), (outs), (ins),
71341825Sdim                             [(set I32:$dst, (fp_to_uint F32:$src))],
72341825Sdim                             "i32.trunc_u:sat/f32\t$dst, $src",
73341825Sdim                             "i32.trunc_u:sat/f32", 0xfc01>,
74341825Sdim                             Requires<[HasNontrappingFPToInt]>;
75341825Sdimdefm I64_TRUNC_S_SAT_F32 : I<(outs I64:$dst), (ins F32:$src), (outs), (ins),
76341825Sdim                             [(set I64:$dst, (fp_to_sint F32:$src))],
77341825Sdim                             "i64.trunc_s:sat/f32\t$dst, $src",
78341825Sdim                             "i64.trunc_s:sat/f32", 0xfc04>,
79341825Sdim                             Requires<[HasNontrappingFPToInt]>;
80341825Sdimdefm I64_TRUNC_U_SAT_F32 : I<(outs I64:$dst), (ins F32:$src), (outs), (ins),
81341825Sdim                             [(set I64:$dst, (fp_to_uint F32:$src))],
82341825Sdim                             "i64.trunc_u:sat/f32\t$dst, $src",
83341825Sdim                             "i64.trunc_u:sat/f32", 0xfc05>,
84341825Sdim                             Requires<[HasNontrappingFPToInt]>;
85341825Sdimdefm I32_TRUNC_S_SAT_F64 : I<(outs I32:$dst), (ins F64:$src), (outs), (ins),
86341825Sdim                             [(set I32:$dst, (fp_to_sint F64:$src))],
87341825Sdim                             "i32.trunc_s:sat/f64\t$dst, $src",
88341825Sdim                             "i32.trunc_s:sat/f64", 0xfc02>,
89341825Sdim                             Requires<[HasNontrappingFPToInt]>;
90341825Sdimdefm I32_TRUNC_U_SAT_F64 : I<(outs I32:$dst), (ins F64:$src), (outs), (ins),
91341825Sdim                             [(set I32:$dst, (fp_to_uint F64:$src))],
92341825Sdim                             "i32.trunc_u:sat/f64\t$dst, $src",
93341825Sdim                             "i32.trunc_u:sat/f64", 0xfc03>,
94341825Sdim                             Requires<[HasNontrappingFPToInt]>;
95341825Sdimdefm I64_TRUNC_S_SAT_F64 : I<(outs I64:$dst), (ins F64:$src), (outs), (ins),
96341825Sdim                             [(set I64:$dst, (fp_to_sint F64:$src))],
97341825Sdim                             "i64.trunc_s:sat/f64\t$dst, $src",
98341825Sdim                             "i64.trunc_s:sat/f64", 0xfc06>,
99341825Sdim                             Requires<[HasNontrappingFPToInt]>;
100341825Sdimdefm I64_TRUNC_U_SAT_F64 : I<(outs I64:$dst), (ins F64:$src), (outs), (ins),
101341825Sdim                             [(set I64:$dst, (fp_to_uint F64:$src))],
102341825Sdim                             "i64.trunc_u:sat/f64\t$dst, $src",
103341825Sdim                             "i64.trunc_u:sat/f64", 0xfc07>,
104341825Sdim                             Requires<[HasNontrappingFPToInt]>;
105327952Sdim
106327952Sdim// Conversion from floating point to integer pseudo-instructions which don't
107327952Sdim// trap on overflow or invalid.
108327952Sdimlet usesCustomInserter = 1, isCodeGenOnly = 1 in {
109341825Sdimdefm FP_TO_SINT_I32_F32 : I<(outs I32:$dst), (ins F32:$src), (outs), (ins),
110341825Sdim                            [(set I32:$dst, (fp_to_sint F32:$src))], "", "", 0>,
111341825Sdim                            Requires<[NotHasNontrappingFPToInt]>;
112341825Sdimdefm FP_TO_UINT_I32_F32 : I<(outs I32:$dst), (ins F32:$src), (outs), (ins),
113341825Sdim                            [(set I32:$dst, (fp_to_uint F32:$src))], "", "", 0>,
114341825Sdim                            Requires<[NotHasNontrappingFPToInt]>;
115341825Sdimdefm FP_TO_SINT_I64_F32 : I<(outs I64:$dst), (ins F32:$src), (outs), (ins),
116341825Sdim                            [(set I64:$dst, (fp_to_sint F32:$src))], "", "", 0>,
117341825Sdim                            Requires<[NotHasNontrappingFPToInt]>;
118341825Sdimdefm FP_TO_UINT_I64_F32 : I<(outs I64:$dst), (ins F32:$src), (outs), (ins),
119341825Sdim                            [(set I64:$dst, (fp_to_uint F32:$src))], "", "", 0>,
120341825Sdim                            Requires<[NotHasNontrappingFPToInt]>;
121341825Sdimdefm FP_TO_SINT_I32_F64 : I<(outs I32:$dst), (ins F64:$src), (outs), (ins),
122341825Sdim                            [(set I32:$dst, (fp_to_sint F64:$src))], "", "", 0>,
123341825Sdim                            Requires<[NotHasNontrappingFPToInt]>;
124341825Sdimdefm FP_TO_UINT_I32_F64 : I<(outs I32:$dst), (ins F64:$src), (outs), (ins),
125341825Sdim                            [(set I32:$dst, (fp_to_uint F64:$src))], "", "", 0>,
126341825Sdim                            Requires<[NotHasNontrappingFPToInt]>;
127341825Sdimdefm FP_TO_SINT_I64_F64 : I<(outs I64:$dst), (ins F64:$src), (outs), (ins),
128341825Sdim                            [(set I64:$dst, (fp_to_sint F64:$src))], "", "", 0>,
129341825Sdim                            Requires<[NotHasNontrappingFPToInt]>;
130341825Sdimdefm FP_TO_UINT_I64_F64 : I<(outs I64:$dst), (ins F64:$src), (outs), (ins),
131341825Sdim                            [(set I64:$dst, (fp_to_uint F64:$src))], "", "", 0>,
132341825Sdim                            Requires<[NotHasNontrappingFPToInt]>;
133327952Sdim} // usesCustomInserter, isCodeGenOnly = 1
134327952Sdim
135296417Sdim// Conversion from floating point to integer traps on overflow and invalid.
136296417Sdimlet hasSideEffects = 1 in {
137341825Sdimdefm I32_TRUNC_S_F32 : I<(outs I32:$dst), (ins F32:$src), (outs), (ins),
138341825Sdim                         [], "i32.trunc_s/f32\t$dst, $src", "i32.trunc_s/f32",
139341825Sdim                         0xa8>;
140341825Sdimdefm I32_TRUNC_U_F32 : I<(outs I32:$dst), (ins F32:$src), (outs), (ins),
141341825Sdim                         [], "i32.trunc_u/f32\t$dst, $src", "i32.trunc_u/f32",
142341825Sdim                         0xa9>;
143341825Sdimdefm I64_TRUNC_S_F32 : I<(outs I64:$dst), (ins F32:$src), (outs), (ins),
144341825Sdim                         [], "i64.trunc_s/f32\t$dst, $src", "i64.trunc_s/f32",
145341825Sdim                         0xae>;
146341825Sdimdefm I64_TRUNC_U_F32 : I<(outs I64:$dst), (ins F32:$src), (outs), (ins),
147341825Sdim                         [], "i64.trunc_u/f32\t$dst, $src", "i64.trunc_u/f32",
148341825Sdim                         0xaf>;
149341825Sdimdefm I32_TRUNC_S_F64 : I<(outs I32:$dst), (ins F64:$src), (outs), (ins),
150341825Sdim                         [], "i32.trunc_s/f64\t$dst, $src", "i32.trunc_s/f64",
151341825Sdim                         0xaa>;
152341825Sdimdefm I32_TRUNC_U_F64 : I<(outs I32:$dst), (ins F64:$src), (outs), (ins),
153341825Sdim                         [], "i32.trunc_u/f64\t$dst, $src", "i32.trunc_u/f64",
154341825Sdim                         0xab>;
155341825Sdimdefm I64_TRUNC_S_F64 : I<(outs I64:$dst), (ins F64:$src), (outs), (ins),
156341825Sdim                         [], "i64.trunc_s/f64\t$dst, $src", "i64.trunc_s/f64",
157341825Sdim                         0xb0>;
158341825Sdimdefm I64_TRUNC_U_F64 : I<(outs I64:$dst), (ins F64:$src), (outs), (ins),
159341825Sdim                         [], "i64.trunc_u/f64\t$dst, $src", "i64.trunc_u/f64",
160341825Sdim                         0xb1>;
161296417Sdim} // hasSideEffects = 1
162296417Sdim
163341825Sdimdefm F32_CONVERT_S_I32 : I<(outs F32:$dst), (ins I32:$src), (outs), (ins),
164341825Sdim                           [(set F32:$dst, (sint_to_fp I32:$src))],
165341825Sdim                           "f32.convert_s/i32\t$dst, $src", "f32.convert_s/i32",
166341825Sdim                           0xb2>;
167341825Sdimdefm F32_CONVERT_U_I32 : I<(outs F32:$dst), (ins I32:$src), (outs), (ins),
168341825Sdim                           [(set F32:$dst, (uint_to_fp I32:$src))],
169341825Sdim                           "f32.convert_u/i32\t$dst, $src", "f32.convert_u/i32",
170341825Sdim                           0xb3>;
171341825Sdimdefm F64_CONVERT_S_I32 : I<(outs F64:$dst), (ins I32:$src), (outs), (ins),
172341825Sdim                           [(set F64:$dst, (sint_to_fp I32:$src))],
173341825Sdim                           "f64.convert_s/i32\t$dst, $src", "f64.convert_s/i32",
174341825Sdim                           0xb7>;
175341825Sdimdefm F64_CONVERT_U_I32 : I<(outs F64:$dst), (ins I32:$src), (outs), (ins),
176341825Sdim                           [(set F64:$dst, (uint_to_fp I32:$src))],
177341825Sdim                           "f64.convert_u/i32\t$dst, $src", "f64.convert_u/i32",
178341825Sdim                           0xb8>;
179341825Sdimdefm F32_CONVERT_S_I64 : I<(outs F32:$dst), (ins I64:$src), (outs), (ins),
180341825Sdim                           [(set F32:$dst, (sint_to_fp I64:$src))],
181341825Sdim                           "f32.convert_s/i64\t$dst, $src", "f32.convert_s/i64",
182341825Sdim                           0xb4>;
183341825Sdimdefm F32_CONVERT_U_I64 : I<(outs F32:$dst), (ins I64:$src), (outs), (ins),
184341825Sdim                           [(set F32:$dst, (uint_to_fp I64:$src))],
185341825Sdim                           "f32.convert_u/i64\t$dst, $src", "f32.convert_u/i64",
186341825Sdim                           0xb5>;
187341825Sdimdefm F64_CONVERT_S_I64 : I<(outs F64:$dst), (ins I64:$src), (outs), (ins),
188341825Sdim                           [(set F64:$dst, (sint_to_fp I64:$src))],
189341825Sdim                           "f64.convert_s/i64\t$dst, $src", "f64.convert_s/i64",
190341825Sdim                           0xb9>;
191341825Sdimdefm F64_CONVERT_U_I64 : I<(outs F64:$dst), (ins I64:$src), (outs), (ins),
192341825Sdim                           [(set F64:$dst, (uint_to_fp I64:$src))],
193341825Sdim                           "f64.convert_u/i64\t$dst, $src", "f64.convert_u/i64",
194341825Sdim                           0xba>;
195296417Sdim
196341825Sdimdefm F64_PROMOTE_F32 : I<(outs F64:$dst), (ins F32:$src), (outs), (ins),
197341825Sdim                         [(set F64:$dst, (fpextend F32:$src))],
198341825Sdim                         "f64.promote/f32\t$dst, $src", "f64.promote/f32",
199341825Sdim                         0xbb>;
200341825Sdimdefm F32_DEMOTE_F64 : I<(outs F32:$dst), (ins F64:$src), (outs), (ins),
201341825Sdim                        [(set F32:$dst, (fpround F64:$src))],
202341825Sdim                        "f32.demote/f64\t$dst, $src", "f32.demote/f64",
203341825Sdim                        0xb6>;
204296417Sdim
205341825Sdimdefm I32_REINTERPRET_F32 : I<(outs I32:$dst), (ins F32:$src), (outs), (ins),
206341825Sdim                             [(set I32:$dst, (bitconvert F32:$src))],
207341825Sdim                             "i32.reinterpret/f32\t$dst, $src",
208341825Sdim                             "i32.reinterpret/f32", 0xbc>;
209341825Sdimdefm F32_REINTERPRET_I32 : I<(outs F32:$dst), (ins I32:$src), (outs), (ins),
210341825Sdim                             [(set F32:$dst, (bitconvert I32:$src))],
211341825Sdim                             "f32.reinterpret/i32\t$dst, $src",
212341825Sdim                             "f32.reinterpret/i32", 0xbe>;
213341825Sdimdefm I64_REINTERPRET_F64 : I<(outs I64:$dst), (ins F64:$src), (outs), (ins),
214341825Sdim                             [(set I64:$dst, (bitconvert F64:$src))],
215341825Sdim                             "i64.reinterpret/f64\t$dst, $src",
216341825Sdim                             "i64.reinterpret/f64", 0xbd>;
217341825Sdimdefm F64_REINTERPRET_I64 : I<(outs F64:$dst), (ins I64:$src), (outs), (ins),
218341825Sdim                             [(set F64:$dst, (bitconvert I64:$src))],
219341825Sdim                             "f64.reinterpret/i64\t$dst, $src",
220341825Sdim                             "f64.reinterpret/i64", 0xbf>;
221296417Sdim
222296417Sdim} // Defs = [ARGUMENTS]
223