Commit 5e9c4716 authored by ivica.bogosavljevic's avatar ivica.bogosavljevic Committed by Commit bot

MIPS: Implementation of Float64RoundUp and Float64RoundTiesEven

Port 1389b9f5
Port dffecf31

Implementation of two optional turbofan operators Float64RoundUp and
Float64RoundTiesEven on MIPS32. On MIPS32R2 with FP64 and MIPS32R6 with FP64
we can support these two operators directly using MIPS instructions. This
code implements these two operators. Also, added some DCHECKs for instructions
which are supported on MIPS32R2 with FP64 and MIPS32R6 with FP64 to detect
wrong usage on unsupported architectures.

BUG=

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

Cr-Commit-Position: refs/heads/master@{#32108}
parent de884f20
...@@ -213,6 +213,13 @@ class OutOfLineCeil final : public OutOfLineRound { ...@@ -213,6 +213,13 @@ class OutOfLineCeil final : public OutOfLineRound {
}; };
class OutOfLineTiesEven final : public OutOfLineRound {
public:
OutOfLineTiesEven(CodeGenerator* gen, DoubleRegister result)
: OutOfLineRound(gen, result) {}
};
class OutOfLineRecordWrite final : public OutOfLineCode { class OutOfLineRecordWrite final : public OutOfLineCode {
public: public:
OutOfLineRecordWrite(CodeGenerator* gen, Register object, Register index, OutOfLineRecordWrite(CodeGenerator* gen, Register object, Register index,
...@@ -797,6 +804,10 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) { ...@@ -797,6 +804,10 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
ASSEMBLE_ROUND_DOUBLE_TO_DOUBLE(ceil_l_d, Ceil); ASSEMBLE_ROUND_DOUBLE_TO_DOUBLE(ceil_l_d, Ceil);
break; break;
} }
case kMipsFloat64RoundTiesEven: {
ASSEMBLE_ROUND_DOUBLE_TO_DOUBLE(round_l_d, TiesEven);
break;
}
case kMipsFloat64Max: { case kMipsFloat64Max: {
// (b < a) ? a : b // (b < a) ? a : b
if (IsMipsArchVariant(kMips32r6)) { if (IsMipsArchVariant(kMips32r6)) {
...@@ -1000,7 +1011,7 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) { ...@@ -1000,7 +1011,7 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
UNREACHABLE(); // currently unsupported checked int64 load/store. UNREACHABLE(); // currently unsupported checked int64 load/store.
break; break;
} }
} } // NOLINT(readability/fn_size)
#define UNSUPPORTED_COND(opcode, condition) \ #define UNSUPPORTED_COND(opcode, condition) \
......
...@@ -58,6 +58,7 @@ namespace compiler { ...@@ -58,6 +58,7 @@ namespace compiler {
V(MipsFloat64RoundDown) \ V(MipsFloat64RoundDown) \
V(MipsFloat64RoundTruncate) \ V(MipsFloat64RoundTruncate) \
V(MipsFloat64RoundUp) \ V(MipsFloat64RoundUp) \
V(MipsFloat64RoundTiesEven) \
V(MipsCvtSD) \ V(MipsCvtSD) \
V(MipsCvtDS) \ V(MipsCvtDS) \
V(MipsTruncWD) \ V(MipsTruncWD) \
......
...@@ -640,7 +640,9 @@ void InstructionSelector::VisitFloat64RoundDown(Node* node) { ...@@ -640,7 +640,9 @@ void InstructionSelector::VisitFloat64RoundDown(Node* node) {
} }
void InstructionSelector::VisitFloat64RoundUp(Node* node) { UNREACHABLE(); } void InstructionSelector::VisitFloat64RoundUp(Node* node) {
VisitRR(this, kMipsFloat64RoundUp, node);
}
void InstructionSelector::VisitFloat64RoundTruncate(Node* node) { void InstructionSelector::VisitFloat64RoundTruncate(Node* node) {
...@@ -654,7 +656,7 @@ void InstructionSelector::VisitFloat64RoundTiesAway(Node* node) { ...@@ -654,7 +656,7 @@ void InstructionSelector::VisitFloat64RoundTiesAway(Node* node) {
void InstructionSelector::VisitFloat64RoundTiesEven(Node* node) { void InstructionSelector::VisitFloat64RoundTiesEven(Node* node) {
UNREACHABLE(); VisitRR(this, kMipsFloat64RoundTiesEven, node);
} }
...@@ -1162,7 +1164,9 @@ InstructionSelector::SupportedMachineOperatorFlags() { ...@@ -1162,7 +1164,9 @@ InstructionSelector::SupportedMachineOperatorFlags() {
if ((IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) && if ((IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) &&
IsFp64Mode()) { IsFp64Mode()) {
flags |= MachineOperatorBuilder::kFloat64RoundDown | flags |= MachineOperatorBuilder::kFloat64RoundDown |
MachineOperatorBuilder::kFloat64RoundTruncate; MachineOperatorBuilder::kFloat64RoundUp |
MachineOperatorBuilder::kFloat64RoundTruncate |
MachineOperatorBuilder::kFloat64RoundTiesEven;
} }
return flags | MachineOperatorBuilder::kFloat64Min | return flags | MachineOperatorBuilder::kFloat64Min |
MachineOperatorBuilder::kFloat64Max | MachineOperatorBuilder::kFloat64Max |
......
...@@ -2489,55 +2489,71 @@ void Assembler::rint_d(FPURegister fd, FPURegister fs) { rint(D, fd, fs); } ...@@ -2489,55 +2489,71 @@ void Assembler::rint_d(FPURegister fd, FPURegister fs) { rint(D, fd, fs); }
void Assembler::cvt_l_s(FPURegister fd, FPURegister fs) { void Assembler::cvt_l_s(FPURegister fd, FPURegister fs) {
DCHECK(IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)); DCHECK((IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) &&
IsFp64Mode());
GenInstrRegister(COP1, S, f0, fs, fd, CVT_L_S); GenInstrRegister(COP1, S, f0, fs, fd, CVT_L_S);
} }
void Assembler::cvt_l_d(FPURegister fd, FPURegister fs) { void Assembler::cvt_l_d(FPURegister fd, FPURegister fs) {
DCHECK(IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)); DCHECK((IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) &&
IsFp64Mode());
GenInstrRegister(COP1, D, f0, fs, fd, CVT_L_D); GenInstrRegister(COP1, D, f0, fs, fd, CVT_L_D);
} }
void Assembler::trunc_l_s(FPURegister fd, FPURegister fs) { void Assembler::trunc_l_s(FPURegister fd, FPURegister fs) {
DCHECK(IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)); DCHECK((IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) &&
IsFp64Mode());
GenInstrRegister(COP1, S, f0, fs, fd, TRUNC_L_S); GenInstrRegister(COP1, S, f0, fs, fd, TRUNC_L_S);
} }
void Assembler::trunc_l_d(FPURegister fd, FPURegister fs) { void Assembler::trunc_l_d(FPURegister fd, FPURegister fs) {
DCHECK(IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)); DCHECK((IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) &&
IsFp64Mode());
GenInstrRegister(COP1, D, f0, fs, fd, TRUNC_L_D); GenInstrRegister(COP1, D, f0, fs, fd, TRUNC_L_D);
} }
void Assembler::round_l_s(FPURegister fd, FPURegister fs) { void Assembler::round_l_s(FPURegister fd, FPURegister fs) {
DCHECK((IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) &&
IsFp64Mode());
GenInstrRegister(COP1, S, f0, fs, fd, ROUND_L_S); GenInstrRegister(COP1, S, f0, fs, fd, ROUND_L_S);
} }
void Assembler::round_l_d(FPURegister fd, FPURegister fs) { void Assembler::round_l_d(FPURegister fd, FPURegister fs) {
DCHECK((IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) &&
IsFp64Mode());
GenInstrRegister(COP1, D, f0, fs, fd, ROUND_L_D); GenInstrRegister(COP1, D, f0, fs, fd, ROUND_L_D);
} }
void Assembler::floor_l_s(FPURegister fd, FPURegister fs) { void Assembler::floor_l_s(FPURegister fd, FPURegister fs) {
DCHECK((IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) &&
IsFp64Mode());
GenInstrRegister(COP1, S, f0, fs, fd, FLOOR_L_S); GenInstrRegister(COP1, S, f0, fs, fd, FLOOR_L_S);
} }
void Assembler::floor_l_d(FPURegister fd, FPURegister fs) { void Assembler::floor_l_d(FPURegister fd, FPURegister fs) {
DCHECK((IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) &&
IsFp64Mode());
GenInstrRegister(COP1, D, f0, fs, fd, FLOOR_L_D); GenInstrRegister(COP1, D, f0, fs, fd, FLOOR_L_D);
} }
void Assembler::ceil_l_s(FPURegister fd, FPURegister fs) { void Assembler::ceil_l_s(FPURegister fd, FPURegister fs) {
DCHECK((IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) &&
IsFp64Mode());
GenInstrRegister(COP1, S, f0, fs, fd, CEIL_L_S); GenInstrRegister(COP1, S, f0, fs, fd, CEIL_L_S);
} }
void Assembler::ceil_l_d(FPURegister fd, FPURegister fs) { void Assembler::ceil_l_d(FPURegister fd, FPURegister fs) {
DCHECK((IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) &&
IsFp64Mode());
GenInstrRegister(COP1, D, f0, fs, fd, CEIL_L_D); GenInstrRegister(COP1, D, f0, fs, fd, CEIL_L_D);
} }
...@@ -2632,7 +2648,8 @@ void Assembler::cvt_s_w(FPURegister fd, FPURegister fs) { ...@@ -2632,7 +2648,8 @@ void Assembler::cvt_s_w(FPURegister fd, FPURegister fs) {
void Assembler::cvt_s_l(FPURegister fd, FPURegister fs) { void Assembler::cvt_s_l(FPURegister fd, FPURegister fs) {
DCHECK(IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)); DCHECK((IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) &&
IsFp64Mode());
GenInstrRegister(COP1, L, f0, fs, fd, CVT_S_L); GenInstrRegister(COP1, L, f0, fs, fd, CVT_S_L);
} }
...@@ -2648,7 +2665,8 @@ void Assembler::cvt_d_w(FPURegister fd, FPURegister fs) { ...@@ -2648,7 +2665,8 @@ void Assembler::cvt_d_w(FPURegister fd, FPURegister fs) {
void Assembler::cvt_d_l(FPURegister fd, FPURegister fs) { void Assembler::cvt_d_l(FPURegister fd, FPURegister fs) {
DCHECK(IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)); DCHECK((IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) &&
IsFp64Mode());
GenInstrRegister(COP1, L, f0, fs, fd, CVT_D_L); GenInstrRegister(COP1, L, f0, fs, fd, CVT_D_L);
} }
......
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