| %default {"preinstr":"", "chkzero":"0"} |
| /* |
| * Generic 32-bit binary float operation. |
| * |
| * For: add-fp, sub-fp, mul-fp, div-fp |
| */ |
| |
| /* binop vAA, vBB, vCC */ |
| FETCH(a0, 1) # a0 <- CCBB |
| GET_OPA(rOBJ) # s5 <- AA |
| srl a3, a0, 8 # a3 <- CC |
| and a2, a0, 255 # a2 <- BB |
| #ifdef SOFT_FLOAT |
| GET_VREG(a1, a3) # a1 <- vCC |
| GET_VREG(a0, a2) # a0 <- vBB |
| .if $chkzero |
| # is second operand zero? |
| beqz a1, common_errDivideByZero |
| .endif |
| #else |
| GET_VREG_F(fa1, a3) # a1 <- vCC |
| GET_VREG_F(fa0, a2) # a0 <- vBB |
| |
| .if $chkzero |
| # is second operand zero? |
| li.s ft0, 0 |
| c.eq.s fcc0, ft0, fa1 # condition bit and comparision with 0 |
| bc1t fcc0, common_errDivideByZero |
| .endif |
| #endif |
| |
| FETCH_ADVANCE_INST(2) # advance rPC, load rINST |
| $preinstr # optional op |
| #ifdef SOFT_FLOAT |
| $instr # v0 = result |
| SET_VREG(v0, rOBJ) # vAA <- v0 |
| #else |
| $instr_f # f0 = result |
| SET_VREG_F(fv0, rOBJ) # vAA <- fv0 |
| #endif |
| GET_INST_OPCODE(t0) # extract opcode from rINST |
| GOTO_OPCODE(t0) # jump to next instruction |
| /* 11-14 instructions */ |
| |