| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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/ast/scopes.h" | 7 #include "src/ast/scopes.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 345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 } else { \ | 356 } else { \ |
| 357 if (instr->InputAt(1)->IsRegister()) { \ | 357 if (instr->InputAt(1)->IsRegister()) { \ |
| 358 __ asm_instr(i.InputRegister(0), i.InputRegister(1)); \ | 358 __ asm_instr(i.InputRegister(0), i.InputRegister(1)); \ |
| 359 } else { \ | 359 } else { \ |
| 360 __ asm_instr(i.InputRegister(0), i.InputOperand(1)); \ | 360 __ asm_instr(i.InputRegister(0), i.InputOperand(1)); \ |
| 361 } \ | 361 } \ |
| 362 } \ | 362 } \ |
| 363 } \ | 363 } \ |
| 364 } while (0) | 364 } while (0) |
| 365 | 365 |
| 366 #define ASSEMBLE_IEEE754_UNOP(name) \ |
| 367 do { \ |
| 368 /* Pass one double as argument on the stack.*/ \ |
| 369 __ PrepareCallCFunction(2, eax); \ |
| 370 __ movsd(Operand(esp, 0 * kDoubleSize), i.InputDoubleRegister(0)); \ |
| 371 __ CallCFunction(ExternalReference::ieee754_##name##_function(isolate()), \ |
| 372 2); \ |
| 373 /* Return value is in st(0) on ia32. */ \ |
| 374 /* Store it into the result register. */ \ |
| 375 __ sub(esp, Immediate(kDoubleSize)); \ |
| 376 __ fstp_d(Operand(esp, 0)); \ |
| 377 __ movsd(i.OutputDoubleRegister(), Operand(esp, 0)); \ |
| 378 __ add(esp, Immediate(kDoubleSize)); \ |
| 379 } while (false) |
| 380 |
| 366 void CodeGenerator::AssembleDeconstructFrame() { | 381 void CodeGenerator::AssembleDeconstructFrame() { |
| 367 __ mov(esp, ebp); | 382 __ mov(esp, ebp); |
| 368 __ pop(ebp); | 383 __ pop(ebp); |
| 369 } | 384 } |
| 370 | 385 |
| 371 void CodeGenerator::AssembleDeconstructActivationRecord(int stack_param_delta) { | 386 void CodeGenerator::AssembleDeconstructActivationRecord(int stack_param_delta) { |
| 372 int sp_slot_delta = TailCallFrameStackSlotDelta(stack_param_delta); | 387 int sp_slot_delta = TailCallFrameStackSlotDelta(stack_param_delta); |
| 373 if (sp_slot_delta > 0) { | 388 if (sp_slot_delta > 0) { |
| 374 __ add(esp, Immediate(sp_slot_delta * kPointerSize)); | 389 __ add(esp, Immediate(sp_slot_delta * kPointerSize)); |
| 375 } | 390 } |
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 610 frame_access_state()->GetFrameOffset(i.InputInt32(0)); | 625 frame_access_state()->GetFrameOffset(i.InputInt32(0)); |
| 611 Register base; | 626 Register base; |
| 612 if (offset.from_stack_pointer()) { | 627 if (offset.from_stack_pointer()) { |
| 613 base = esp; | 628 base = esp; |
| 614 } else { | 629 } else { |
| 615 base = ebp; | 630 base = ebp; |
| 616 } | 631 } |
| 617 __ lea(i.OutputRegister(), Operand(base, offset.offset())); | 632 __ lea(i.OutputRegister(), Operand(base, offset.offset())); |
| 618 break; | 633 break; |
| 619 } | 634 } |
| 620 case kIeee754Float64Log: { | 635 case kIeee754Float64Log: |
| 621 // Pass one double as argument on the stack. | 636 ASSEMBLE_IEEE754_UNOP(log); |
| 622 __ PrepareCallCFunction(2, eax); | |
| 623 __ movsd(Operand(esp, 0 * kDoubleSize), i.InputDoubleRegister(0)); | |
| 624 __ CallCFunction(ExternalReference::ieee754_log_function(isolate()), 2); | |
| 625 // Return value is in st(0) on ia32. | |
| 626 // Store it into the result register. | |
| 627 __ sub(esp, Immediate(kDoubleSize)); | |
| 628 __ fstp_d(Operand(esp, 0)); | |
| 629 __ movsd(i.OutputDoubleRegister(), Operand(esp, 0)); | |
| 630 __ add(esp, Immediate(kDoubleSize)); | |
| 631 break; | 637 break; |
| 632 } | 638 case kIeee754Float64Log1p: |
| 639 ASSEMBLE_IEEE754_UNOP(log1p); |
| 640 break; |
| 633 case kIA32Add: | 641 case kIA32Add: |
| 634 if (HasImmediateInput(instr, 1)) { | 642 if (HasImmediateInput(instr, 1)) { |
| 635 __ add(i.InputOperand(0), i.InputImmediate(1)); | 643 __ add(i.InputOperand(0), i.InputImmediate(1)); |
| 636 } else { | 644 } else { |
| 637 __ add(i.InputRegister(0), i.InputOperand(1)); | 645 __ add(i.InputRegister(0), i.InputOperand(1)); |
| 638 } | 646 } |
| 639 break; | 647 break; |
| 640 case kIA32And: | 648 case kIA32And: |
| 641 if (HasImmediateInput(instr, 1)) { | 649 if (HasImmediateInput(instr, 1)) { |
| 642 __ and_(i.InputOperand(0), i.InputImmediate(1)); | 650 __ and_(i.InputOperand(0), i.InputImmediate(1)); |
| (...skipping 1332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1975 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; | 1983 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; |
| 1976 __ Nop(padding_size); | 1984 __ Nop(padding_size); |
| 1977 } | 1985 } |
| 1978 } | 1986 } |
| 1979 | 1987 |
| 1980 #undef __ | 1988 #undef __ |
| 1981 | 1989 |
| 1982 } // namespace compiler | 1990 } // namespace compiler |
| 1983 } // namespace internal | 1991 } // namespace internal |
| 1984 } // namespace v8 | 1992 } // namespace v8 |
| OLD | NEW |