OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/compiler/code-generator.h" | 5 #include "src/compiler/code-generator.h" |
6 | 6 |
7 #include "src/arm/macro-assembler-arm.h" | 7 #include "src/arm/macro-assembler-arm.h" |
8 #include "src/compiler/code-generator-impl.h" | 8 #include "src/compiler/code-generator-impl.h" |
9 #include "src/compiler/gap-resolver.h" | 9 #include "src/compiler/gap-resolver.h" |
10 #include "src/compiler/node-matchers.h" | 10 #include "src/compiler/node-matchers.h" |
(...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
366 __ ldr(kScratchReg, FieldMemOperand(func, JSFunction::kContextOffset)); | 366 __ ldr(kScratchReg, FieldMemOperand(func, JSFunction::kContextOffset)); |
367 __ cmp(cp, kScratchReg); | 367 __ cmp(cp, kScratchReg); |
368 __ Assert(eq, kWrongFunctionContext); | 368 __ Assert(eq, kWrongFunctionContext); |
369 } | 369 } |
370 AssembleDeconstructActivationRecord(); | 370 AssembleDeconstructActivationRecord(); |
371 __ ldr(ip, FieldMemOperand(func, JSFunction::kCodeEntryOffset)); | 371 __ ldr(ip, FieldMemOperand(func, JSFunction::kCodeEntryOffset)); |
372 __ Jump(ip); | 372 __ Jump(ip); |
373 DCHECK_EQ(LeaveCC, i.OutputSBit()); | 373 DCHECK_EQ(LeaveCC, i.OutputSBit()); |
374 break; | 374 break; |
375 } | 375 } |
| 376 case kArchPrepareCallCFunction: { |
| 377 int const num_parameters = MiscField::decode(instr->opcode()); |
| 378 __ PrepareCallCFunction(num_parameters, kScratchReg); |
| 379 break; |
| 380 } |
| 381 case kArchCallCFunction: { |
| 382 int const num_parameters = MiscField::decode(instr->opcode()); |
| 383 if (instr->InputAt(0)->IsImmediate()) { |
| 384 ExternalReference ref = i.InputExternalReference(0); |
| 385 __ CallCFunction(ref, num_parameters); |
| 386 } else { |
| 387 Register func = i.InputRegister(0); |
| 388 __ CallCFunction(func, num_parameters); |
| 389 } |
| 390 break; |
| 391 } |
376 case kArchJmp: | 392 case kArchJmp: |
377 AssembleArchJump(i.InputRpo(0)); | 393 AssembleArchJump(i.InputRpo(0)); |
378 DCHECK_EQ(LeaveCC, i.OutputSBit()); | 394 DCHECK_EQ(LeaveCC, i.OutputSBit()); |
379 break; | 395 break; |
380 case kArchLookupSwitch: | 396 case kArchLookupSwitch: |
381 AssembleArchLookupSwitch(instr); | 397 AssembleArchLookupSwitch(instr); |
382 DCHECK_EQ(LeaveCC, i.OutputSBit()); | 398 DCHECK_EQ(LeaveCC, i.OutputSBit()); |
383 break; | 399 break; |
384 case kArchTableSwitch: | 400 case kArchTableSwitch: |
385 AssembleArchTableSwitch(instr); | 401 AssembleArchTableSwitch(instr); |
(...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
799 size_t index = 0; | 815 size_t index = 0; |
800 MemOperand operand = i.InputOffset(&index); | 816 MemOperand operand = i.InputOffset(&index); |
801 __ vstr(i.InputFloat64Register(index), operand); | 817 __ vstr(i.InputFloat64Register(index), operand); |
802 DCHECK_EQ(LeaveCC, i.OutputSBit()); | 818 DCHECK_EQ(LeaveCC, i.OutputSBit()); |
803 break; | 819 break; |
804 } | 820 } |
805 case kArmPush: | 821 case kArmPush: |
806 __ Push(i.InputRegister(0)); | 822 __ Push(i.InputRegister(0)); |
807 DCHECK_EQ(LeaveCC, i.OutputSBit()); | 823 DCHECK_EQ(LeaveCC, i.OutputSBit()); |
808 break; | 824 break; |
| 825 case kArmPoke: { |
| 826 int const slot = MiscField::decode(instr->opcode()); |
| 827 __ str(i.InputRegister(0), MemOperand(sp, slot * kPointerSize)); |
| 828 DCHECK_EQ(LeaveCC, i.OutputSBit()); |
| 829 break; |
| 830 } |
809 case kArmStoreWriteBarrier: { | 831 case kArmStoreWriteBarrier: { |
810 Register object = i.InputRegister(0); | 832 Register object = i.InputRegister(0); |
811 Register index = i.InputRegister(1); | 833 Register index = i.InputRegister(1); |
812 Register value = i.InputRegister(2); | 834 Register value = i.InputRegister(2); |
813 __ add(index, object, index); | 835 __ add(index, object, index); |
814 __ str(value, MemOperand(index)); | 836 __ str(value, MemOperand(index)); |
815 SaveFPRegsMode mode = | 837 SaveFPRegsMode mode = |
816 frame()->DidAllocateDoubleRegisters() ? kSaveFPRegs : kDontSaveFPRegs; | 838 frame()->DidAllocateDoubleRegisters() ? kSaveFPRegs : kDontSaveFPRegs; |
817 LinkRegisterStatus lr_status = kLRHasNotBeenSaved; | 839 LinkRegisterStatus lr_status = kLRHasNotBeenSaved; |
818 __ RecordWrite(object, index, value, lr_status, mode); | 840 __ RecordWrite(object, index, value, lr_status, mode); |
(...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1217 } | 1239 } |
1218 } | 1240 } |
1219 } | 1241 } |
1220 } | 1242 } |
1221 | 1243 |
1222 #undef __ | 1244 #undef __ |
1223 | 1245 |
1224 } // namespace compiler | 1246 } // namespace compiler |
1225 } // namespace internal | 1247 } // namespace internal |
1226 } // namespace v8 | 1248 } // namespace v8 |
OLD | NEW |