Home | History | Annotate | Download | only in RISCV
      1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
      2 ; RUN: llc -mtriple=riscv32 -mattr=+d -verify-machineinstrs < %s \
      3 ; RUN:   | FileCheck -check-prefix=RV32IFD %s
      4 
      5 define i32 @fcmp_false(double %a, double %b) nounwind {
      6 ; RV32IFD-LABEL: fcmp_false:
      7 ; RV32IFD:       # %bb.0:
      8 ; RV32IFD-NEXT:    mv a0, zero
      9 ; RV32IFD-NEXT:    ret
     10   %1 = fcmp false double %a, %b
     11   %2 = zext i1 %1 to i32
     12   ret i32 %2
     13 }
     14 
     15 define i32 @fcmp_oeq(double %a, double %b) nounwind {
     16 ; RV32IFD-LABEL: fcmp_oeq:
     17 ; RV32IFD:       # %bb.0:
     18 ; RV32IFD-NEXT:    addi sp, sp, -16
     19 ; RV32IFD-NEXT:    sw a2, 8(sp)
     20 ; RV32IFD-NEXT:    sw a3, 12(sp)
     21 ; RV32IFD-NEXT:    fld ft0, 8(sp)
     22 ; RV32IFD-NEXT:    sw a0, 8(sp)
     23 ; RV32IFD-NEXT:    sw a1, 12(sp)
     24 ; RV32IFD-NEXT:    fld ft1, 8(sp)
     25 ; RV32IFD-NEXT:    feq.d a0, ft1, ft0
     26 ; RV32IFD-NEXT:    addi sp, sp, 16
     27 ; RV32IFD-NEXT:    ret
     28   %1 = fcmp oeq double %a, %b
     29   %2 = zext i1 %1 to i32
     30   ret i32 %2
     31 }
     32 
     33 define i32 @fcmp_ogt(double %a, double %b) nounwind {
     34 ; RV32IFD-LABEL: fcmp_ogt:
     35 ; RV32IFD:       # %bb.0:
     36 ; RV32IFD-NEXT:    addi sp, sp, -16
     37 ; RV32IFD-NEXT:    sw a0, 8(sp)
     38 ; RV32IFD-NEXT:    sw a1, 12(sp)
     39 ; RV32IFD-NEXT:    fld ft0, 8(sp)
     40 ; RV32IFD-NEXT:    sw a2, 8(sp)
     41 ; RV32IFD-NEXT:    sw a3, 12(sp)
     42 ; RV32IFD-NEXT:    fld ft1, 8(sp)
     43 ; RV32IFD-NEXT:    flt.d a0, ft1, ft0
     44 ; RV32IFD-NEXT:    addi sp, sp, 16
     45 ; RV32IFD-NEXT:    ret
     46   %1 = fcmp ogt double %a, %b
     47   %2 = zext i1 %1 to i32
     48   ret i32 %2
     49 }
     50 
     51 define i32 @fcmp_oge(double %a, double %b) nounwind {
     52 ; RV32IFD-LABEL: fcmp_oge:
     53 ; RV32IFD:       # %bb.0:
     54 ; RV32IFD-NEXT:    addi sp, sp, -16
     55 ; RV32IFD-NEXT:    sw a0, 8(sp)
     56 ; RV32IFD-NEXT:    sw a1, 12(sp)
     57 ; RV32IFD-NEXT:    fld ft0, 8(sp)
     58 ; RV32IFD-NEXT:    sw a2, 8(sp)
     59 ; RV32IFD-NEXT:    sw a3, 12(sp)
     60 ; RV32IFD-NEXT:    fld ft1, 8(sp)
     61 ; RV32IFD-NEXT:    fle.d a0, ft1, ft0
     62 ; RV32IFD-NEXT:    addi sp, sp, 16
     63 ; RV32IFD-NEXT:    ret
     64   %1 = fcmp oge double %a, %b
     65   %2 = zext i1 %1 to i32
     66   ret i32 %2
     67 }
     68 
     69 define i32 @fcmp_olt(double %a, double %b) nounwind {
     70 ; RV32IFD-LABEL: fcmp_olt:
     71 ; RV32IFD:       # %bb.0:
     72 ; RV32IFD-NEXT:    addi sp, sp, -16
     73 ; RV32IFD-NEXT:    sw a2, 8(sp)
     74 ; RV32IFD-NEXT:    sw a3, 12(sp)
     75 ; RV32IFD-NEXT:    fld ft0, 8(sp)
     76 ; RV32IFD-NEXT:    sw a0, 8(sp)
     77 ; RV32IFD-NEXT:    sw a1, 12(sp)
     78 ; RV32IFD-NEXT:    fld ft1, 8(sp)
     79 ; RV32IFD-NEXT:    flt.d a0, ft1, ft0
     80 ; RV32IFD-NEXT:    addi sp, sp, 16
     81 ; RV32IFD-NEXT:    ret
     82   %1 = fcmp olt double %a, %b
     83   %2 = zext i1 %1 to i32
     84   ret i32 %2
     85 }
     86 
     87 define i32 @fcmp_ole(double %a, double %b) nounwind {
     88 ; RV32IFD-LABEL: fcmp_ole:
     89 ; RV32IFD:       # %bb.0:
     90 ; RV32IFD-NEXT:    addi sp, sp, -16
     91 ; RV32IFD-NEXT:    sw a2, 8(sp)
     92 ; RV32IFD-NEXT:    sw a3, 12(sp)
     93 ; RV32IFD-NEXT:    fld ft0, 8(sp)
     94 ; RV32IFD-NEXT:    sw a0, 8(sp)
     95 ; RV32IFD-NEXT:    sw a1, 12(sp)
     96 ; RV32IFD-NEXT:    fld ft1, 8(sp)
     97 ; RV32IFD-NEXT:    fle.d a0, ft1, ft0
     98 ; RV32IFD-NEXT:    addi sp, sp, 16
     99 ; RV32IFD-NEXT:    ret
    100   %1 = fcmp ole double %a, %b
    101   %2 = zext i1 %1 to i32
    102   ret i32 %2
    103 }
    104 
    105 define i32 @fcmp_one(double %a, double %b) nounwind {
    106 ; RV32IFD-LABEL: fcmp_one:
    107 ; RV32IFD:       # %bb.0:
    108 ; RV32IFD-NEXT:    addi sp, sp, -16
    109 ; RV32IFD-NEXT:    sw a0, 8(sp)
    110 ; RV32IFD-NEXT:    sw a1, 12(sp)
    111 ; RV32IFD-NEXT:    fld ft0, 8(sp)
    112 ; RV32IFD-NEXT:    sw a2, 8(sp)
    113 ; RV32IFD-NEXT:    sw a3, 12(sp)
    114 ; RV32IFD-NEXT:    fld ft1, 8(sp)
    115 ; RV32IFD-NEXT:    feq.d a0, ft1, ft1
    116 ; RV32IFD-NEXT:    feq.d a1, ft0, ft0
    117 ; RV32IFD-NEXT:    and a0, a1, a0
    118 ; RV32IFD-NEXT:    feq.d a1, ft0, ft1
    119 ; RV32IFD-NEXT:    not a1, a1
    120 ; RV32IFD-NEXT:    seqz a0, a0
    121 ; RV32IFD-NEXT:    xori a0, a0, 1
    122 ; RV32IFD-NEXT:    and a0, a1, a0
    123 ; RV32IFD-NEXT:    addi sp, sp, 16
    124 ; RV32IFD-NEXT:    ret
    125   %1 = fcmp one double %a, %b
    126   %2 = zext i1 %1 to i32
    127   ret i32 %2
    128 }
    129 
    130 define i32 @fcmp_ord(double %a, double %b) nounwind {
    131 ; RV32IFD-LABEL: fcmp_ord:
    132 ; RV32IFD:       # %bb.0:
    133 ; RV32IFD-NEXT:    addi sp, sp, -16
    134 ; RV32IFD-NEXT:    sw a0, 8(sp)
    135 ; RV32IFD-NEXT:    sw a1, 12(sp)
    136 ; RV32IFD-NEXT:    fld ft0, 8(sp)
    137 ; RV32IFD-NEXT:    sw a2, 8(sp)
    138 ; RV32IFD-NEXT:    sw a3, 12(sp)
    139 ; RV32IFD-NEXT:    fld ft1, 8(sp)
    140 ; RV32IFD-NEXT:    feq.d a0, ft1, ft1
    141 ; RV32IFD-NEXT:    feq.d a1, ft0, ft0
    142 ; RV32IFD-NEXT:    and a0, a1, a0
    143 ; RV32IFD-NEXT:    seqz a0, a0
    144 ; RV32IFD-NEXT:    xori a0, a0, 1
    145 ; RV32IFD-NEXT:    addi sp, sp, 16
    146 ; RV32IFD-NEXT:    ret
    147   %1 = fcmp ord double %a, %b
    148   %2 = zext i1 %1 to i32
    149   ret i32 %2
    150 }
    151 
    152 define i32 @fcmp_ueq(double %a, double %b) nounwind {
    153 ; RV32IFD-LABEL: fcmp_ueq:
    154 ; RV32IFD:       # %bb.0:
    155 ; RV32IFD-NEXT:    addi sp, sp, -16
    156 ; RV32IFD-NEXT:    sw a2, 8(sp)
    157 ; RV32IFD-NEXT:    sw a3, 12(sp)
    158 ; RV32IFD-NEXT:    fld ft0, 8(sp)
    159 ; RV32IFD-NEXT:    sw a0, 8(sp)
    160 ; RV32IFD-NEXT:    sw a1, 12(sp)
    161 ; RV32IFD-NEXT:    fld ft1, 8(sp)
    162 ; RV32IFD-NEXT:    feq.d a0, ft1, ft0
    163 ; RV32IFD-NEXT:    feq.d a1, ft0, ft0
    164 ; RV32IFD-NEXT:    feq.d a2, ft1, ft1
    165 ; RV32IFD-NEXT:    and a1, a2, a1
    166 ; RV32IFD-NEXT:    seqz a1, a1
    167 ; RV32IFD-NEXT:    or a0, a0, a1
    168 ; RV32IFD-NEXT:    addi sp, sp, 16
    169 ; RV32IFD-NEXT:    ret
    170   %1 = fcmp ueq double %a, %b
    171   %2 = zext i1 %1 to i32
    172   ret i32 %2
    173 }
    174 
    175 define i32 @fcmp_ugt(double %a, double %b) nounwind {
    176 ; RV32IFD-LABEL: fcmp_ugt:
    177 ; RV32IFD:       # %bb.0:
    178 ; RV32IFD-NEXT:    addi sp, sp, -16
    179 ; RV32IFD-NEXT:    sw a2, 8(sp)
    180 ; RV32IFD-NEXT:    sw a3, 12(sp)
    181 ; RV32IFD-NEXT:    fld ft0, 8(sp)
    182 ; RV32IFD-NEXT:    sw a0, 8(sp)
    183 ; RV32IFD-NEXT:    sw a1, 12(sp)
    184 ; RV32IFD-NEXT:    fld ft1, 8(sp)
    185 ; RV32IFD-NEXT:    fle.d a0, ft1, ft0
    186 ; RV32IFD-NEXT:    xori a0, a0, 1
    187 ; RV32IFD-NEXT:    addi sp, sp, 16
    188 ; RV32IFD-NEXT:    ret
    189   %1 = fcmp ugt double %a, %b
    190   %2 = zext i1 %1 to i32
    191   ret i32 %2
    192 }
    193 
    194 define i32 @fcmp_uge(double %a, double %b) nounwind {
    195 ; RV32IFD-LABEL: fcmp_uge:
    196 ; RV32IFD:       # %bb.0:
    197 ; RV32IFD-NEXT:    addi sp, sp, -16
    198 ; RV32IFD-NEXT:    sw a2, 8(sp)
    199 ; RV32IFD-NEXT:    sw a3, 12(sp)
    200 ; RV32IFD-NEXT:    fld ft0, 8(sp)
    201 ; RV32IFD-NEXT:    sw a0, 8(sp)
    202 ; RV32IFD-NEXT:    sw a1, 12(sp)
    203 ; RV32IFD-NEXT:    fld ft1, 8(sp)
    204 ; RV32IFD-NEXT:    flt.d a0, ft1, ft0
    205 ; RV32IFD-NEXT:    xori a0, a0, 1
    206 ; RV32IFD-NEXT:    addi sp, sp, 16
    207 ; RV32IFD-NEXT:    ret
    208   %1 = fcmp uge double %a, %b
    209   %2 = zext i1 %1 to i32
    210   ret i32 %2
    211 }
    212 
    213 define i32 @fcmp_ult(double %a, double %b) nounwind {
    214 ; RV32IFD-LABEL: fcmp_ult:
    215 ; RV32IFD:       # %bb.0:
    216 ; RV32IFD-NEXT:    addi sp, sp, -16
    217 ; RV32IFD-NEXT:    sw a0, 8(sp)
    218 ; RV32IFD-NEXT:    sw a1, 12(sp)
    219 ; RV32IFD-NEXT:    fld ft0, 8(sp)
    220 ; RV32IFD-NEXT:    sw a2, 8(sp)
    221 ; RV32IFD-NEXT:    sw a3, 12(sp)
    222 ; RV32IFD-NEXT:    fld ft1, 8(sp)
    223 ; RV32IFD-NEXT:    fle.d a0, ft1, ft0
    224 ; RV32IFD-NEXT:    xori a0, a0, 1
    225 ; RV32IFD-NEXT:    addi sp, sp, 16
    226 ; RV32IFD-NEXT:    ret
    227   %1 = fcmp ult double %a, %b
    228   %2 = zext i1 %1 to i32
    229   ret i32 %2
    230 }
    231 
    232 define i32 @fcmp_ule(double %a, double %b) nounwind {
    233 ; RV32IFD-LABEL: fcmp_ule:
    234 ; RV32IFD:       # %bb.0:
    235 ; RV32IFD-NEXT:    addi sp, sp, -16
    236 ; RV32IFD-NEXT:    sw a0, 8(sp)
    237 ; RV32IFD-NEXT:    sw a1, 12(sp)
    238 ; RV32IFD-NEXT:    fld ft0, 8(sp)
    239 ; RV32IFD-NEXT:    sw a2, 8(sp)
    240 ; RV32IFD-NEXT:    sw a3, 12(sp)
    241 ; RV32IFD-NEXT:    fld ft1, 8(sp)
    242 ; RV32IFD-NEXT:    flt.d a0, ft1, ft0
    243 ; RV32IFD-NEXT:    xori a0, a0, 1
    244 ; RV32IFD-NEXT:    addi sp, sp, 16
    245 ; RV32IFD-NEXT:    ret
    246   %1 = fcmp ule double %a, %b
    247   %2 = zext i1 %1 to i32
    248   ret i32 %2
    249 }
    250 
    251 define i32 @fcmp_une(double %a, double %b) nounwind {
    252 ; RV32IFD-LABEL: fcmp_une:
    253 ; RV32IFD:       # %bb.0:
    254 ; RV32IFD-NEXT:    addi sp, sp, -16
    255 ; RV32IFD-NEXT:    sw a2, 8(sp)
    256 ; RV32IFD-NEXT:    sw a3, 12(sp)
    257 ; RV32IFD-NEXT:    fld ft0, 8(sp)
    258 ; RV32IFD-NEXT:    sw a0, 8(sp)
    259 ; RV32IFD-NEXT:    sw a1, 12(sp)
    260 ; RV32IFD-NEXT:    fld ft1, 8(sp)
    261 ; RV32IFD-NEXT:    feq.d a0, ft1, ft0
    262 ; RV32IFD-NEXT:    xori a0, a0, 1
    263 ; RV32IFD-NEXT:    addi sp, sp, 16
    264 ; RV32IFD-NEXT:    ret
    265   %1 = fcmp une double %a, %b
    266   %2 = zext i1 %1 to i32
    267   ret i32 %2
    268 }
    269 
    270 define i32 @fcmp_uno(double %a, double %b) nounwind {
    271 ; RV32IFD-LABEL: fcmp_uno:
    272 ; RV32IFD:       # %bb.0:
    273 ; RV32IFD-NEXT:    addi sp, sp, -16
    274 ; RV32IFD-NEXT:    sw a0, 8(sp)
    275 ; RV32IFD-NEXT:    sw a1, 12(sp)
    276 ; RV32IFD-NEXT:    fld ft0, 8(sp)
    277 ; RV32IFD-NEXT:    sw a2, 8(sp)
    278 ; RV32IFD-NEXT:    sw a3, 12(sp)
    279 ; RV32IFD-NEXT:    fld ft1, 8(sp)
    280 ; RV32IFD-NEXT:    feq.d a0, ft1, ft1
    281 ; RV32IFD-NEXT:    feq.d a1, ft0, ft0
    282 ; RV32IFD-NEXT:    and a0, a1, a0
    283 ; RV32IFD-NEXT:    seqz a0, a0
    284 ; RV32IFD-NEXT:    addi sp, sp, 16
    285 ; RV32IFD-NEXT:    ret
    286   %1 = fcmp uno double %a, %b
    287   %2 = zext i1 %1 to i32
    288   ret i32 %2
    289 }
    290 
    291 define i32 @fcmp_true(double %a, double %b) nounwind {
    292 ; RV32IFD-LABEL: fcmp_true:
    293 ; RV32IFD:       # %bb.0:
    294 ; RV32IFD-NEXT:    addi a0, zero, 1
    295 ; RV32IFD-NEXT:    ret
    296   %1 = fcmp true double %a, %b
    297   %2 = zext i1 %1 to i32
    298   ret i32 %2
    299 }
    300