112 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; Test strict conversion of floating-point values to unsigned i32s (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-i32 conversions;7; they were added in z196 as the Convert to Logical family of instructions.8; Promoting to i64 doesn't generate an inexact condition for values that are9; outside the i32 range but in the i64 range, so use the default expansion.10; Note that the strict expansion sequence must be used.11 12declare i32 @llvm.experimental.constrained.fptoui.i32.f16(half, metadata)13declare i32 @llvm.experimental.constrained.fptoui.i32.f32(float, metadata)14declare i32 @llvm.experimental.constrained.fptoui.i32.f64(double, metadata)15declare i32 @llvm.experimental.constrained.fptoui.i32.f128(fp128, metadata)16 17; Test f16->i32. Converted to signed as the max float value is smaller than18; the signed integer range.19define i32 @f0(half %f) #0 {20; CHECK-LABEL: f0:21; CHECK: # %bb.0:22; CHECK-NEXT: stmg %r14, %r15, 112(%r15)23; CHECK-NEXT: .cfi_offset %r14, -4824; CHECK-NEXT: .cfi_offset %r15, -4025; CHECK-NEXT: aghi %r15, -16026; CHECK-NEXT: .cfi_def_cfa_offset 32027; CHECK-NEXT: brasl %r14, __extendhfsf2@PLT28; CHECK-NEXT: cfebr %r2, 5, %f029; CHECK-NEXT: lmg %r14, %r15, 272(%r15)30; CHECK-NEXT: br %r1431 %conv = call i32 @llvm.experimental.constrained.fptoui.i32.f16(half %f,32 metadata !"fpexcept.strict") #033 ret i32 %conv34}35 36; Test f32->i32.37define i32 @f1(float %f) #0 {38; CHECK-LABEL: f1:39; CHECK: # %bb.0:40; CHECK-NEXT: larl %r1, .LCPI1_041; CHECK-NEXT: le %f1, 0(%r1)42; CHECK-NEXT: kebr %f0, %f143; CHECK-NEXT: jnl .LBB1_244; CHECK-NEXT: # %bb.1:45; CHECK-NEXT: lhi %r0, 046; CHECK-NEXT: lzer %f147; CHECK-NEXT: j .LBB1_348; CHECK-NEXT: .LBB1_2:49; CHECK-NEXT: llilh %r0, 3276850; CHECK-NEXT: .LBB1_3:51; CHECK-NEXT: sebr %f0, %f152; CHECK-NEXT: cfebr %r2, 5, %f053; CHECK-NEXT: xr %r2, %r054; CHECK-NEXT: br %r1455 %conv = call i32 @llvm.experimental.constrained.fptoui.i32.f32(float %f,56 metadata !"fpexcept.strict") #057 ret i32 %conv58}59 60; Test f64->i32.61define i32 @f2(double %f) #0 {62; CHECK-LABEL: f2:63; CHECK: # %bb.0:64; CHECK-NEXT: larl %r1, .LCPI2_065; CHECK-NEXT: ld %f1, 0(%r1)66; CHECK-NEXT: kdbr %f0, %f167; CHECK-NEXT: jnl .LBB2_268; CHECK-NEXT: # %bb.1:69; CHECK-NEXT: lhi %r0, 070; CHECK-NEXT: lzdr %f171; CHECK-NEXT: j .LBB2_372; CHECK-NEXT: .LBB2_2:73; CHECK-NEXT: llilh %r0, 3276874; CHECK-NEXT: .LBB2_3:75; CHECK-NEXT: sdbr %f0, %f176; CHECK-NEXT: cfdbr %r2, 5, %f077; CHECK-NEXT: xr %r2, %r078; CHECK-NEXT: br %r1479 %conv = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double %f,80 metadata !"fpexcept.strict") #081 ret i32 %conv82}83 84; Test f128->i32.85define i32 @f3(ptr %src) #0 {86; CHECK-LABEL: f3:87; CHECK: # %bb.0:88; CHECK-NEXT: ld %f0, 0(%r2)89; CHECK-NEXT: ld %f2, 8(%r2)90; CHECK-NEXT: larl %r1, .LCPI3_091; CHECK-NEXT: lxeb %f1, 0(%r1)92; CHECK-NEXT: kxbr %f0, %f193; CHECK-NEXT: jnl .LBB3_294; CHECK-NEXT: # %bb.1:95; CHECK-NEXT: lhi %r0, 096; CHECK-NEXT: lzxr %f197; CHECK-NEXT: j .LBB3_398; CHECK-NEXT: .LBB3_2:99; CHECK-NEXT: llilh %r0, 32768100; CHECK-NEXT: .LBB3_3:101; CHECK-NEXT: sxbr %f0, %f1102; CHECK-NEXT: cfxbr %r2, 5, %f0103; CHECK-NEXT: xr %r2, %r0104; CHECK-NEXT: br %r14105 %f = load fp128, ptr %src106 %conv = call i32 @llvm.experimental.constrained.fptoui.i32.f128(fp128 %f,107 metadata !"fpexcept.strict") #0108 ret i32 %conv109}110 111attributes #0 = { strictfp }112