From eda2a0d4d293773c16e4725fa3227fb9d7d4f5dc Mon Sep 17 00:00:00 2001 From: "ager@chromium.org" Date: Tue, 3 May 2011 12:00:54 +0000 Subject: [PATCH] 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 --- src/ia32/assembler-ia32.cc | 11 ++++++++++- src/ia32/assembler-ia32.h | 1 + src/ia32/code-stubs-ia32.cc | 4 ++-- src/ia32/disasm-ia32.cc | 10 +++++++++- src/ia32/full-codegen-ia32.cc | 2 +- src/ia32/lithium-codegen-ia32.cc | 14 +++++++------- src/x64/lithium-codegen-x64.cc | 2 +- 7 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/ia32/assembler-ia32.cc b/src/ia32/assembler-ia32.cc index 3f8bdc70a9..043eb2ef7a 100644 --- a/src/ia32/assembler-ia32.cc +++ b/src/ia32/assembler-ia32.cc @@ -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_; diff --git a/src/ia32/assembler-ia32.h b/src/ia32/assembler-ia32.h index c0d6531965..af41cb50ac 100644 --- a/src/ia32/assembler-ia32.h +++ b/src/ia32/assembler-ia32.h @@ -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); diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc index 777924b105..7af000ade2 100644 --- a/src/ia32/code-stubs-ia32.cc +++ b/src/ia32/code-stubs-ia32.cc @@ -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); diff --git a/src/ia32/disasm-ia32.cc b/src/ia32/disasm-ia32.cc index d1c869a2c2..7a59a4f62a 100644 --- a/src/ia32/disasm-ia32.cc +++ b/src/ia32/disasm-ia32.cc @@ -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 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 || diff --git a/src/ia32/full-codegen-ia32.cc b/src/ia32/full-codegen-ia32.cc index 7d3dea2a52..c46a869f3f 100644 --- a/src/ia32/full-codegen-ia32.cc +++ b/src/ia32/full-codegen-ia32.cc @@ -2794,7 +2794,7 @@ void FullCodeGenerator::EmitRandomHeapNumber(ZoneList* 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 { diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc index a7cdf06b2c..c94b6563c4 100644 --- a/src/ia32/lithium-codegen-ia32.cc +++ b/src/ia32/lithium-codegen-ia32.cc @@ -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(v) == 0) { - __ xorpd(res, res); + __ xorps(res, res); } else { Register temp = ToRegister(instr->TempAt(0)); uint64_t int_val = BitCast(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); diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc index 776403319d..388d69814d 100644 --- a/src/x64/lithium-codegen-x64.cc +++ b/src/x64/lithium-codegen-x64.cc @@ -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);