1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s 3; RUN: llc < %s -mtriple=ve-unknown-unknown -enable-no-signed-zeros-fp-math \ 4; RUN: -enable-no-nans-fp-math | FileCheck %s -check-prefix=OPT 5 6define double @minf64(double, double) { 7; CHECK-LABEL: minf64: 8; CHECK: # %bb.0: 9; CHECK-NEXT: fcmp.d %s2, %s0, %s1 10; CHECK-NEXT: cmov.d.lt %s1, %s0, %s2 11; CHECK-NEXT: or %s0, 0, %s1 12; CHECK-NEXT: b.l.t (, %s10) 13; 14; OPT-LABEL: minf64: 15; OPT: # %bb.0: 16; OPT-NEXT: fmin.d %s0, %s0, %s1 17; OPT-NEXT: b.l.t (, %s10) 18 %3 = fcmp olt double %0, %1 19 %4 = select i1 %3, double %0, double %1 20 ret double %4 21} 22 23define double @min2f64(double, double) { 24; CHECK-LABEL: min2f64: 25; CHECK: # %bb.0: 26; CHECK-NEXT: fcmp.d %s2, %s0, %s1 27; CHECK-NEXT: cmov.d.le %s1, %s0, %s2 28; CHECK-NEXT: or %s0, 0, %s1 29; CHECK-NEXT: b.l.t (, %s10) 30; 31; OPT-LABEL: min2f64: 32; OPT: # %bb.0: 33; OPT-NEXT: fmin.d %s0, %s0, %s1 34; OPT-NEXT: b.l.t (, %s10) 35 %3 = fcmp ole double %0, %1 36 %4 = select i1 %3, double %0, double %1 37 ret double %4 38} 39 40define double @minuf64(double, double) { 41; CHECK-LABEL: minuf64: 42; CHECK: # %bb.0: 43; CHECK-NEXT: fcmp.d %s2, %s0, %s1 44; CHECK-NEXT: cmov.d.ltnan %s1, %s0, %s2 45; CHECK-NEXT: or %s0, 0, %s1 46; CHECK-NEXT: b.l.t (, %s10) 47; 48; OPT-LABEL: minuf64: 49; OPT: # %bb.0: 50; OPT-NEXT: fmin.d %s0, %s0, %s1 51; OPT-NEXT: b.l.t (, %s10) 52 %3 = fcmp ult double %0, %1 53 %4 = select i1 %3, double %0, double %1 54 ret double %4 55} 56 57define double @min2uf64(double, double) { 58; CHECK-LABEL: min2uf64: 59; CHECK: # %bb.0: 60; CHECK-NEXT: fcmp.d %s2, %s0, %s1 61; CHECK-NEXT: cmov.d.lenan %s1, %s0, %s2 62; CHECK-NEXT: or %s0, 0, %s1 63; CHECK-NEXT: b.l.t (, %s10) 64; 65; OPT-LABEL: min2uf64: 66; OPT: # %bb.0: 67; OPT-NEXT: fmin.d %s0, %s0, %s1 68; OPT-NEXT: b.l.t (, %s10) 69 %3 = fcmp ule double %0, %1 70 %4 = select i1 %3, double %0, double %1 71 ret double %4 72} 73 74define float @minf32(float, float) { 75; CHECK-LABEL: minf32: 76; CHECK: # %bb.0: 77; CHECK-NEXT: fcmp.s %s2, %s0, %s1 78; CHECK-NEXT: cmov.s.lt %s1, %s0, %s2 79; CHECK-NEXT: or %s0, 0, %s1 80; CHECK-NEXT: b.l.t (, %s10) 81; 82; OPT-LABEL: minf32: 83; OPT: # %bb.0: 84; OPT-NEXT: fmin.s %s0, %s0, %s1 85; OPT-NEXT: b.l.t (, %s10) 86 %3 = fcmp olt float %0, %1 87 %4 = select i1 %3, float %0, float %1 88 ret float %4 89} 90 91define float @min2f32(float, float) { 92; CHECK-LABEL: min2f32: 93; CHECK: # %bb.0: 94; CHECK-NEXT: fcmp.s %s2, %s0, %s1 95; CHECK-NEXT: cmov.s.le %s1, %s0, %s2 96; CHECK-NEXT: or %s0, 0, %s1 97; CHECK-NEXT: b.l.t (, %s10) 98; 99; OPT-LABEL: min2f32: 100; OPT: # %bb.0: 101; OPT-NEXT: fmin.s %s0, %s0, %s1 102; OPT-NEXT: b.l.t (, %s10) 103 %3 = fcmp ole float %0, %1 104 %4 = select i1 %3, float %0, float %1 105 ret float %4 106} 107 108define float @minuf32(float, float) { 109; CHECK-LABEL: minuf32: 110; CHECK: # %bb.0: 111; CHECK-NEXT: fcmp.s %s2, %s0, %s1 112; CHECK-NEXT: cmov.s.ltnan %s1, %s0, %s2 113; CHECK-NEXT: or %s0, 0, %s1 114; CHECK-NEXT: b.l.t (, %s10) 115; 116; OPT-LABEL: minuf32: 117; OPT: # %bb.0: 118; OPT-NEXT: fmin.s %s0, %s0, %s1 119; OPT-NEXT: b.l.t (, %s10) 120 %3 = fcmp ult float %0, %1 121 %4 = select i1 %3, float %0, float %1 122 ret float %4 123} 124 125define float @min2uf32(float, float) { 126; CHECK-LABEL: min2uf32: 127; CHECK: # %bb.0: 128; CHECK-NEXT: fcmp.s %s2, %s0, %s1 129; CHECK-NEXT: cmov.s.lenan %s1, %s0, %s2 130; CHECK-NEXT: or %s0, 0, %s1 131; CHECK-NEXT: b.l.t (, %s10) 132; 133; OPT-LABEL: min2uf32: 134; OPT: # %bb.0: 135; OPT-NEXT: fmin.s %s0, %s0, %s1 136; OPT-NEXT: b.l.t (, %s10) 137 %3 = fcmp ule float %0, %1 138 %4 = select i1 %3, float %0, float %1 139 ret float %4 140} 141 142define i64 @mini64(i64, i64) { 143; CHECK-LABEL: mini64: 144; CHECK: # %bb.0: 145; CHECK-NEXT: mins.l %s0, %s0, %s1 146; CHECK-NEXT: b.l.t (, %s10) 147; 148; OPT-LABEL: mini64: 149; OPT: # %bb.0: 150; OPT-NEXT: mins.l %s0, %s0, %s1 151; OPT-NEXT: b.l.t (, %s10) 152 %3 = icmp slt i64 %0, %1 153 %4 = select i1 %3, i64 %0, i64 %1 154 ret i64 %4 155} 156 157define i64 @min2i64(i64, i64) { 158; CHECK-LABEL: min2i64: 159; CHECK: # %bb.0: 160; CHECK-NEXT: mins.l %s0, %s0, %s1 161; CHECK-NEXT: b.l.t (, %s10) 162; 163; OPT-LABEL: min2i64: 164; OPT: # %bb.0: 165; OPT-NEXT: mins.l %s0, %s0, %s1 166; OPT-NEXT: b.l.t (, %s10) 167 %3 = icmp sle i64 %0, %1 168 %4 = select i1 %3, i64 %0, i64 %1 169 ret i64 %4 170} 171 172define i64 @minu64(i64, i64) { 173; CHECK-LABEL: minu64: 174; CHECK: # %bb.0: 175; CHECK-NEXT: cmpu.l %s2, %s0, %s1 176; CHECK-NEXT: cmov.l.lt %s1, %s0, %s2 177; CHECK-NEXT: or %s0, 0, %s1 178; CHECK-NEXT: b.l.t (, %s10) 179; 180; OPT-LABEL: minu64: 181; OPT: # %bb.0: 182; OPT-NEXT: cmpu.l %s2, %s0, %s1 183; OPT-NEXT: cmov.l.lt %s1, %s0, %s2 184; OPT-NEXT: or %s0, 0, %s1 185; OPT-NEXT: b.l.t (, %s10) 186 %3 = icmp ult i64 %0, %1 187 %4 = select i1 %3, i64 %0, i64 %1 188 ret i64 %4 189} 190 191define i64 @min2u64(i64, i64) { 192; CHECK-LABEL: min2u64: 193; CHECK: # %bb.0: 194; CHECK-NEXT: cmpu.l %s2, %s0, %s1 195; CHECK-NEXT: cmov.l.le %s1, %s0, %s2 196; CHECK-NEXT: or %s0, 0, %s1 197; CHECK-NEXT: b.l.t (, %s10) 198; 199; OPT-LABEL: min2u64: 200; OPT: # %bb.0: 201; OPT-NEXT: cmpu.l %s2, %s0, %s1 202; OPT-NEXT: cmov.l.le %s1, %s0, %s2 203; OPT-NEXT: or %s0, 0, %s1 204; OPT-NEXT: b.l.t (, %s10) 205 %3 = icmp ule i64 %0, %1 206 %4 = select i1 %3, i64 %0, i64 %1 207 ret i64 %4 208} 209 210define i32 @mini32(i32, i32) { 211; CHECK-LABEL: mini32: 212; CHECK: # %bb.0: 213; CHECK-NEXT: mins.w.sx %s0, %s0, %s1 214; CHECK-NEXT: b.l.t (, %s10) 215; 216; OPT-LABEL: mini32: 217; OPT: # %bb.0: 218; OPT-NEXT: mins.w.sx %s0, %s0, %s1 219; OPT-NEXT: b.l.t (, %s10) 220 %3 = icmp slt i32 %0, %1 221 %4 = select i1 %3, i32 %0, i32 %1 222 ret i32 %4 223} 224 225define i32 @min2i32(i32, i32) { 226; CHECK-LABEL: min2i32: 227; CHECK: # %bb.0: 228; CHECK-NEXT: mins.w.sx %s0, %s0, %s1 229; CHECK-NEXT: b.l.t (, %s10) 230; 231; OPT-LABEL: min2i32: 232; OPT: # %bb.0: 233; OPT-NEXT: mins.w.sx %s0, %s0, %s1 234; OPT-NEXT: b.l.t (, %s10) 235 %3 = icmp sle i32 %0, %1 236 %4 = select i1 %3, i32 %0, i32 %1 237 ret i32 %4 238} 239 240define i32 @minu32(i32, i32) { 241; CHECK-LABEL: minu32: 242; CHECK: # %bb.0: 243; CHECK-NEXT: cmpu.w %s2, %s0, %s1 244; CHECK-NEXT: cmov.w.lt %s1, %s0, %s2 245; CHECK-NEXT: or %s0, 0, %s1 246; CHECK-NEXT: b.l.t (, %s10) 247; 248; OPT-LABEL: minu32: 249; OPT: # %bb.0: 250; OPT-NEXT: cmpu.w %s2, %s0, %s1 251; OPT-NEXT: cmov.w.lt %s1, %s0, %s2 252; OPT-NEXT: or %s0, 0, %s1 253; OPT-NEXT: b.l.t (, %s10) 254 %3 = icmp ult i32 %0, %1 255 %4 = select i1 %3, i32 %0, i32 %1 256 ret i32 %4 257} 258 259define i32 @min2u32(i32, i32) { 260; CHECK-LABEL: min2u32: 261; CHECK: # %bb.0: 262; CHECK-NEXT: cmpu.w %s2, %s0, %s1 263; CHECK-NEXT: cmov.w.le %s1, %s0, %s2 264; CHECK-NEXT: or %s0, 0, %s1 265; CHECK-NEXT: b.l.t (, %s10) 266; 267; OPT-LABEL: min2u32: 268; OPT: # %bb.0: 269; OPT-NEXT: cmpu.w %s2, %s0, %s1 270; OPT-NEXT: cmov.w.le %s1, %s0, %s2 271; OPT-NEXT: or %s0, 0, %s1 272; OPT-NEXT: b.l.t (, %s10) 273 %3 = icmp ule i32 %0, %1 274 %4 = select i1 %3, i32 %0, i32 %1 275 ret i32 %4 276} 277 278define zeroext i1 @mini1(i1 zeroext, i1 zeroext) { 279; CHECK-LABEL: mini1: 280; CHECK: # %bb.0: 281; CHECK-NEXT: and %s0, %s0, (32)0 282; CHECK-NEXT: and %s2, %s1, %s0 283; CHECK-NEXT: cmov.w.ne %s2, %s1, %s0 284; CHECK-NEXT: adds.w.zx %s0, %s2, (0)1 285; CHECK-NEXT: b.l.t (, %s10) 286; 287; OPT-LABEL: mini1: 288; OPT: # %bb.0: 289; OPT-NEXT: and %s0, %s0, (32)0 290; OPT-NEXT: and %s2, %s1, %s0 291; OPT-NEXT: cmov.w.ne %s2, %s1, %s0 292; OPT-NEXT: adds.w.zx %s0, %s2, (0)1 293; OPT-NEXT: b.l.t (, %s10) 294 %3 = xor i1 %0, true 295 %4 = and i1 %3, %1 296 %5 = select i1 %4, i1 %0, i1 %1 297 ret i1 %5 298} 299