| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: llc -mtriple=hexagon < %s | FileCheck %s |
| |
| define i32 @fptoui.sat.i32.f32(float %x) { |
| ; CHECK-LABEL: fptoui.sat.i32.f32: |
| ; CHECK: .cfi_startproc |
| ; CHECK-NEXT: // %bb.0: |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: r1 = convert_sf2uw(r0):chop |
| ; CHECK-NEXT: r3:2 = combine(##1333788671,#0) |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: p0 = sfcmp.gt(r2,r0) |
| ; CHECK-NEXT: p1 = sfcmp.uo(r2,r0) |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: p0 = or(p1,p0) |
| ; CHECK-NEXT: p2 = sfcmp.uo(r0,r3) |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: p3 = sfcmp.gt(r0,r3) |
| ; CHECK-NEXT: if (p0) r1 = #0 |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: p1 = and(p3,!p2) |
| ; CHECK-NEXT: if (p1.new) r1 = #-1 |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: r0 = r1 |
| ; CHECK-NEXT: jumpr r31 |
| ; CHECK-NEXT: } |
| %res = call i32 @llvm.fptoui.sat(float %x) |
| ret i32 %res |
| } |
| |
| define i16 @fptoui.sat.i16.f32(float %x) { |
| ; CHECK-LABEL: fptoui.sat.i16.f32: |
| ; CHECK: .cfi_startproc |
| ; CHECK-NEXT: // %bb.0: |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: r2 = ##1199570688 |
| ; CHECK-NEXT: r1 = #0 |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: r0 = sfmax(r0,r1) |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: r0 = sfmin(r0,r2) |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: r0 = convert_sf2uw(r0):chop |
| ; CHECK-NEXT: jumpr r31 |
| ; CHECK-NEXT: } |
| %res = call i16 @llvm.fptoui.sat(float %x) |
| ret i16 %res |
| } |
| |
| define i64 @fptoui.sat.i64.f64(double %x) { |
| ; CHECK-LABEL: fptoui.sat.i64.f64: |
| ; CHECK: .cfi_startproc |
| ; CHECK-NEXT: // %bb.0: |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: r9:8 = convert_df2ud(r1:0):chop |
| ; CHECK-NEXT: r3:2 = combine(#0,#0) |
| ; CHECK-NEXT: r5:4 = CONST64(#4895412794951729151) |
| ; CHECK-NEXT: r6 = #0 |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: p0 = dfcmp.gt(r3:2,r1:0) |
| ; CHECK-NEXT: p2 = dfcmp.uo(r3:2,r1:0) |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: p0 = or(p2,p0) |
| ; CHECK-NEXT: p1 = dfcmp.gt(r1:0,r5:4) |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: p2 = dfcmp.uo(r1:0,r5:4) |
| ; CHECK-NEXT: r1 = #-1 |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: p1 = and(p1,!p2) |
| ; CHECK-NEXT: r2 = mux(p0,r6,r8) |
| ; CHECK-NEXT: r3 = mux(p0,r6,r9) |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: r0 = mux(p1,r1,r2) |
| ; CHECK-NEXT: jumpr r31 |
| ; CHECK-NEXT: if (!p1) r1 = add(r3,#0) |
| ; CHECK-NEXT: } |
| %res = call i64 @llvm.fptoui.sat(double %x) |
| ret i64 %res |
| } |
| |
| define i32 @fptoui.sat.i32.f64(double %x) { |
| ; CHECK-LABEL: fptoui.sat.i32.f64: |
| ; CHECK: .cfi_startproc |
| ; CHECK-NEXT: // %bb.0: |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: r3:2 = combine(#0,#0) |
| ; CHECK-NEXT: r5:4 = CONST64(#4751297606873776128) |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: r1:0 = dfmax(r1:0,r3:2) |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: r1:0 = dfmin(r1:0,r5:4) |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: r0 = convert_df2uw(r1:0):chop |
| ; CHECK-NEXT: jumpr r31 |
| ; CHECK-NEXT: } |
| %res = call i32 @llvm.fptoui.sat(double %x) |
| ret i32 %res |
| } |
| |
| define i32 @fptosi.sat.i32.f32(float %x) { |
| ; CHECK-LABEL: fptosi.sat.i32.f32: |
| ; CHECK: .cfi_startproc |
| ; CHECK-NEXT: // %bb.0: |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: r2 = ##-822083584 |
| ; CHECK-NEXT: r3 = ##1325400063 |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: r1 = convert_sf2w(r0):chop |
| ; CHECK-NEXT: p1 = sfcmp.gt(r2,r0) |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: p2 = sfcmp.uo(r2,r0) |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: p1 = or(p2,p1) |
| ; CHECK-NEXT: p0 = sfcmp.uo(r0,r3) |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: p2 = sfcmp.gt(r0,r3) |
| ; CHECK-NEXT: p1 = sfcmp.uo(r0,r0) |
| ; CHECK-NEXT: if (p1) r1 = ##-2147483648 |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: p0 = and(p2,!p0) |
| ; CHECK-NEXT: if (p0.new) r1 = ##2147483647 |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: if (p1) r1 = #0 |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: r0 = r1 |
| ; CHECK-NEXT: jumpr r31 |
| ; CHECK-NEXT: } |
| %res = call i32 @llvm.fptosi.sat(float %x) |
| ret i32 %res |
| } |
| |
| define i16 @fptosi.sat.i16.f32(float %x) { |
| ; CHECK-LABEL: fptosi.sat.i16.f32: |
| ; CHECK: .cfi_startproc |
| ; CHECK-NEXT: // %bb.0: |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: r1 = ##-956301312 |
| ; CHECK-NEXT: r2 = ##1191181824 |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: r1 = sfmax(r0,r1) |
| ; CHECK-NEXT: p0 = sfcmp.uo(r0,r0) |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: r1 = sfmin(r1,r2) |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: r0 = convert_sf2w(r1):chop |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: if (p0) r0 = #0 |
| ; CHECK-NEXT: jumpr r31 |
| ; CHECK-NEXT: } |
| %res = call i16 @llvm.fptosi.sat(float %x) |
| ret i16 %res |
| } |
| |
| define i64 @fptosi.sat.i64.f64(double %x) { |
| ; CHECK-LABEL: fptosi.sat.i64.f64: |
| ; CHECK: .cfi_startproc |
| ; CHECK-NEXT: // %bb.0: |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: p0 = dfcmp.uo(r1:0,r1:0) |
| ; CHECK-NEXT: r6 = #0 |
| ; CHECK-NEXT: r3:2 = CONST64(#-4332462841530417152) |
| ; CHECK-NEXT: r5:4 = CONST64(#4890909195324358655) |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: p1 = dfcmp.gt(r3:2,r1:0) |
| ; CHECK-NEXT: p2 = dfcmp.uo(r3:2,r1:0) |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: p1 = or(p2,p1) |
| ; CHECK-NEXT: r3:2 = convert_df2d(r1:0):chop |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: p2 = dfcmp.uo(r1:0,r5:4) |
| ; CHECK-NEXT: p3 = dfcmp.gt(r1:0,r5:4) |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: p2 = and(p3,!p2) |
| ; CHECK-NEXT: r1 = mux(p1,r6,r2) |
| ; CHECK-NEXT: r2 = mux(p1,##-2147483648,r3) |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: if (p2) r1 = #-1 |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: r0 = mux(p0,r6,r1) |
| ; CHECK-NEXT: if (p2) r2 = ##2147483647 |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: r1 = mux(p0,r6,r2) |
| ; CHECK-NEXT: jumpr r31 |
| ; CHECK-NEXT: } |
| %res = call i64 @llvm.fptosi.sat(double %x) |
| ret i64 %res |
| } |
| |
| define i32 @fptosi.sat.i32.f64(double %x) { |
| ; CHECK-LABEL: fptosi.sat.i32.f64: |
| ; CHECK: .cfi_startproc |
| ; CHECK-NEXT: // %bb.0: |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: p0 = dfcmp.uo(r1:0,r1:0) |
| ; CHECK-NEXT: r3:2 = CONST64(#-4476578029606273024) |
| ; CHECK-NEXT: r5:4 = CONST64(#4746794007244308480) |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: r3:2 = dfmax(r1:0,r3:2) |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: r3:2 = dfmin(r3:2,r5:4) |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: r0 = convert_df2w(r3:2):chop |
| ; CHECK-NEXT: } |
| ; CHECK-NEXT: { |
| ; CHECK-NEXT: if (p0) r0 = #0 |
| ; CHECK-NEXT: jumpr r31 |
| ; CHECK-NEXT: } |
| %res = call i32 @llvm.fptosi.sat(double %x) |
| ret i32 %res |
| } |