OP_FLOAT_TO_INT.S revision a8b91c52fd8a90b784835dfe1f8898035266c4dd
1%verify "executed"
2%include "mips/unflop.S" {"instr":"b f2i_doconv", "instr_f":"b f2i_doconv"}
3%break
4
5/*
6 * Not an entry point as it is used only once !!
7 */
8f2i_doconv:
9#ifdef SOFT_FLOAT
10    li        a1, 0x4f000000               #  (float)maxint
11    move      rBIX, a0
12    JAL(__gesf2)                           #  is arg >= maxint?
13    move      t0, v0
14    li        v0, ~0x80000000              #  return maxint (7fffffff)
15    bgez      t0, .L${opcode}_set_vreg
16
17    move      a0, rBIX                     #  recover arg
18    li        a1, 0xcf000000               #  (float)minint
19    JAL(__lesf2)
20
21    move      t0, v0
22    li        v0, 0x80000000               #  return minint (80000000)
23    blez      t0, .L${opcode}_set_vreg
24    move      a0, rBIX
25    move      a1, rBIX
26    JAL(__nesf2)
27
28    move      t0, v0
29    li        v0, 0                        #  return zero for NaN
30    bnez      t0, .L${opcode}_set_vreg
31
32    move      a0, rBIX
33    JAL(__fixsfsi)
34    b         .L${opcode}_set_vreg
35#else
36    l.s       fa1, .LFLOAT_TO_INT_max
37    c.ole.s   fcc0, fa1, fa0
38    l.s       fv0, .LFLOAT_TO_INT_ret_max
39    bc1t      .L${opcode}_set_vreg_f
40
41    l.s       fa1, .LFLOAT_TO_INT_min
42    c.ole.s   fcc0, fa0, fa1
43    l.s       fv0, .LFLOAT_TO_INT_ret_min
44    bc1t      .L${opcode}_set_vreg_f
45
46    mov.s     fa1, fa0
47    c.un.s    fcc0, fa0, fa1
48    li.s      fv0, 0
49    bc1t      .L${opcode}_set_vreg_f
50
51    trunc.w.s  fv0, fa0
52    b         .L${opcode}_set_vreg_f
53#endif
54
55.LFLOAT_TO_INT_max:
56    .word 0x4f000000
57.LFLOAT_TO_INT_min:
58    .word 0xcf000000
59.LFLOAT_TO_INT_ret_max:
60    .word 0x7fffffff
61.LFLOAT_TO_INT_ret_min:
62    .word 0x80000000
63
64