Douglas Leung | 200f040 | 2016-02-25 20:05:47 -0800 | [diff] [blame] | 1 | %include "mips/funopWide.S" {"instr":"b d2l_doconv", "st_result":"SET_VREG64(rRESULT0, rRESULT1, rOBJ)"} |
| 2 | %break |
| 3 | |
| 4 | d2l_doconv: |
| 5 | #ifdef MIPS32REVGE6 |
| 6 | la t0, .LDOUBLE_TO_LONG_max |
| 7 | LOAD64_F(fa1, fa1f, t0) |
Alexey Frunze | 28d06c1 | 2016-10-20 21:50:05 -0700 | [diff] [blame] | 8 | cmp.le.d ft2, fa1, fa0 |
Douglas Leung | 200f040 | 2016-02-25 20:05:47 -0800 | [diff] [blame] | 9 | la t0, .LDOUBLE_TO_LONG_ret_max |
| 10 | LOAD64(rRESULT0, rRESULT1, t0) |
| 11 | bc1nez ft2, .L${opcode}_set_vreg |
| 12 | |
| 13 | la t0, .LDOUBLE_TO_LONG_min |
| 14 | LOAD64_F(fa1, fa1f, t0) |
Alexey Frunze | 28d06c1 | 2016-10-20 21:50:05 -0700 | [diff] [blame] | 15 | cmp.le.d ft2, fa0, fa1 |
Douglas Leung | 200f040 | 2016-02-25 20:05:47 -0800 | [diff] [blame] | 16 | la t0, .LDOUBLE_TO_LONG_ret_min |
| 17 | LOAD64(rRESULT0, rRESULT1, t0) |
| 18 | bc1nez ft2, .L${opcode}_set_vreg |
| 19 | |
| 20 | mov.d fa1, fa0 |
| 21 | cmp.un.d ft2, fa0, fa1 |
| 22 | li rRESULT0, 0 |
| 23 | li rRESULT1, 0 |
| 24 | bc1nez ft2, .L${opcode}_set_vreg |
| 25 | #else |
| 26 | la t0, .LDOUBLE_TO_LONG_max |
| 27 | LOAD64_F(fa1, fa1f, t0) |
| 28 | c.ole.d fcc0, fa1, fa0 |
| 29 | la t0, .LDOUBLE_TO_LONG_ret_max |
| 30 | LOAD64(rRESULT0, rRESULT1, t0) |
| 31 | bc1t .L${opcode}_set_vreg |
| 32 | |
| 33 | la t0, .LDOUBLE_TO_LONG_min |
| 34 | LOAD64_F(fa1, fa1f, t0) |
| 35 | c.ole.d fcc0, fa0, fa1 |
| 36 | la t0, .LDOUBLE_TO_LONG_ret_min |
| 37 | LOAD64(rRESULT0, rRESULT1, t0) |
| 38 | bc1t .L${opcode}_set_vreg |
| 39 | |
| 40 | mov.d fa1, fa0 |
| 41 | c.un.d fcc0, fa0, fa1 |
| 42 | li rRESULT0, 0 |
| 43 | li rRESULT1, 0 |
| 44 | bc1t .L${opcode}_set_vreg |
| 45 | #endif |
| 46 | JAL(__fixdfdi) |
| 47 | b .L${opcode}_set_vreg |
| 48 | |
| 49 | .LDOUBLE_TO_LONG_max: |
| 50 | .dword 0x43e0000000000000 # maxlong, as a double (high word) |
| 51 | .LDOUBLE_TO_LONG_min: |
| 52 | .dword 0xc3e0000000000000 # minlong, as a double (high word) |
| 53 | .LDOUBLE_TO_LONG_ret_max: |
| 54 | .dword 0x7fffffffffffffff |
| 55 | .LDOUBLE_TO_LONG_ret_min: |
| 56 | .dword 0x8000000000000000 |