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