Index: src/arm/assembler-arm.h |
=================================================================== |
--- src/arm/assembler-arm.h (revision 3208) |
+++ src/arm/assembler-arm.h (working copy) |
@@ -102,7 +102,58 @@ |
extern Register lr; |
extern Register pc; |
+// Support for VFP registers s0 to s32 (d0 to d16). |
+// Note that "sN:sM" is the same as "dN/2". |
+extern Register s0; |
+extern Register s1; |
+extern Register s2; |
+extern Register s3; |
+extern Register s4; |
+extern Register s5; |
+extern Register s6; |
+extern Register s7; |
+extern Register s8; |
+extern Register s9; |
+extern Register s10; |
+extern Register s11; |
+extern Register s12; |
+extern Register s13; |
+extern Register s14; |
+extern Register s15; |
+extern Register s16; |
+extern Register s17; |
+extern Register s18; |
+extern Register s19; |
+extern Register s20; |
+extern Register s21; |
+extern Register s22; |
+extern Register s23; |
+extern Register s24; |
+extern Register s25; |
+extern Register s26; |
+extern Register s27; |
+extern Register s28; |
+extern Register s29; |
+extern Register s30; |
+extern Register s31; |
+extern Register d0; |
+extern Register d1; |
+extern Register d2; |
+extern Register d3; |
+extern Register d4; |
+extern Register d5; |
+extern Register d6; |
+extern Register d7; |
+extern Register d8; |
+extern Register d9; |
+extern Register d10; |
+extern Register d11; |
+extern Register d12; |
+extern Register d13; |
+extern Register d14; |
+extern Register d15; |
+ |
// Coprocessor register |
struct CRegister { |
bool is_valid() const { return 0 <= code_ && code_ < 16; } |
@@ -372,7 +423,31 @@ |
friend class Assembler; |
}; |
+// CpuFeatures keeps track of which features are supported by the target CPU. |
+// Supported features must be enabled by a Scope before use. |
+class CpuFeatures : public AllStatic { |
+ public: |
+ enum Feature { VFP3 = 1 }; |
+ // Detect features of the target CPU. Set safe defaults if the serializer |
+ // is enabled (snapshots must be portable). |
+ static void Probe(); |
+ // Check whether a feature is supported by the target CPU. |
+ static bool IsSupported(Feature f) { |
+ if (f == VFP3 && !FLAG_enable_vfp3) return false; |
+ return (supported_ & (static_cast<uint64_t>(1) << f)) != 0; |
+ } |
+ // Check whether a feature is currently enabled. |
+ static bool IsEnabled(Feature f) { |
+ return (enabled_ & (static_cast<uint64_t>(1) << f)) != 0; |
+ } |
+ |
+ private: |
+ static uint64_t supported_; |
+ static uint64_t enabled_; |
+}; |
+ |
+ |
typedef int32_t Instr; |
@@ -655,6 +730,66 @@ |
void stc2(Coprocessor coproc, CRegister crd, Register base, int option, |
LFlag l = Short); // v5 and above |
+ // Support for VFP. |
+ // All these APIs support S0 to S31 and D0 to D15. |
+ // Currently these APIs do not support extended D registers, i.e, D16 to D31. |
+ // However, some simple modifications can allow |
+ // these APIs to support D16 to D31. |
+ |
+ void fmdrr(const Register dst, |
+ const Register src1, |
+ const Register src2, |
+ const SBit s = LeaveCC, |
+ const Condition cond = al); |
+ void fmrrd(const Register dst1, |
+ const Register dst2, |
+ const Register src, |
+ const SBit s = LeaveCC, |
+ const Condition cond = al); |
+ void fmsr(const Register dst, |
+ const Register src, |
+ const SBit s = LeaveCC, |
+ const Condition cond = al); |
+ void fmrs(const Register dst, |
+ const Register src, |
+ const SBit s = LeaveCC, |
+ const Condition cond = al); |
+ void fsitod(const Register dst, |
+ const Register src, |
+ const SBit s = LeaveCC, |
+ const Condition cond = al); |
+ void ftosid(const Register dst, |
+ const Register src, |
+ const SBit s = LeaveCC, |
+ const Condition cond = al); |
+ |
+ void faddd(const Register dst, |
+ const Register src1, |
+ const Register src2, |
+ const SBit s = LeaveCC, |
+ const Condition cond = al); |
+ void fsubd(const Register dst, |
+ const Register src1, |
+ const Register src2, |
+ const SBit s = LeaveCC, |
+ const Condition cond = al); |
+ void fmuld(const Register dst, |
+ const Register src1, |
+ const Register src2, |
+ const SBit s = LeaveCC, |
+ const Condition cond = al); |
+ void fdivd(const Register dst, |
+ const Register src1, |
+ const Register src2, |
+ const SBit s = LeaveCC, |
+ const Condition cond = al); |
+ void fcmp(const Register src1, |
+ const Register src2, |
+ const SBit s = LeaveCC, |
+ const Condition cond = al); |
+ void vmrs(const Register dst, |
+ const Condition cond = al); |
+ |
// Pseudo instructions |
void nop() { mov(r0, Operand(r0)); } |