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 @maxf64(double, double) { 7; CHECK-LABEL: maxf64: 8; CHECK: # %bb.0: 9; CHECK-NEXT: fcmp.d %s2, %s0, %s1 10; CHECK-NEXT: cmov.d.gt %s1, %s0, %s2 11; CHECK-NEXT: or %s0, 0, %s1 12; CHECK-NEXT: b.l.t (, %s10) 13; 14; OPT-LABEL: maxf64: 15; OPT: # %bb.0: 16; OPT-NEXT: fmax.d %s0, %s0, %s1 17; OPT-NEXT: b.l.t (, %s10) 18 %3 = fcmp ogt double %0, %1 19 %4 = select i1 %3, double %0, double %1 20 ret double %4 21} 22 23define double @max2f64(double, double) { 24; CHECK-LABEL: max2f64: 25; CHECK: # %bb.0: 26; CHECK-NEXT: fcmp.d %s2, %s0, %s1 27; CHECK-NEXT: cmov.d.ge %s1, %s0, %s2 28; CHECK-NEXT: or %s0, 0, %s1 29; CHECK-NEXT: b.l.t (, %s10) 30; 31; OPT-LABEL: max2f64: 32; OPT: # %bb.0: 33; OPT-NEXT: fmax.d %s0, %s0, %s1 34; OPT-NEXT: b.l.t (, %s10) 35 %3 = fcmp oge double %0, %1 36 %4 = select i1 %3, double %0, double %1 37 ret double %4 38} 39 40; VE has no max for unordered comparison 41define double @maxuf64(double, double) { 42; CHECK-LABEL: maxuf64: 43; CHECK: # %bb.0: 44; CHECK-NEXT: fcmp.d %s2, %s0, %s1 45; CHECK-NEXT: cmov.d.gtnan %s1, %s0, %s2 46; CHECK-NEXT: or %s0, 0, %s1 47; CHECK-NEXT: b.l.t (, %s10) 48; 49; OPT-LABEL: maxuf64: 50; OPT: # %bb.0: 51; OPT-NEXT: fmax.d %s0, %s0, %s1 52; OPT-NEXT: b.l.t (, %s10) 53 %3 = fcmp ugt double %0, %1 54 %4 = select i1 %3, double %0, double %1 55 ret double %4 56} 57 58; VE has no max for unordered comparison 59define double @max2uf64(double, double) { 60; CHECK-LABEL: max2uf64: 61; CHECK: # %bb.0: 62; CHECK-NEXT: fcmp.d %s2, %s0, %s1 63; CHECK-NEXT: cmov.d.genan %s1, %s0, %s2 64; CHECK-NEXT: or %s0, 0, %s1 65; CHECK-NEXT: b.l.t (, %s10) 66; 67; OPT-LABEL: max2uf64: 68; OPT: # %bb.0: 69; OPT-NEXT: fmax.d %s0, %s0, %s1 70; OPT-NEXT: b.l.t (, %s10) 71 %3 = fcmp uge double %0, %1 72 %4 = select i1 %3, double %0, double %1 73 ret double %4 74} 75 76define float @maxf32(float, float) { 77; CHECK-LABEL: maxf32: 78; CHECK: # %bb.0: 79; CHECK-NEXT: fcmp.s %s2, %s0, %s1 80; CHECK-NEXT: cmov.s.gt %s1, %s0, %s2 81; CHECK-NEXT: or %s0, 0, %s1 82; CHECK-NEXT: b.l.t (, %s10) 83; 84; OPT-LABEL: maxf32: 85; OPT: # %bb.0: 86; OPT-NEXT: fmax.s %s0, %s0, %s1 87; OPT-NEXT: b.l.t (, %s10) 88 %3 = fcmp ogt float %0, %1 89 %4 = select i1 %3, float %0, float %1 90 ret float %4 91} 92 93define float @max2f32(float, float) { 94; CHECK-LABEL: max2f32: 95; CHECK: # %bb.0: 96; CHECK-NEXT: fcmp.s %s2, %s0, %s1 97; CHECK-NEXT: cmov.s.ge %s1, %s0, %s2 98; CHECK-NEXT: or %s0, 0, %s1 99; CHECK-NEXT: b.l.t (, %s10) 100; 101; OPT-LABEL: max2f32: 102; OPT: # %bb.0: 103; OPT-NEXT: fmax.s %s0, %s0, %s1 104; OPT-NEXT: b.l.t (, %s10) 105 %3 = fcmp oge float %0, %1 106 %4 = select i1 %3, float %0, float %1 107 ret float %4 108} 109 110define float @maxuf32(float, float) { 111; CHECK-LABEL: maxuf32: 112; CHECK: # %bb.0: 113; CHECK-NEXT: fcmp.s %s2, %s0, %s1 114; CHECK-NEXT: cmov.s.gtnan %s1, %s0, %s2 115; CHECK-NEXT: or %s0, 0, %s1 116; CHECK-NEXT: b.l.t (, %s10) 117; 118; OPT-LABEL: maxuf32: 119; OPT: # %bb.0: 120; OPT-NEXT: fmax.s %s0, %s0, %s1 121; OPT-NEXT: b.l.t (, %s10) 122 %3 = fcmp ugt float %0, %1 123 %4 = select i1 %3, float %0, float %1 124 ret float %4 125} 126 127define float @max2uf32(float, float) { 128; CHECK-LABEL: max2uf32: 129; CHECK: # %bb.0: 130; CHECK-NEXT: fcmp.s %s2, %s0, %s1 131; CHECK-NEXT: cmov.s.genan %s1, %s0, %s2 132; CHECK-NEXT: or %s0, 0, %s1 133; CHECK-NEXT: b.l.t (, %s10) 134; 135; OPT-LABEL: max2uf32: 136; OPT: # %bb.0: 137; OPT-NEXT: fmax.s %s0, %s0, %s1 138; OPT-NEXT: b.l.t (, %s10) 139 %3 = fcmp uge float %0, %1 140 %4 = select i1 %3, float %0, float %1 141 ret float %4 142} 143 144define i64 @maxi64(i64, i64) { 145; CHECK-LABEL: maxi64: 146; CHECK: # %bb.0: 147; CHECK-NEXT: maxs.l %s0, %s0, %s1 148; CHECK-NEXT: b.l.t (, %s10) 149; 150; OPT-LABEL: maxi64: 151; OPT: # %bb.0: 152; OPT-NEXT: maxs.l %s0, %s0, %s1 153; OPT-NEXT: b.l.t (, %s10) 154 %3 = icmp sgt i64 %0, %1 155 %4 = select i1 %3, i64 %0, i64 %1 156 ret i64 %4 157} 158 159define i64 @max2i64(i64, i64) { 160; CHECK-LABEL: max2i64: 161; CHECK: # %bb.0: 162; CHECK-NEXT: maxs.l %s0, %s0, %s1 163; CHECK-NEXT: b.l.t (, %s10) 164; 165; OPT-LABEL: max2i64: 166; OPT: # %bb.0: 167; OPT-NEXT: maxs.l %s0, %s0, %s1 168; OPT-NEXT: b.l.t (, %s10) 169 %3 = icmp sge i64 %0, %1 170 %4 = select i1 %3, i64 %0, i64 %1 171 ret i64 %4 172} 173 174define i64 @maxu64(i64, i64) { 175; CHECK-LABEL: maxu64: 176; CHECK: # %bb.0: 177; CHECK-NEXT: cmpu.l %s2, %s0, %s1 178; CHECK-NEXT: cmov.l.gt %s1, %s0, %s2 179; CHECK-NEXT: or %s0, 0, %s1 180; CHECK-NEXT: b.l.t (, %s10) 181; 182; OPT-LABEL: maxu64: 183; OPT: # %bb.0: 184; OPT-NEXT: cmpu.l %s2, %s0, %s1 185; OPT-NEXT: cmov.l.gt %s1, %s0, %s2 186; OPT-NEXT: or %s0, 0, %s1 187; OPT-NEXT: b.l.t (, %s10) 188 %3 = icmp ugt i64 %0, %1 189 %4 = select i1 %3, i64 %0, i64 %1 190 ret i64 %4 191} 192 193define i64 @max2u64(i64, i64) { 194; CHECK-LABEL: max2u64: 195; CHECK: # %bb.0: 196; CHECK-NEXT: cmpu.l %s2, %s0, %s1 197; CHECK-NEXT: cmov.l.ge %s1, %s0, %s2 198; CHECK-NEXT: or %s0, 0, %s1 199; CHECK-NEXT: b.l.t (, %s10) 200; 201; OPT-LABEL: max2u64: 202; OPT: # %bb.0: 203; OPT-NEXT: cmpu.l %s2, %s0, %s1 204; OPT-NEXT: cmov.l.ge %s1, %s0, %s2 205; OPT-NEXT: or %s0, 0, %s1 206; OPT-NEXT: b.l.t (, %s10) 207 %3 = icmp uge i64 %0, %1 208 %4 = select i1 %3, i64 %0, i64 %1 209 ret i64 %4 210} 211 212define i32 @maxi32(i32, i32) { 213; CHECK-LABEL: maxi32: 214; CHECK: # %bb.0: 215; CHECK-NEXT: maxs.w.sx %s0, %s0, %s1 216; CHECK-NEXT: b.l.t (, %s10) 217; 218; OPT-LABEL: maxi32: 219; OPT: # %bb.0: 220; OPT-NEXT: maxs.w.sx %s0, %s0, %s1 221; OPT-NEXT: b.l.t (, %s10) 222 %3 = icmp sgt i32 %0, %1 223 %4 = select i1 %3, i32 %0, i32 %1 224 ret i32 %4 225} 226 227define i32 @max2i32(i32, i32) { 228; CHECK-LABEL: max2i32: 229; CHECK: # %bb.0: 230; CHECK-NEXT: maxs.w.sx %s0, %s0, %s1 231; CHECK-NEXT: b.l.t (, %s10) 232; 233; OPT-LABEL: max2i32: 234; OPT: # %bb.0: 235; OPT-NEXT: maxs.w.sx %s0, %s0, %s1 236; OPT-NEXT: b.l.t (, %s10) 237 %3 = icmp sge i32 %0, %1 238 %4 = select i1 %3, i32 %0, i32 %1 239 ret i32 %4 240} 241 242define i32 @maxu32(i32, i32) { 243; CHECK-LABEL: maxu32: 244; CHECK: # %bb.0: 245; CHECK-NEXT: cmpu.w %s2, %s0, %s1 246; CHECK-NEXT: cmov.w.gt %s1, %s0, %s2 247; CHECK-NEXT: or %s0, 0, %s1 248; CHECK-NEXT: b.l.t (, %s10) 249; 250; OPT-LABEL: maxu32: 251; OPT: # %bb.0: 252; OPT-NEXT: cmpu.w %s2, %s0, %s1 253; OPT-NEXT: cmov.w.gt %s1, %s0, %s2 254; OPT-NEXT: or %s0, 0, %s1 255; OPT-NEXT: b.l.t (, %s10) 256 %3 = icmp ugt i32 %0, %1 257 %4 = select i1 %3, i32 %0, i32 %1 258 ret i32 %4 259} 260 261define i32 @max2u32(i32, i32) { 262; CHECK-LABEL: max2u32: 263; CHECK: # %bb.0: 264; CHECK-NEXT: cmpu.w %s2, %s0, %s1 265; CHECK-NEXT: cmov.w.ge %s1, %s0, %s2 266; CHECK-NEXT: or %s0, 0, %s1 267; CHECK-NEXT: b.l.t (, %s10) 268; 269; OPT-LABEL: max2u32: 270; OPT: # %bb.0: 271; OPT-NEXT: cmpu.w %s2, %s0, %s1 272; OPT-NEXT: cmov.w.ge %s1, %s0, %s2 273; OPT-NEXT: or %s0, 0, %s1 274; OPT-NEXT: b.l.t (, %s10) 275 %3 = icmp uge i32 %0, %1 276 %4 = select i1 %3, i32 %0, i32 %1 277 ret i32 %4 278} 279 280define zeroext i1 @maxi1(i1 zeroext, i1 zeroext) { 281; CHECK-LABEL: maxi1: 282; CHECK: # %bb.0: 283; CHECK-NEXT: or %s0, %s0, %s1 284; CHECK-NEXT: and %s0, 1, %s0 285; CHECK-NEXT: b.l.t (, %s10) 286; 287; OPT-LABEL: maxi1: 288; OPT: # %bb.0: 289; OPT-NEXT: or %s0, %s0, %s1 290; OPT-NEXT: and %s0, 1, %s0 291; OPT-NEXT: b.l.t (, %s10) 292 %3 = xor i1 %1, true 293 %4 = and i1 %3, %0 294 %5 = select i1 %4, i1 %0, i1 %1 295 ret i1 %5 296} 297