Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(545)

Side by Side Diff: src/compiler/ia32/code-generator-ia32.cc

Issue 2065503002: [builtins] Introduce proper Float64Atan and Float64Atan2 operators. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: [WIP] Fix GCC/Win32. Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/compiler/code-assembler.h ('k') | src/compiler/ia32/instruction-selector-ia32.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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_BINOP(name) \
367 do { \
368 /* Pass two doubles as arguments on the stack. */ \
369 __ PrepareCallCFunction(4, eax); \
370 __ movsd(Operand(esp, 0 * kDoubleSize), i.InputDoubleRegister(0)); \
371 __ movsd(Operand(esp, 1 * kDoubleSize), i.InputDoubleRegister(1)); \
372 __ CallCFunction(ExternalReference::ieee754_##name##_function(isolate()), \
373 4); \
374 /* Return value is in st(0) on ia32. */ \
375 /* Store it into the result register. */ \
376 __ sub(esp, Immediate(kDoubleSize)); \
377 __ fstp_d(Operand(esp, 0)); \
378 __ movsd(i.OutputDoubleRegister(), Operand(esp, 0)); \
379 __ add(esp, Immediate(kDoubleSize)); \
380 } while (false)
381
366 #define ASSEMBLE_IEEE754_UNOP(name) \ 382 #define ASSEMBLE_IEEE754_UNOP(name) \
367 do { \ 383 do { \
368 /* Pass one double as argument on the stack.*/ \ 384 /* Pass one double as argument on the stack. */ \
369 __ PrepareCallCFunction(2, eax); \ 385 __ PrepareCallCFunction(2, eax); \
370 __ movsd(Operand(esp, 0 * kDoubleSize), i.InputDoubleRegister(0)); \ 386 __ movsd(Operand(esp, 0 * kDoubleSize), i.InputDoubleRegister(0)); \
371 __ CallCFunction(ExternalReference::ieee754_##name##_function(isolate()), \ 387 __ CallCFunction(ExternalReference::ieee754_##name##_function(isolate()), \
372 2); \ 388 2); \
373 /* Return value is in st(0) on ia32. */ \ 389 /* Return value is in st(0) on ia32. */ \
374 /* Store it into the result register. */ \ 390 /* Store it into the result register. */ \
375 __ sub(esp, Immediate(kDoubleSize)); \ 391 __ sub(esp, Immediate(kDoubleSize)); \
376 __ fstp_d(Operand(esp, 0)); \ 392 __ fstp_d(Operand(esp, 0)); \
377 __ movsd(i.OutputDoubleRegister(), Operand(esp, 0)); \ 393 __ movsd(i.OutputDoubleRegister(), Operand(esp, 0)); \
378 __ add(esp, Immediate(kDoubleSize)); \ 394 __ add(esp, Immediate(kDoubleSize)); \
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after
625 frame_access_state()->GetFrameOffset(i.InputInt32(0)); 641 frame_access_state()->GetFrameOffset(i.InputInt32(0));
626 Register base; 642 Register base;
627 if (offset.from_stack_pointer()) { 643 if (offset.from_stack_pointer()) {
628 base = esp; 644 base = esp;
629 } else { 645 } else {
630 base = ebp; 646 base = ebp;
631 } 647 }
632 __ lea(i.OutputRegister(), Operand(base, offset.offset())); 648 __ lea(i.OutputRegister(), Operand(base, offset.offset()));
633 break; 649 break;
634 } 650 }
651 case kIeee754Float64Atan:
652 ASSEMBLE_IEEE754_UNOP(atan);
653 break;
654 case kIeee754Float64Atan2:
655 ASSEMBLE_IEEE754_BINOP(atan2);
656 break;
635 case kIeee754Float64Log: 657 case kIeee754Float64Log:
636 ASSEMBLE_IEEE754_UNOP(log); 658 ASSEMBLE_IEEE754_UNOP(log);
637 break; 659 break;
638 case kIeee754Float64Log1p: 660 case kIeee754Float64Log1p:
639 ASSEMBLE_IEEE754_UNOP(log1p); 661 ASSEMBLE_IEEE754_UNOP(log1p);
640 break; 662 break;
641 case kIA32Add: 663 case kIA32Add:
642 if (HasImmediateInput(instr, 1)) { 664 if (HasImmediateInput(instr, 1)) {
643 __ add(i.InputOperand(0), i.InputImmediate(1)); 665 __ add(i.InputOperand(0), i.InputImmediate(1));
644 } else { 666 } else {
(...skipping 1338 matching lines...) Expand 10 before | Expand all | Expand 10 after
1983 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; 2005 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc;
1984 __ Nop(padding_size); 2006 __ Nop(padding_size);
1985 } 2007 }
1986 } 2008 }
1987 2009
1988 #undef __ 2010 #undef __
1989 2011
1990 } // namespace compiler 2012 } // namespace compiler
1991 } // namespace internal 2013 } // namespace internal
1992 } // namespace v8 2014 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/code-assembler.h ('k') | src/compiler/ia32/instruction-selector-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698