Home | History | Annotate | Download | only in arm
      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     flds    s0, [r2]                    @ s0<- vBB
     25     flds    s1, [r3]                    @ s1<- vCC
     26     vcmpe.f32 s0, s1                    @ 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