Chromium Code Reviews| Index: src/mips/assembler-mips.cc |
| diff --git a/src/mips/assembler-mips.cc b/src/mips/assembler-mips.cc |
| index c276ba9066f5d6122b25ef22f9d37013468ce26b..2c20c40d0e1194565af74b7118ec92bf955246a6 100644 |
| --- a/src/mips/assembler-mips.cc |
| +++ b/src/mips/assembler-mips.cc |
| @@ -2099,7 +2099,7 @@ void Assembler::ldc1(FPURegister fd, const MemOperand& src) { |
| GenInstrImmediate(LW, at, at, Register::kExponentOffset); |
| mthc1(at, fd); |
| } |
| - } else { // fp32 mode. |
| + } else if (IsFp32Mode()) { // fp32 mode. |
| if (is_int16(src.offset_) && is_int16(src.offset_ + kIntSize)) { |
| GenInstrImmediate(LWC1, src.rm(), fd, |
| src.offset_ + Register::kMantissaOffset); |
| @@ -2114,6 +2114,22 @@ void Assembler::ldc1(FPURegister fd, const MemOperand& src) { |
| nextfpreg.setcode(fd.code() + 1); |
| GenInstrImmediate(LWC1, at, nextfpreg, Register::kExponentOffset); |
| } |
| + } else { |
|
Paul Lind
2016/02/01 04:27:36
As far as I can see this block is same as fp64 cas
|
| + DCHECK(IsFpxxMode()); |
| + // Currently we support FPXX on Mips32r2 and Mips32r6 |
| + DCHECK(IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)); |
| + if (is_int16(src.offset_) && is_int16(src.offset_ + kIntSize)) { |
| + GenInstrImmediate(LWC1, src.rm(), fd, |
| + src.offset_ + Register::kMantissaOffset); |
| + GenInstrImmediate(LW, src.rm(), at, |
| + src.offset_ + Register::kExponentOffset); |
| + mthc1(at, fd); |
| + } else { // Offset > 16 bits, use multiple instructions to load. |
| + LoadRegPlusOffsetToAt(src); |
| + GenInstrImmediate(LWC1, at, fd, Register::kMantissaOffset); |
| + GenInstrImmediate(LW, at, at, Register::kExponentOffset); |
| + mthc1(at, fd); |
| + } |
| } |
| } |
| @@ -2146,7 +2162,7 @@ void Assembler::sdc1(FPURegister fd, const MemOperand& src) { |
| mfhc1(t8, fd); |
| GenInstrImmediate(SW, at, t8, Register::kExponentOffset); |
| } |
| - } else { // fp32 mode. |
| + } else if (IsFp32Mode()) { // fp32 mode. |
| if (is_int16(src.offset_) && is_int16(src.offset_ + kIntSize)) { |
| GenInstrImmediate(SWC1, src.rm(), fd, |
| src.offset_ + Register::kMantissaOffset); |
| @@ -2161,6 +2177,22 @@ void Assembler::sdc1(FPURegister fd, const MemOperand& src) { |
| nextfpreg.setcode(fd.code() + 1); |
| GenInstrImmediate(SWC1, at, nextfpreg, Register::kExponentOffset); |
| } |
| + } else { |
| + DCHECK(IsFpxxMode()); |
| + // Currently we support FPXX on Mips32r2 and Mips32r6 |
| + DCHECK(IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)); |
| + if (is_int16(src.offset_) && is_int16(src.offset_ + kIntSize)) { |
| + GenInstrImmediate(SWC1, src.rm(), fd, |
| + src.offset_ + Register::kMantissaOffset); |
| + mfhc1(at, fd); |
| + GenInstrImmediate(SW, src.rm(), at, |
| + src.offset_ + Register::kExponentOffset); |
| + } else { // Offset > 16 bits, use multiple instructions to load. |
| + LoadRegPlusOffsetToAt(src); |
| + GenInstrImmediate(SWC1, at, fd, Register::kMantissaOffset); |
| + mfhc1(t8, fd); |
| + GenInstrImmediate(SW, at, t8, Register::kExponentOffset); |
| + } |
| } |
| } |