350 lines · plain
1; Test f64 and v2f64 comparisons.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s4 5; Test oeq.6define <2 x i64> @f1(<2 x i64> %dummy, <2 x double> %val1, <2 x double> %val2) {7; CHECK-LABEL: f1:8; CHECK: vfcedb %v24, %v26, %v289; CHECK-NEXT: br %r1410 %cmp = fcmp oeq <2 x double> %val1, %val211 %ret = sext <2 x i1> %cmp to <2 x i64>12 ret <2 x i64> %ret13}14 15; Test one.16define <2 x i64> @f2(<2 x i64> %dummy, <2 x double> %val1, <2 x double> %val2) {17; CHECK-LABEL: f2:18; CHECK-DAG: vfchdb [[REG1:%v[0-9]+]], %v28, %v2619; CHECK-DAG: vfchdb [[REG2:%v[0-9]+]], %v26, %v2820; CHECK: vo %v24, [[REG1]], [[REG2]]21; CHECK-NEXT: br %r1422 %cmp = fcmp one <2 x double> %val1, %val223 %ret = sext <2 x i1> %cmp to <2 x i64>24 ret <2 x i64> %ret25}26 27; Test ogt.28define <2 x i64> @f3(<2 x i64> %dummy, <2 x double> %val1, <2 x double> %val2) {29; CHECK-LABEL: f3:30; CHECK: vfchdb %v24, %v26, %v2831; CHECK-NEXT: br %r1432 %cmp = fcmp ogt <2 x double> %val1, %val233 %ret = sext <2 x i1> %cmp to <2 x i64>34 ret <2 x i64> %ret35}36 37; Test oge.38define <2 x i64> @f4(<2 x i64> %dummy, <2 x double> %val1, <2 x double> %val2) {39; CHECK-LABEL: f4:40; CHECK: vfchedb %v24, %v26, %v2841; CHECK-NEXT: br %r1442 %cmp = fcmp oge <2 x double> %val1, %val243 %ret = sext <2 x i1> %cmp to <2 x i64>44 ret <2 x i64> %ret45}46 47; Test ole.48define <2 x i64> @f5(<2 x i64> %dummy, <2 x double> %val1, <2 x double> %val2) {49; CHECK-LABEL: f5:50; CHECK: vfchedb %v24, %v28, %v2651; CHECK-NEXT: br %r1452 %cmp = fcmp ole <2 x double> %val1, %val253 %ret = sext <2 x i1> %cmp to <2 x i64>54 ret <2 x i64> %ret55}56 57; Test olt.58define <2 x i64> @f6(<2 x i64> %dummy, <2 x double> %val1, <2 x double> %val2) {59; CHECK-LABEL: f6:60; CHECK: vfchdb %v24, %v28, %v2661; CHECK-NEXT: br %r1462 %cmp = fcmp olt <2 x double> %val1, %val263 %ret = sext <2 x i1> %cmp to <2 x i64>64 ret <2 x i64> %ret65}66 67; Test ueq.68define <2 x i64> @f7(<2 x i64> %dummy, <2 x double> %val1, <2 x double> %val2) {69; CHECK-LABEL: f7:70; CHECK-DAG: vfchdb [[REG1:%v[0-9]+]], %v28, %v2671; CHECK-DAG: vfchdb [[REG2:%v[0-9]+]], %v26, %v2872; CHECK: vno %v24, [[REG1]], [[REG2]]73; CHECK-NEXT: br %r1474 %cmp = fcmp ueq <2 x double> %val1, %val275 %ret = sext <2 x i1> %cmp to <2 x i64>76 ret <2 x i64> %ret77}78 79; Test une.80define <2 x i64> @f8(<2 x i64> %dummy, <2 x double> %val1, <2 x double> %val2) {81; CHECK-LABEL: f8:82; CHECK: vfcedb [[REG:%v[0-9]+]], %v26, %v2883; CHECK-NEXT: vno %v24, [[REG]], [[REG]]84; CHECK-NEXT: br %r1485 %cmp = fcmp une <2 x double> %val1, %val286 %ret = sext <2 x i1> %cmp to <2 x i64>87 ret <2 x i64> %ret88}89 90; Test ugt.91define <2 x i64> @f9(<2 x i64> %dummy, <2 x double> %val1, <2 x double> %val2) {92; CHECK-LABEL: f9:93; CHECK: vfchedb [[REG:%v[0-9]+]], %v28, %v2694; CHECK-NEXT: vno %v24, [[REG]], [[REG]]95; CHECK-NEXT: br %r1496 %cmp = fcmp ugt <2 x double> %val1, %val297 %ret = sext <2 x i1> %cmp to <2 x i64>98 ret <2 x i64> %ret99}100 101; Test uge.102define <2 x i64> @f10(<2 x i64> %dummy, <2 x double> %val1,103 <2 x double> %val2) {104; CHECK-LABEL: f10:105; CHECK: vfchdb [[REG:%v[0-9]+]], %v28, %v26106; CHECK-NEXT: vno %v24, [[REG]], [[REG]]107; CHECK-NEXT: br %r14108 %cmp = fcmp uge <2 x double> %val1, %val2109 %ret = sext <2 x i1> %cmp to <2 x i64>110 ret <2 x i64> %ret111}112 113; Test ule.114define <2 x i64> @f11(<2 x i64> %dummy, <2 x double> %val1,115 <2 x double> %val2) {116; CHECK-LABEL: f11:117; CHECK: vfchdb [[REG:%v[0-9]+]], %v26, %v28118; CHECK-NEXT: vno %v24, [[REG]], [[REG]]119; CHECK-NEXT: br %r14120 %cmp = fcmp ule <2 x double> %val1, %val2121 %ret = sext <2 x i1> %cmp to <2 x i64>122 ret <2 x i64> %ret123}124 125; Test ult.126define <2 x i64> @f12(<2 x i64> %dummy, <2 x double> %val1,127 <2 x double> %val2) {128; CHECK-LABEL: f12:129; CHECK: vfchedb [[REG:%v[0-9]+]], %v26, %v28130; CHECK-NEXT: vno %v24, [[REG]], [[REG]]131; CHECK-NEXT: br %r14132 %cmp = fcmp ult <2 x double> %val1, %val2133 %ret = sext <2 x i1> %cmp to <2 x i64>134 ret <2 x i64> %ret135}136 137; Test ord.138define <2 x i64> @f13(<2 x i64> %dummy, <2 x double> %val1,139 <2 x double> %val2) {140; CHECK-LABEL: f13:141; CHECK-DAG: vfchdb [[REG1:%v[0-9]+]], %v28, %v26142; CHECK-DAG: vfchedb [[REG2:%v[0-9]+]], %v26, %v28143; CHECK: vo %v24, [[REG1]], [[REG2]]144; CHECK-NEXT: br %r14145 %cmp = fcmp ord <2 x double> %val1, %val2146 %ret = sext <2 x i1> %cmp to <2 x i64>147 ret <2 x i64> %ret148}149 150; Test uno.151define <2 x i64> @f14(<2 x i64> %dummy, <2 x double> %val1,152 <2 x double> %val2) {153; CHECK-LABEL: f14:154; CHECK-DAG: vfchdb [[REG1:%v[0-9]+]], %v28, %v26155; CHECK-DAG: vfchedb [[REG2:%v[0-9]+]], %v26, %v28156; CHECK: vno %v24, [[REG1]], [[REG2]]157; CHECK-NEXT: br %r14158 %cmp = fcmp uno <2 x double> %val1, %val2159 %ret = sext <2 x i1> %cmp to <2 x i64>160 ret <2 x i64> %ret161}162 163; Test oeq selects.164define <2 x double> @f15(<2 x double> %val1, <2 x double> %val2,165 <2 x double> %val3, <2 x double> %val4) {166; CHECK-LABEL: f15:167; CHECK: vfcedb [[REG:%v[0-9]+]], %v24, %v26168; CHECK-NEXT: vsel %v24, %v28, %v30, [[REG]]169; CHECK-NEXT: br %r14170 %cmp = fcmp oeq <2 x double> %val1, %val2171 %ret = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4172 ret <2 x double> %ret173}174 175; Test one selects.176define <2 x double> @f16(<2 x double> %val1, <2 x double> %val2,177 <2 x double> %val3, <2 x double> %val4) {178; CHECK-LABEL: f16:179; CHECK-DAG: vfchdb [[REG1:%v[0-9]+]], %v26, %v24180; CHECK-DAG: vfchdb [[REG2:%v[0-9]+]], %v24, %v26181; CHECK: vo [[REG:%v[0-9]+]], [[REG1]], [[REG2]]182; CHECK-NEXT: vsel %v24, %v28, %v30, [[REG]]183; CHECK-NEXT: br %r14184 %cmp = fcmp one <2 x double> %val1, %val2185 %ret = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4186 ret <2 x double> %ret187}188 189; Test ogt selects.190define <2 x double> @f17(<2 x double> %val1, <2 x double> %val2,191 <2 x double> %val3, <2 x double> %val4) {192; CHECK-LABEL: f17:193; CHECK: vfchdb [[REG:%v[0-9]+]], %v24, %v26194; CHECK-NEXT: vsel %v24, %v28, %v30, [[REG]]195; CHECK-NEXT: br %r14196 %cmp = fcmp ogt <2 x double> %val1, %val2197 %ret = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4198 ret <2 x double> %ret199}200 201; Test oge selects.202define <2 x double> @f18(<2 x double> %val1, <2 x double> %val2,203 <2 x double> %val3, <2 x double> %val4) {204; CHECK-LABEL: f18:205; CHECK: vfchedb [[REG:%v[0-9]+]], %v24, %v26206; CHECK-NEXT: vsel %v24, %v28, %v30, [[REG]]207; CHECK-NEXT: br %r14208 %cmp = fcmp oge <2 x double> %val1, %val2209 %ret = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4210 ret <2 x double> %ret211}212 213; Test ole selects.214define <2 x double> @f19(<2 x double> %val1, <2 x double> %val2,215 <2 x double> %val3, <2 x double> %val4) {216; CHECK-LABEL: f19:217; CHECK: vfchedb [[REG:%v[0-9]+]], %v26, %v24218; CHECK-NEXT: vsel %v24, %v28, %v30, [[REG]]219; CHECK-NEXT: br %r14220 %cmp = fcmp ole <2 x double> %val1, %val2221 %ret = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4222 ret <2 x double> %ret223}224 225; Test olt selects.226define <2 x double> @f20(<2 x double> %val1, <2 x double> %val2,227 <2 x double> %val3, <2 x double> %val4) {228; CHECK-LABEL: f20:229; CHECK: vfchdb [[REG:%v[0-9]+]], %v26, %v24230; CHECK-NEXT: vsel %v24, %v28, %v30, [[REG]]231; CHECK-NEXT: br %r14232 %cmp = fcmp olt <2 x double> %val1, %val2233 %ret = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4234 ret <2 x double> %ret235}236 237; Test ueq selects.238define <2 x double> @f21(<2 x double> %val1, <2 x double> %val2,239 <2 x double> %val3, <2 x double> %val4) {240; CHECK-LABEL: f21:241; CHECK-DAG: vfchdb [[REG1:%v[0-9]+]], %v26, %v24242; CHECK-DAG: vfchdb [[REG2:%v[0-9]+]], %v24, %v26243; CHECK: vo [[REG:%v[0-9]+]], [[REG1]], [[REG2]]244; CHECK-NEXT: vsel %v24, %v30, %v28, [[REG]]245; CHECK-NEXT: br %r14246 %cmp = fcmp ueq <2 x double> %val1, %val2247 %ret = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4248 ret <2 x double> %ret249}250 251; Test une selects.252define <2 x double> @f22(<2 x double> %val1, <2 x double> %val2,253 <2 x double> %val3, <2 x double> %val4) {254; CHECK-LABEL: f22:255; CHECK: vfcedb [[REG:%v[0-9]+]], %v24, %v26256; CHECK-NEXT: vsel %v24, %v30, %v28, [[REG]]257; CHECK-NEXT: br %r14258 %cmp = fcmp une <2 x double> %val1, %val2259 %ret = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4260 ret <2 x double> %ret261}262 263; Test ugt selects.264define <2 x double> @f23(<2 x double> %val1, <2 x double> %val2,265 <2 x double> %val3, <2 x double> %val4) {266; CHECK-LABEL: f23:267; CHECK: vfchedb [[REG:%v[0-9]+]], %v26, %v24268; CHECK-NEXT: vsel %v24, %v30, %v28, [[REG]]269; CHECK-NEXT: br %r14270 %cmp = fcmp ugt <2 x double> %val1, %val2271 %ret = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4272 ret <2 x double> %ret273}274 275; Test uge selects.276define <2 x double> @f24(<2 x double> %val1, <2 x double> %val2,277 <2 x double> %val3, <2 x double> %val4) {278; CHECK-LABEL: f24:279; CHECK: vfchdb [[REG:%v[0-9]+]], %v26, %v24280; CHECK-NEXT: vsel %v24, %v30, %v28, [[REG]]281; CHECK-NEXT: br %r14282 %cmp = fcmp uge <2 x double> %val1, %val2283 %ret = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4284 ret <2 x double> %ret285}286 287; Test ule selects.288define <2 x double> @f25(<2 x double> %val1, <2 x double> %val2,289 <2 x double> %val3, <2 x double> %val4) {290; CHECK-LABEL: f25:291; CHECK: vfchdb [[REG:%v[0-9]+]], %v24, %v26292; CHECK-NEXT: vsel %v24, %v30, %v28, [[REG]]293; CHECK-NEXT: br %r14294 %cmp = fcmp ule <2 x double> %val1, %val2295 %ret = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4296 ret <2 x double> %ret297}298 299; Test ult selects.300define <2 x double> @f26(<2 x double> %val1, <2 x double> %val2,301 <2 x double> %val3, <2 x double> %val4) {302; CHECK-LABEL: f26:303; CHECK: vfchedb [[REG:%v[0-9]+]], %v24, %v26304; CHECK-NEXT: vsel %v24, %v30, %v28, [[REG]]305; CHECK-NEXT: br %r14306 %cmp = fcmp ult <2 x double> %val1, %val2307 %ret = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4308 ret <2 x double> %ret309}310 311; Test ord selects.312define <2 x double> @f27(<2 x double> %val1, <2 x double> %val2,313 <2 x double> %val3, <2 x double> %val4) {314; CHECK-LABEL: f27:315; CHECK-DAG: vfchdb [[REG1:%v[0-9]+]], %v26, %v24316; CHECK-DAG: vfchedb [[REG2:%v[0-9]+]], %v24, %v26317; CHECK: vo [[REG:%v[0-9]+]], [[REG1]], [[REG2]]318; CHECK-NEXT: vsel %v24, %v28, %v30, [[REG]]319; CHECK-NEXT: br %r14320 %cmp = fcmp ord <2 x double> %val1, %val2321 %ret = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4322 ret <2 x double> %ret323}324 325; Test uno selects.326define <2 x double> @f28(<2 x double> %val1, <2 x double> %val2,327 <2 x double> %val3, <2 x double> %val4) {328; CHECK-LABEL: f28:329; CHECK-DAG: vfchdb [[REG1:%v[0-9]+]], %v26, %v24330; CHECK-DAG: vfchedb [[REG2:%v[0-9]+]], %v24, %v26331; CHECK: vo [[REG:%v[0-9]+]], [[REG1]], [[REG2]]332; CHECK-NEXT: vsel %v24, %v30, %v28, [[REG]]333; CHECK-NEXT: br %r14334 %cmp = fcmp uno <2 x double> %val1, %val2335 %ret = select <2 x i1> %cmp, <2 x double> %val3, <2 x double> %val4336 ret <2 x double> %ret337}338 339; Test an f64 comparison that uses vector registers.340define i64 @f29(i64 %a, i64 %b, double %f1, <2 x double> %vec) {341; CHECK-LABEL: f29:342; CHECK: wfcdb %f0, %v24343; CHECK-NEXT: locgrne %r2, %r3344; CHECK: br %r14345 %f2 = extractelement <2 x double> %vec, i32 0346 %cond = fcmp oeq double %f1, %f2347 %res = select i1 %cond, i64 %a, i64 %b348 ret i64 %res349}350