Revision: 3100
Author: [email protected]
Date: Wed Oct 21 02:24:25 2009
Log: Commit fucomip change 197037 http://codereview.chromium.org/197037/show
http://code.google.com/p/v8/source/detail?r=3100
Modified:
/branches/bleeding_edge/src/ia32/assembler-ia32.cc
/branches/bleeding_edge/src/ia32/assembler-ia32.h
/branches/bleeding_edge/src/ia32/codegen-ia32.cc
/branches/bleeding_edge/src/ia32/macro-assembler-ia32.cc
/branches/bleeding_edge/src/x64/assembler-x64.cc
/branches/bleeding_edge/src/x64/assembler-x64.h
/branches/bleeding_edge/src/x64/codegen-x64.cc
/branches/bleeding_edge/src/x64/macro-assembler-x64.cc
=======================================
--- /branches/bleeding_edge/src/ia32/assembler-ia32.cc Thu Oct 8 00:09:46
2009
+++ /branches/bleeding_edge/src/ia32/assembler-ia32.cc Wed Oct 21 02:24:25
2009
@@ -1848,6 +1848,14 @@
EMIT(0xDA);
EMIT(0xE9);
}
+
+
+void Assembler::fucomip() {
+ EnsureSpace ensure_space(this);
+ last_pc_ = pc_;
+ EMIT(0xDF);
+ EMIT(0xE9);
+}
void Assembler::fcompp() {
=======================================
--- /branches/bleeding_edge/src/ia32/assembler-ia32.h Thu Oct 8 07:27:46
2009
+++ /branches/bleeding_edge/src/ia32/assembler-ia32.h Wed Oct 21 02:24:25
2009
@@ -702,6 +702,7 @@
void ftst();
void fucomp(int i);
void fucompp();
+ void fucomip();
void fcompp();
void fnstsw_ax();
void fwait();
=======================================
--- /branches/bleeding_edge/src/ia32/codegen-ia32.cc Tue Oct 20 08:26:17
2009
+++ /branches/bleeding_edge/src/ia32/codegen-ia32.cc Wed Oct 21 02:24:25
2009
@@ -6500,11 +6500,7 @@
__ j(not_equal, &true_result);
__ fldz();
__ fld_d(FieldOperand(eax, HeapNumber::kValueOffset));
- __ fucompp();
- __ push(eax);
- __ fnstsw_ax();
- __ sahf();
- __ pop(eax);
+ __ FCmp();
__ j(zero, &false_result);
// Fall through to |true_result|.
@@ -6908,18 +6904,14 @@
// Check if right operand is int32.
__ fist_s(Operand(esp, 0 * kPointerSize));
__ fild_s(Operand(esp, 0 * kPointerSize));
- __ fucompp();
- __ fnstsw_ax();
- __ sahf();
+ __ FCmp();
__ j(not_zero, &operand_conversion_failure);
__ j(parity_even, &operand_conversion_failure);
// Check if left operand is int32.
__ fist_s(Operand(esp, 1 * kPointerSize));
__ fild_s(Operand(esp, 1 * kPointerSize));
- __ fucompp();
- __ fnstsw_ax();
- __ sahf();
+ __ FCmp();
__ j(not_zero, &operand_conversion_failure);
__ j(parity_even, &operand_conversion_failure);
}
=======================================
--- /branches/bleeding_edge/src/ia32/macro-assembler-ia32.cc Tue Oct 20
08:26:17 2009
+++ /branches/bleeding_edge/src/ia32/macro-assembler-ia32.cc Wed Oct 21
02:24:25 2009
@@ -319,11 +319,17 @@
void MacroAssembler::FCmp() {
- fucompp();
- push(eax);
- fnstsw_ax();
- sahf();
- pop(eax);
+ if (CpuFeatures::IsSupported(CpuFeatures::CMOV)) {
+ fucomip();
+ ffree(0);
+ fincstp();
+ } else {
+ fucompp();
+ push(eax);
+ fnstsw_ax();
+ sahf();
+ pop(eax);
+ }
}
=======================================
--- /branches/bleeding_edge/src/x64/assembler-x64.cc Tue Oct 20 08:26:17
2009
+++ /branches/bleeding_edge/src/x64/assembler-x64.cc Wed Oct 21 02:24:25
2009
@@ -2227,6 +2227,14 @@
emit(0xDA);
emit(0xE9);
}
+
+
+void Assembler::fucomip() {
+ EnsureSpace ensure_space(this);
+ last_pc_ = pc_;
+ emit(0xDF);
+ emit(0xE9);
+}
void Assembler::fcompp() {
=======================================
--- /branches/bleeding_edge/src/x64/assembler-x64.h Tue Oct 20 08:26:17 2009
+++ /branches/bleeding_edge/src/x64/assembler-x64.h Wed Oct 21 02:24:25 2009
@@ -1049,6 +1049,8 @@
void ftst();
void fucomp(int i);
void fucompp();
+ void fucomip();
+
void fcompp();
void fnstsw_ax();
void fwait();
=======================================
--- /branches/bleeding_edge/src/x64/codegen-x64.cc Tue Oct 20 08:26:17 2009
+++ /branches/bleeding_edge/src/x64/codegen-x64.cc Wed Oct 21 02:24:25 2009
@@ -6206,16 +6206,11 @@
// These three cases set C3 when compared to zero in the FPU.
__ CompareRoot(rdx, Heap::kHeapNumberMapRootIndex);
__ j(not_equal, &true_result);
- // TODO(x64): Don't use fp stack, use MMX registers?
__ fldz(); // Load zero onto fp stack
// Load heap-number double value onto fp stack
__ fld_d(FieldOperand(rax, HeapNumber::kValueOffset));
- __ fucompp(); // Compare and pop both values.
- __ movq(kScratchRegister, rax);
- __ fnstsw_ax(); // Store fp status word in ax, no checking for
exceptions.
- __ testl(rax, Immediate(0x4000)); // Test FP condition flag C3, bit 16.
- __ movq(rax, kScratchRegister);
- __ j(not_zero, &false_result);
+ __ FCmp();
+ __ j(zero, &false_result);
// Fall through to |true_result|.
// Return 1/0 for true/false in rax.
@@ -7512,31 +7507,16 @@
// Check if right operand is int32.
__ fist_s(Operand(rsp, 0 * kPointerSize));
__ fild_s(Operand(rsp, 0 * kPointerSize));
- __ fucompp();
- __ fnstsw_ax();
- if (CpuFeatures::IsSupported(CpuFeatures::SAHF)) {
- __ sahf();
- __ j(not_zero, &operand_conversion_failure);
- __ j(parity_even, &operand_conversion_failure);
- } else {
- __ and_(rax, Immediate(0x4400));
- __ cmpl(rax, Immediate(0x4000));
- __ j(not_zero, &operand_conversion_failure);
- }
+ __ FCmp();
+ __ j(not_zero, &operand_conversion_failure);
+ __ j(parity_even, &operand_conversion_failure);
+
// Check if left operand is int32.
__ fist_s(Operand(rsp, 1 * kPointerSize));
__ fild_s(Operand(rsp, 1 * kPointerSize));
- __ fucompp();
- __ fnstsw_ax();
- if (CpuFeatures::IsSupported(CpuFeatures::SAHF)) {
- __ sahf();
- __ j(not_zero, &operand_conversion_failure);
- __ j(parity_even, &operand_conversion_failure);
- } else {
- __ and_(rax, Immediate(0x4400));
- __ cmpl(rax, Immediate(0x4000));
- __ j(not_zero, &operand_conversion_failure);
- }
+ __ FCmp();
+ __ j(not_zero, &operand_conversion_failure);
+ __ j(parity_even, &operand_conversion_failure);
}
// Get int32 operands and perform bitop.
=======================================
--- /branches/bleeding_edge/src/x64/macro-assembler-x64.cc Tue Oct 20
08:26:17 2009
+++ /branches/bleeding_edge/src/x64/macro-assembler-x64.cc Wed Oct 21
02:24:25 2009
@@ -1421,18 +1421,9 @@
void MacroAssembler::FCmp() {
- fucompp();
- push(rax);
- fnstsw_ax();
- if (CpuFeatures::IsSupported(CpuFeatures::SAHF)) {
- sahf();
- } else {
- shrl(rax, Immediate(8));
- and_(rax, Immediate(0xFF));
- push(rax);
- popfq();
- }
- pop(rax);
+ fucomip();
+ ffree(0);
+ fincstp();
}
--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---