Chromium Code Reviews| Index: src/mips/assembler-mips.h |
| =================================================================== |
| --- src/mips/assembler-mips.h (revision 4259) |
| +++ src/mips/assembler-mips.h (working copy) |
| @@ -139,7 +139,10 @@ |
| ASSERT(is_valid()); |
| return 1 << code_; |
| } |
| - |
| + void setcode(int f) { |
|
Søren Thygesen Gjesse
2010/05/25 09:00:56
setcode -> set_code
|
| + code_ = f; |
| + ASSERT(is_valid()); |
| + } |
| // Unfortunately we can't make this private in a struct. |
| int code_; |
| }; |
| @@ -267,6 +270,52 @@ |
| }; |
| +// 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: |
| + // 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(CpuFeature f) { |
| + if (f == FPU && !FLAG_enable_fpu) return false; |
| + return (supported_ & (1u << f)) != 0; |
| + } |
| + |
| + // Check whether a feature is currently enabled. |
| + static bool IsEnabled(CpuFeature f) { |
| + return (enabled_ & (1u << f)) != 0; |
| + } |
| + |
| + // Enable a specified feature within a scope. |
| + class Scope BASE_EMBEDDED { |
| +#ifdef DEBUG |
| + public: |
| + explicit Scope(CpuFeature f) { |
| + ASSERT(CpuFeatures::IsSupported(f)); |
| + ASSERT(!Serializer::enabled() || |
| + (found_by_runtime_probing_ & (1u << f)) == 0); |
| + old_enabled_ = CpuFeatures::enabled_; |
| + CpuFeatures::enabled_ |= 1u << f; |
| + } |
| + ~Scope() { CpuFeatures::enabled_ = old_enabled_; } |
| + private: |
| + unsigned old_enabled_; |
| +#else |
| + public: |
| + explicit Scope(CpuFeature f) {} |
| +#endif |
| + }; |
| + |
| + private: |
| + static unsigned supported_; |
| + static unsigned enabled_; |
| + static unsigned found_by_runtime_probing_; |
| +}; |
| + |
| + |
| class Assembler : public Malloced { |
| public: |
| // Create an assembler. Instructions and relocation information are emitted |
| @@ -397,9 +446,7 @@ |
| //-------Data-processing-instructions--------- |
| // Arithmetic. |
| - void add(Register rd, Register rs, Register rt); |
| void addu(Register rd, Register rs, Register rt); |
| - void sub(Register rd, Register rs, Register rt); |
| void subu(Register rd, Register rs, Register rt); |
| void mult(Register rs, Register rt); |
| void multu(Register rs, Register rt); |
| @@ -407,7 +454,6 @@ |
| void divu(Register rs, Register rt); |
| void mul(Register rd, Register rs, Register rt); |
| - void addi(Register rd, Register rs, int32_t j); |
| void addiu(Register rd, Register rs, int32_t j); |
| // Logical. |
| @@ -434,8 +480,11 @@ |
| void lb(Register rd, const MemOperand& rs); |
| void lbu(Register rd, const MemOperand& rs); |
| + void lh(Register rd, const MemOperand& rs); |
| + void lhu(Register rd, const MemOperand& rs); |
| void lw(Register rd, const MemOperand& rs); |
| void sb(Register rd, const MemOperand& rs); |
| + void sh(Register rd, const MemOperand& rs); |
| void sw(Register rd, const MemOperand& rs); |
| @@ -460,7 +509,15 @@ |
| void slti(Register rd, Register rs, int32_t j); |
| void sltiu(Register rd, Register rs, int32_t j); |
| + // Conditional move. |
| + void movz(Register rd, Register rs, Register rt); |
| + void movn(Register rd, Register rs, Register rt); |
| + // Bit twiddling. |
| + void clz(Register rd, Register rs); |
| + void ins(Register rt, Register rs, uint16_t pos, uint16_t size); |
| + void ext(Register rt, Register rs, uint16_t pos, uint16_t size); |
| + |
| //--------Coprocessor-instructions---------------- |
| // Load, store, and move. |
| @@ -470,13 +527,18 @@ |
| void swc1(FPURegister fs, const MemOperand& dst); |
| void sdc1(FPURegister fs, const MemOperand& dst); |
| - // When paired with MTC1 to write a value to a 64-bit FPR, the MTC1 must be |
| - // executed first, followed by the MTHC1. |
| - void mtc1(FPURegister fs, Register rt); |
| - void mthc1(FPURegister fs, Register rt); |
| - void mfc1(FPURegister fs, Register rt); |
| - void mfhc1(FPURegister fs, Register rt); |
| + void mtc1(Register rt, FPURegister fs); |
| + void mfc1(Register rt, FPURegister fs); |
| + // Arithmetic. |
| + void add_d(FPURegister fd, FPURegister fs, FPURegister ft); |
| + void sub_d(FPURegister fd, FPURegister fs, FPURegister ft); |
| + void mul_d(FPURegister fd, FPURegister fs, FPURegister ft); |
| + void div_d(FPURegister fd, FPURegister fs, FPURegister ft); |
| + void abs_d(FPURegister fd, FPURegister fs); |
| + void mov_d(FPURegister fd, FPURegister fs); |
| + void neg_d(FPURegister fd, FPURegister fs); |
| + |
| // Conversion. |
| void cvt_w_s(FPURegister fd, FPURegister fs); |
| void cvt_w_d(FPURegister fd, FPURegister fs); |
| @@ -615,6 +677,13 @@ |
| SecondaryField func = NULLSF); |
| void GenInstrRegister(Opcode opcode, |
| + Register rs, |
| + Register rt, |
| + uint16_t msb, |
| + uint16_t lsb, |
| + SecondaryField func); |
| + |
| + void GenInstrRegister(Opcode opcode, |
| SecondaryField fmt, |
| FPURegister ft, |
| FPURegister fs, |