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 #include "src/interpreter/bytecode-array-builder.h" | 5 #include "src/interpreter/bytecode-array-builder.h" |
6 | 6 |
7 #include "src/compiler.h" | 7 #include "src/compiler.h" |
8 #include "src/interpreter/bytecode-array-writer.h" | 8 #include "src/interpreter/bytecode-array-writer.h" |
9 #include "src/interpreter/bytecode-label.h" | 9 #include "src/interpreter/bytecode-label.h" |
10 #include "src/interpreter/bytecode-peephole-optimizer.h" | 10 #include "src/interpreter/bytecode-peephole-optimizer.h" |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 } | 104 } |
105 } | 105 } |
106 } | 106 } |
107 | 107 |
108 void BytecodeArrayBuilder::Output(Bytecode bytecode) { | 108 void BytecodeArrayBuilder::Output(Bytecode bytecode) { |
109 BytecodeNode node(bytecode); | 109 BytecodeNode node(bytecode); |
110 AttachSourceInfo(&node); | 110 AttachSourceInfo(&node); |
111 pipeline()->Write(&node); | 111 pipeline()->Write(&node); |
112 } | 112 } |
113 | 113 |
114 void BytecodeArrayBuilder::OutputScaled(Bytecode bytecode, | 114 void BytecodeArrayBuilder::Output(Bytecode bytecode, uint32_t operand0, |
115 OperandScale operand_scale, | 115 uint32_t operand1, uint32_t operand2, |
116 uint32_t operand0, uint32_t operand1, | 116 uint32_t operand3) { |
117 uint32_t operand2, uint32_t operand3) { | 117 BytecodeNode node(bytecode, operand0, operand1, operand2, operand3); |
118 DCHECK(OperandIsValid(bytecode, operand_scale, 0, operand0)); | |
119 DCHECK(OperandIsValid(bytecode, operand_scale, 1, operand1)); | |
120 DCHECK(OperandIsValid(bytecode, operand_scale, 2, operand2)); | |
121 DCHECK(OperandIsValid(bytecode, operand_scale, 3, operand3)); | |
122 BytecodeNode node(bytecode, operand0, operand1, operand2, operand3, | |
123 operand_scale); | |
124 AttachSourceInfo(&node); | 118 AttachSourceInfo(&node); |
125 pipeline()->Write(&node); | 119 pipeline()->Write(&node); |
126 } | 120 } |
127 | 121 |
128 void BytecodeArrayBuilder::OutputScaled(Bytecode bytecode, | 122 void BytecodeArrayBuilder::Output(Bytecode bytecode, uint32_t operand0, |
129 OperandScale operand_scale, | 123 uint32_t operand1, uint32_t operand2) { |
130 uint32_t operand0, uint32_t operand1, | 124 BytecodeNode node(bytecode, operand0, operand1, operand2); |
131 uint32_t operand2) { | |
132 DCHECK(OperandIsValid(bytecode, operand_scale, 0, operand0)); | |
133 DCHECK(OperandIsValid(bytecode, operand_scale, 1, operand1)); | |
134 DCHECK(OperandIsValid(bytecode, operand_scale, 2, operand2)); | |
135 BytecodeNode node(bytecode, operand0, operand1, operand2, operand_scale); | |
136 AttachSourceInfo(&node); | 125 AttachSourceInfo(&node); |
137 pipeline()->Write(&node); | 126 pipeline()->Write(&node); |
138 } | 127 } |
139 | 128 |
140 void BytecodeArrayBuilder::OutputScaled(Bytecode bytecode, | 129 void BytecodeArrayBuilder::Output(Bytecode bytecode, uint32_t operand0, |
141 OperandScale operand_scale, | 130 uint32_t operand1) { |
142 uint32_t operand0, uint32_t operand1) { | 131 BytecodeNode node(bytecode, operand0, operand1); |
143 DCHECK(OperandIsValid(bytecode, operand_scale, 0, operand0)); | |
144 DCHECK(OperandIsValid(bytecode, operand_scale, 1, operand1)); | |
145 BytecodeNode node(bytecode, operand0, operand1, operand_scale); | |
146 AttachSourceInfo(&node); | 132 AttachSourceInfo(&node); |
147 pipeline()->Write(&node); | 133 pipeline()->Write(&node); |
148 } | 134 } |
149 | 135 |
150 void BytecodeArrayBuilder::OutputScaled(Bytecode bytecode, | 136 void BytecodeArrayBuilder::Output(Bytecode bytecode, uint32_t operand0) { |
151 OperandScale operand_scale, | 137 BytecodeNode node(bytecode, operand0); |
152 uint32_t operand0) { | |
153 DCHECK(OperandIsValid(bytecode, operand_scale, 0, operand0)); | |
154 BytecodeNode node(bytecode, operand0, operand_scale); | |
155 AttachSourceInfo(&node); | 138 AttachSourceInfo(&node); |
156 pipeline()->Write(&node); | 139 pipeline()->Write(&node); |
157 } | 140 } |
158 | 141 |
159 BytecodeArrayBuilder& BytecodeArrayBuilder::BinaryOperation(Token::Value op, | 142 BytecodeArrayBuilder& BytecodeArrayBuilder::BinaryOperation(Token::Value op, |
160 Register reg) { | 143 Register reg) { |
161 OperandScale operand_scale = | 144 Output(BytecodeForBinaryOperation(op), RegisterOperand(reg)); |
162 Bytecodes::OperandSizesToScale(reg.SizeOfOperand()); | |
163 OutputScaled(BytecodeForBinaryOperation(op), operand_scale, | |
164 RegisterOperand(reg)); | |
165 return *this; | 145 return *this; |
166 } | 146 } |
167 | 147 |
168 BytecodeArrayBuilder& BytecodeArrayBuilder::CountOperation(Token::Value op) { | 148 BytecodeArrayBuilder& BytecodeArrayBuilder::CountOperation(Token::Value op) { |
169 Output(BytecodeForCountOperation(op)); | 149 Output(BytecodeForCountOperation(op)); |
170 return *this; | 150 return *this; |
171 } | 151 } |
172 | 152 |
173 BytecodeArrayBuilder& BytecodeArrayBuilder::LogicalNot() { | 153 BytecodeArrayBuilder& BytecodeArrayBuilder::LogicalNot() { |
174 Output(Bytecode::kToBooleanLogicalNot); | 154 Output(Bytecode::kToBooleanLogicalNot); |
175 return *this; | 155 return *this; |
176 } | 156 } |
177 | 157 |
178 | 158 |
179 BytecodeArrayBuilder& BytecodeArrayBuilder::TypeOf() { | 159 BytecodeArrayBuilder& BytecodeArrayBuilder::TypeOf() { |
180 Output(Bytecode::kTypeOf); | 160 Output(Bytecode::kTypeOf); |
181 return *this; | 161 return *this; |
182 } | 162 } |
183 | 163 |
184 BytecodeArrayBuilder& BytecodeArrayBuilder::CompareOperation(Token::Value op, | 164 BytecodeArrayBuilder& BytecodeArrayBuilder::CompareOperation(Token::Value op, |
185 Register reg) { | 165 Register reg) { |
186 OperandScale operand_scale = | 166 Output(BytecodeForCompareOperation(op), RegisterOperand(reg)); |
187 Bytecodes::OperandSizesToScale(reg.SizeOfOperand()); | |
188 OutputScaled(BytecodeForCompareOperation(op), operand_scale, | |
189 RegisterOperand(reg)); | |
190 return *this; | 167 return *this; |
191 } | 168 } |
192 | 169 |
193 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLiteral( | 170 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLiteral( |
194 v8::internal::Smi* smi) { | 171 v8::internal::Smi* smi) { |
195 int32_t raw_smi = smi->value(); | 172 int32_t raw_smi = smi->value(); |
196 if (raw_smi == 0) { | 173 if (raw_smi == 0) { |
197 Output(Bytecode::kLdaZero); | 174 Output(Bytecode::kLdaZero); |
198 } else { | 175 } else { |
199 OperandSize operand_size = Bytecodes::SizeForSignedOperand(raw_smi); | 176 Output(Bytecode::kLdaSmi, SignedOperand(raw_smi)); |
200 OperandScale operand_scale = Bytecodes::OperandSizesToScale(operand_size); | |
201 OutputScaled(Bytecode::kLdaSmi, operand_scale, | |
202 SignedOperand(raw_smi, operand_size)); | |
203 } | 177 } |
204 return *this; | 178 return *this; |
205 } | 179 } |
206 | 180 |
207 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLiteral(Handle<Object> object) { | 181 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLiteral(Handle<Object> object) { |
208 size_t entry = GetConstantPoolEntry(object); | 182 size_t entry = GetConstantPoolEntry(object); |
209 OperandScale operand_scale = | 183 Output(Bytecode::kLdaConstant, UnsignedOperand(entry)); |
210 Bytecodes::OperandSizesToScale(Bytecodes::SizeForUnsignedOperand(entry)); | |
211 OutputScaled(Bytecode::kLdaConstant, operand_scale, UnsignedOperand(entry)); | |
212 return *this; | 184 return *this; |
213 } | 185 } |
214 | 186 |
215 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadUndefined() { | 187 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadUndefined() { |
216 Output(Bytecode::kLdaUndefined); | 188 Output(Bytecode::kLdaUndefined); |
217 return *this; | 189 return *this; |
218 } | 190 } |
219 | 191 |
220 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadNull() { | 192 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadNull() { |
221 Output(Bytecode::kLdaNull); | 193 Output(Bytecode::kLdaNull); |
(...skipping 10 matching lines...) Expand all Loading... |
232 return *this; | 204 return *this; |
233 } | 205 } |
234 | 206 |
235 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadFalse() { | 207 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadFalse() { |
236 Output(Bytecode::kLdaFalse); | 208 Output(Bytecode::kLdaFalse); |
237 return *this; | 209 return *this; |
238 } | 210 } |
239 | 211 |
240 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadAccumulatorWithRegister( | 212 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadAccumulatorWithRegister( |
241 Register reg) { | 213 Register reg) { |
242 OperandScale operand_scale = | 214 Output(Bytecode::kLdar, RegisterOperand(reg)); |
243 Bytecodes::OperandSizesToScale(reg.SizeOfOperand()); | |
244 OutputScaled(Bytecode::kLdar, operand_scale, RegisterOperand(reg)); | |
245 return *this; | 215 return *this; |
246 } | 216 } |
247 | 217 |
248 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreAccumulatorInRegister( | 218 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreAccumulatorInRegister( |
249 Register reg) { | 219 Register reg) { |
250 OperandScale operand_scale = | 220 Output(Bytecode::kStar, RegisterOperand(reg)); |
251 Bytecodes::OperandSizesToScale(reg.SizeOfOperand()); | |
252 OutputScaled(Bytecode::kStar, operand_scale, RegisterOperand(reg)); | |
253 return *this; | 221 return *this; |
254 } | 222 } |
255 | 223 |
256 BytecodeArrayBuilder& BytecodeArrayBuilder::MoveRegister(Register from, | 224 BytecodeArrayBuilder& BytecodeArrayBuilder::MoveRegister(Register from, |
257 Register to) { | 225 Register to) { |
258 DCHECK(from != to); | 226 DCHECK(from != to); |
259 OperandScale operand_scale = | 227 Output(Bytecode::kMov, RegisterOperand(from), RegisterOperand(to)); |
260 Bytecodes::OperandSizesToScale(from.SizeOfOperand(), to.SizeOfOperand()); | |
261 OutputScaled(Bytecode::kMov, operand_scale, RegisterOperand(from), | |
262 RegisterOperand(to)); | |
263 return *this; | 228 return *this; |
264 } | 229 } |
265 | 230 |
266 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadGlobal( | 231 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadGlobal( |
267 const Handle<String> name, int feedback_slot, TypeofMode typeof_mode) { | 232 const Handle<String> name, int feedback_slot, TypeofMode typeof_mode) { |
268 // TODO(rmcilroy): Potentially store typeof information in an | 233 // TODO(rmcilroy): Potentially store typeof information in an |
269 // operand rather than having extra bytecodes. | 234 // operand rather than having extra bytecodes. |
270 Bytecode bytecode = BytecodeForLoadGlobal(typeof_mode); | 235 Bytecode bytecode = BytecodeForLoadGlobal(typeof_mode); |
271 size_t name_index = GetConstantPoolEntry(name); | 236 size_t name_index = GetConstantPoolEntry(name); |
272 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 237 Output(bytecode, UnsignedOperand(name_index), UnsignedOperand(feedback_slot)); |
273 Bytecodes::SizeForUnsignedOperand(name_index), | |
274 Bytecodes::SizeForUnsignedOperand(feedback_slot)); | |
275 OutputScaled(bytecode, operand_scale, UnsignedOperand(name_index), | |
276 UnsignedOperand(feedback_slot)); | |
277 return *this; | 238 return *this; |
278 } | 239 } |
279 | 240 |
280 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreGlobal( | 241 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreGlobal( |
281 const Handle<String> name, int feedback_slot, LanguageMode language_mode) { | 242 const Handle<String> name, int feedback_slot, LanguageMode language_mode) { |
282 Bytecode bytecode = BytecodeForStoreGlobal(language_mode); | 243 Bytecode bytecode = BytecodeForStoreGlobal(language_mode); |
283 size_t name_index = GetConstantPoolEntry(name); | 244 size_t name_index = GetConstantPoolEntry(name); |
284 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 245 Output(bytecode, UnsignedOperand(name_index), UnsignedOperand(feedback_slot)); |
285 Bytecodes::SizeForUnsignedOperand(name_index), | |
286 Bytecodes::SizeForUnsignedOperand(feedback_slot)); | |
287 OutputScaled(bytecode, operand_scale, UnsignedOperand(name_index), | |
288 UnsignedOperand(feedback_slot)); | |
289 return *this; | 246 return *this; |
290 } | 247 } |
291 | 248 |
292 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadContextSlot(Register context, | 249 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadContextSlot(Register context, |
293 int slot_index) { | 250 int slot_index) { |
294 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 251 Output(Bytecode::kLdaContextSlot, RegisterOperand(context), |
295 context.SizeOfOperand(), Bytecodes::SizeForUnsignedOperand(slot_index)); | 252 UnsignedOperand(slot_index)); |
296 OutputScaled(Bytecode::kLdaContextSlot, operand_scale, | |
297 RegisterOperand(context), UnsignedOperand(slot_index)); | |
298 return *this; | 253 return *this; |
299 } | 254 } |
300 | 255 |
301 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreContextSlot(Register context, | 256 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreContextSlot(Register context, |
302 int slot_index) { | 257 int slot_index) { |
303 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 258 Output(Bytecode::kStaContextSlot, RegisterOperand(context), |
304 context.SizeOfOperand(), Bytecodes::SizeForUnsignedOperand(slot_index)); | 259 UnsignedOperand(slot_index)); |
305 OutputScaled(Bytecode::kStaContextSlot, operand_scale, | |
306 RegisterOperand(context), UnsignedOperand(slot_index)); | |
307 return *this; | 260 return *this; |
308 } | 261 } |
309 | 262 |
310 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLookupSlot( | 263 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLookupSlot( |
311 const Handle<String> name, TypeofMode typeof_mode) { | 264 const Handle<String> name, TypeofMode typeof_mode) { |
312 Bytecode bytecode = (typeof_mode == INSIDE_TYPEOF) | 265 Bytecode bytecode = (typeof_mode == INSIDE_TYPEOF) |
313 ? Bytecode::kLdaLookupSlotInsideTypeof | 266 ? Bytecode::kLdaLookupSlotInsideTypeof |
314 : Bytecode::kLdaLookupSlot; | 267 : Bytecode::kLdaLookupSlot; |
315 size_t name_index = GetConstantPoolEntry(name); | 268 size_t name_index = GetConstantPoolEntry(name); |
316 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 269 Output(bytecode, UnsignedOperand(name_index)); |
317 Bytecodes::SizeForUnsignedOperand(name_index)); | |
318 OutputScaled(bytecode, operand_scale, UnsignedOperand(name_index)); | |
319 return *this; | 270 return *this; |
320 } | 271 } |
321 | 272 |
322 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreLookupSlot( | 273 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreLookupSlot( |
323 const Handle<String> name, LanguageMode language_mode) { | 274 const Handle<String> name, LanguageMode language_mode) { |
324 Bytecode bytecode = BytecodeForStoreLookupSlot(language_mode); | 275 Bytecode bytecode = BytecodeForStoreLookupSlot(language_mode); |
325 size_t name_index = GetConstantPoolEntry(name); | 276 size_t name_index = GetConstantPoolEntry(name); |
326 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 277 Output(bytecode, UnsignedOperand(name_index)); |
327 Bytecodes::SizeForUnsignedOperand(name_index)); | |
328 OutputScaled(bytecode, operand_scale, UnsignedOperand(name_index)); | |
329 return *this; | 278 return *this; |
330 } | 279 } |
331 | 280 |
332 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadNamedProperty( | 281 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadNamedProperty( |
333 Register object, const Handle<Name> name, int feedback_slot) { | 282 Register object, const Handle<Name> name, int feedback_slot) { |
334 size_t name_index = GetConstantPoolEntry(name); | 283 size_t name_index = GetConstantPoolEntry(name); |
335 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 284 Output(Bytecode::kLdaNamedProperty, RegisterOperand(object), |
336 object.SizeOfOperand(), Bytecodes::SizeForUnsignedOperand(name_index), | 285 UnsignedOperand(name_index), UnsignedOperand(feedback_slot)); |
337 Bytecodes::SizeForUnsignedOperand(feedback_slot)); | |
338 OutputScaled(Bytecode::kLdaNamedProperty, operand_scale, | |
339 RegisterOperand(object), UnsignedOperand(name_index), | |
340 UnsignedOperand(feedback_slot)); | |
341 return *this; | 286 return *this; |
342 } | 287 } |
343 | 288 |
344 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadKeyedProperty( | 289 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadKeyedProperty( |
345 Register object, int feedback_slot) { | 290 Register object, int feedback_slot) { |
346 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 291 Output(Bytecode::kLdaKeyedProperty, RegisterOperand(object), |
347 object.SizeOfOperand(), Bytecodes::SizeForUnsignedOperand(feedback_slot)); | 292 UnsignedOperand(feedback_slot)); |
348 OutputScaled(Bytecode::kLdaKeyedProperty, operand_scale, | |
349 RegisterOperand(object), UnsignedOperand(feedback_slot)); | |
350 return *this; | 293 return *this; |
351 } | 294 } |
352 | 295 |
353 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreNamedProperty( | 296 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreNamedProperty( |
354 Register object, const Handle<Name> name, int feedback_slot, | 297 Register object, const Handle<Name> name, int feedback_slot, |
355 LanguageMode language_mode) { | 298 LanguageMode language_mode) { |
356 Bytecode bytecode = BytecodeForStoreNamedProperty(language_mode); | 299 Bytecode bytecode = BytecodeForStoreNamedProperty(language_mode); |
357 size_t name_index = GetConstantPoolEntry(name); | 300 size_t name_index = GetConstantPoolEntry(name); |
358 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 301 Output(bytecode, RegisterOperand(object), UnsignedOperand(name_index), |
359 object.SizeOfOperand(), Bytecodes::SizeForUnsignedOperand(name_index), | 302 UnsignedOperand(feedback_slot)); |
360 Bytecodes::SizeForUnsignedOperand(feedback_slot)); | |
361 OutputScaled(bytecode, operand_scale, RegisterOperand(object), | |
362 UnsignedOperand(name_index), UnsignedOperand(feedback_slot)); | |
363 return *this; | 303 return *this; |
364 } | 304 } |
365 | 305 |
366 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreKeyedProperty( | 306 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreKeyedProperty( |
367 Register object, Register key, int feedback_slot, | 307 Register object, Register key, int feedback_slot, |
368 LanguageMode language_mode) { | 308 LanguageMode language_mode) { |
369 Bytecode bytecode = BytecodeForStoreKeyedProperty(language_mode); | 309 Bytecode bytecode = BytecodeForStoreKeyedProperty(language_mode); |
370 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 310 Output(bytecode, RegisterOperand(object), RegisterOperand(key), |
371 object.SizeOfOperand(), key.SizeOfOperand(), | 311 UnsignedOperand(feedback_slot)); |
372 Bytecodes::SizeForUnsignedOperand(feedback_slot)); | |
373 OutputScaled(bytecode, operand_scale, RegisterOperand(object), | |
374 RegisterOperand(key), UnsignedOperand(feedback_slot)); | |
375 return *this; | 312 return *this; |
376 } | 313 } |
377 | 314 |
378 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateClosure( | 315 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateClosure( |
379 Handle<SharedFunctionInfo> shared_info, PretenureFlag tenured) { | 316 Handle<SharedFunctionInfo> shared_info, PretenureFlag tenured) { |
380 size_t entry = GetConstantPoolEntry(shared_info); | 317 size_t entry = GetConstantPoolEntry(shared_info); |
381 OperandScale operand_scale = | 318 Output(Bytecode::kCreateClosure, UnsignedOperand(entry), |
382 Bytecodes::OperandSizesToScale(Bytecodes::SizeForUnsignedOperand(entry)); | 319 UnsignedOperand(static_cast<size_t>(tenured))); |
383 OutputScaled(Bytecode::kCreateClosure, operand_scale, UnsignedOperand(entry), | |
384 UnsignedOperand(static_cast<size_t>(tenured))); | |
385 return *this; | 320 return *this; |
386 } | 321 } |
387 | 322 |
388 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateArguments( | 323 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateArguments( |
389 CreateArgumentsType type) { | 324 CreateArgumentsType type) { |
390 // TODO(rmcilroy): Consider passing the type as a bytecode operand rather | 325 // TODO(rmcilroy): Consider passing the type as a bytecode operand rather |
391 // than having two different bytecodes once we have better support for | 326 // than having two different bytecodes once we have better support for |
392 // branches in the InterpreterAssembler. | 327 // branches in the InterpreterAssembler. |
393 Bytecode bytecode = BytecodeForCreateArguments(type); | 328 Bytecode bytecode = BytecodeForCreateArguments(type); |
394 Output(bytecode); | 329 Output(bytecode); |
395 return *this; | 330 return *this; |
396 } | 331 } |
397 | 332 |
398 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateRegExpLiteral( | 333 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateRegExpLiteral( |
399 Handle<String> pattern, int literal_index, int flags) { | 334 Handle<String> pattern, int literal_index, int flags) { |
400 size_t pattern_entry = GetConstantPoolEntry(pattern); | 335 size_t pattern_entry = GetConstantPoolEntry(pattern); |
401 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 336 Output(Bytecode::kCreateRegExpLiteral, UnsignedOperand(pattern_entry), |
402 Bytecodes::SizeForUnsignedOperand(pattern_entry), | 337 UnsignedOperand(literal_index), UnsignedOperand(flags)); |
403 Bytecodes::SizeForUnsignedOperand(literal_index), | |
404 Bytecodes::SizeForUnsignedOperand(flags)); | |
405 OutputScaled(Bytecode::kCreateRegExpLiteral, operand_scale, | |
406 UnsignedOperand(pattern_entry), UnsignedOperand(literal_index), | |
407 UnsignedOperand(flags)); | |
408 return *this; | 338 return *this; |
409 } | 339 } |
410 | 340 |
411 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateArrayLiteral( | 341 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateArrayLiteral( |
412 Handle<FixedArray> constant_elements, int literal_index, int flags) { | 342 Handle<FixedArray> constant_elements, int literal_index, int flags) { |
413 size_t constant_elements_entry = GetConstantPoolEntry(constant_elements); | 343 size_t constant_elements_entry = GetConstantPoolEntry(constant_elements); |
414 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 344 Output(Bytecode::kCreateArrayLiteral, |
415 Bytecodes::SizeForUnsignedOperand(constant_elements_entry), | 345 UnsignedOperand(constant_elements_entry), |
416 Bytecodes::SizeForUnsignedOperand(literal_index), | 346 UnsignedOperand(literal_index), UnsignedOperand(flags)); |
417 Bytecodes::SizeForUnsignedOperand(flags)); | |
418 OutputScaled(Bytecode::kCreateArrayLiteral, operand_scale, | |
419 UnsignedOperand(constant_elements_entry), | |
420 UnsignedOperand(literal_index), UnsignedOperand(flags)); | |
421 return *this; | 347 return *this; |
422 } | 348 } |
423 | 349 |
424 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateObjectLiteral( | 350 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateObjectLiteral( |
425 Handle<FixedArray> constant_properties, int literal_index, int flags) { | 351 Handle<FixedArray> constant_properties, int literal_index, int flags) { |
426 size_t constant_properties_entry = GetConstantPoolEntry(constant_properties); | 352 size_t constant_properties_entry = GetConstantPoolEntry(constant_properties); |
427 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 353 Output(Bytecode::kCreateObjectLiteral, |
428 Bytecodes::SizeForUnsignedOperand(constant_properties_entry), | 354 UnsignedOperand(constant_properties_entry), |
429 Bytecodes::SizeForUnsignedOperand(literal_index), | 355 UnsignedOperand(literal_index), UnsignedOperand(flags)); |
430 Bytecodes::SizeForUnsignedOperand(flags)); | |
431 OutputScaled(Bytecode::kCreateObjectLiteral, operand_scale, | |
432 UnsignedOperand(constant_properties_entry), | |
433 UnsignedOperand(literal_index), UnsignedOperand(flags)); | |
434 return *this; | 356 return *this; |
435 } | 357 } |
436 | 358 |
437 BytecodeArrayBuilder& BytecodeArrayBuilder::PushContext(Register context) { | 359 BytecodeArrayBuilder& BytecodeArrayBuilder::PushContext(Register context) { |
438 OperandScale operand_scale = | 360 Output(Bytecode::kPushContext, RegisterOperand(context)); |
439 Bytecodes::OperandSizesToScale(context.SizeOfOperand()); | |
440 OutputScaled(Bytecode::kPushContext, operand_scale, RegisterOperand(context)); | |
441 return *this; | 361 return *this; |
442 } | 362 } |
443 | 363 |
444 BytecodeArrayBuilder& BytecodeArrayBuilder::PopContext(Register context) { | 364 BytecodeArrayBuilder& BytecodeArrayBuilder::PopContext(Register context) { |
445 OperandScale operand_scale = | 365 Output(Bytecode::kPopContext, RegisterOperand(context)); |
446 Bytecodes::OperandSizesToScale(context.SizeOfOperand()); | |
447 OutputScaled(Bytecode::kPopContext, operand_scale, RegisterOperand(context)); | |
448 return *this; | 366 return *this; |
449 } | 367 } |
450 | 368 |
451 BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToJSObject() { | 369 BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToJSObject() { |
452 Output(Bytecode::kToObject); | 370 Output(Bytecode::kToObject); |
453 return *this; | 371 return *this; |
454 } | 372 } |
455 | 373 |
456 BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToName() { | 374 BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToName() { |
457 Output(Bytecode::kToName); | 375 Output(Bytecode::kToName); |
(...skipping 13 matching lines...) Expand all Loading... |
471 | 389 |
472 BytecodeArrayBuilder& BytecodeArrayBuilder::Bind(const BytecodeLabel& target, | 390 BytecodeArrayBuilder& BytecodeArrayBuilder::Bind(const BytecodeLabel& target, |
473 BytecodeLabel* label) { | 391 BytecodeLabel* label) { |
474 pipeline_->BindLabel(target, label); | 392 pipeline_->BindLabel(target, label); |
475 LeaveBasicBlock(); | 393 LeaveBasicBlock(); |
476 return *this; | 394 return *this; |
477 } | 395 } |
478 | 396 |
479 BytecodeArrayBuilder& BytecodeArrayBuilder::OutputJump(Bytecode jump_bytecode, | 397 BytecodeArrayBuilder& BytecodeArrayBuilder::OutputJump(Bytecode jump_bytecode, |
480 BytecodeLabel* label) { | 398 BytecodeLabel* label) { |
481 BytecodeNode node(jump_bytecode, 0, OperandScale::kSingle); | 399 BytecodeNode node(jump_bytecode, 0); |
482 AttachSourceInfo(&node); | 400 AttachSourceInfo(&node); |
483 pipeline_->WriteJump(&node, label); | 401 pipeline_->WriteJump(&node, label); |
484 LeaveBasicBlock(); | 402 LeaveBasicBlock(); |
485 return *this; | 403 return *this; |
486 } | 404 } |
487 | 405 |
488 BytecodeArrayBuilder& BytecodeArrayBuilder::Jump(BytecodeLabel* label) { | 406 BytecodeArrayBuilder& BytecodeArrayBuilder::Jump(BytecodeLabel* label) { |
489 return OutputJump(Bytecode::kJump, label); | 407 return OutputJump(Bytecode::kJump, label); |
490 } | 408 } |
491 | 409 |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
541 return *this; | 459 return *this; |
542 } | 460 } |
543 | 461 |
544 BytecodeArrayBuilder& BytecodeArrayBuilder::Debugger() { | 462 BytecodeArrayBuilder& BytecodeArrayBuilder::Debugger() { |
545 Output(Bytecode::kDebugger); | 463 Output(Bytecode::kDebugger); |
546 return *this; | 464 return *this; |
547 } | 465 } |
548 | 466 |
549 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInPrepare( | 467 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInPrepare( |
550 Register cache_info_triple) { | 468 Register cache_info_triple) { |
551 OperandScale operand_scale = | 469 Output(Bytecode::kForInPrepare, RegisterOperand(cache_info_triple)); |
552 Bytecodes::OperandSizesToScale(cache_info_triple.SizeOfOperand()); | |
553 OutputScaled(Bytecode::kForInPrepare, operand_scale, | |
554 RegisterOperand(cache_info_triple)); | |
555 return *this; | 470 return *this; |
556 } | 471 } |
557 | 472 |
558 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInDone(Register index, | 473 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInDone(Register index, |
559 Register cache_length) { | 474 Register cache_length) { |
560 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 475 Output(Bytecode::kForInDone, RegisterOperand(index), |
561 index.SizeOfOperand(), cache_length.SizeOfOperand()); | 476 RegisterOperand(cache_length)); |
562 OutputScaled(Bytecode::kForInDone, operand_scale, RegisterOperand(index), | |
563 RegisterOperand(cache_length)); | |
564 return *this; | 477 return *this; |
565 } | 478 } |
566 | 479 |
567 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInNext( | 480 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInNext( |
568 Register receiver, Register index, Register cache_type_array_pair, | 481 Register receiver, Register index, Register cache_type_array_pair, |
569 int feedback_slot) { | 482 int feedback_slot) { |
570 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 483 Output(Bytecode::kForInNext, RegisterOperand(receiver), |
571 receiver.SizeOfOperand(), index.SizeOfOperand(), | 484 RegisterOperand(index), RegisterOperand(cache_type_array_pair), |
572 cache_type_array_pair.SizeOfOperand(), | 485 UnsignedOperand(feedback_slot)); |
573 Bytecodes::SizeForUnsignedOperand(feedback_slot)); | |
574 OutputScaled(Bytecode::kForInNext, operand_scale, RegisterOperand(receiver), | |
575 RegisterOperand(index), RegisterOperand(cache_type_array_pair), | |
576 UnsignedOperand(feedback_slot)); | |
577 return *this; | 486 return *this; |
578 } | 487 } |
579 | 488 |
580 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInStep(Register index) { | 489 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInStep(Register index) { |
581 OperandScale operand_scale = | 490 Output(Bytecode::kForInStep, RegisterOperand(index)); |
582 Bytecodes::OperandSizesToScale(index.SizeOfOperand()); | |
583 OutputScaled(Bytecode::kForInStep, operand_scale, RegisterOperand(index)); | |
584 return *this; | 491 return *this; |
585 } | 492 } |
586 | 493 |
587 BytecodeArrayBuilder& BytecodeArrayBuilder::SuspendGenerator( | 494 BytecodeArrayBuilder& BytecodeArrayBuilder::SuspendGenerator( |
588 Register generator) { | 495 Register generator) { |
589 OperandScale operand_scale = | 496 Output(Bytecode::kSuspendGenerator, RegisterOperand(generator)); |
590 Bytecodes::OperandSizesToScale(generator.SizeOfOperand()); | |
591 OutputScaled(Bytecode::kSuspendGenerator, operand_scale, | |
592 RegisterOperand(generator)); | |
593 return *this; | 497 return *this; |
594 } | 498 } |
595 | 499 |
596 BytecodeArrayBuilder& BytecodeArrayBuilder::ResumeGenerator( | 500 BytecodeArrayBuilder& BytecodeArrayBuilder::ResumeGenerator( |
597 Register generator) { | 501 Register generator) { |
598 OperandScale operand_scale = | 502 Output(Bytecode::kResumeGenerator, RegisterOperand(generator)); |
599 Bytecodes::OperandSizesToScale(generator.SizeOfOperand()); | |
600 OutputScaled(Bytecode::kResumeGenerator, operand_scale, | |
601 RegisterOperand(generator)); | |
602 return *this; | 503 return *this; |
603 } | 504 } |
604 | 505 |
605 BytecodeArrayBuilder& BytecodeArrayBuilder::MarkHandler(int handler_id, | 506 BytecodeArrayBuilder& BytecodeArrayBuilder::MarkHandler(int handler_id, |
606 bool will_catch) { | 507 bool will_catch) { |
607 BytecodeLabel handler; | 508 BytecodeLabel handler; |
608 Bind(&handler); | 509 Bind(&handler); |
609 handler_table_builder()->SetHandlerTarget(handler_id, handler.offset()); | 510 handler_table_builder()->SetHandlerTarget(handler_id, handler.offset()); |
610 handler_table_builder()->SetPrediction(handler_id, will_catch); | 511 handler_table_builder()->SetPrediction(handler_id, will_catch); |
611 return *this; | 512 return *this; |
(...skipping 23 matching lines...) Expand all Loading... |
635 } | 536 } |
636 DCHECK(return_seen_in_block_); | 537 DCHECK(return_seen_in_block_); |
637 } | 538 } |
638 | 539 |
639 BytecodeArrayBuilder& BytecodeArrayBuilder::Call(Register callable, | 540 BytecodeArrayBuilder& BytecodeArrayBuilder::Call(Register callable, |
640 Register receiver_args, | 541 Register receiver_args, |
641 size_t receiver_args_count, | 542 size_t receiver_args_count, |
642 int feedback_slot, | 543 int feedback_slot, |
643 TailCallMode tail_call_mode) { | 544 TailCallMode tail_call_mode) { |
644 Bytecode bytecode = BytecodeForCall(tail_call_mode); | 545 Bytecode bytecode = BytecodeForCall(tail_call_mode); |
645 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 546 Output(bytecode, RegisterOperand(callable), RegisterOperand(receiver_args), |
646 callable.SizeOfOperand(), receiver_args.SizeOfOperand(), | 547 UnsignedOperand(receiver_args_count), UnsignedOperand(feedback_slot)); |
647 Bytecodes::SizeForUnsignedOperand(receiver_args_count), | |
648 Bytecodes::SizeForUnsignedOperand(feedback_slot)); | |
649 OutputScaled(bytecode, operand_scale, RegisterOperand(callable), | |
650 RegisterOperand(receiver_args), | |
651 UnsignedOperand(receiver_args_count), | |
652 UnsignedOperand(feedback_slot)); | |
653 return *this; | 548 return *this; |
654 } | 549 } |
655 | 550 |
656 BytecodeArrayBuilder& BytecodeArrayBuilder::New(Register constructor, | 551 BytecodeArrayBuilder& BytecodeArrayBuilder::New(Register constructor, |
657 Register first_arg, | 552 Register first_arg, |
658 size_t arg_count) { | 553 size_t arg_count) { |
659 if (!first_arg.is_valid()) { | 554 if (!first_arg.is_valid()) { |
660 DCHECK_EQ(0u, arg_count); | 555 DCHECK_EQ(0u, arg_count); |
661 first_arg = Register(0); | 556 first_arg = Register(0); |
662 } | 557 } |
663 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 558 Output(Bytecode::kNew, RegisterOperand(constructor), |
664 constructor.SizeOfOperand(), first_arg.SizeOfOperand(), | 559 RegisterOperand(first_arg), UnsignedOperand(arg_count)); |
665 Bytecodes::SizeForUnsignedOperand(arg_count)); | |
666 OutputScaled(Bytecode::kNew, operand_scale, RegisterOperand(constructor), | |
667 RegisterOperand(first_arg), UnsignedOperand(arg_count)); | |
668 return *this; | 560 return *this; |
669 } | 561 } |
670 | 562 |
671 BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntime( | 563 BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntime( |
672 Runtime::FunctionId function_id, Register first_arg, size_t arg_count) { | 564 Runtime::FunctionId function_id, Register first_arg, size_t arg_count) { |
673 DCHECK_EQ(1, Runtime::FunctionForId(function_id)->result_size); | 565 DCHECK_EQ(1, Runtime::FunctionForId(function_id)->result_size); |
674 DCHECK(Bytecodes::SizeForUnsignedOperand(function_id) <= OperandSize::kShort); | 566 DCHECK(Bytecodes::SizeForUnsignedOperand(function_id) <= OperandSize::kShort); |
675 if (!first_arg.is_valid()) { | 567 if (!first_arg.is_valid()) { |
676 DCHECK_EQ(0u, arg_count); | 568 DCHECK_EQ(0u, arg_count); |
677 first_arg = Register(0); | 569 first_arg = Register(0); |
678 } | 570 } |
679 Bytecode bytecode = IntrinsicsHelper::IsSupported(function_id) | 571 Bytecode bytecode = IntrinsicsHelper::IsSupported(function_id) |
680 ? Bytecode::kInvokeIntrinsic | 572 ? Bytecode::kInvokeIntrinsic |
681 : Bytecode::kCallRuntime; | 573 : Bytecode::kCallRuntime; |
682 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 574 Output(bytecode, static_cast<uint16_t>(function_id), |
683 first_arg.SizeOfOperand(), Bytecodes::SizeForUnsignedOperand(arg_count)); | 575 RegisterOperand(first_arg), UnsignedOperand(arg_count)); |
684 OutputScaled(bytecode, operand_scale, static_cast<uint16_t>(function_id), | |
685 RegisterOperand(first_arg), UnsignedOperand(arg_count)); | |
686 return *this; | 576 return *this; |
687 } | 577 } |
688 | 578 |
689 BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntimeForPair( | 579 BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntimeForPair( |
690 Runtime::FunctionId function_id, Register first_arg, size_t arg_count, | 580 Runtime::FunctionId function_id, Register first_arg, size_t arg_count, |
691 Register first_return) { | 581 Register first_return) { |
692 DCHECK_EQ(2, Runtime::FunctionForId(function_id)->result_size); | 582 DCHECK_EQ(2, Runtime::FunctionForId(function_id)->result_size); |
693 DCHECK(Bytecodes::SizeForUnsignedOperand(function_id) <= OperandSize::kShort); | 583 DCHECK(Bytecodes::SizeForUnsignedOperand(function_id) <= OperandSize::kShort); |
694 if (!first_arg.is_valid()) { | 584 if (!first_arg.is_valid()) { |
695 DCHECK_EQ(0u, arg_count); | 585 DCHECK_EQ(0u, arg_count); |
696 first_arg = Register(0); | 586 first_arg = Register(0); |
697 } | 587 } |
698 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 588 Output(Bytecode::kCallRuntimeForPair, static_cast<uint16_t>(function_id), |
699 first_arg.SizeOfOperand(), Bytecodes::SizeForUnsignedOperand(arg_count), | 589 RegisterOperand(first_arg), UnsignedOperand(arg_count), |
700 first_return.SizeOfOperand()); | 590 RegisterOperand(first_return)); |
701 OutputScaled(Bytecode::kCallRuntimeForPair, operand_scale, | |
702 static_cast<uint16_t>(function_id), RegisterOperand(first_arg), | |
703 UnsignedOperand(arg_count), RegisterOperand(first_return)); | |
704 return *this; | 591 return *this; |
705 } | 592 } |
706 | 593 |
707 BytecodeArrayBuilder& BytecodeArrayBuilder::CallJSRuntime( | 594 BytecodeArrayBuilder& BytecodeArrayBuilder::CallJSRuntime( |
708 int context_index, Register receiver_args, size_t receiver_args_count) { | 595 int context_index, Register receiver_args, size_t receiver_args_count) { |
709 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 596 Output(Bytecode::kCallJSRuntime, UnsignedOperand(context_index), |
710 Bytecodes::SizeForUnsignedOperand(context_index), | 597 RegisterOperand(receiver_args), UnsignedOperand(receiver_args_count)); |
711 receiver_args.SizeOfOperand(), | |
712 Bytecodes::SizeForUnsignedOperand(receiver_args_count)); | |
713 OutputScaled(Bytecode::kCallJSRuntime, operand_scale, | |
714 UnsignedOperand(context_index), RegisterOperand(receiver_args), | |
715 UnsignedOperand(receiver_args_count)); | |
716 return *this; | 598 return *this; |
717 } | 599 } |
718 | 600 |
719 BytecodeArrayBuilder& BytecodeArrayBuilder::Delete(Register object, | 601 BytecodeArrayBuilder& BytecodeArrayBuilder::Delete(Register object, |
720 LanguageMode language_mode) { | 602 LanguageMode language_mode) { |
721 OperandScale operand_scale = | 603 Output(BytecodeForDelete(language_mode), RegisterOperand(object)); |
722 Bytecodes::OperandSizesToScale(object.SizeOfOperand()); | |
723 OutputScaled(BytecodeForDelete(language_mode), operand_scale, | |
724 RegisterOperand(object)); | |
725 return *this; | 604 return *this; |
726 } | 605 } |
727 | 606 |
728 size_t BytecodeArrayBuilder::GetConstantPoolEntry(Handle<Object> object) { | 607 size_t BytecodeArrayBuilder::GetConstantPoolEntry(Handle<Object> object) { |
729 return constant_array_builder()->Insert(object); | 608 return constant_array_builder()->Insert(object); |
730 } | 609 } |
731 | 610 |
732 void BytecodeArrayBuilder::SetReturnPosition() { | 611 void BytecodeArrayBuilder::SetReturnPosition() { |
733 if (return_position_ == RelocInfo::kNoPosition) return; | 612 if (return_position_ == RelocInfo::kNoPosition) return; |
734 latest_source_info_.Update({return_position_, true}); | 613 latest_source_info_.Update({return_position_, true}); |
(...skipping 20 matching lines...) Expand all Loading... |
755 | 634 |
756 void BytecodeArrayBuilder::SetExpressionAsStatementPosition(Expression* expr) { | 635 void BytecodeArrayBuilder::SetExpressionAsStatementPosition(Expression* expr) { |
757 if (expr->position() == RelocInfo::kNoPosition) return; | 636 if (expr->position() == RelocInfo::kNoPosition) return; |
758 latest_source_info_.Update({expr->position(), true}); | 637 latest_source_info_.Update({expr->position(), true}); |
759 } | 638 } |
760 | 639 |
761 bool BytecodeArrayBuilder::TemporaryRegisterIsLive(Register reg) const { | 640 bool BytecodeArrayBuilder::TemporaryRegisterIsLive(Register reg) const { |
762 return temporary_register_allocator()->RegisterIsLive(reg); | 641 return temporary_register_allocator()->RegisterIsLive(reg); |
763 } | 642 } |
764 | 643 |
765 bool BytecodeArrayBuilder::OperandIsValid(Bytecode bytecode, | |
766 OperandScale operand_scale, | |
767 int operand_index, | |
768 uint32_t operand_value) const { | |
769 OperandSize operand_size = | |
770 Bytecodes::GetOperandSize(bytecode, operand_index, operand_scale); | |
771 OperandType operand_type = Bytecodes::GetOperandType(bytecode, operand_index); | |
772 switch (operand_type) { | |
773 case OperandType::kNone: | |
774 return false; | |
775 case OperandType::kRegCount: { | |
776 if (operand_index > 0) { | |
777 OperandType previous_operand_type = | |
778 Bytecodes::GetOperandType(bytecode, operand_index - 1); | |
779 if (previous_operand_type != OperandType::kMaybeReg && | |
780 previous_operand_type != OperandType::kReg) { | |
781 return false; | |
782 } | |
783 } | |
784 } // Fall-through | |
785 case OperandType::kFlag8: | |
786 case OperandType::kIdx: | |
787 case OperandType::kRuntimeId: | |
788 case OperandType::kImm: { | |
789 size_t unsigned_value = static_cast<size_t>(operand_value); | |
790 return Bytecodes::SizeForUnsignedOperand(unsigned_value) <= operand_size; | |
791 } | |
792 case OperandType::kMaybeReg: | |
793 if (RegisterFromOperand(operand_value) == Register(0)) { | |
794 return true; | |
795 } | |
796 // Fall-through to kReg case. | |
797 case OperandType::kReg: | |
798 case OperandType::kRegOut: { | |
799 Register reg = RegisterFromOperand(operand_value); | |
800 return RegisterIsValid(reg, operand_size); | |
801 } | |
802 case OperandType::kRegOutPair: | |
803 case OperandType::kRegPair: { | |
804 Register reg0 = RegisterFromOperand(operand_value); | |
805 Register reg1 = Register(reg0.index() + 1); | |
806 // The size of reg1 is immaterial. | |
807 return RegisterIsValid(reg0, operand_size) && | |
808 RegisterIsValid(reg1, OperandSize::kQuad); | |
809 } | |
810 case OperandType::kRegOutTriple: { | |
811 Register reg0 = RegisterFromOperand(operand_value); | |
812 Register reg1 = Register(reg0.index() + 1); | |
813 Register reg2 = Register(reg0.index() + 2); | |
814 // The size of reg1 and reg2 is immaterial. | |
815 return RegisterIsValid(reg0, operand_size) && | |
816 RegisterIsValid(reg1, OperandSize::kQuad) && | |
817 RegisterIsValid(reg2, OperandSize::kQuad); | |
818 } | |
819 } | |
820 UNREACHABLE(); | |
821 return false; | |
822 } | |
823 | |
824 bool BytecodeArrayBuilder::RegisterIsValid(Register reg, | |
825 OperandSize reg_size) const { | |
826 if (!reg.is_valid()) { | |
827 return false; | |
828 } | |
829 | |
830 if (reg.SizeOfOperand() > reg_size) { | |
831 return false; | |
832 } | |
833 | |
834 if (reg.is_current_context() || reg.is_function_closure() || | |
835 reg.is_new_target()) { | |
836 return true; | |
837 } else if (reg.is_parameter()) { | |
838 int parameter_index = reg.ToParameterIndex(parameter_count()); | |
839 return parameter_index >= 0 && parameter_index < parameter_count(); | |
840 } else if (reg.index() < fixed_register_count()) { | |
841 return true; | |
842 } else { | |
843 return TemporaryRegisterIsLive(reg); | |
844 } | |
845 } | |
846 | |
847 // static | 644 // static |
848 Bytecode BytecodeArrayBuilder::BytecodeForBinaryOperation(Token::Value op) { | 645 Bytecode BytecodeArrayBuilder::BytecodeForBinaryOperation(Token::Value op) { |
849 switch (op) { | 646 switch (op) { |
850 case Token::Value::ADD: | 647 case Token::Value::ADD: |
851 return Bytecode::kAdd; | 648 return Bytecode::kAdd; |
852 case Token::Value::SUB: | 649 case Token::Value::SUB: |
853 return Bytecode::kSub; | 650 return Bytecode::kSub; |
854 case Token::Value::MUL: | 651 case Token::Value::MUL: |
855 return Bytecode::kMul; | 652 return Bytecode::kMul; |
856 case Token::Value::DIV: | 653 case Token::Value::DIV: |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1011 case TailCallMode::kDisallow: | 808 case TailCallMode::kDisallow: |
1012 return Bytecode::kCall; | 809 return Bytecode::kCall; |
1013 case TailCallMode::kAllow: | 810 case TailCallMode::kAllow: |
1014 return Bytecode::kTailCall; | 811 return Bytecode::kTailCall; |
1015 default: | 812 default: |
1016 UNREACHABLE(); | 813 UNREACHABLE(); |
1017 } | 814 } |
1018 return Bytecode::kIllegal; | 815 return Bytecode::kIllegal; |
1019 } | 816 } |
1020 | 817 |
1021 uint32_t BytecodeArrayBuilder::RegisterOperand(Register reg) { | |
1022 return static_cast<uint32_t>(reg.ToOperand()); | |
1023 } | |
1024 | |
1025 Register BytecodeArrayBuilder::RegisterFromOperand(uint32_t operand) { | |
1026 return Register::FromOperand(static_cast<int32_t>(operand)); | |
1027 } | |
1028 | |
1029 uint32_t BytecodeArrayBuilder::SignedOperand(int value, OperandSize size) { | |
1030 switch (size) { | |
1031 case OperandSize::kByte: | |
1032 return static_cast<uint8_t>(value & 0xff); | |
1033 case OperandSize::kShort: | |
1034 return static_cast<uint16_t>(value & 0xffff); | |
1035 case OperandSize::kQuad: | |
1036 return static_cast<uint32_t>(value); | |
1037 case OperandSize::kNone: | |
1038 UNREACHABLE(); | |
1039 } | |
1040 return 0; | |
1041 } | |
1042 | |
1043 uint32_t BytecodeArrayBuilder::UnsignedOperand(int value) { | |
1044 DCHECK_GE(value, 0); | |
1045 return static_cast<uint32_t>(value); | |
1046 } | |
1047 | |
1048 uint32_t BytecodeArrayBuilder::UnsignedOperand(size_t value) { | |
1049 DCHECK_LE(value, kMaxUInt32); | |
1050 return static_cast<uint32_t>(value); | |
1051 } | |
1052 | |
1053 } // namespace interpreter | 818 } // namespace interpreter |
1054 } // namespace internal | 819 } // namespace internal |
1055 } // namespace v8 | 820 } // namespace v8 |
OLD | NEW |