1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc -mtriple=mips-unknown-linux-gnu -mcpu=mips32 < %s | FileCheck %s -check-prefixes=MIPS32 3 ; RUN: llc -mtriple=mips-unknown-linux-gnu -mcpu=mips32r2 < %s | FileCheck %s -check-prefixes=MIPS32R2 4 ; RUN: llc -mtriple=mips-unknown-linux-gnu -mcpu=mips32r6 < %s | FileCheck %s -check-prefixes=MIPS32r6 5 ; RUN: llc -mtriple=mips64-unknown-linux-gnu -mcpu=mips4 < %s | FileCheck %s -check-prefixes=MIPS4 6 ; RUN: llc -mtriple=mips64-unknown-linux-gnu -mcpu=mips64 < %s | FileCheck %s -check-prefixes=MIPS64 7 ; RUN: llc -mtriple=mips64-unknown-linux-gnu -mcpu=mips64r2 < %s | FileCheck %s -check-prefixes=MIPS64R2 8 ; RUN: llc -mtriple=mips64-unknown-linux-gnu -mcpu=mips64r6 < %s | FileCheck %s -check-prefixes=MIPS64R6 9 10 define double @foo(double %a, double %b) nounwind readnone { 11 ; MIPS32-LABEL: foo: 12 ; MIPS32: # %bb.0: # %entry 13 ; MIPS32-NEXT: mtc1 $zero, $f2 14 ; MIPS32-NEXT: mtc1 $zero, $f3 15 ; MIPS32-NEXT: c.ule.d $f12, $f2 16 ; MIPS32-NEXT: bc1f $BB0_2 17 ; MIPS32-NEXT: mov.d $f0, $f12 18 ; MIPS32-NEXT: # %bb.1: # %if.else 19 ; MIPS32-NEXT: mtc1 $zero, $f0 20 ; MIPS32-NEXT: mtc1 $zero, $f1 21 ; MIPS32-NEXT: c.ule.d $f14, $f0 22 ; MIPS32-NEXT: bc1t $BB0_3 23 ; MIPS32-NEXT: nop 24 ; MIPS32-NEXT: $BB0_2: # %if.end6 25 ; MIPS32-NEXT: sub.d $f0, $f14, $f0 26 ; MIPS32-NEXT: add.d $f0, $f0, $f0 27 ; MIPS32-NEXT: $BB0_3: # %return 28 ; MIPS32-NEXT: jr $ra 29 ; MIPS32-NEXT: nop 30 ; 31 ; MIPS32R2-LABEL: foo: 32 ; MIPS32R2: # %bb.0: # %entry 33 ; MIPS32R2-NEXT: mov.d $f0, $f12 34 ; MIPS32R2-NEXT: mtc1 $zero, $f2 35 ; MIPS32R2-NEXT: mthc1 $zero, $f2 36 ; MIPS32R2-NEXT: c.ule.d $f12, $f2 37 ; MIPS32R2-NEXT: bc1f $BB0_2 38 ; MIPS32R2-NEXT: nop 39 ; MIPS32R2-NEXT: # %bb.1: # %if.else 40 ; MIPS32R2-NEXT: mtc1 $zero, $f0 41 ; MIPS32R2-NEXT: mthc1 $zero, $f0 42 ; MIPS32R2-NEXT: c.ule.d $f14, $f0 43 ; MIPS32R2-NEXT: bc1t $BB0_3 44 ; MIPS32R2-NEXT: nop 45 ; MIPS32R2-NEXT: $BB0_2: # %if.end6 46 ; MIPS32R2-NEXT: sub.d $f0, $f14, $f0 47 ; MIPS32R2-NEXT: add.d $f0, $f0, $f0 48 ; MIPS32R2-NEXT: $BB0_3: # %return 49 ; MIPS32R2-NEXT: jr $ra 50 ; MIPS32R2-NEXT: nop 51 ; 52 ; MIPS32r6-LABEL: foo: 53 ; MIPS32r6: # %bb.0: # %entry 54 ; MIPS32r6-NEXT: mov.d $f0, $f12 55 ; MIPS32r6-NEXT: mtc1 $zero, $f1 56 ; MIPS32r6-NEXT: mthc1 $zero, $f1 57 ; MIPS32r6-NEXT: cmp.lt.d $f1, $f1, $f12 58 ; MIPS32r6-NEXT: mfc1 $1, $f1 59 ; MIPS32r6-NEXT: andi $1, $1, 1 60 ; MIPS32r6-NEXT: bnezc $1, $BB0_2 61 ; MIPS32r6-NEXT: # %bb.1: # %if.else 62 ; MIPS32r6-NEXT: mtc1 $zero, $f0 63 ; MIPS32r6-NEXT: mthc1 $zero, $f0 64 ; MIPS32r6-NEXT: cmp.ule.d $f1, $f14, $f0 65 ; MIPS32r6-NEXT: mfc1 $1, $f1 66 ; MIPS32r6-NEXT: andi $1, $1, 1 67 ; MIPS32r6-NEXT: bnezc $1, $BB0_3 68 ; MIPS32r6-NEXT: $BB0_2: # %if.end6 69 ; MIPS32r6-NEXT: sub.d $f0, $f14, $f0 70 ; MIPS32r6-NEXT: add.d $f0, $f0, $f0 71 ; MIPS32r6-NEXT: $BB0_3: # %return 72 ; MIPS32r6-NEXT: jrc $ra 73 ; 74 ; MIPS4-LABEL: foo: 75 ; MIPS4: # %bb.0: # %entry 76 ; MIPS4-NEXT: dmtc1 $zero, $f1 77 ; MIPS4-NEXT: c.ule.d $f12, $f1 78 ; MIPS4-NEXT: bc1f .LBB0_2 79 ; MIPS4-NEXT: mov.d $f0, $f12 80 ; MIPS4-NEXT: # %bb.1: # %if.else 81 ; MIPS4-NEXT: dmtc1 $zero, $f0 82 ; MIPS4-NEXT: c.ule.d $f13, $f0 83 ; MIPS4-NEXT: bc1t .LBB0_3 84 ; MIPS4-NEXT: nop 85 ; MIPS4-NEXT: .LBB0_2: # %if.end6 86 ; MIPS4-NEXT: sub.d $f0, $f13, $f0 87 ; MIPS4-NEXT: add.d $f0, $f0, $f0 88 ; MIPS4-NEXT: .LBB0_3: # %return 89 ; MIPS4-NEXT: jr $ra 90 ; MIPS4-NEXT: nop 91 ; 92 ; MIPS64-LABEL: foo: 93 ; MIPS64: # %bb.0: # %entry 94 ; MIPS64-NEXT: dmtc1 $zero, $f1 95 ; MIPS64-NEXT: c.ule.d $f12, $f1 96 ; MIPS64-NEXT: bc1f .LBB0_2 97 ; MIPS64-NEXT: mov.d $f0, $f12 98 ; MIPS64-NEXT: # %bb.1: # %if.else 99 ; MIPS64-NEXT: dmtc1 $zero, $f0 100 ; MIPS64-NEXT: c.ule.d $f13, $f0 101 ; MIPS64-NEXT: bc1t .LBB0_3 102 ; MIPS64-NEXT: nop 103 ; MIPS64-NEXT: .LBB0_2: # %if.end6 104 ; MIPS64-NEXT: sub.d $f0, $f13, $f0 105 ; MIPS64-NEXT: add.d $f0, $f0, $f0 106 ; MIPS64-NEXT: .LBB0_3: # %return 107 ; MIPS64-NEXT: jr $ra 108 ; MIPS64-NEXT: nop 109 ; 110 ; MIPS64R2-LABEL: foo: 111 ; MIPS64R2: # %bb.0: # %entry 112 ; MIPS64R2-NEXT: dmtc1 $zero, $f1 113 ; MIPS64R2-NEXT: c.ule.d $f12, $f1 114 ; MIPS64R2-NEXT: bc1f .LBB0_2 115 ; MIPS64R2-NEXT: mov.d $f0, $f12 116 ; MIPS64R2-NEXT: # %bb.1: # %if.else 117 ; MIPS64R2-NEXT: dmtc1 $zero, $f0 118 ; MIPS64R2-NEXT: c.ule.d $f13, $f0 119 ; MIPS64R2-NEXT: bc1t .LBB0_3 120 ; MIPS64R2-NEXT: nop 121 ; MIPS64R2-NEXT: .LBB0_2: # %if.end6 122 ; MIPS64R2-NEXT: sub.d $f0, $f13, $f0 123 ; MIPS64R2-NEXT: add.d $f0, $f0, $f0 124 ; MIPS64R2-NEXT: .LBB0_3: # %return 125 ; MIPS64R2-NEXT: jr $ra 126 ; MIPS64R2-NEXT: nop 127 ; 128 ; MIPS64R6-LABEL: foo: 129 ; MIPS64R6: # %bb.0: # %entry 130 ; MIPS64R6-NEXT: dmtc1 $zero, $f1 131 ; MIPS64R6-NEXT: cmp.lt.d $f1, $f1, $f12 132 ; MIPS64R6-NEXT: mfc1 $1, $f1 133 ; MIPS64R6-NEXT: andi $1, $1, 1 134 ; MIPS64R6-NEXT: bnez $1, .LBB0_2 135 ; MIPS64R6-NEXT: mov.d $f0, $f12 136 ; MIPS64R6-NEXT: # %bb.1: # %if.else 137 ; MIPS64R6-NEXT: dmtc1 $zero, $f0 138 ; MIPS64R6-NEXT: cmp.ule.d $f1, $f13, $f0 139 ; MIPS64R6-NEXT: mfc1 $1, $f1 140 ; MIPS64R6-NEXT: andi $1, $1, 1 141 ; MIPS64R6-NEXT: bnezc $1, .LBB0_3 142 ; MIPS64R6-NEXT: .LBB0_2: # %if.end6 143 ; MIPS64R6-NEXT: sub.d $f0, $f13, $f0 144 ; MIPS64R6-NEXT: add.d $f0, $f0, $f0 145 ; MIPS64R6-NEXT: .LBB0_3: # %return 146 ; MIPS64R6-NEXT: jrc $ra 147 entry: 148 %cmp = fcmp ogt double %a, 0.000000e+00 149 br i1 %cmp, label %if.end6, label %if.else 150 151 if.else: ; preds = %entry 152 %cmp3 = fcmp ogt double %b, 0.000000e+00 153 br i1 %cmp3, label %if.end6, label %return 154 155 if.end6: ; preds = %if.else, %entry 156 %c.0 = phi double [ %a, %entry ], [ 0.000000e+00, %if.else ] 157 %sub = fsub double %b, %c.0 158 %mul = fmul double %sub, 2.000000e+00 159 br label %return 160 161 return: ; preds = %if.else, %if.end6 162 %retval.0 = phi double [ %mul, %if.end6 ], [ 0.000000e+00, %if.else ] 163 ret double %retval.0 164 } 165 166 define void @f1(float %f) nounwind { 167 ; MIPS32-LABEL: f1: 168 ; MIPS32: # %bb.0: # %entry 169 ; MIPS32-NEXT: addiu $sp, $sp, -24 170 ; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 171 ; MIPS32-NEXT: mtc1 $zero, $f0 172 ; MIPS32-NEXT: c.eq.s $f12, $f0 173 ; MIPS32-NEXT: bc1f $BB1_2 174 ; MIPS32-NEXT: nop 175 ; MIPS32-NEXT: # %bb.1: # %if.end 176 ; MIPS32-NEXT: jal f2 177 ; MIPS32-NEXT: nop 178 ; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 179 ; MIPS32-NEXT: jr $ra 180 ; MIPS32-NEXT: addiu $sp, $sp, 24 181 ; MIPS32-NEXT: $BB1_2: # %if.then 182 ; MIPS32-NEXT: jal abort 183 ; MIPS32-NEXT: nop 184 ; 185 ; MIPS32R2-LABEL: f1: 186 ; MIPS32R2: # %bb.0: # %entry 187 ; MIPS32R2-NEXT: addiu $sp, $sp, -24 188 ; MIPS32R2-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 189 ; MIPS32R2-NEXT: mtc1 $zero, $f0 190 ; MIPS32R2-NEXT: c.eq.s $f12, $f0 191 ; MIPS32R2-NEXT: bc1f $BB1_2 192 ; MIPS32R2-NEXT: nop 193 ; MIPS32R2-NEXT: # %bb.1: # %if.end 194 ; MIPS32R2-NEXT: jal f2 195 ; MIPS32R2-NEXT: nop 196 ; MIPS32R2-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 197 ; MIPS32R2-NEXT: jr $ra 198 ; MIPS32R2-NEXT: addiu $sp, $sp, 24 199 ; MIPS32R2-NEXT: $BB1_2: # %if.then 200 ; MIPS32R2-NEXT: jal abort 201 ; MIPS32R2-NEXT: nop 202 ; 203 ; MIPS32r6-LABEL: f1: 204 ; MIPS32r6: # %bb.0: # %entry 205 ; MIPS32r6-NEXT: addiu $sp, $sp, -24 206 ; MIPS32r6-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 207 ; MIPS32r6-NEXT: mtc1 $zero, $f0 208 ; MIPS32r6-NEXT: cmp.eq.s $f0, $f12, $f0 209 ; MIPS32r6-NEXT: mfc1 $1, $f0 210 ; MIPS32r6-NEXT: andi $1, $1, 1 211 ; MIPS32r6-NEXT: beqzc $1, $BB1_2 212 ; MIPS32r6-NEXT: nop 213 ; MIPS32r6-NEXT: # %bb.1: # %if.end 214 ; MIPS32r6-NEXT: jal f2 215 ; MIPS32r6-NEXT: nop 216 ; MIPS32r6-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 217 ; MIPS32r6-NEXT: jr $ra 218 ; MIPS32r6-NEXT: addiu $sp, $sp, 24 219 ; MIPS32r6-NEXT: $BB1_2: # %if.then 220 ; MIPS32r6-NEXT: jal abort 221 ; MIPS32r6-NEXT: nop 222 ; 223 ; MIPS4-LABEL: f1: 224 ; MIPS4: # %bb.0: # %entry 225 ; MIPS4-NEXT: daddiu $sp, $sp, -16 226 ; MIPS4-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill 227 ; MIPS4-NEXT: mtc1 $zero, $f0 228 ; MIPS4-NEXT: c.eq.s $f12, $f0 229 ; MIPS4-NEXT: bc1f .LBB1_2 230 ; MIPS4-NEXT: nop 231 ; MIPS4-NEXT: # %bb.1: # %if.end 232 ; MIPS4-NEXT: jal f2 233 ; MIPS4-NEXT: nop 234 ; MIPS4-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload 235 ; MIPS4-NEXT: jr $ra 236 ; MIPS4-NEXT: daddiu $sp, $sp, 16 237 ; MIPS4-NEXT: .LBB1_2: # %if.then 238 ; MIPS4-NEXT: jal abort 239 ; MIPS4-NEXT: nop 240 ; 241 ; MIPS64-LABEL: f1: 242 ; MIPS64: # %bb.0: # %entry 243 ; MIPS64-NEXT: daddiu $sp, $sp, -16 244 ; MIPS64-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill 245 ; MIPS64-NEXT: mtc1 $zero, $f0 246 ; MIPS64-NEXT: c.eq.s $f12, $f0 247 ; MIPS64-NEXT: bc1f .LBB1_2 248 ; MIPS64-NEXT: nop 249 ; MIPS64-NEXT: # %bb.1: # %if.end 250 ; MIPS64-NEXT: jal f2 251 ; MIPS64-NEXT: nop 252 ; MIPS64-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload 253 ; MIPS64-NEXT: jr $ra 254 ; MIPS64-NEXT: daddiu $sp, $sp, 16 255 ; MIPS64-NEXT: .LBB1_2: # %if.then 256 ; MIPS64-NEXT: jal abort 257 ; MIPS64-NEXT: nop 258 ; 259 ; MIPS64R2-LABEL: f1: 260 ; MIPS64R2: # %bb.0: # %entry 261 ; MIPS64R2-NEXT: daddiu $sp, $sp, -16 262 ; MIPS64R2-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill 263 ; MIPS64R2-NEXT: mtc1 $zero, $f0 264 ; MIPS64R2-NEXT: c.eq.s $f12, $f0 265 ; MIPS64R2-NEXT: bc1f .LBB1_2 266 ; MIPS64R2-NEXT: nop 267 ; MIPS64R2-NEXT: # %bb.1: # %if.end 268 ; MIPS64R2-NEXT: jal f2 269 ; MIPS64R2-NEXT: nop 270 ; MIPS64R2-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload 271 ; MIPS64R2-NEXT: jr $ra 272 ; MIPS64R2-NEXT: daddiu $sp, $sp, 16 273 ; MIPS64R2-NEXT: .LBB1_2: # %if.then 274 ; MIPS64R2-NEXT: jal abort 275 ; MIPS64R2-NEXT: nop 276 ; 277 ; MIPS64R6-LABEL: f1: 278 ; MIPS64R6: # %bb.0: # %entry 279 ; MIPS64R6-NEXT: daddiu $sp, $sp, -16 280 ; MIPS64R6-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill 281 ; MIPS64R6-NEXT: mtc1 $zero, $f0 282 ; MIPS64R6-NEXT: cmp.eq.s $f0, $f12, $f0 283 ; MIPS64R6-NEXT: mfc1 $1, $f0 284 ; MIPS64R6-NEXT: andi $1, $1, 1 285 ; MIPS64R6-NEXT: beqzc $1, .LBB1_2 286 ; MIPS64R6-NEXT: nop 287 ; MIPS64R6-NEXT: # %bb.1: # %if.end 288 ; MIPS64R6-NEXT: jal f2 289 ; MIPS64R6-NEXT: nop 290 ; MIPS64R6-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload 291 ; MIPS64R6-NEXT: jr $ra 292 ; MIPS64R6-NEXT: daddiu $sp, $sp, 16 293 ; MIPS64R6-NEXT: .LBB1_2: # %if.then 294 ; MIPS64R6-NEXT: jal abort 295 ; MIPS64R6-NEXT: nop 296 entry: 297 %cmp = fcmp une float %f, 0.000000e+00 298 br i1 %cmp, label %if.then, label %if.end 299 300 if.then: ; preds = %entry 301 tail call void @abort() noreturn 302 unreachable 303 304 if.end: ; preds = %entry 305 tail call void (...) @f2() nounwind 306 ret void 307 } 308 309 declare void @abort() noreturn nounwind 310 311 declare void @f2(...) 312