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 10define 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 147entry: 148 %cmp = fcmp ogt double %a, 0.000000e+00 149 br i1 %cmp, label %if.end6, label %if.else 150 151if.else: ; preds = %entry 152 %cmp3 = fcmp ogt double %b, 0.000000e+00 153 br i1 %cmp3, label %if.end6, label %return 154 155if.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 161return: ; 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 166define 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 296entry: 297 %cmp = fcmp une float %f, 0.000000e+00 298 br i1 %cmp, label %if.then, label %if.end 299 300if.then: ; preds = %entry 301 tail call void @abort() noreturn 302 unreachable 303 304if.end: ; preds = %entry 305 tail call void (...) @f2() nounwind 306 ret void 307} 308 309declare void @abort() noreturn nounwind 310 311declare void @f2(...) 312