219 lines · plain
1; Test all condition-code masks that are relevant for floating-point2; comparisons.3;4; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s5 6define void @f1(ptr %src, float %target) {7; CHECK-LABEL: f1:8; CHECK: .cfi_startproc9; CHECK: .L[[LABEL:.*]]:10; CHECK: ceb %f0, 0(%r2)11; CHECK-NEXT: je .L[[LABEL]]12 br label %loop13loop:14 %val = load volatile float, ptr %src15 %cond = fcmp oeq float %target, %val16 br i1 %cond, label %loop, label %exit17exit:18 ret void19}20 21define void @f2(ptr %src, float %target) {22; CHECK-LABEL: f2:23; CHECK: .cfi_startproc24; CHECK: .L[[LABEL:.*]]:25; CHECK: ceb %f0, 0(%r2)26; CHECK-NEXT: jlh .L[[LABEL]]27 br label %loop28loop:29 %val = load volatile float, ptr %src30 %cond = fcmp one float %target, %val31 br i1 %cond, label %loop, label %exit32exit:33 ret void34}35 36define void @f3(ptr %src, float %target) {37; CHECK-LABEL: f3:38; CHECK: .cfi_startproc39; CHECK: .L[[LABEL:.*]]:40; CHECK: ceb %f0, 0(%r2)41; CHECK-NEXT: jle .L[[LABEL]]42 br label %loop43loop:44 %val = load volatile float, ptr %src45 %cond = fcmp ole float %target, %val46 br i1 %cond, label %loop, label %exit47exit:48 ret void49}50 51define void @f4(ptr %src, float %target) {52; CHECK-LABEL: f4:53; CHECK: .cfi_startproc54; CHECK: .L[[LABEL:.*]]:55; CHECK: ceb %f0, 0(%r2)56; CHECK-NEXT: jl .L[[LABEL]]57 br label %loop58loop:59 %val = load volatile float, ptr %src60 %cond = fcmp olt float %target, %val61 br i1 %cond, label %loop, label %exit62exit:63 ret void64}65 66define void @f5(ptr %src, float %target) {67; CHECK-LABEL: f5:68; CHECK: .cfi_startproc69; CHECK: .L[[LABEL:.*]]:70; CHECK: ceb %f0, 0(%r2)71; CHECK-NEXT: jh .L[[LABEL]]72 br label %loop73loop:74 %val = load volatile float, ptr %src75 %cond = fcmp ogt float %target, %val76 br i1 %cond, label %loop, label %exit77exit:78 ret void79}80 81define void @f6(ptr %src, float %target) {82; CHECK-LABEL: f6:83; CHECK: .cfi_startproc84; CHECK: .L[[LABEL:.*]]:85; CHECK: ceb %f0, 0(%r2)86; CHECK-NEXT: jhe .L[[LABEL]]87 br label %loop88loop:89 %val = load volatile float, ptr %src90 %cond = fcmp oge float %target, %val91 br i1 %cond, label %loop, label %exit92exit:93 ret void94}95 96define void @f7(ptr %src, float %target) {97; CHECK-LABEL: f7:98; CHECK: .cfi_startproc99; CHECK: .L[[LABEL:.*]]:100; CHECK: ceb %f0, 0(%r2)101; CHECK-NEXT: jnlh .L[[LABEL]]102 br label %loop103loop:104 %val = load volatile float, ptr %src105 %cond = fcmp ueq float %target, %val106 br i1 %cond, label %loop, label %exit107exit:108 ret void109}110 111define void @f8(ptr %src, float %target) {112; CHECK-LABEL: f8:113; CHECK: .cfi_startproc114; CHECK: .L[[LABEL:.*]]:115; CHECK: ceb %f0, 0(%r2)116; CHECK-NEXT: jne .L[[LABEL]]117 br label %loop118loop:119 %val = load volatile float, ptr %src120 %cond = fcmp une float %target, %val121 br i1 %cond, label %loop, label %exit122exit:123 ret void124}125 126define void @f9(ptr %src, float %target) {127; CHECK-LABEL: f9:128; CHECK: .cfi_startproc129; CHECK: .L[[LABEL:.*]]:130; CHECK: ceb %f0, 0(%r2)131; CHECK-NEXT: jnh .L[[LABEL]]132 br label %loop133loop:134 %val = load volatile float, ptr %src135 %cond = fcmp ule float %target, %val136 br i1 %cond, label %loop, label %exit137exit:138 ret void139}140 141define void @f10(ptr %src, float %target) {142; CHECK-LABEL: f10:143; CHECK: .cfi_startproc144; CHECK: .L[[LABEL:.*]]:145; CHECK: ceb %f0, 0(%r2)146; CHECK-NEXT: jnhe .L[[LABEL]]147 br label %loop148loop:149 %val = load volatile float, ptr %src150 %cond = fcmp ult float %target, %val151 br i1 %cond, label %loop, label %exit152exit:153 ret void154}155 156define void @f11(ptr %src, float %target) {157; CHECK-LABEL: f11:158; CHECK: .cfi_startproc159; CHECK: .L[[LABEL:.*]]:160; CHECK: ceb %f0, 0(%r2)161; CHECK-NEXT: jnle .L[[LABEL]]162 br label %loop163loop:164 %val = load volatile float, ptr %src165 %cond = fcmp ugt float %target, %val166 br i1 %cond, label %loop, label %exit167exit:168 ret void169}170 171define void @f12(ptr %src, float %target) {172; CHECK-LABEL: f12:173; CHECK: .cfi_startproc174; CHECK: .L[[LABEL:.*]]:175; CHECK: ceb %f0, 0(%r2)176; CHECK-NEXT: jnl .L[[LABEL]]177 br label %loop178loop:179 %val = load volatile float, ptr %src180 %cond = fcmp uge float %target, %val181 br i1 %cond, label %loop, label %exit182exit:183 ret void184}185 186; "jno" == "jump if no overflow", which corresponds to "jump if ordered"187; rather than "jump if not ordered" after a floating-point comparison.188define void @f13(ptr %src, float %target) {189; CHECK-LABEL: f13:190; CHECK: .cfi_startproc191; CHECK: .L[[LABEL:.*]]:192; CHECK: ceb %f0, 0(%r2)193; CHECK-NEXT: jno .L[[LABEL]]194 br label %loop195loop:196 %val = load volatile float, ptr %src197 %cond = fcmp ord float %target, %val198 br i1 %cond, label %loop, label %exit199exit:200 ret void201}202 203; "jo" == "jump if overflow", which corresponds to "jump if not ordered"204; rather than "jump if ordered" after a floating-point comparison.205define void @f14(ptr %src, float %target) {206; CHECK-LABEL: f14:207; CHECK: .cfi_startproc208; CHECK: .L[[LABEL:.*]]:209; CHECK: ceb %f0, 0(%r2)210; CHECK-NEXT: jo .L[[LABEL]]211 br label %loop212loop:213 %val = load volatile float, ptr %src214 %cond = fcmp uno float %target, %val215 br i1 %cond, label %loop, label %exit216exit:217 ret void218}219