Index: src/mips64/macro-assembler-mips64.h |
diff --git a/src/mips64/macro-assembler-mips64.h b/src/mips64/macro-assembler-mips64.h |
index 09289bf1332f002c92ac981669baceab799c5404..24abd28c36abba2bc9eb26cf4e391f39d0988279 100644 |
--- a/src/mips64/macro-assembler-mips64.h |
+++ b/src/mips64/macro-assembler-mips64.h |
@@ -337,17 +337,6 @@ class MacroAssembler: public Assembler { |
void Movt(Register rd, Register rs, uint16_t cc = 0); |
void Movf(Register rd, Register rs, uint16_t cc = 0); |
- // Min, Max macros. |
- // On pre-r6 these functions may modify at and t8 registers. |
- void MinNaNCheck_d(FPURegister dst, FPURegister src1, FPURegister src2, |
- Label* nan = nullptr); |
- void MaxNaNCheck_d(FPURegister dst, FPURegister src1, FPURegister src2, |
- Label* nan = nullptr); |
- void MinNaNCheck_s(FPURegister dst, FPURegister src1, FPURegister src2, |
- Label* nan = nullptr); |
- void MaxNaNCheck_s(FPURegister dst, FPURegister src1, FPURegister src2, |
- Label* nan = nullptr); |
- |
void Clz(Register rd, Register rs); |
// Jump unconditionally to given label. |
@@ -1411,6 +1400,29 @@ class MacroAssembler: public Assembler { |
Ret(ge, overflow_check, Operand(zero_reg), bd); |
} |
+ // Perform a floating-point min or max operation with the |
+ // (IEEE-754-compatible) semantics of MIPS32's Release 6 MIN.fmt/MAX.fmt. |
+ // Some cases, typically NaNs or +/-0.0, are expected to be rare and are |
+ // handled in out-of-line code. The specific behaviour depends on supported |
+ // instructions. |
+ // |
+ // These functions assume (and assert) that !src1.is(src2). It is permitted |
+ // for the result to alias either input register. |
+ void Float32Max(FPURegister dst, FPURegister src1, FPURegister src2, |
+ Label* out_of_line); |
+ void Float32Min(FPURegister dst, FPURegister src1, FPURegister src2, |
+ Label* out_of_line); |
+ void Float64Max(FPURegister dst, FPURegister src1, FPURegister src2, |
+ Label* out_of_line); |
+ void Float64Min(FPURegister dst, FPURegister src1, FPURegister src2, |
+ Label* out_of_line); |
+ |
+ // Generate out-of-line cases for the macros above. |
+ void Float32MaxOutOfLine(FPURegister dst, FPURegister src1, FPURegister src2); |
+ void Float32MinOutOfLine(FPURegister dst, FPURegister src1, FPURegister src2); |
+ void Float64MaxOutOfLine(FPURegister dst, FPURegister src1, FPURegister src2); |
+ void Float64MinOutOfLine(FPURegister dst, FPURegister src1, FPURegister src2); |
+ |
// ------------------------------------------------------------------------- |
// Runtime calls. |