1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef TEST_SIGNATURES_H
6 #define TEST_SIGNATURES_H
7 
8 #include "src/codegen/signature.h"
9 #include "src/wasm/value-type.h"
10 #include "src/wasm/wasm-opcodes.h"
11 
12 namespace v8 {
13 namespace internal {
14 namespace wasm {
15 
16 // A helper class with many useful signatures in order to simplify tests.
17 class TestSignatures {
18  public:
TestSignatures()19   TestSignatures()
20       : sig_i_v(1, 0, kIntTypes4),
21         sig_i_i(1, 1, kIntTypes4),
22         sig_i_ii(1, 2, kIntTypes4),
23         sig_i_iii(1, 3, kIntTypes4),
24         sig_i_f(1, 1, kIntFloatTypes4),
25         sig_i_ff(1, 2, kIntFloatTypes4),
26         sig_i_d(1, 1, kIntDoubleTypes4),
27         sig_i_dd(1, 2, kIntDoubleTypes4),
28         sig_i_e(1, 1, kIntExternRefTypes4),
29         sig_i_ee(1, 2, kIntExternRefTypes4),
30         sig_i_c(1, 1, kIntFuncRefTypes4),
31         sig_i_s(1, 1, kIntSimd128Types4),
32         sig_l_v(1, 0, kLongTypes4),
33         sig_l_l(1, 1, kLongTypes4),
34         sig_l_ll(1, 2, kLongTypes4),
35         sig_i_ll(1, 2, kIntLongTypes4),
36         sig_f_f(1, 1, kFloatTypes4),
37         sig_f_ff(1, 2, kFloatTypes4),
38         sig_d_d(1, 1, kDoubleTypes4),
39         sig_d_dd(1, 2, kDoubleTypes4),
40         sig_e_v(1, 0, kExternRefTypes4),
41         sig_c_v(1, 0, kFuncTypes4),
42         sig_e_e(1, 1, kExternRefTypes4),
43         sig_c_c(1, 1, kFuncTypes4),
44         sig_v_v(0, 0, kIntTypes4),
45         sig_v_i(0, 1, kIntTypes4),
46         sig_v_ii(0, 2, kIntTypes4),
47         sig_v_iii(0, 3, kIntTypes4),
48         sig_v_e(0, 1, kExternRefTypes4),
49         sig_v_c(0, 1, kFuncTypes4),
50         sig_v_d(0, 1, kDoubleTypes4),
51         sig_s_i(1, 1, kSimd128IntTypes4),
52         sig_s_s(1, 1, kSimd128Types4),
53         sig_s_ss(1, 2, kSimd128Types4),
54         sig_ii_v(2, 0, kIntTypes4),
55         sig_iii_v(3, 0, kIntTypes4) {
56     // I used C++ and you won't believe what happened next....
57     for (int i = 0; i < 4; i++) kIntTypes4[i] = kWasmI32;
58     for (int i = 0; i < 4; i++) kLongTypes4[i] = kWasmI64;
59     for (int i = 0; i < 4; i++) kFloatTypes4[i] = kWasmF32;
60     for (int i = 0; i < 4; i++) kDoubleTypes4[i] = kWasmF64;
61     for (int i = 0; i < 4; i++) kExternRefTypes4[i] = kWasmExternRef;
62     for (int i = 0; i < 4; i++) kFuncTypes4[i] = kWasmFuncRef;
63     for (int i = 1; i < 4; i++) kIntLongTypes4[i] = kWasmI64;
64     for (int i = 1; i < 4; i++) kIntFloatTypes4[i] = kWasmF32;
65     for (int i = 1; i < 4; i++) kIntDoubleTypes4[i] = kWasmF64;
66     for (int i = 1; i < 4; i++) kIntExternRefTypes4[i] = kWasmExternRef;
67     for (int i = 1; i < 4; i++) kIntFuncRefTypes4[i] = kWasmFuncRef;
68     for (int i = 0; i < 4; i++) kSimd128Types4[i] = kWasmS128;
69     for (int i = 1; i < 4; i++) kIntSimd128Types4[i] = kWasmS128;
70     for (int i = 0; i < 4; i++) kSimd128IntTypes4[i] = kWasmS128;
71     kIntLongTypes4[0] = kWasmI32;
72     kIntFloatTypes4[0] = kWasmI32;
73     kIntDoubleTypes4[0] = kWasmI32;
74     kIntExternRefTypes4[0] = kWasmI32;
75     kIntFuncRefTypes4[0] = kWasmI32;
76     kIntSimd128Types4[0] = kWasmI32;
77     kSimd128IntTypes4[1] = kWasmI32;
78   }
79 
i_v()80   FunctionSig* i_v() { return &sig_i_v; }
i_i()81   FunctionSig* i_i() { return &sig_i_i; }
i_ii()82   FunctionSig* i_ii() { return &sig_i_ii; }
i_iii()83   FunctionSig* i_iii() { return &sig_i_iii; }
84 
i_f()85   FunctionSig* i_f() { return &sig_i_f; }
i_ff()86   FunctionSig* i_ff() { return &sig_i_ff; }
i_d()87   FunctionSig* i_d() { return &sig_i_d; }
i_dd()88   FunctionSig* i_dd() { return &sig_i_dd; }
89 
l_v()90   FunctionSig* l_v() { return &sig_l_v; }
l_l()91   FunctionSig* l_l() { return &sig_l_l; }
l_ll()92   FunctionSig* l_ll() { return &sig_l_ll; }
i_ll()93   FunctionSig* i_ll() { return &sig_i_ll; }
i_e()94   FunctionSig* i_e() { return &sig_i_e; }
i_ee()95   FunctionSig* i_ee() { return &sig_i_ee; }
i_c()96   FunctionSig* i_c() { return &sig_i_c; }
i_s()97   FunctionSig* i_s() { return &sig_i_s; }
98 
f_f()99   FunctionSig* f_f() { return &sig_f_f; }
f_ff()100   FunctionSig* f_ff() { return &sig_f_ff; }
d_d()101   FunctionSig* d_d() { return &sig_d_d; }
d_dd()102   FunctionSig* d_dd() { return &sig_d_dd; }
103 
e_v()104   FunctionSig* e_v() { return &sig_e_v; }
a_v()105   FunctionSig* a_v() { return &sig_c_v; }
e_e()106   FunctionSig* e_e() { return &sig_e_e; }
c_c()107   FunctionSig* c_c() { return &sig_c_c; }
108 
v_v()109   FunctionSig* v_v() { return &sig_v_v; }
v_i()110   FunctionSig* v_i() { return &sig_v_i; }
v_ii()111   FunctionSig* v_ii() { return &sig_v_ii; }
v_iii()112   FunctionSig* v_iii() { return &sig_v_iii; }
v_e()113   FunctionSig* v_e() { return &sig_v_e; }
v_c()114   FunctionSig* v_c() { return &sig_v_c; }
v_d()115   FunctionSig* v_d() { return &sig_v_d; }
s_i()116   FunctionSig* s_i() { return &sig_s_i; }
s_s()117   FunctionSig* s_s() { return &sig_s_s; }
s_ss()118   FunctionSig* s_ss() { return &sig_s_ss; }
119 
ii_v()120   FunctionSig* ii_v() { return &sig_ii_v; }
iii_v()121   FunctionSig* iii_v() { return &sig_iii_v; }
122 
many(Zone * zone,ValueType ret,ValueType param,int count)123   FunctionSig* many(Zone* zone, ValueType ret, ValueType param, int count) {
124     FunctionSig::Builder builder(zone, ret == kWasmVoid ? 0 : 1, count);
125     if (ret != kWasmVoid) builder.AddReturn(ret);
126     for (int i = 0; i < count; i++) {
127       builder.AddParam(param);
128     }
129     return builder.Build();
130   }
131 
132  private:
133   ValueType kIntTypes4[4];
134   ValueType kLongTypes4[4];
135   ValueType kFloatTypes4[4];
136   ValueType kDoubleTypes4[4];
137   ValueType kExternRefTypes4[4];
138   ValueType kFuncTypes4[4];
139   ValueType kIntLongTypes4[4];
140   ValueType kIntFloatTypes4[4];
141   ValueType kIntDoubleTypes4[4];
142   ValueType kIntExternRefTypes4[4];
143   ValueType kIntFuncRefTypes4[4];
144   ValueType kSimd128Types4[4];
145   ValueType kIntSimd128Types4[4];
146   ValueType kSimd128IntTypes4[4];
147 
148   FunctionSig sig_i_v;
149   FunctionSig sig_i_i;
150   FunctionSig sig_i_ii;
151   FunctionSig sig_i_iii;
152 
153   FunctionSig sig_i_f;
154   FunctionSig sig_i_ff;
155   FunctionSig sig_i_d;
156   FunctionSig sig_i_dd;
157   FunctionSig sig_i_e;
158   FunctionSig sig_i_ee;
159   FunctionSig sig_i_c;
160   FunctionSig sig_i_s;
161 
162   FunctionSig sig_l_v;
163   FunctionSig sig_l_l;
164   FunctionSig sig_l_ll;
165   FunctionSig sig_i_ll;
166 
167   FunctionSig sig_f_f;
168   FunctionSig sig_f_ff;
169   FunctionSig sig_d_d;
170   FunctionSig sig_d_dd;
171 
172   FunctionSig sig_e_v;
173   FunctionSig sig_c_v;
174   FunctionSig sig_e_e;
175   FunctionSig sig_c_c;
176 
177   FunctionSig sig_v_v;
178   FunctionSig sig_v_i;
179   FunctionSig sig_v_ii;
180   FunctionSig sig_v_iii;
181   FunctionSig sig_v_e;
182   FunctionSig sig_v_c;
183   FunctionSig sig_v_d;
184   FunctionSig sig_s_i;
185   FunctionSig sig_s_s;
186   FunctionSig sig_s_ss;
187 
188   FunctionSig sig_ii_v;
189   FunctionSig sig_iii_v;
190 };
191 }  // namespace wasm
192 }  // namespace internal
193 }  // namespace v8
194 
195 #endif  // TEST_SIGNATURES_H
196