OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_WASM_MACRO_GEN_H_ | 5 #ifndef V8_WASM_MACRO_GEN_H_ |
6 #define V8_WASM_MACRO_GEN_H_ | 6 #define V8_WASM_MACRO_GEN_H_ |
7 | 7 |
8 #include "src/wasm/wasm-opcodes.h" | 8 #include "src/wasm/wasm-opcodes.h" |
9 | 9 |
10 #include "src/zone/zone-containers.h" | 10 #include "src/zone/zone-containers.h" |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 #define ARITY_1 1 | 64 #define ARITY_1 1 |
65 #define ARITY_2 2 | 65 #define ARITY_2 2 |
66 #define DEPTH_0 0 | 66 #define DEPTH_0 0 |
67 #define DEPTH_1 1 | 67 #define DEPTH_1 1 |
68 #define DEPTH_2 2 | 68 #define DEPTH_2 2 |
69 #define ARITY_2 2 | 69 #define ARITY_2 2 |
70 | 70 |
71 #define WASM_BLOCK(...) kExprBlock, kLocalVoid, __VA_ARGS__, kExprEnd | 71 #define WASM_BLOCK(...) kExprBlock, kLocalVoid, __VA_ARGS__, kExprEnd |
72 | 72 |
73 #define WASM_BLOCK_T(t, ...) \ | 73 #define WASM_BLOCK_T(t, ...) \ |
74 kExprBlock, static_cast<byte>(WasmOpcodes::LocalTypeCodeFor(t)), \ | 74 kExprBlock, static_cast<byte>(WasmOpcodes::ValueTypeCodeFor(t)), \ |
75 __VA_ARGS__, kExprEnd | 75 __VA_ARGS__, kExprEnd |
76 | 76 |
77 #define WASM_BLOCK_TT(t1, t2, ...) \ | 77 #define WASM_BLOCK_TT(t1, t2, ...) \ |
78 kExprBlock, kMultivalBlock, 0, \ | 78 kExprBlock, kMultivalBlock, 0, \ |
79 static_cast<byte>(WasmOpcodes::LocalTypeCodeFor(t1)), \ | 79 static_cast<byte>(WasmOpcodes::ValueTypeCodeFor(t1)), \ |
80 static_cast<byte>(WasmOpcodes::LocalTypeCodeFor(t2)), __VA_ARGS__, \ | 80 static_cast<byte>(WasmOpcodes::ValueTypeCodeFor(t2)), __VA_ARGS__, \ |
81 kExprEnd | 81 kExprEnd |
82 | 82 |
83 #define WASM_BLOCK_I(...) kExprBlock, kLocalI32, __VA_ARGS__, kExprEnd | 83 #define WASM_BLOCK_I(...) kExprBlock, kLocalI32, __VA_ARGS__, kExprEnd |
84 #define WASM_BLOCK_L(...) kExprBlock, kLocalI64, __VA_ARGS__, kExprEnd | 84 #define WASM_BLOCK_L(...) kExprBlock, kLocalI64, __VA_ARGS__, kExprEnd |
85 #define WASM_BLOCK_F(...) kExprBlock, kLocalF32, __VA_ARGS__, kExprEnd | 85 #define WASM_BLOCK_F(...) kExprBlock, kLocalF32, __VA_ARGS__, kExprEnd |
86 #define WASM_BLOCK_D(...) kExprBlock, kLocalF64, __VA_ARGS__, kExprEnd | 86 #define WASM_BLOCK_D(...) kExprBlock, kLocalF64, __VA_ARGS__, kExprEnd |
87 | 87 |
88 #define WASM_INFINITE_LOOP kExprLoop, kLocalVoid, kExprBr, DEPTH_0, kExprEnd | 88 #define WASM_INFINITE_LOOP kExprLoop, kLocalVoid, kExprBr, DEPTH_0, kExprEnd |
89 | 89 |
90 #define WASM_LOOP(...) kExprLoop, kLocalVoid, __VA_ARGS__, kExprEnd | 90 #define WASM_LOOP(...) kExprLoop, kLocalVoid, __VA_ARGS__, kExprEnd |
91 #define WASM_LOOP_I(...) kExprLoop, kLocalI32, __VA_ARGS__, kExprEnd | 91 #define WASM_LOOP_I(...) kExprLoop, kLocalI32, __VA_ARGS__, kExprEnd |
92 #define WASM_LOOP_L(...) kExprLoop, kLocalI64, __VA_ARGS__, kExprEnd | 92 #define WASM_LOOP_L(...) kExprLoop, kLocalI64, __VA_ARGS__, kExprEnd |
93 #define WASM_LOOP_F(...) kExprLoop, kLocalF32, __VA_ARGS__, kExprEnd | 93 #define WASM_LOOP_F(...) kExprLoop, kLocalF32, __VA_ARGS__, kExprEnd |
94 #define WASM_LOOP_D(...) kExprLoop, kLocalF64, __VA_ARGS__, kExprEnd | 94 #define WASM_LOOP_D(...) kExprLoop, kLocalF64, __VA_ARGS__, kExprEnd |
95 | 95 |
96 #define WASM_IF(cond, tstmt) cond, kExprIf, kLocalVoid, tstmt, kExprEnd | 96 #define WASM_IF(cond, tstmt) cond, kExprIf, kLocalVoid, tstmt, kExprEnd |
97 | 97 |
98 #define WASM_IF_ELSE(cond, tstmt, fstmt) \ | 98 #define WASM_IF_ELSE(cond, tstmt, fstmt) \ |
99 cond, kExprIf, kLocalVoid, tstmt, kExprElse, fstmt, kExprEnd | 99 cond, kExprIf, kLocalVoid, tstmt, kExprElse, fstmt, kExprEnd |
100 | 100 |
101 #define WASM_IF_ELSE_T(t, cond, tstmt, fstmt) \ | 101 #define WASM_IF_ELSE_T(t, cond, tstmt, fstmt) \ |
102 cond, kExprIf, static_cast<byte>(WasmOpcodes::LocalTypeCodeFor(t)), tstmt, \ | 102 cond, kExprIf, static_cast<byte>(WasmOpcodes::ValueTypeCodeFor(t)), tstmt, \ |
103 kExprElse, fstmt, kExprEnd | 103 kExprElse, fstmt, kExprEnd |
104 | 104 |
105 #define WASM_IF_ELSE_TT(t1, t2, cond, tstmt, fstmt) \ | 105 #define WASM_IF_ELSE_TT(t1, t2, cond, tstmt, fstmt) \ |
106 cond, kExprIf, kMultivalBlock, 0, \ | 106 cond, kExprIf, kMultivalBlock, 0, \ |
107 static_cast<byte>(WasmOpcodes::LocalTypeCodeFor(t1)), \ | 107 static_cast<byte>(WasmOpcodes::ValueTypeCodeFor(t1)), \ |
108 static_cast<byte>(WasmOpcodes::LocalTypeCodeFor(t2)), tstmt, kExprElse, \ | 108 static_cast<byte>(WasmOpcodes::ValueTypeCodeFor(t2)), tstmt, kExprElse, \ |
109 fstmt, kExprEnd | 109 fstmt, kExprEnd |
110 | 110 |
111 #define WASM_IF_ELSE_I(cond, tstmt, fstmt) \ | 111 #define WASM_IF_ELSE_I(cond, tstmt, fstmt) \ |
112 cond, kExprIf, kLocalI32, tstmt, kExprElse, fstmt, kExprEnd | 112 cond, kExprIf, kLocalI32, tstmt, kExprElse, fstmt, kExprEnd |
113 #define WASM_IF_ELSE_L(cond, tstmt, fstmt) \ | 113 #define WASM_IF_ELSE_L(cond, tstmt, fstmt) \ |
114 cond, kExprIf, kLocalI64, tstmt, kExprElse, fstmt, kExprEnd | 114 cond, kExprIf, kLocalI64, tstmt, kExprElse, fstmt, kExprEnd |
115 #define WASM_IF_ELSE_F(cond, tstmt, fstmt) \ | 115 #define WASM_IF_ELSE_F(cond, tstmt, fstmt) \ |
116 cond, kExprIf, kLocalF32, tstmt, kExprElse, fstmt, kExprEnd | 116 cond, kExprIf, kLocalF32, tstmt, kExprElse, fstmt, kExprEnd |
117 #define WASM_IF_ELSE_D(cond, tstmt, fstmt) \ | 117 #define WASM_IF_ELSE_D(cond, tstmt, fstmt) \ |
118 cond, kExprIf, kLocalF64, tstmt, kExprElse, fstmt, kExprEnd | 118 cond, kExprIf, kLocalF64, tstmt, kExprElse, fstmt, kExprEnd |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
188 pos += size; | 188 pos += size; |
189 *start = buffer; | 189 *start = buffer; |
190 *end = buffer + pos; | 190 *end = buffer + pos; |
191 } | 191 } |
192 | 192 |
193 size_t Emit(byte* buffer) const { | 193 size_t Emit(byte* buffer) const { |
194 size_t pos = 0; | 194 size_t pos = 0; |
195 pos = WriteUint32v(buffer, pos, static_cast<uint32_t>(local_decls.size())); | 195 pos = WriteUint32v(buffer, pos, static_cast<uint32_t>(local_decls.size())); |
196 for (size_t i = 0; i < local_decls.size(); ++i) { | 196 for (size_t i = 0; i < local_decls.size(); ++i) { |
197 pos = WriteUint32v(buffer, pos, local_decls[i].first); | 197 pos = WriteUint32v(buffer, pos, local_decls[i].first); |
198 buffer[pos++] = WasmOpcodes::LocalTypeCodeFor(local_decls[i].second); | 198 buffer[pos++] = WasmOpcodes::ValueTypeCodeFor(local_decls[i].second); |
199 } | 199 } |
200 DCHECK_EQ(Size(), pos); | 200 DCHECK_EQ(Size(), pos); |
201 return pos; | 201 return pos; |
202 } | 202 } |
203 | 203 |
204 // Add locals declarations to this helper. Return the index of the newly added | 204 // Add locals declarations to this helper. Return the index of the newly added |
205 // local(s), with an optional adjustment for the parameters. | 205 // local(s), with an optional adjustment for the parameters. |
206 uint32_t AddLocals(uint32_t count, LocalType type) { | 206 uint32_t AddLocals(uint32_t count, ValueType type) { |
207 uint32_t result = | 207 uint32_t result = |
208 static_cast<uint32_t>(total + (sig ? sig->parameter_count() : 0)); | 208 static_cast<uint32_t>(total + (sig ? sig->parameter_count() : 0)); |
209 total += count; | 209 total += count; |
210 if (local_decls.size() > 0 && local_decls.back().second == type) { | 210 if (local_decls.size() > 0 && local_decls.back().second == type) { |
211 count += local_decls.back().first; | 211 count += local_decls.back().first; |
212 local_decls.pop_back(); | 212 local_decls.pop_back(); |
213 } | 213 } |
214 local_decls.push_back(std::pair<uint32_t, LocalType>(count, type)); | 214 local_decls.push_back(std::pair<uint32_t, ValueType>(count, type)); |
215 return result; | 215 return result; |
216 } | 216 } |
217 | 217 |
218 size_t Size() const { | 218 size_t Size() const { |
219 size_t size = SizeofUint32v(static_cast<uint32_t>(local_decls.size())); | 219 size_t size = SizeofUint32v(static_cast<uint32_t>(local_decls.size())); |
220 for (auto p : local_decls) size += 1 + SizeofUint32v(p.first); | 220 for (auto p : local_decls) size += 1 + SizeofUint32v(p.first); |
221 return size; | 221 return size; |
222 } | 222 } |
223 | 223 |
224 bool has_sig() const { return sig != nullptr; } | 224 bool has_sig() const { return sig != nullptr; } |
225 FunctionSig* get_sig() const { return sig; } | 225 FunctionSig* get_sig() const { return sig; } |
226 void set_sig(FunctionSig* s) { sig = s; } | 226 void set_sig(FunctionSig* s) { sig = s; } |
227 | 227 |
228 private: | 228 private: |
229 FunctionSig* sig; | 229 FunctionSig* sig; |
230 ZoneVector<std::pair<uint32_t, LocalType>> local_decls; | 230 ZoneVector<std::pair<uint32_t, ValueType>> local_decls; |
231 size_t total; | 231 size_t total; |
232 | 232 |
233 size_t SizeofUint32v(uint32_t val) const { | 233 size_t SizeofUint32v(uint32_t val) const { |
234 size_t size = 1; | 234 size_t size = 1; |
235 while (true) { | 235 while (true) { |
236 byte b = val & MASK_7; | 236 byte b = val & MASK_7; |
237 if (b == val) return size; | 237 if (b == val) return size; |
238 size++; | 238 size++; |
239 val = val >> 7; | 239 val = val >> 7; |
240 } | 240 } |
(...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
672 #define WASM_BRV(depth, val) val, kExprBr, static_cast<byte>(depth) | 672 #define WASM_BRV(depth, val) val, kExprBr, static_cast<byte>(depth) |
673 #define WASM_BRV_IF(depth, val, cond) \ | 673 #define WASM_BRV_IF(depth, val, cond) \ |
674 val, cond, kExprBrIf, static_cast<byte>(depth) | 674 val, cond, kExprBrIf, static_cast<byte>(depth) |
675 #define WASM_BRV_IFD(depth, val, cond) \ | 675 #define WASM_BRV_IFD(depth, val, cond) \ |
676 val, cond, kExprBrIf, static_cast<byte>(depth), kExprDrop | 676 val, cond, kExprBrIf, static_cast<byte>(depth), kExprDrop |
677 #define WASM_IFB(cond, ...) cond, kExprIf, kLocalVoid, __VA_ARGS__, kExprEnd | 677 #define WASM_IFB(cond, ...) cond, kExprIf, kLocalVoid, __VA_ARGS__, kExprEnd |
678 #define WASM_BR_TABLEV(val, key, count, ...) \ | 678 #define WASM_BR_TABLEV(val, key, count, ...) \ |
679 val, key, kExprBrTable, U32V_1(count), __VA_ARGS__ | 679 val, key, kExprBrTable, U32V_1(count), __VA_ARGS__ |
680 | 680 |
681 #endif // V8_WASM_MACRO_GEN_H_ | 681 #endif // V8_WASM_MACRO_GEN_H_ |
OLD | NEW |