%verify "executed" %include "mips/unflopWide.S" {"instr":"b d2l_doconv", "st_result":"STORE64(rRESULT0, rRESULT1, rOBJ)"} %break d2l_doconv: #ifdef SOFT_FLOAT la t0, .LDOUBLE_TO_LONG_max LOAD64(rARG2, rARG3, t0) move rBIX, rARG0 # save a0 move rTEMP, rARG1 # and a1 JAL(__gedf2) move t1, v0 la t0, .LDOUBLE_TO_LONG_ret_max LOAD64(rRESULT0, rRESULT1, t0) bgez t1, .L${opcode}_set_vreg move rARG0, rBIX move rARG1, rTEMP la t0, .LDOUBLE_TO_LONG_min LOAD64(rARG2, rARG3, t0) JAL(__ledf2) move t1, v0 la t0, .LDOUBLE_TO_LONG_ret_min LOAD64(rRESULT0, rRESULT1, t0) blez t1, .L${opcode}_set_vreg move rARG0, rBIX move rARG1, rTEMP move rARG2, rBIX move rARG3, rTEMP JAL(__nedf2) move t0, v0 li rRESULT0, 0 li rRESULT1, 0 bnez t0, .L${opcode}_set_vreg move rARG0, rBIX move rARG1, rTEMP JAL(__fixdfdi) #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 JAL(__fixdfdi) #endif 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