| %include "mips/funopWide.S" {"instr":"b d2l_doconv", "st_result":"SET_VREG64(rRESULT0, rRESULT1, rOBJ)"} |
| %break |
| |
| d2l_doconv: |
| #ifdef MIPS32REVGE6 |
| la t0, .LDOUBLE_TO_LONG_max |
| LOAD64_F(fa1, fa1f, t0) |
| cmp.ule.d ft2, fa1, fa0 |
| la t0, .LDOUBLE_TO_LONG_ret_max |
| LOAD64(rRESULT0, rRESULT1, t0) |
| bc1nez ft2, .L${opcode}_set_vreg |
| |
| la t0, .LDOUBLE_TO_LONG_min |
| LOAD64_F(fa1, fa1f, t0) |
| cmp.ule.d ft2, fa0, fa1 |
| la t0, .LDOUBLE_TO_LONG_ret_min |
| LOAD64(rRESULT0, rRESULT1, t0) |
| bc1nez ft2, .L${opcode}_set_vreg |
| |
| mov.d fa1, fa0 |
| cmp.un.d ft2, fa0, fa1 |
| li rRESULT0, 0 |
| li rRESULT1, 0 |
| bc1nez ft2, .L${opcode}_set_vreg |
| #else |
| la t0, .LDOUBLE_TO_LONG_max |
| LOAD64_F(fa1, fa1f, t0) |
| c.ole.d fcc0, fa1, fa0 |
| la t0, .LDOUBLE_TO_LONG_ret_max |
| LOAD64(rRESULT0, rRESULT1, t0) |
| bc1t .L${opcode}_set_vreg |
| |
| la t0, .LDOUBLE_TO_LONG_min |
| LOAD64_F(fa1, fa1f, t0) |
| c.ole.d fcc0, fa0, fa1 |
| la t0, .LDOUBLE_TO_LONG_ret_min |
| LOAD64(rRESULT0, rRESULT1, t0) |
| bc1t .L${opcode}_set_vreg |
| |
| mov.d fa1, fa0 |
| c.un.d fcc0, fa0, fa1 |
| li rRESULT0, 0 |
| li rRESULT1, 0 |
| bc1t .L${opcode}_set_vreg |
| #endif |
| JAL(__fixdfdi) |
| b .L${opcode}_set_vreg |
| |
| .LDOUBLE_TO_LONG_max: |
| .dword 0x43e0000000000000 # maxlong, as a double (high word) |
| .LDOUBLE_TO_LONG_min: |
| .dword 0xc3e0000000000000 # minlong, as a double (high word) |
| .LDOUBLE_TO_LONG_ret_max: |
| .dword 0x7fffffffffffffff |
| .LDOUBLE_TO_LONG_ret_min: |
| .dword 0x8000000000000000 |