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
This commit is contained in:
parent
88371e63f6
commit
2a63594602
@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user