Commit 2604c75e authored by Djordje.Pesic's avatar Djordje.Pesic Committed by Commit bot

MIPS: disabling rsqrt and recip for mips32r1

Disabling rsqrt and recip for mips32r1 in assembler, disassembler and simulator

Review URL: https://codereview.chromium.org/1221663006

Cr-Commit-Position: refs/heads/master@{#29425}
parent e32f9cfc
...@@ -2350,21 +2350,25 @@ void Assembler::sqrt_d(FPURegister fd, FPURegister fs) { ...@@ -2350,21 +2350,25 @@ void Assembler::sqrt_d(FPURegister fd, FPURegister fs) {
void Assembler::rsqrt_s(FPURegister fd, FPURegister fs) { void Assembler::rsqrt_s(FPURegister fd, FPURegister fs) {
DCHECK(IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6));
GenInstrRegister(COP1, S, f0, fs, fd, RSQRT_S); GenInstrRegister(COP1, S, f0, fs, fd, RSQRT_S);
} }
void Assembler::rsqrt_d(FPURegister fd, FPURegister fs) { void Assembler::rsqrt_d(FPURegister fd, FPURegister fs) {
DCHECK(IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6));
GenInstrRegister(COP1, D, f0, fs, fd, RSQRT_D); GenInstrRegister(COP1, D, f0, fs, fd, RSQRT_D);
} }
void Assembler::recip_d(FPURegister fd, FPURegister fs) { void Assembler::recip_d(FPURegister fd, FPURegister fs) {
DCHECK(IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6));
GenInstrRegister(COP1, D, f0, fs, fd, RECIP_D); GenInstrRegister(COP1, D, f0, fs, fd, RECIP_D);
} }
void Assembler::recip_s(FPURegister fd, FPURegister fs) { void Assembler::recip_s(FPURegister fd, FPURegister fs) {
DCHECK(IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6));
GenInstrRegister(COP1, S, f0, fs, fd, RECIP_S); GenInstrRegister(COP1, S, f0, fs, fd, RECIP_S);
} }
......
...@@ -2711,11 +2711,13 @@ void Simulator::DecodeTypeRegisterDRsType(Instruction* instr, ...@@ -2711,11 +2711,13 @@ void Simulator::DecodeTypeRegisterDRsType(Instruction* instr,
set_fpu_register_double(fd_reg, fast_sqrt(fs)); set_fpu_register_double(fd_reg, fast_sqrt(fs));
break; break;
case RSQRT_D: { case RSQRT_D: {
DCHECK(IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6));
double result = 1.0 / fast_sqrt(fs); double result = 1.0 / fast_sqrt(fs);
set_fpu_register_double(fd_reg, result); set_fpu_register_double(fd_reg, result);
break; break;
} }
case RECIP_D: { case RECIP_D: {
DCHECK(IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6));
double result = 1.0 / fs; double result = 1.0 / fs;
set_fpu_register_double(fd_reg, result); set_fpu_register_double(fd_reg, result);
break; break;
...@@ -3117,11 +3119,13 @@ void Simulator::DecodeTypeRegisterSRsType(Instruction* instr, ...@@ -3117,11 +3119,13 @@ void Simulator::DecodeTypeRegisterSRsType(Instruction* instr,
set_fpu_register_float(fd_reg, fast_sqrt(fs)); set_fpu_register_float(fd_reg, fast_sqrt(fs));
break; break;
case RSQRT_S: { case RSQRT_S: {
DCHECK(IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6));
float result = 1.0 / fast_sqrt(fs); float result = 1.0 / fast_sqrt(fs);
set_fpu_register_float(fd_reg, result); set_fpu_register_float(fd_reg, result);
break; break;
} }
case RECIP_S: { case RECIP_S: {
DCHECK(IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6));
float result = 1.0 / fs; float result = 1.0 / fs;
set_fpu_register_float(fd_reg, result); set_fpu_register_float(fd_reg, result);
break; break;
......
...@@ -2511,16 +2511,22 @@ TEST(sqrt_rsqrt_recip) { ...@@ -2511,16 +2511,22 @@ TEST(sqrt_rsqrt_recip) {
__ ldc1(f8, MemOperand(a0, offsetof(TestFloat, c)) ); __ ldc1(f8, MemOperand(a0, offsetof(TestFloat, c)) );
__ sqrt_s(f6, f2); __ sqrt_s(f6, f2);
__ sqrt_d(f12, f8); __ sqrt_d(f12, f8);
if (IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) {
__ rsqrt_d(f14, f8); __ rsqrt_d(f14, f8);
__ rsqrt_s(f16, f2); __ rsqrt_s(f16, f2);
__ recip_d(f18, f8); __ recip_d(f18, f8);
__ recip_s(f20, f2); __ recip_s(f20, f2);
}
__ swc1(f6, MemOperand(a0, offsetof(TestFloat, resultS)) ); __ swc1(f6, MemOperand(a0, offsetof(TestFloat, resultS)) );
__ sdc1(f12, MemOperand(a0, offsetof(TestFloat, resultD)) ); __ sdc1(f12, MemOperand(a0, offsetof(TestFloat, resultD)) );
if (IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) {
__ swc1(f16, MemOperand(a0, offsetof(TestFloat, resultS1)) ); __ swc1(f16, MemOperand(a0, offsetof(TestFloat, resultS1)) );
__ sdc1(f14, MemOperand(a0, offsetof(TestFloat, resultD1)) ); __ sdc1(f14, MemOperand(a0, offsetof(TestFloat, resultD1)) );
__ swc1(f20, MemOperand(a0, offsetof(TestFloat, resultS2)) ); __ swc1(f20, MemOperand(a0, offsetof(TestFloat, resultS2)) );
__ sdc1(f18, MemOperand(a0, offsetof(TestFloat, resultD2)) ); __ sdc1(f18, MemOperand(a0, offsetof(TestFloat, resultD2)) );
}
__ jr(ra); __ jr(ra);
__ nop(); __ nop();
...@@ -2541,6 +2547,7 @@ TEST(sqrt_rsqrt_recip) { ...@@ -2541,6 +2547,7 @@ TEST(sqrt_rsqrt_recip) {
CHECK_EQ(test.resultS, outputs_S[i]); CHECK_EQ(test.resultS, outputs_S[i]);
CHECK_EQ(test.resultD, outputs_D[i]); CHECK_EQ(test.resultD, outputs_D[i]);
if (IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) {
if (i != 0) { if (i != 0) {
f1 = test.resultS1 - 1.0F/outputs_S[i]; f1 = test.resultS1 - 1.0F/outputs_S[i];
f1 = (f1 < 0) ? f1 : -f1; f1 = (f1 < 0) ? f1 : -f1;
...@@ -2561,6 +2568,7 @@ TEST(sqrt_rsqrt_recip) { ...@@ -2561,6 +2568,7 @@ TEST(sqrt_rsqrt_recip) {
CHECK_EQ(test.resultD2, 1.0L/inputs_D[i]); CHECK_EQ(test.resultD2, 1.0L/inputs_D[i]);
} }
} }
}
} }
......
...@@ -666,11 +666,13 @@ TEST(Type1) { ...@@ -666,11 +666,13 @@ TEST(Type1) {
COMPARE(mul_s(f8, f6, f4), "46043202 mul.s f8, f6, f4"); COMPARE(mul_s(f8, f6, f4), "46043202 mul.s f8, f6, f4");
COMPARE(mul_d(f8, f6, f4), "46243202 mul.d f8, f6, f4"); COMPARE(mul_d(f8, f6, f4), "46243202 mul.d f8, f6, f4");
if (IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) {
COMPARE(rsqrt_s(f8, f6), "46003216 rsqrt.s f8, f6"); COMPARE(rsqrt_s(f8, f6), "46003216 rsqrt.s f8, f6");
COMPARE(rsqrt_d(f8, f6), "46203216 rsqrt.d f8, f6"); COMPARE(rsqrt_d(f8, f6), "46203216 rsqrt.d f8, f6");
COMPARE(recip_s(f8, f6), "46003215 recip.s f8, f6"); COMPARE(recip_s(f8, f6), "46003215 recip.s f8, f6");
COMPARE(recip_d(f8, f6), "46203215 recip.d f8, f6"); COMPARE(recip_d(f8, f6), "46203215 recip.d f8, f6");
}
COMPARE(mov_s(f6, f4), "46002186 mov.s f6, f4"); COMPARE(mov_s(f6, f4), "46002186 mov.s f6, f4");
COMPARE(mov_d(f6, f4), "46202186 mov.d f6, f4"); COMPARE(mov_d(f6, f4), "46202186 mov.d f6, f4");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment