| %verify "executed" |
| %include "mips/funop.S" {"instr":"b f2i_doconv","instr_f":"b f2i_doconv"} |
| |
| /* |
| * Not an entry point as it is used only once !! |
| */ |
| f2i_doconv: |
| #ifdef SOFT_FLOAT |
| li a1, 0x4f000000 # (float)maxint |
| move rBIX, a0 |
| JAL(__gesf2) # is arg >= maxint? |
| move t0, v0 |
| li v0, ~0x80000000 # return maxint (7fffffff) |
| bgez t0, .L${opcode}_set_vreg |
| |
| move a0, rBIX # recover arg |
| li a1, 0xcf000000 # (float)minint |
| JAL(__lesf2) |
| |
| move t0, v0 |
| li v0, 0x80000000 # return minint (80000000) |
| blez t0, .L${opcode}_set_vreg |
| move a0, rBIX |
| move a1, rBIX |
| JAL(__nesf2) |
| |
| move t0, v0 |
| li v0, 0 # return zero for NaN |
| bnez t0, .L${opcode}_set_vreg |
| |
| move a0, rBIX |
| JAL(__fixsfsi) |
| b .L${opcode}_set_vreg |
| #else |
| l.s fa1, .LFLOAT_TO_INT_max |
| c.ole.s fcc0, fa1, fa0 |
| l.s fv0, .LFLOAT_TO_INT_ret_max |
| bc1t .L${opcode}_set_vreg_f |
| |
| l.s fa1, .LFLOAT_TO_INT_min |
| c.ole.s fcc0, fa0, fa1 |
| l.s fv0, .LFLOAT_TO_INT_ret_min |
| bc1t .L${opcode}_set_vreg_f |
| |
| mov.s fa1, fa0 |
| c.un.s fcc0, fa0, fa1 |
| li.s fv0, 0 |
| bc1t .L${opcode}_set_vreg_f |
| |
| trunc.w.s fv0, fa0 |
| b .L${opcode}_set_vreg_f |
| #endif |
| |
| .LFLOAT_TO_INT_max: |
| .word 0x4f000000 |
| .LFLOAT_TO_INT_min: |
| .word 0xcf000000 |
| .LFLOAT_TO_INT_ret_max: |
| .word 0x7fffffff |
| .LFLOAT_TO_INT_ret_min: |
| .word 0x80000000 |
| |