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