1ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng%default { "naninst":"mvn     r0, #0" }
2ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /*
31465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee     * For the JIT: incoming arguments in r0-r1, r2-r3
4ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *              result in r0
5ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
6ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Compare two floating-point values.  Puts 0, 1, or -1 into the
7ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * destination register based on the results of the comparison.
8ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
9ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
10ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * on what value we'd like to return when one of the operands is NaN.
11ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
12ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * See OP_CMPL_FLOAT for an explanation.
13ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     *
14ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     * For: cmpl-double, cmpg-double
15ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     */
16ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* op vAA, vBB, vCC */
171465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    push    {r0-r3}                     @ save operands
181465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    mov     r11, lr                     @ save return address
198b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, .L__aeabi_cdcmple       @ PIC way of "bl __aeabi_cdcmple"
208b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
21ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bhi     .L${opcode}_gt_or_nan       @ C set and Z clear, disambiguate
22ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mvncc   r0, #0                      @ (less than) r1<- -1
23ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    moveq   r0, #0                      @ (equal) r1<- 0, trumps less than
241465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    add     sp, #16                     @ drop unused operands
251465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bx      r11
26ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
27ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ Test for NaN with a second comparison.  EABI forbids testing bit
28ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
29ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ make the library call.
30ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng.L${opcode}_gt_or_nan:
311465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    pop     {r2-r3}                     @ restore operands in reverse order
321465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    pop     {r0-r1}                     @ restore operands in reverse order
338b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, .L__aeabi_cdcmple       @ r0<- Z set if eq, C clear if <
348b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
35ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    movcc   r0, #1                      @ (greater than) r1<- 1
361465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bxcc    r11
37ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    $naninst                            @ r1<- 1 or -1 for NaN
381465db5ee2d3c4c4dcc8e017a294172e858765cbBill Buzbee    bx      r11
39