From f6cf2952ebda80eda64fd8ebb99801f8f43b993a Mon Sep 17 00:00:00 2001 From: Jacob Bramley Date: Wed, 11 May 2011 15:16:22 +0100 Subject: [PATCH] Add absDouble to the MacroAssembler interface, and abstract the 'x & -x' trick away as it is an x86-specific optimization. [bug 655260] [r=bhackett] --- js/src/assembler/assembler/ARMAssembler.h | 8 ++++++++ js/src/assembler/assembler/MacroAssemblerARM.h | 5 +++++ js/src/assembler/assembler/MacroAssemblerX86Common.h | 9 +++++++++ js/src/methodjit/FastBuiltins.cpp | 5 +---- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/js/src/assembler/assembler/ARMAssembler.h b/js/src/assembler/assembler/ARMAssembler.h index d60a2756c98..09d21adcb73 100644 --- a/js/src/assembler/assembler/ARMAssembler.h +++ b/js/src/assembler/assembler/ARMAssembler.h @@ -190,6 +190,7 @@ namespace JSC { FCPYD = 0x0eb00b40, FADDD = 0x0e300b00, FNEGD = 0x0eb10b40, + FABSD = 0x0eb00bc0, FDIVD = 0x0e800b00, FSUBD = 0x0e300b40, FMULD = 0x0e200b00, @@ -548,6 +549,13 @@ namespace JSC { m_buffer.putInt(static_cast(cc) | FNEGD | DD(dd) | DM(dm)); } + void fabsd_r(int dd, int dm, Condition cc = AL) + { + js::JaegerSpew(js::JSpew_Insns, + IPFX "%-15s %s, %s, %s, %s\n", MAYBE_PAD, "fabsd", nameFpRegD(dd), nameFpRegD(dm)); + m_buffer.putInt(static_cast(cc) | FABSD | DD(dd) | DM(dm)); + } + void fdivd_r(int dd, int dn, int dm, Condition cc = AL) { js::JaegerSpew(js::JSpew_Insns, diff --git a/js/src/assembler/assembler/MacroAssemblerARM.h b/js/src/assembler/assembler/MacroAssemblerARM.h index 7413411f450..47b3b6c14b4 100644 --- a/js/src/assembler/assembler/MacroAssemblerARM.h +++ b/js/src/assembler/assembler/MacroAssemblerARM.h @@ -1037,6 +1037,11 @@ public: m_assembler.fnegd_r(dest, src); } + void absDouble(FPRegisterID src, FPRegisterID dest) + { + m_assembler.fabsd_r(dest, src); + } + void sqrtDouble(FPRegisterID src, FPRegisterID dest) { m_assembler.fsqrtd_r(dest, src); diff --git a/js/src/assembler/assembler/MacroAssemblerX86Common.h b/js/src/assembler/assembler/MacroAssemblerX86Common.h index 5ba34a97a08..ee4cc310879 100644 --- a/js/src/assembler/assembler/MacroAssemblerX86Common.h +++ b/js/src/assembler/assembler/MacroAssemblerX86Common.h @@ -639,6 +639,15 @@ public: m_assembler.andpd_rr(src, dest); } + void absDouble(FPRegisterID src, FPRegisterID dest) + { + ASSERT(isSSE2Present()); + /* Compile abs(x) as x & -x. */ + zeroDouble(dest); + subDouble(src, dest); + andDouble(src, dest); + } + void convertInt32ToDouble(RegisterID src, FPRegisterID dest) { ASSERT(isSSE2Present()); diff --git a/js/src/methodjit/FastBuiltins.cpp b/js/src/methodjit/FastBuiltins.cpp index 3f34ee9229e..3c23460fafb 100644 --- a/js/src/methodjit/FastBuiltins.cpp +++ b/js/src/methodjit/FastBuiltins.cpp @@ -94,10 +94,7 @@ mjit::Compiler::compileMathAbsDouble(FrameEntry *arg) MaybeJump notNumber = loadDouble(arg, &fpReg, &allocate); JS_ASSERT(!notNumber.isSet()); - /* Compile abs(x) as x & -x. */ - masm.zeroDouble(fpResultReg); - masm.subDouble(fpReg, fpResultReg); - masm.andDouble(fpReg, fpResultReg); + masm.absDouble(fpReg, fpResultReg); if (allocate) frame.freeReg(fpReg);