Home | History | Annotate | Download | only in mips
      1 %verify "executed"
      2 %include "mips/unflopWide.S" {"instr":"b d2l_doconv", "st_result":"STORE64(rRESULT0, rRESULT1, rOBJ)"}
      3 %break
      4 
      5 d2l_doconv:
      6 #ifdef SOFT_FLOAT
      7     la        t0, .LDOUBLE_TO_LONG_max
      8     LOAD64(rARG2, rARG3, t0)
      9     move      rBIX, rARG0                  #  save a0
     10     move      rTEMP, rARG1                 #  and a1
     11     JAL(__gedf2)
     12 
     13     move      t1, v0
     14     la        t0, .LDOUBLE_TO_LONG_ret_max
     15     LOAD64(rRESULT0, rRESULT1, t0)
     16     bgez      t1, .L${opcode}_set_vreg
     17 
     18     move      rARG0, rBIX
     19     move      rARG1, rTEMP
     20     la        t0, .LDOUBLE_TO_LONG_min
     21     LOAD64(rARG2, rARG3, t0)
     22     JAL(__ledf2)
     23 
     24     move      t1, v0
     25     la        t0, .LDOUBLE_TO_LONG_ret_min
     26     LOAD64(rRESULT0, rRESULT1, t0)
     27     blez      t1, .L${opcode}_set_vreg
     28 
     29     move      rARG0, rBIX
     30     move      rARG1, rTEMP
     31     move      rARG2, rBIX
     32     move      rARG3, rTEMP
     33     JAL(__nedf2)
     34 
     35     move      t0, v0
     36     li        rRESULT0, 0
     37     li        rRESULT1, 0
     38     bnez      t0, .L${opcode}_set_vreg
     39 
     40     move      rARG0, rBIX
     41     move      rARG1, rTEMP
     42     JAL(__fixdfdi)
     43 
     44 #else
     45     la        t0, .LDOUBLE_TO_LONG_max
     46     LOAD64_F(fa1, fa1f, t0)
     47     c.ole.d   fcc0, fa1, fa0
     48     la        t0, .LDOUBLE_TO_LONG_ret_max
     49     LOAD64(rRESULT0, rRESULT1, t0)
     50     bc1t      .L${opcode}_set_vreg
     51 
     52     la        t0, .LDOUBLE_TO_LONG_min
     53     LOAD64_F(fa1, fa1f, t0)
     54     c.ole.d   fcc0, fa0, fa1
     55     la        t0, .LDOUBLE_TO_LONG_ret_min
     56     LOAD64(rRESULT0, rRESULT1, t0)
     57     bc1t      .L${opcode}_set_vreg
     58 
     59     mov.d     fa1, fa0
     60     c.un.d    fcc0, fa0, fa1
     61     li        rRESULT0, 0
     62     li        rRESULT1, 0
     63     bc1t      .L${opcode}_set_vreg
     64     JAL(__fixdfdi)
     65 #endif
     66     b         .L${opcode}_set_vreg
     67 
     68 
     69 .LDOUBLE_TO_LONG_max:
     70     .dword 0x43e0000000000000              #  maxlong, as a double (high word)
     71 .LDOUBLE_TO_LONG_min:
     72     .dword 0xc3e0000000000000              #  minlong, as a double (high word)
     73 .LDOUBLE_TO_LONG_ret_max:
     74     .dword 0x7fffffffffffffff
     75 .LDOUBLE_TO_LONG_ret_min:
     76     .dword 0x8000000000000000
     77