11452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    /*
21452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee     * Compare two floating-point values.  Puts 0, 1, or -1 into the
31452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee     * destination register based on the results of the comparison.
41452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee     *
51452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee     * int compare(x, y) {
61452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee     *     if (x == y) {
71452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee     *         return 0;
81452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee     *     } else if (x > y) {
91452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee     *         return 1;
101452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee     *     } else if (x < y) {
111452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee     *         return -1;
121452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee     *     } else {
131452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee     *         return -1;
141452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee     *     }
151452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee     * }
161452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee     */
171452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    /* op vAA, vBB, vCC */
181452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    FETCH r0, 1                         @ r0<- CCBB
191452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    mov     r9, rINST, lsr #8           @ r9<- AA
201452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    and     r2, r0, #255                @ r2<- BB
211452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    mov     r3, r0, lsr #8              @ r3<- CC
221452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    VREG_INDEX_TO_ADDR r2, r2           @ r2<- &vBB
231452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    VREG_INDEX_TO_ADDR r3, r3           @ r3<- &vCC
241452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    flds    s0, [r2]                    @ s0<- vBB
251452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    flds    s1, [r3]                    @ s1<- vCC
2696530d346917cf3877e7d0df9a05a6a3464fe432buzbee    vcmpe.f32  s0, s1                   @ compare (vBB, vCC)
271452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    FETCH_ADVANCE_INST 2                @ advance rPC, load rINST
281452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    mvn     r0, #0                      @ r0<- -1 (default)
291452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    GET_INST_OPCODE ip                  @ extract opcode from rINST
301452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    fmstat                              @ export status flags
311452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    movgt   r0, #1                      @ (greater than) r1<- 1
321452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    moveq   r0, #0                      @ (equal) r1<- 0
331452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    SET_VREG r0, r9                     @ vAA<- r0
341452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee    GOTO_OPCODE ip                      @ jump to next instruction
35