Index: src/mips/assembler-mips.h |
diff --git a/src/mips/assembler-mips.h b/src/mips/assembler-mips.h |
index 8469c1ca182b883a0a1c36a103f85a98a459e5f8..5cdf16ac4ae8435fca6b327e191f446de1c4ca33 100644 |
--- a/src/mips/assembler-mips.h |
+++ b/src/mips/assembler-mips.h |
@@ -328,6 +328,8 @@ const FPURegister f31 = { 31 }; |
#define kLithiumScratchReg2 s4 |
#define kLithiumScratchDouble f30 |
#define kDoubleRegZero f28 |
+// Used on mips32r6 for compare operations. |
+#define kDoubleCompareReg f31 |
// FPU (coprocessor 1) control registers. |
// Currently only FCSR (#31) is implemented. |
@@ -465,11 +467,20 @@ class Assembler : public AssemblerBase { |
// position. Links the label to the current position if it is still unbound. |
// Manages the jump elimination optimization if the second parameter is true. |
int32_t branch_offset(Label* L, bool jump_elimination_allowed); |
+ int32_t branch_offset_compact(Label* L, bool jump_elimination_allowed); |
+ int32_t branch_offset21(Label* L, bool jump_elimination_allowed); |
+ int32_t branch_offset21_compact(Label* L, bool jump_elimination_allowed); |
int32_t shifted_branch_offset(Label* L, bool jump_elimination_allowed) { |
int32_t o = branch_offset(L, jump_elimination_allowed); |
DCHECK((o & 3) == 0); // Assert the offset is aligned. |
return o >> 2; |
} |
+ int32_t shifted_branch_offset_compact(Label* L, |
+ bool jump_elimination_allowed) { |
+ int32_t o = branch_offset_compact(L, jump_elimination_allowed); |
+ DCHECK((o & 3) == 0); // Assert the offset is aligned. |
+ return o >> 2; |
+ } |
uint32_t jump_address(Label* L); |
// Puts a labels target address at the given position. |
@@ -627,15 +638,99 @@ class Assembler : public AssemblerBase { |
beq(rs, rt, branch_offset(L, false) >> 2); |
} |
void bgez(Register rs, int16_t offset); |
+ void bgezc(Register rt, int16_t offset); |
+ void bgezc(Register rt, Label* L) { |
+ bgezc(rt, branch_offset_compact(L, false)>>2); |
+ } |
+ void bgeuc(Register rs, Register rt, int16_t offset); |
+ void bgeuc(Register rs, Register rt, Label* L) { |
+ bgeuc(rs, rt, branch_offset_compact(L, false)>>2); |
+ } |
+ void bgec(Register rs, Register rt, int16_t offset); |
+ void bgec(Register rs, Register rt, Label* L) { |
+ bgec(rs, rt, branch_offset_compact(L, false)>>2); |
+ } |
void bgezal(Register rs, int16_t offset); |
+ void bgezalc(Register rt, int16_t offset); |
+ void bgezalc(Register rt, Label* L) { |
+ bgezalc(rt, branch_offset_compact(L, false)>>2); |
+ } |
+ void bgezall(Register rs, int16_t offset); |
+ void bgezall(Register rs, Label* L) { |
+ bgezall(rs, branch_offset(L, false)>>2); |
+ } |
void bgtz(Register rs, int16_t offset); |
+ void bgtzc(Register rt, int16_t offset); |
+ void bgtzc(Register rt, Label* L) { |
+ bgtzc(rt, branch_offset_compact(L, false)>>2); |
+ } |
void blez(Register rs, int16_t offset); |
+ void blezc(Register rt, int16_t offset); |
+ void blezc(Register rt, Label* L) { |
+ blezc(rt, branch_offset_compact(L, false)>>2); |
+ } |
void bltz(Register rs, int16_t offset); |
+ void bltzc(Register rt, int16_t offset); |
+ void bltzc(Register rt, Label* L) { |
+ bltzc(rt, branch_offset_compact(L, false)>>2); |
+ } |
+ void bltuc(Register rs, Register rt, int16_t offset); |
+ void bltuc(Register rs, Register rt, Label* L) { |
+ bltuc(rs, rt, branch_offset_compact(L, false)>>2); |
+ } |
+ void bltc(Register rs, Register rt, int16_t offset); |
+ void bltc(Register rs, Register rt, Label* L) { |
+ bltc(rs, rt, branch_offset_compact(L, false)>>2); |
+ } |
void bltzal(Register rs, int16_t offset); |
+ void blezalc(Register rt, int16_t offset); |
+ void blezalc(Register rt, Label* L) { |
+ blezalc(rt, branch_offset_compact(L, false)>>2); |
+ } |
+ void bltzalc(Register rt, int16_t offset); |
+ void bltzalc(Register rt, Label* L) { |
+ bltzalc(rt, branch_offset_compact(L, false)>>2); |
+ } |
+ void bgtzalc(Register rt, int16_t offset); |
+ void bgtzalc(Register rt, Label* L) { |
+ bgtzalc(rt, branch_offset_compact(L, false)>>2); |
+ } |
+ void beqzalc(Register rt, int16_t offset); |
+ void beqzalc(Register rt, Label* L) { |
+ beqzalc(rt, branch_offset_compact(L, false)>>2); |
+ } |
+ void beqc(Register rs, Register rt, int16_t offset); |
+ void beqc(Register rs, Register rt, Label* L) { |
+ beqc(rs, rt, branch_offset_compact(L, false)>>2); |
+ } |
+ void beqzc(Register rs, int32_t offset); |
+ void beqzc(Register rs, Label* L) { |
+ beqzc(rs, branch_offset21_compact(L, false)>>2); |
+ } |
+ void bnezalc(Register rt, int16_t offset); |
+ void bnezalc(Register rt, Label* L) { |
+ bnezalc(rt, branch_offset_compact(L, false)>>2); |
+ } |
+ void bnec(Register rs, Register rt, int16_t offset); |
+ void bnec(Register rs, Register rt, Label* L) { |
+ bnec(rs, rt, branch_offset_compact(L, false)>>2); |
+ } |
+ void bnezc(Register rt, int32_t offset); |
+ void bnezc(Register rt, Label* L) { |
+ bnezc(rt, branch_offset21_compact(L, false)>>2); |
+ } |
void bne(Register rs, Register rt, int16_t offset); |
void bne(Register rs, Register rt, Label* L) { |
bne(rs, rt, branch_offset(L, false)>>2); |
} |
+ void bovc(Register rs, Register rt, int16_t offset); |
+ void bovc(Register rs, Register rt, Label* L) { |
+ bovc(rs, rt, branch_offset_compact(L, false)>>2); |
+ } |
+ void bnvc(Register rs, Register rt, int16_t offset); |
+ void bnvc(Register rs, Register rt, Label* L) { |
+ bnvc(rs, rt, branch_offset_compact(L, false)>>2); |
+ } |
// Never use the int16_t b(l)cond version with a branch offset |
// instead of using the Label* version. |
@@ -658,7 +753,14 @@ class Assembler : public AssemblerBase { |
void multu(Register rs, Register rt); |
void div(Register rs, Register rt); |
void divu(Register rs, Register rt); |
+ void div(Register rd, Register rs, Register rt); |
+ void divu(Register rd, Register rs, Register rt); |
+ void mod(Register rd, Register rs, Register rt); |
+ void modu(Register rd, Register rs, Register rt); |
void mul(Register rd, Register rs, Register rt); |
+ void muh(Register rd, Register rs, Register rt); |
+ void mulu(Register rd, Register rs, Register rt); |
+ void muhu(Register rd, Register rs, Register rt); |
void addiu(Register rd, Register rs, int32_t j); |
@@ -672,6 +774,7 @@ class Assembler : public AssemblerBase { |
void ori(Register rd, Register rs, int32_t j); |
void xori(Register rd, Register rs, int32_t j); |
void lui(Register rd, int32_t j); |
+ void aui(Register rs, Register rt, int32_t j); |
// Shifts. |
// Please note: sll(zero_reg, zero_reg, x) instructions are reserved as nop |
@@ -736,6 +839,15 @@ class Assembler : public AssemblerBase { |
void movt(Register rd, Register rs, uint16_t cc = 0); |
void movf(Register rd, Register rs, uint16_t cc = 0); |
+ void sel(SecondaryField fmt, FPURegister fd, FPURegister ft, |
+ FPURegister fs, uint8_t sel); |
+ void seleqz(Register rs, Register rt, Register rd); |
+ void seleqz(SecondaryField fmt, FPURegister fd, FPURegister ft, |
+ FPURegister fs); |
+ void selnez(Register rs, Register rt, Register rd); |
+ void selnez(SecondaryField fmt, FPURegister fd, FPURegister ft, |
+ FPURegister fs); |
+ |
// Bit twiddling. |
void clz(Register rd, Register rs); |
void ins_(Register rt, Register rs, uint16_t pos, uint16_t size); |
@@ -751,7 +863,10 @@ class Assembler : public AssemblerBase { |
void sdc1(FPURegister fs, const MemOperand& dst); |
void mtc1(Register rt, FPURegister fs); |
+ void mthc1(Register rt, FPURegister fs); |
+ |
void mfc1(Register rt, FPURegister fs); |
+ void mfhc1(Register rt, FPURegister fs); |
void ctc1(Register rt, FPUControlRegister fs); |
void cfc1(Register rt, FPUControlRegister fs); |
@@ -790,6 +905,11 @@ class Assembler : public AssemblerBase { |
void ceil_l_s(FPURegister fd, FPURegister fs); |
void ceil_l_d(FPURegister fd, FPURegister fs); |
+ void min(SecondaryField fmt, FPURegister fd, FPURegister ft, FPURegister fs); |
+ void mina(SecondaryField fmt, FPURegister fd, FPURegister ft, FPURegister fs); |
+ void max(SecondaryField fmt, FPURegister fd, FPURegister ft, FPURegister fs); |
+ void maxa(SecondaryField fmt, FPURegister fd, FPURegister ft, FPURegister fs); |
+ |
void cvt_s_w(FPURegister fd, FPURegister fs); |
void cvt_s_l(FPURegister fd, FPURegister fs); |
void cvt_s_d(FPURegister fd, FPURegister fs); |
@@ -798,7 +918,20 @@ class Assembler : public AssemblerBase { |
void cvt_d_l(FPURegister fd, FPURegister fs); |
void cvt_d_s(FPURegister fd, FPURegister fs); |
- // Conditions and branches. |
+ // Conditions and branches for MIPSr6. |
+ void cmp(FPUCondition cond, SecondaryField fmt, |
+ FPURegister fd, FPURegister ft, FPURegister fs); |
+ |
+ void bc1eqz(int16_t offset, FPURegister ft); |
+ void bc1eqz(Label* L, FPURegister ft) { |
+ bc1eqz(branch_offset(L, false)>>2, ft); |
+ } |
+ void bc1nez(int16_t offset, FPURegister ft); |
+ void bc1nez(Label* L, FPURegister ft) { |
+ bc1nez(branch_offset(L, false)>>2, ft); |
+ } |
+ |
+ // Conditions and branches for non MIPSr6. |
void c(FPUCondition cond, SecondaryField fmt, |
FPURegister ft, FPURegister fs, uint16_t cc = 0); |