| 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)); }
|
|
|
|
|