111 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; Test strict conversion of floating-point values to unsigned i64s (z10 only).3;4; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s5 6; z10 doesn't have native support for unsigned fp-to-i64 conversions;7; they were added in z196 as the Convert to Logical family of instructions.8; Convert via signed i64s instead.9; Note that the strict expansion sequence must be used.10 11declare i64 @llvm.experimental.constrained.fptoui.i64.f16(half, metadata)12declare i64 @llvm.experimental.constrained.fptoui.i64.f32(float, metadata)13declare i64 @llvm.experimental.constrained.fptoui.i64.f64(double, metadata)14declare i64 @llvm.experimental.constrained.fptoui.i64.f128(fp128, metadata)15 16; Test f16->i64. Converted to signed as the max float value is smaller than17; the signed integer range.18define i64 @f0(half %f) #0 {19; CHECK-LABEL: f0:20; CHECK: # %bb.0:21; CHECK-NEXT: stmg %r14, %r15, 112(%r15)22; CHECK-NEXT: .cfi_offset %r14, -4823; CHECK-NEXT: .cfi_offset %r15, -4024; CHECK-NEXT: aghi %r15, -16025; CHECK-NEXT: .cfi_def_cfa_offset 32026; CHECK-NEXT: brasl %r14, __extendhfsf2@PLT27; CHECK-NEXT: cgebr %r2, 5, %f028; CHECK-NEXT: lmg %r14, %r15, 272(%r15)29; CHECK-NEXT: br %r1430 %conv = call i64 @llvm.experimental.constrained.fptoui.i64.f16(half %f,31 metadata !"fpexcept.strict") #032 ret i64 %conv33}34 35; Test f32->i64.36define i64 @f1(float %f) #0 {37; CHECK-LABEL: f1:38; CHECK: # %bb.0:39; CHECK-NEXT: larl %r1, .LCPI1_040; CHECK-NEXT: le %f1, 0(%r1)41; CHECK-NEXT: kebr %f0, %f142; CHECK-NEXT: jnl .LBB1_243; CHECK-NEXT: # %bb.1:44; CHECK-NEXT: lghi %r0, 045; CHECK-NEXT: lzer %f146; CHECK-NEXT: j .LBB1_347; CHECK-NEXT: .LBB1_2:48; CHECK-NEXT: llihh %r0, 3276849; CHECK-NEXT: .LBB1_3:50; CHECK-NEXT: sebr %f0, %f151; CHECK-NEXT: cgebr %r2, 5, %f052; CHECK-NEXT: xgr %r2, %r053; CHECK-NEXT: br %r1454 %conv = call i64 @llvm.experimental.constrained.fptoui.i64.f32(float %f,55 metadata !"fpexcept.strict") #056 ret i64 %conv57}58 59; Test f64->i64.60define i64 @f2(double %f) #0 {61; CHECK-LABEL: f2:62; CHECK: # %bb.0:63; CHECK-NEXT: larl %r1, .LCPI2_064; CHECK-NEXT: ld %f1, 0(%r1)65; CHECK-NEXT: kdbr %f0, %f166; CHECK-NEXT: jnl .LBB2_267; CHECK-NEXT: # %bb.1:68; CHECK-NEXT: lghi %r0, 069; CHECK-NEXT: lzdr %f170; CHECK-NEXT: j .LBB2_371; CHECK-NEXT: .LBB2_2:72; CHECK-NEXT: llihh %r0, 3276873; CHECK-NEXT: .LBB2_3:74; CHECK-NEXT: sdbr %f0, %f175; CHECK-NEXT: cgdbr %r2, 5, %f076; CHECK-NEXT: xgr %r2, %r077; CHECK-NEXT: br %r1478 %conv = call i64 @llvm.experimental.constrained.fptoui.i64.f64(double %f,79 metadata !"fpexcept.strict") #080 ret i64 %conv81}82 83; Test f128->i64.84define i64 @f3(ptr %src) #0 {85; CHECK-LABEL: f3:86; CHECK: # %bb.0:87; CHECK-NEXT: ld %f0, 0(%r2)88; CHECK-NEXT: ld %f2, 8(%r2)89; CHECK-NEXT: larl %r1, .LCPI3_090; CHECK-NEXT: lxeb %f1, 0(%r1)91; CHECK-NEXT: kxbr %f0, %f192; CHECK-NEXT: jnl .LBB3_293; CHECK-NEXT: # %bb.1:94; CHECK-NEXT: lghi %r0, 095; CHECK-NEXT: lzxr %f196; CHECK-NEXT: j .LBB3_397; CHECK-NEXT: .LBB3_2:98; CHECK-NEXT: llihh %r0, 3276899; CHECK-NEXT: .LBB3_3:100; CHECK-NEXT: sxbr %f0, %f1101; CHECK-NEXT: cgxbr %r2, 5, %f0102; CHECK-NEXT: xgr %r2, %r0103; CHECK-NEXT: br %r14104 %f = load fp128, ptr %src105 %conv = call i64 @llvm.experimental.constrained.fptoui.i64.f128(fp128 %f,106 metadata !"fpexcept.strict") #0107 ret i64 %conv108}109 110attributes #0 = { strictfp }111