1    /*
2     * Compare two floating-point values.  Puts 0, 1, or -1 into the
3     * destination register based on the results of the comparison.
4     *
5     * int compare(x, y) {
6     *     if (x == y) {
7     *         return 0;
8     *     } else if (x < y) {
9     *         return -1;
10     *     } else if (x > y) {
11     *         return 1;
12     *     } else {
13     *         return 1;
14     *     }
15     * }
16     */
17    /* op vAA, vBB, vCC */
18    FETCH r0, 1                         @ r0<- CCBB
19    mov     r9, rINST, lsr #8           @ r9<- AA
20    and     r2, r0, #255                @ r2<- BB
21    mov     r3, r0, lsr #8              @ r3<- CC
22    VREG_INDEX_TO_ADDR r2, r2           @ r2<- &vBB
23    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vCC
24    fldd    d0, [r2]                    @ d0<- vBB
25    fldd    d1, [r3]                    @ d1<- vCC
26    vcmpe.f64 d0, d1                    @ compare (vBB, vCC)
27    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
28    mov     r0, #1                      @ r0<- 1 (default)
29    GET_INST_OPCODE ip                  @ extract opcode from rINST
30    fmstat                              @ export status flags
31    mvnmi   r0, #0                      @ (less than) r1<- -1
32    moveq   r0, #0                      @ (equal) r1<- 0
33    SET_VREG r0, r9                     @ vAA<- r0
34    GOTO_OPCODE ip                      @ jump to next instruction
35