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 // Convenience macros for building Wasm bytecode directly into a byte array. | 10 // Convenience macros for building Wasm bytecode directly into a byte array. |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
45 #define WASM_CASE(x) static_cast<byte>(x), static_cast<byte>(x >> 8) | 45 #define WASM_CASE(x) static_cast<byte>(x), static_cast<byte>(x >> 8) |
46 #define WASM_CASE_BR(x) static_cast<byte>(x), static_cast<byte>(0x80 | (x) >> 8) | 46 #define WASM_CASE_BR(x) static_cast<byte>(x), static_cast<byte>(0x80 | (x) >> 8) |
47 | 47 |
48 //------------------------------------------------------------------------------ | 48 //------------------------------------------------------------------------------ |
49 // Misc expressions. | 49 // Misc expressions. |
50 //------------------------------------------------------------------------------ | 50 //------------------------------------------------------------------------------ |
51 #define WASM_ID(...) __VA_ARGS__ | 51 #define WASM_ID(...) __VA_ARGS__ |
52 #define WASM_ZERO kExprI8Const, 0 | 52 #define WASM_ZERO kExprI8Const, 0 |
53 #define WASM_ONE kExprI8Const, 1 | 53 #define WASM_ONE kExprI8Const, 1 |
54 #define WASM_I8(val) kExprI8Const, static_cast<byte>(val) | 54 #define WASM_I8(val) kExprI8Const, static_cast<byte>(val) |
55 #define WASM_I32(val) \ | 55 |
56 kExprI32Const, static_cast<byte>(val), static_cast<byte>(val >> 8), \ | 56 //------------------------------------------------------------------------------ |
57 static_cast<byte>(val >> 16), static_cast<byte>(val >> 24) | 57 // Int32 Const operations |
58 #define WASM_I64(val) \ | 58 //------------------------------------------------------------------------------ |
59 kExprI64Const, static_cast<byte>(static_cast<uint64_t>(val)), \ | 59 namespace v8 { |
60 static_cast<byte>(static_cast<uint64_t>(val) >> 8), \ | 60 namespace internal { |
61 static_cast<byte>(static_cast<uint64_t>(val) >> 16), \ | 61 namespace wasm { |
62 static_cast<byte>(static_cast<uint64_t>(val) >> 24), \ | 62 |
63 static_cast<byte>(static_cast<uint64_t>(val) >> 32), \ | 63 #define I32V_MIN(length) -(1 << (6 + (7 * ((length) - 1)))) |
64 static_cast<byte>(static_cast<uint64_t>(val) >> 40), \ | 64 #define I32V_MAX(length) ((1 << (6 + (7 * ((length) - 1)))) - 1) |
65 static_cast<byte>(static_cast<uint64_t>(val) >> 48), \ | 65 |
66 static_cast<byte>(static_cast<uint64_t>(val) >> 56) | 66 #define I32V_IN_RANGE(value, length) \ |
67 ((value) >= I32V_MIN(length) && (value) <= I32V_MAX(length)) | |
68 | |
69 inline void CheckI32v(int32_t value, int length) { | |
70 DCHECK(length >= 1 && length <= 5); | |
71 DCHECK(length == 5 || I32V_IN_RANGE(value, length)); | |
72 DCHECK(length == 1 || !I32V_IN_RANGE(value, length - 1)); | |
73 } | |
74 | |
75 } // namespace wasm | |
76 } // namespace internal | |
77 } // namespace v8 | |
78 | |
79 #define WASM_I32V(val) kExprI32Const, U32V_5(val) | |
80 | |
81 #define WASM_I32V_1(val) \ | |
82 static_cast<byte>(CheckI32v((val), 1), kExprI32Const), U32V_1(val) | |
83 #define WASM_I32V_2(val) \ | |
84 static_cast<byte>(CheckI32v((val), 2), kExprI32Const), U32V_2(val) | |
85 #define WASM_I32V_3(val) \ | |
86 static_cast<byte>(CheckI32v((val), 3), kExprI32Const), U32V_3(val) | |
87 #define WASM_I32V_4(val) \ | |
88 static_cast<byte>(CheckI32v((val), 4), kExprI32Const), U32V_4(val) | |
89 #define WASM_I32V_5(val) \ | |
90 static_cast<byte>(CheckI32v((val), 5), kExprI32Const), U32V_5(val) | |
91 | |
92 //------------------------------------------------------------------------------ | |
93 // Int64 Const operations | |
94 //------------------------------------------------------------------------------ | |
95 namespace v8 { | |
titzer
2016/03/03 23:22:52
You can combine these namespaces.
binji
2016/03/03 23:47:32
Sorry, not sure what you mean... is this some new
| |
96 namespace internal { | |
97 namespace wasm { | |
98 | |
99 #define I64V_MIN(length) -(1LL << (6 + (7 * ((length)-1)))) | |
100 #define I64V_MAX(length) ((1LL << (6 + 7 * ((length)-1))) - 1) | |
101 | |
102 #define I64V_IN_RANGE(value, length) \ | |
103 ((value) >= I64V_MIN(length) && (value) <= I64V_MAX(length)) | |
104 | |
105 inline void CheckI64v(int64_t value, int length) { | |
106 DCHECK(length >= 1 && length <= 10); | |
107 DCHECK(length == 10 || I64V_IN_RANGE(value, length)); | |
108 DCHECK(length == 1 || !I64V_IN_RANGE(value, length - 1)); | |
109 } | |
110 | |
111 } // namespace wasm | |
112 } // namespace internal | |
113 } // namespace v8 | |
114 | |
115 #define WASM_I64V(val) \ | |
116 kExprI64Const, static_cast<byte>(((val)&MASK_7) | 0x80), \ | |
117 static_cast<byte>((((val) >> 7) & MASK_7) | 0x80), \ | |
118 static_cast<byte>((((val) >> 14) & MASK_7) | 0x80), \ | |
119 static_cast<byte>((((val) >> 21) & MASK_7) | 0x80), \ | |
120 static_cast<byte>((((val) >> 28) & MASK_7) | 0x80), \ | |
121 static_cast<byte>((((val) >> 35) & MASK_7) | 0x80), \ | |
122 static_cast<byte>((((val) >> 42) & MASK_7) | 0x80), \ | |
123 static_cast<byte>((((val) >> 49) & MASK_7) | 0x80), \ | |
124 static_cast<byte>((((val) >> 56) & MASK_7) | 0x80), \ | |
125 static_cast<byte>(((val) >> 63) & MASK_7) | |
126 | |
127 #define WASM_I64V_1(val) \ | |
128 static_cast<byte>(CheckI64v((val), 1), kExprI64Const), \ | |
129 static_cast<byte>((val)&MASK_7) | |
130 #define WASM_I64V_2(val) \ | |
131 static_cast<byte>(CheckI64v((val), 2), kExprI64Const), \ | |
132 static_cast<byte>(((val)&MASK_7) | 0x80), \ | |
133 static_cast<byte>(((val) >> 7) & MASK_7) | |
134 #define WASM_I64V_3(val) \ | |
135 static_cast<byte>(CheckI64v((val), 3), kExprI64Const), \ | |
136 static_cast<byte>(((val)&MASK_7) | 0x80), \ | |
137 static_cast<byte>((((val) >> 7) & MASK_7) | 0x80), \ | |
138 static_cast<byte>(((val) >> 14) & MASK_7) | |
139 #define WASM_I64V_4(val) \ | |
140 static_cast<byte>(CheckI64v((val), 4), kExprI64Const), \ | |
141 static_cast<byte>(((val)&MASK_7) | 0x80), \ | |
142 static_cast<byte>((((val) >> 7) & MASK_7) | 0x80), \ | |
143 static_cast<byte>((((val) >> 14) & MASK_7) | 0x80), \ | |
144 static_cast<byte>(((val) >> 21) & MASK_7) | |
145 #define WASM_I64V_5(val) \ | |
146 static_cast<byte>(CheckI64v((val), 5), kExprI64Const), \ | |
147 static_cast<byte>(((val)&MASK_7) | 0x80), \ | |
148 static_cast<byte>((((val) >> 7) & MASK_7) | 0x80), \ | |
149 static_cast<byte>((((val) >> 14) & MASK_7) | 0x80), \ | |
150 static_cast<byte>((((val) >> 21) & MASK_7) | 0x80), \ | |
151 static_cast<byte>(((val) >> 28) & MASK_7) | |
152 #define WASM_I64V_6(val) \ | |
153 static_cast<byte>(CheckI64v((val), 6), kExprI64Const), \ | |
154 static_cast<byte>(((val)&MASK_7) | 0x80), \ | |
155 static_cast<byte>((((val) >> 7) & MASK_7) | 0x80), \ | |
156 static_cast<byte>((((val) >> 14) & MASK_7) | 0x80), \ | |
157 static_cast<byte>((((val) >> 21) & MASK_7) | 0x80), \ | |
158 static_cast<byte>((((val) >> 28) & MASK_7) | 0x80), \ | |
159 static_cast<byte>(((val) >> 35) & MASK_7) | |
160 #define WASM_I64V_7(val) \ | |
161 static_cast<byte>(CheckI64v((val), 7), kExprI64Const), \ | |
162 static_cast<byte>(((val)&MASK_7) | 0x80), \ | |
163 static_cast<byte>((((val) >> 7) & MASK_7) | 0x80), \ | |
164 static_cast<byte>((((val) >> 14) & MASK_7) | 0x80), \ | |
165 static_cast<byte>((((val) >> 21) & MASK_7) | 0x80), \ | |
166 static_cast<byte>((((val) >> 28) & MASK_7) | 0x80), \ | |
167 static_cast<byte>((((val) >> 35) & MASK_7) | 0x80), \ | |
168 static_cast<byte>(((val) >> 42) & MASK_7) | |
169 #define WASM_I64V_8(val) \ | |
170 static_cast<byte>(CheckI64v((val), 8), kExprI64Const), \ | |
171 static_cast<byte>(((val)&MASK_7) | 0x80), \ | |
172 static_cast<byte>((((val) >> 7) & MASK_7) | 0x80), \ | |
173 static_cast<byte>((((val) >> 14) & MASK_7) | 0x80), \ | |
174 static_cast<byte>((((val) >> 21) & MASK_7) | 0x80), \ | |
175 static_cast<byte>((((val) >> 28) & MASK_7) | 0x80), \ | |
176 static_cast<byte>((((val) >> 35) & MASK_7) | 0x80), \ | |
177 static_cast<byte>((((val) >> 42) & MASK_7) | 0x80), \ | |
178 static_cast<byte>(((val) >> 49) & MASK_7) | |
179 #define WASM_I64V_9(val) \ | |
180 static_cast<byte>(CheckI64v((val), 9), kExprI64Const), \ | |
181 static_cast<byte>(((val)&MASK_7) | 0x80), \ | |
182 static_cast<byte>((((val) >> 7) & MASK_7) | 0x80), \ | |
183 static_cast<byte>((((val) >> 14) & MASK_7) | 0x80), \ | |
184 static_cast<byte>((((val) >> 21) & MASK_7) | 0x80), \ | |
185 static_cast<byte>((((val) >> 28) & MASK_7) | 0x80), \ | |
186 static_cast<byte>((((val) >> 35) & MASK_7) | 0x80), \ | |
187 static_cast<byte>((((val) >> 42) & MASK_7) | 0x80), \ | |
188 static_cast<byte>((((val) >> 49) & MASK_7) | 0x80), \ | |
189 static_cast<byte>(((val) >> 56) & MASK_7) | |
190 #define WASM_I64V_10(val) \ | |
191 static_cast<byte>(CheckI64v((val), 10), kExprI64Const), \ | |
192 static_cast<byte>(((val)&MASK_7) | 0x80), \ | |
193 static_cast<byte>((((val) >> 7) & MASK_7) | 0x80), \ | |
194 static_cast<byte>((((val) >> 14) & MASK_7) | 0x80), \ | |
195 static_cast<byte>((((val) >> 21) & MASK_7) | 0x80), \ | |
196 static_cast<byte>((((val) >> 28) & MASK_7) | 0x80), \ | |
197 static_cast<byte>((((val) >> 35) & MASK_7) | 0x80), \ | |
198 static_cast<byte>((((val) >> 42) & MASK_7) | 0x80), \ | |
199 static_cast<byte>((((val) >> 49) & MASK_7) | 0x80), \ | |
200 static_cast<byte>((((val) >> 56) & MASK_7) | 0x80), \ | |
201 static_cast<byte>(((val) >> 63) & MASK_7) | |
202 | |
67 #define WASM_F32(val) \ | 203 #define WASM_F32(val) \ |
68 kExprF32Const, \ | 204 kExprF32Const, \ |
69 static_cast<byte>(bit_cast<int32_t>(static_cast<float>(val))), \ | 205 static_cast<byte>(bit_cast<int32_t>(static_cast<float>(val))), \ |
70 static_cast<byte>(bit_cast<uint32_t>(static_cast<float>(val)) >> 8), \ | 206 static_cast<byte>(bit_cast<uint32_t>(static_cast<float>(val)) >> 8), \ |
71 static_cast<byte>(bit_cast<uint32_t>(static_cast<float>(val)) >> 16), \ | 207 static_cast<byte>(bit_cast<uint32_t>(static_cast<float>(val)) >> 16), \ |
72 static_cast<byte>(bit_cast<uint32_t>(static_cast<float>(val)) >> 24) | 208 static_cast<byte>(bit_cast<uint32_t>(static_cast<float>(val)) >> 24) |
73 #define WASM_F64(val) \ | 209 #define WASM_F64(val) \ |
74 kExprF64Const, static_cast<byte>(bit_cast<uint64_t>(val)), \ | 210 kExprF64Const, static_cast<byte>(bit_cast<uint64_t>(val)), \ |
75 static_cast<byte>(bit_cast<uint64_t>(val) >> 8), \ | 211 static_cast<byte>(bit_cast<uint64_t>(val) >> 8), \ |
76 static_cast<byte>(bit_cast<uint64_t>(val) >> 16), \ | 212 static_cast<byte>(bit_cast<uint64_t>(val) >> 16), \ |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
296 #define U32V_4(x) \ | 432 #define U32V_4(x) \ |
297 static_cast<byte>((x & MASK_7) | 0x80), \ | 433 static_cast<byte>((x & MASK_7) | 0x80), \ |
298 static_cast<byte>(((x >> 7) & MASK_7) | 0x80), \ | 434 static_cast<byte>(((x >> 7) & MASK_7) | 0x80), \ |
299 static_cast<byte>(((x >> 14) & MASK_7) | 0x80), \ | 435 static_cast<byte>(((x >> 14) & MASK_7) | 0x80), \ |
300 static_cast<byte>((x >> 21) & MASK_7) | 436 static_cast<byte>((x >> 21) & MASK_7) |
301 #define U32V_5(x) \ | 437 #define U32V_5(x) \ |
302 static_cast<byte>((x & MASK_7) | 0x80), \ | 438 static_cast<byte>((x & MASK_7) | 0x80), \ |
303 static_cast<byte>(((x >> 7) & MASK_7) | 0x80), \ | 439 static_cast<byte>(((x >> 7) & MASK_7) | 0x80), \ |
304 static_cast<byte>(((x >> 14) & MASK_7) | 0x80), \ | 440 static_cast<byte>(((x >> 14) & MASK_7) | 0x80), \ |
305 static_cast<byte>(((x >> 21) & MASK_7) | 0x80), \ | 441 static_cast<byte>(((x >> 21) & MASK_7) | 0x80), \ |
306 static_cast<byte>((x >> 28) & 0xF) | 442 static_cast<byte>(((x >> 28) & MASK_7)) |
307 | 443 |
308 #endif // V8_WASM_MACRO_GEN_H_ | 444 #endif // V8_WASM_MACRO_GEN_H_ |
OLD | NEW |