Commit 2a635946 authored by whesse@chromium.org's avatar whesse@chromium.org

Commit fucomip change 197037 http://codereview.chromium.org/197037/show

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3100 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 88371e63
......@@ -1850,6 +1850,14 @@ void Assembler::fucompp() {
}
void Assembler::fucomip() {
EnsureSpace ensure_space(this);
last_pc_ = pc_;
EMIT(0xDF);
EMIT(0xE9);
}
void Assembler::fcompp() {
EnsureSpace ensure_space(this);
last_pc_ = pc_;
......
......@@ -702,6 +702,7 @@ class Assembler : public Malloced {
void ftst();
void fucomp(int i);
void fucompp();
void fucomip();
void fcompp();
void fnstsw_ax();
void fwait();
......
......@@ -6500,11 +6500,7 @@ void ToBooleanStub::Generate(MacroAssembler* masm) {
__ 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 @@ void GenericBinaryOpStub::Generate(MacroAssembler* masm) {
// 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);
}
......
......@@ -319,11 +319,17 @@ void MacroAssembler::CmpInstanceType(Register map, InstanceType type) {
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);
}
}
......
......@@ -2229,6 +2229,14 @@ void Assembler::fucompp() {
}
void Assembler::fucomip() {
EnsureSpace ensure_space(this);
last_pc_ = pc_;
emit(0xDF);
emit(0xE9);
}
void Assembler::fcompp() {
EnsureSpace ensure_space(this);
last_pc_ = pc_;
......
......@@ -1049,6 +1049,8 @@ class Assembler : public Malloced {
void ftst();
void fucomp(int i);
void fucompp();
void fucomip();
void fcompp();
void fnstsw_ax();
void fwait();
......
......@@ -6206,16 +6206,11 @@ void ToBooleanStub::Generate(MacroAssembler* masm) {
// 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 @@ void GenericBinaryOpStub::Generate(MacroAssembler* masm) {
// 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.
......
......@@ -1421,18 +1421,9 @@ void MacroAssembler::Ret() {
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();
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment