| Index: src/mips/assembler-mips.cc
|
| diff --git a/src/mips/assembler-mips.cc b/src/mips/assembler-mips.cc
|
| index c276ba9066f5d6122b25ef22f9d37013468ce26b..e50a239a4a9c6c0533995a2ed8a337743797d915 100644
|
| --- a/src/mips/assembler-mips.cc
|
| +++ b/src/mips/assembler-mips.cc
|
| @@ -2086,33 +2086,36 @@ void Assembler::ldc1(FPURegister fd, const MemOperand& src) {
|
| // Workaround for non-8-byte alignment of HeapNumber, convert 64-bit
|
| // load to two 32-bit loads.
|
| DCHECK(!src.rm().is(at));
|
| - if (IsFp64Mode()) {
|
| + if (IsFp32Mode()) { // fp32 mode.
|
| if (is_int16(src.offset_) && is_int16(src.offset_ + kIntSize)) {
|
| GenInstrImmediate(LWC1, src.rm(), fd,
|
| src.offset_ + Register::kMantissaOffset);
|
| - GenInstrImmediate(LW, src.rm(), at,
|
| + FPURegister nextfpreg;
|
| + nextfpreg.setcode(fd.code() + 1);
|
| + GenInstrImmediate(LWC1, src.rm(), nextfpreg,
|
| 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);
|
| + FPURegister nextfpreg;
|
| + nextfpreg.setcode(fd.code() + 1);
|
| + GenInstrImmediate(LWC1, at, nextfpreg, Register::kExponentOffset);
|
| }
|
| - } else { // fp32 mode.
|
| + } else {
|
| + DCHECK(IsFp64Mode() || IsFpxxMode());
|
| + // Currently we support FPXX and FP64 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);
|
| - FPURegister nextfpreg;
|
| - nextfpreg.setcode(fd.code() + 1);
|
| - GenInstrImmediate(LWC1, src.rm(), nextfpreg,
|
| + 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);
|
| - FPURegister nextfpreg;
|
| - nextfpreg.setcode(fd.code() + 1);
|
| - GenInstrImmediate(LWC1, at, nextfpreg, Register::kExponentOffset);
|
| + GenInstrImmediate(LW, at, at, Register::kExponentOffset);
|
| + mthc1(at, fd);
|
| }
|
| }
|
| }
|
| @@ -2133,33 +2136,36 @@ void Assembler::sdc1(FPURegister fd, const MemOperand& src) {
|
| // store to two 32-bit stores.
|
| DCHECK(!src.rm().is(at));
|
| DCHECK(!src.rm().is(t8));
|
| - if (IsFp64Mode()) {
|
| + if (IsFp32Mode()) { // fp32 mode.
|
| 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,
|
| + FPURegister nextfpreg;
|
| + nextfpreg.setcode(fd.code() + 1);
|
| + GenInstrImmediate(SWC1, src.rm(), nextfpreg,
|
| 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);
|
| + FPURegister nextfpreg;
|
| + nextfpreg.setcode(fd.code() + 1);
|
| + GenInstrImmediate(SWC1, at, nextfpreg, Register::kExponentOffset);
|
| }
|
| - } else { // fp32 mode.
|
| + } else {
|
| + DCHECK(IsFp64Mode() || IsFpxxMode());
|
| + // Currently we support FPXX and FP64 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);
|
| - FPURegister nextfpreg;
|
| - nextfpreg.setcode(fd.code() + 1);
|
| - GenInstrImmediate(SWC1, src.rm(), nextfpreg,
|
| + 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);
|
| - FPURegister nextfpreg;
|
| - nextfpreg.setcode(fd.code() + 1);
|
| - GenInstrImmediate(SWC1, at, nextfpreg, Register::kExponentOffset);
|
| + mfhc1(t8, fd);
|
| + GenInstrImmediate(SW, at, t8, Register::kExponentOffset);
|
| }
|
| }
|
| }
|
|
|