fbinop.S revision a8b91c52fd8a90b784835dfe1f8898035266c4dd
1%default {"preinstr":"", "chkzero":"0"}
2    /*
3     * Generic 32-bit binary float operation. a0 = a1 op a2.
4     *
5     * For: add-fp, sub-fp, mul-fp, div-fp
6     *
7     * On entry:
8     *     a0 = target dalvik register address
9     *     a1 = op1 address
10     *     a2 = op2 address
11     *
12     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
13     *
14     */
15    move rOBJ, a0                       # save a0
16#ifdef  SOFT_FLOAT
17    LOAD(a0, a1)                        # a0<- vBB
18    LOAD(a1, a2)                        # a1<- vCC
19    .if $chkzero
20    beqz    a1, common_errDivideByZero  # is second operand zero?
21    .endif
22    $preinstr                           # optional op
23    $instr                              # v0 = result
24    STORE(v0, rOBJ)                     # vAA <- v0
25#else
26    LOAD_F(fa0, a1)                     # fa0<- vBB
27    LOAD_F(fa1, a2)                     # fa1<- vCC
28    .if $chkzero
29    # is second operand zero?
30    li.s        ft0, 0
31    c.eq.s      fcc0, ft0, fa1          # condition bit and comparision with 0
32    bc1t        fcc0, common_errDivideByZero
33    .endif
34    $preinstr                           # optional op
35    $instr_f                            # fv0 = result
36    STORE_F(fv0, rOBJ)                  # vAA <- fv0
37#endif
38    RETURN
39