| %default {} |
| /* |
| * Compare two floating-point values. Puts 0, 1, or -1 into the |
| * destination register based on the results of the comparison. |
| * |
| * For: cmpl-float, cmpg-float |
| */ |
| /* op vAA, vBB, vCC */ |
| srl a4, rINST, 8 # a4 <- AA |
| lbu a2, 2(rPC) # a2 <- BB |
| lbu a3, 3(rPC) # a3 <- CC |
| GET_VREG_FLOAT f0, a2 # f0 <- vBB |
| GET_VREG_FLOAT f1, a3 # f1 <- vCC |
| cmp.eq.s f2, f0, f1 |
| li a0, 0 |
| bc1nez f2, 1f # done if vBB == vCC (ordered) |
| .if $gt_bias |
| cmp.lt.s f2, f0, f1 |
| li a0, -1 |
| bc1nez f2, 1f # done if vBB < vCC (ordered) |
| li a0, 1 # vBB > vCC or unordered |
| .else |
| cmp.lt.s f2, f1, f0 |
| li a0, 1 |
| bc1nez f2, 1f # done if vBB > vCC (ordered) |
| li a0, -1 # vBB < vCC or unordered |
| .endif |
| 1: |
| FETCH_ADVANCE_INST 2 # advance rPC, load rINST |
| GET_INST_OPCODE v0 # extract opcode from rINST |
| SET_VREG a0, a4 # vAA <- a0 |
| GOTO_OPCODE v0 # jump to next instruction |