Cleanup: use xorps to zero out an xmm register on ia32 too.
Encoding is one byte shorter. R=lrn@chromium.org BUG= TEST= Review URL: http://codereview.chromium.org/6910021 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@7760 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
5197bff4f2
commit
eda2a0d4d2
@ -32,7 +32,7 @@
|
||||
|
||||
// The original source code covered by the above license above has been modified
|
||||
// significantly by Google Inc.
|
||||
// Copyright 2010 the V8 project authors. All rights reserved.
|
||||
// Copyright 2011 the V8 project authors. All rights reserved.
|
||||
|
||||
#include "v8.h"
|
||||
|
||||
@ -2258,6 +2258,15 @@ void Assembler::xorpd(XMMRegister dst, XMMRegister src) {
|
||||
}
|
||||
|
||||
|
||||
void Assembler::xorps(XMMRegister dst, XMMRegister src) {
|
||||
EnsureSpace ensure_space(this);
|
||||
last_pc_ = pc_;
|
||||
EMIT(0x0F);
|
||||
EMIT(0x57);
|
||||
emit_sse_operand(dst, src);
|
||||
}
|
||||
|
||||
|
||||
void Assembler::sqrtsd(XMMRegister dst, XMMRegister src) {
|
||||
EnsureSpace ensure_space(this);
|
||||
last_pc_ = pc_;
|
||||
|
@ -954,6 +954,7 @@ class Assembler : public AssemblerBase {
|
||||
void mulsd(XMMRegister dst, XMMRegister src);
|
||||
void divsd(XMMRegister dst, XMMRegister src);
|
||||
void xorpd(XMMRegister dst, XMMRegister src);
|
||||
void xorps(XMMRegister dst, XMMRegister src);
|
||||
void sqrtsd(XMMRegister dst, XMMRegister src);
|
||||
|
||||
void andpd(XMMRegister dst, XMMRegister src);
|
||||
|
@ -2880,7 +2880,7 @@ void MathPowStub::Generate(MacroAssembler* masm) {
|
||||
|
||||
// Calculates reciprocal of square root.
|
||||
// sqrtsd returns -0 when input is -0. ECMA spec requires +0.
|
||||
__ xorpd(xmm1, xmm1);
|
||||
__ xorps(xmm1, xmm1);
|
||||
__ addsd(xmm1, xmm0);
|
||||
__ sqrtsd(xmm1, xmm1);
|
||||
__ divsd(xmm3, xmm1);
|
||||
@ -2897,7 +2897,7 @@ void MathPowStub::Generate(MacroAssembler* masm) {
|
||||
__ j(not_equal, &call_runtime);
|
||||
// Calculates square root.
|
||||
// sqrtsd returns -0 when input is -0. ECMA spec requires +0.
|
||||
__ xorpd(xmm1, xmm1);
|
||||
__ xorps(xmm1, xmm1);
|
||||
__ addsd(xmm1, xmm0);
|
||||
__ sqrtsd(xmm1, xmm1);
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
// Copyright 2007-2008 the V8 project authors. All rights reserved.
|
||||
// Copyright 2011 the V8 project authors. All rights reserved.
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
@ -981,6 +981,14 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer,
|
||||
NameOfXMMRegister(regop),
|
||||
NameOfXMMRegister(rm));
|
||||
data++;
|
||||
} else if (f0byte == 0x57) {
|
||||
data += 2;
|
||||
int mod, regop, rm;
|
||||
get_modrm(*data, &mod, ®op, &rm);
|
||||
AppendToBuffer("xorps %s,%s",
|
||||
NameOfXMMRegister(regop),
|
||||
NameOfXMMRegister(rm));
|
||||
data++;
|
||||
} else if ((f0byte & 0xF0) == 0x80) {
|
||||
data += JumpConditional(data, branch_hint);
|
||||
} else if (f0byte == 0xBE || f0byte == 0xBF || f0byte == 0xB6 ||
|
||||
|
@ -2794,7 +2794,7 @@ void FullCodeGenerator::EmitRandomHeapNumber(ZoneList<Expression*>* args) {
|
||||
__ movd(xmm1, Operand(ebx));
|
||||
__ movd(xmm0, Operand(eax));
|
||||
__ cvtss2sd(xmm1, xmm1);
|
||||
__ pxor(xmm0, xmm1);
|
||||
__ xorps(xmm0, xmm1);
|
||||
__ subsd(xmm0, xmm1);
|
||||
__ movdbl(FieldOperand(edi, HeapNumber::kValueOffset), xmm0);
|
||||
} else {
|
||||
|
@ -1139,7 +1139,7 @@ void LCodeGen::DoConstantD(LConstantD* instr) {
|
||||
// Use xor to produce +0.0 in a fast and compact way, but avoid to
|
||||
// do so if the constant is -0.0.
|
||||
if (BitCast<uint64_t, double>(v) == 0) {
|
||||
__ xorpd(res, res);
|
||||
__ xorps(res, res);
|
||||
} else {
|
||||
Register temp = ToRegister(instr->TempAt(0));
|
||||
uint64_t int_val = BitCast<uint64_t, double>(v);
|
||||
@ -1153,7 +1153,7 @@ void LCodeGen::DoConstantD(LConstantD* instr) {
|
||||
__ Set(temp, Immediate(upper));
|
||||
__ pinsrd(res, Operand(temp), 1);
|
||||
} else {
|
||||
__ xorpd(res, res);
|
||||
__ xorps(res, res);
|
||||
__ Set(temp, Immediate(upper));
|
||||
__ pinsrd(res, Operand(temp), 1);
|
||||
}
|
||||
@ -1343,7 +1343,7 @@ void LCodeGen::DoBranch(LBranch* instr) {
|
||||
EmitBranch(true_block, false_block, not_zero);
|
||||
} else if (r.IsDouble()) {
|
||||
XMMRegister reg = ToDoubleRegister(instr->InputAt(0));
|
||||
__ xorpd(xmm0, xmm0);
|
||||
__ xorps(xmm0, xmm0);
|
||||
__ ucomisd(reg, xmm0);
|
||||
EmitBranch(true_block, false_block, not_equal);
|
||||
} else {
|
||||
@ -2720,7 +2720,7 @@ void LCodeGen::DoMathAbs(LUnaryMathOperation* instr) {
|
||||
if (r.IsDouble()) {
|
||||
XMMRegister scratch = xmm0;
|
||||
XMMRegister input_reg = ToDoubleRegister(instr->InputAt(0));
|
||||
__ pxor(scratch, scratch);
|
||||
__ xorps(scratch, scratch);
|
||||
__ subsd(scratch, input_reg);
|
||||
__ pand(input_reg, scratch);
|
||||
} else if (r.IsInteger32()) {
|
||||
@ -2742,7 +2742,7 @@ void LCodeGen::DoMathFloor(LUnaryMathOperation* instr) {
|
||||
XMMRegister xmm_scratch = xmm0;
|
||||
Register output_reg = ToRegister(instr->result());
|
||||
XMMRegister input_reg = ToDoubleRegister(instr->InputAt(0));
|
||||
__ xorpd(xmm_scratch, xmm_scratch); // Zero the register.
|
||||
__ xorps(xmm_scratch, xmm_scratch); // Zero the register.
|
||||
__ ucomisd(input_reg, xmm_scratch);
|
||||
|
||||
if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) {
|
||||
@ -2818,7 +2818,7 @@ void LCodeGen::DoMathPowHalf(LUnaryMathOperation* instr) {
|
||||
XMMRegister xmm_scratch = xmm0;
|
||||
XMMRegister input_reg = ToDoubleRegister(instr->InputAt(0));
|
||||
ASSERT(ToDoubleRegister(instr->result()).is(input_reg));
|
||||
__ xorpd(xmm_scratch, xmm_scratch);
|
||||
__ xorps(xmm_scratch, xmm_scratch);
|
||||
__ addsd(input_reg, xmm_scratch); // Convert -0 to +0.
|
||||
__ sqrtsd(input_reg, input_reg);
|
||||
}
|
||||
@ -2888,7 +2888,7 @@ void LCodeGen::DoMathLog(LUnaryMathOperation* instr) {
|
||||
ASSERT(instr->InputAt(0)->Equals(instr->result()));
|
||||
XMMRegister input_reg = ToDoubleRegister(instr->InputAt(0));
|
||||
NearLabel positive, done, zero, negative;
|
||||
__ xorpd(xmm0, xmm0);
|
||||
__ xorps(xmm0, xmm0);
|
||||
__ ucomisd(input_reg, xmm0);
|
||||
__ j(above, &positive);
|
||||
__ j(equal, &zero);
|
||||
|
@ -3597,7 +3597,7 @@ void LCodeGen::DoDoubleToI(LDoubleToI* instr) {
|
||||
__ cvttsd2siq(result_reg, input_reg);
|
||||
__ movq(kScratchRegister, V8_INT64_C(0x8000000000000000), RelocInfo::NONE);
|
||||
__ cmpq(result_reg, kScratchRegister);
|
||||
DeoptimizeIf(equal, instr->environment());
|
||||
DeoptimizeIf(equal, instr->environment());
|
||||
} else {
|
||||
__ cvttsd2si(result_reg, input_reg);
|
||||
__ cvtlsi2sd(xmm0, result_reg);
|
||||
|
Loading…
Reference in New Issue
Block a user