2009-08-05 Zoltan Herczeg <zherczeg@inf.u-szeged.hu>
Reviewed by Gavin Barraclough.
Add floating point support for generic ARM port.
https://bugs.webkit.org/show_bug.cgi?id=24986
* assembler/ARMAssembler.cpp:
(JSC::ARMAssembler::doubleTransfer):
* assembler/ARMAssembler.h:
(JSC::ARM::):
(JSC::ARMAssembler::):
(JSC::ARMAssembler::faddd_r):
(JSC::ARMAssembler::fsubd_r):
(JSC::ARMAssembler::fmuld_r):
(JSC::ARMAssembler::fcmpd_r):
(JSC::ARMAssembler::fdtr_u):
(JSC::ARMAssembler::fdtr_d):
(JSC::ARMAssembler::fmsr_r):
(JSC::ARMAssembler::fsitod_r):
(JSC::ARMAssembler::fmstat):
* assembler/MacroAssemblerARM.h:
(JSC::MacroAssemblerARM::):
(JSC::MacroAssemblerARM::supportsFloatingPoint):
(JSC::MacroAssemblerARM::loadDouble):
(JSC::MacroAssemblerARM::storeDouble):
(JSC::MacroAssemblerARM::addDouble):
(JSC::MacroAssemblerARM::subDouble):
(JSC::MacroAssemblerARM::mulDouble):
(JSC::MacroAssemblerARM::convertInt32ToDouble):
(JSC::MacroAssemblerARM::branchDouble):
* jit/JIT.h:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@46832 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/JavaScriptCore/assembler/MacroAssemblerARM.h b/JavaScriptCore/assembler/MacroAssemblerARM.h
index 084e5e5..b04ed13 100644
--- a/JavaScriptCore/assembler/MacroAssemblerARM.h
+++ b/JavaScriptCore/assembler/MacroAssemblerARM.h
@@ -57,12 +57,11 @@
};
enum DoubleCondition {
- DoubleEqual, //FIXME
- DoubleNotEqual, //FIXME
- DoubleGreaterThan, //FIXME
- DoubleGreaterThanOrEqual, //FIXME
- DoubleLessThan, //FIXME
- DoubleLessThanOrEqual, //FIXME
+ DoubleEqual = ARMAssembler::EQ,
+ DoubleGreaterThan = ARMAssembler::GT,
+ DoubleGreaterThanOrEqual = ARMAssembler::GE,
+ DoubleLessThan = ARMAssembler::LT,
+ DoubleLessThanOrEqual = ARMAssembler::LE,
};
static const RegisterID stackPointerRegister = ARM::sp;
@@ -640,6 +639,7 @@
// Floating point operators
bool supportsFloatingPoint() const
{
+ // FIXME: should be a dynamic test: VFP, FPA, or nothing
return false;
}
@@ -650,74 +650,58 @@
void loadDouble(ImplicitAddress address, FPRegisterID dest)
{
- UNUSED_PARAM(address);
- UNUSED_PARAM(dest);
- ASSERT_NOT_REACHED();
+ m_assembler.doubleTransfer(true, dest, address.base, address.offset);
}
void storeDouble(FPRegisterID src, ImplicitAddress address)
{
- UNUSED_PARAM(src);
- UNUSED_PARAM(address);
- ASSERT_NOT_REACHED();
+ m_assembler.doubleTransfer(false, src, address.base, address.offset);
}
void addDouble(FPRegisterID src, FPRegisterID dest)
{
- UNUSED_PARAM(src);
- UNUSED_PARAM(dest);
- ASSERT_NOT_REACHED();
+ m_assembler.faddd_r(dest, dest, src);
}
void addDouble(Address src, FPRegisterID dest)
{
- UNUSED_PARAM(src);
- UNUSED_PARAM(dest);
- ASSERT_NOT_REACHED();
+ loadDouble(src, ARM::SD0);
+ addDouble(ARM::SD0, dest);
}
void subDouble(FPRegisterID src, FPRegisterID dest)
{
- UNUSED_PARAM(src);
- UNUSED_PARAM(dest);
- ASSERT_NOT_REACHED();
+ m_assembler.fsubd_r(dest, dest, src);
}
void subDouble(Address src, FPRegisterID dest)
{
- UNUSED_PARAM(src);
- UNUSED_PARAM(dest);
- ASSERT_NOT_REACHED();
+ loadDouble(src, ARM::SD0);
+ subDouble(ARM::SD0, dest);
}
void mulDouble(FPRegisterID src, FPRegisterID dest)
{
- UNUSED_PARAM(src);
- UNUSED_PARAM(dest);
- ASSERT_NOT_REACHED();
+ m_assembler.fmuld_r(dest, dest, src);
}
void mulDouble(Address src, FPRegisterID dest)
{
- UNUSED_PARAM(src);
- UNUSED_PARAM(dest);
- ASSERT_NOT_REACHED();
+ loadDouble(src, ARM::SD0);
+ mulDouble(ARM::SD0, dest);
}
void convertInt32ToDouble(RegisterID src, FPRegisterID dest)
{
- UNUSED_PARAM(src);
- UNUSED_PARAM(dest);
- ASSERT_NOT_REACHED();
+ m_assembler.fmsr_r(dest, src);
+ m_assembler.fsitod_r(dest, dest);
}
Jump branchDouble(DoubleCondition cond, FPRegisterID left, FPRegisterID right)
{
- UNUSED_PARAM(cond);
- UNUSED_PARAM(left);
- UNUSED_PARAM(right);
- ASSERT_NOT_REACHED();
- return jump();
+ m_assembler.fcmpd_r(left, right);
+ m_assembler.fmstat();
+ return Jump(m_assembler.jmp(static_cast<ARMAssembler::Condition>(cond)));
}
// Truncates 'src' to an integer, and places the resulting 'dest'.