CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
617 lines
35 KiB
LLVM
617 lines
35 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals
|
|
; RUN: opt -S -mtriple=x86_64-- --expand-ir-insts < %s | FileCheck %s
|
|
; RUN: opt -S -mtriple=x86_64-- -passes='require<libcall-lowering-info>,expand-ir-insts' < %s | FileCheck %s
|
|
|
|
define half @ui129tohalf(i129 %a) !prof !0 {
|
|
; CHECK-LABEL: @ui129tohalf(
|
|
; CHECK-NEXT: itofp-entry:
|
|
; CHECK-NEXT: [[A:%.*]] = freeze i129 [[A1:%.*]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i129 [[A]], 0
|
|
; CHECK-NEXT: br i1 [[TMP0]], label [[ITOFP_RETURN:%.*]], label [[ITOFP_IF_END:%.*]], !prof [[PROF1:![0-9]+]]
|
|
; CHECK: itofp-if-end:
|
|
; CHECK-NEXT: [[TMP1:%.*]] = ashr i129 [[A]], 128
|
|
; CHECK-NEXT: [[TMP2:%.*]] = xor i129 [[TMP1]], [[A]]
|
|
; CHECK-NEXT: [[TMP3:%.*]] = sub i129 [[TMP2]], [[TMP1]]
|
|
; CHECK-NEXT: [[TMP4:%.*]] = call i129 @llvm.ctlz.i129(i129 [[A]], i1 true)
|
|
; CHECK-NEXT: [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
|
|
; CHECK-NEXT: [[TMP6:%.*]] = sub i32 129, [[TMP5]]
|
|
; CHECK-NEXT: [[TMP7:%.*]] = sub i32 128, [[TMP5]]
|
|
; CHECK-NEXT: [[TMP8:%.*]] = icmp sgt i32 [[TMP6]], 24
|
|
; CHECK-NEXT: br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]], !prof [[PROF2:![0-9]+]]
|
|
; CHECK: itofp-if-then4:
|
|
; CHECK-NEXT: switch i32 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
|
|
; CHECK-NEXT: i32 25, label [[ITOFP_SW_BB:%.*]]
|
|
; CHECK-NEXT: i32 26, label [[ITOFP_SW_EPILOG:%.*]]
|
|
; CHECK-NEXT: ], !prof [[PROF3:![0-9]+]]
|
|
; CHECK: itofp-sw-bb:
|
|
; CHECK-NEXT: [[TMP9:%.*]] = shl i129 [[A]], 1
|
|
; CHECK-NEXT: br label [[ITOFP_SW_EPILOG]]
|
|
; CHECK: itofp-sw-default:
|
|
; CHECK-NEXT: [[TMP10:%.*]] = sub i32 103, [[TMP5]]
|
|
; CHECK-NEXT: [[TMP11:%.*]] = zext i32 [[TMP10]] to i129
|
|
; CHECK-NEXT: [[TMP12:%.*]] = lshr i129 [[A]], [[TMP11]]
|
|
; CHECK-NEXT: [[TMP13:%.*]] = add i32 [[TMP5]], 26
|
|
; CHECK-NEXT: [[TMP14:%.*]] = zext i32 [[TMP13]] to i129
|
|
; CHECK-NEXT: [[TMP15:%.*]] = lshr i129 -1, [[TMP14]]
|
|
; CHECK-NEXT: [[TMP16:%.*]] = and i129 [[TMP15]], [[A]]
|
|
; CHECK-NEXT: [[TMP17:%.*]] = icmp ne i129 [[TMP16]], 0
|
|
; CHECK-NEXT: [[TMP18:%.*]] = zext i1 [[TMP17]] to i129
|
|
; CHECK-NEXT: [[TMP19:%.*]] = or i129 [[TMP12]], [[TMP18]]
|
|
; CHECK-NEXT: br label [[ITOFP_SW_EPILOG]]
|
|
; CHECK: itofp-sw-epilog:
|
|
; CHECK-NEXT: [[TMP20:%.*]] = phi i129 [ [[TMP19]], [[ITOFP_SW_DEFAULT]] ], [ [[A]], [[ITOFP_IF_THEN4]] ], [ [[TMP9]], [[ITOFP_SW_BB]] ]
|
|
; CHECK-NEXT: [[TMP21:%.*]] = trunc i129 [[TMP20]] to i32
|
|
; CHECK-NEXT: [[TMP22:%.*]] = lshr i32 [[TMP21]], 2
|
|
; CHECK-NEXT: [[TMP23:%.*]] = and i32 [[TMP22]], 1
|
|
; CHECK-NEXT: [[TMP24:%.*]] = zext i32 [[TMP23]] to i129
|
|
; CHECK-NEXT: [[TMP25:%.*]] = or i129 [[TMP20]], [[TMP24]]
|
|
; CHECK-NEXT: [[TMP26:%.*]] = add i129 [[TMP25]], 1
|
|
; CHECK-NEXT: [[TMP27:%.*]] = lshr i129 [[TMP26]], 2
|
|
; CHECK-NEXT: [[A3:%.*]] = and i129 [[TMP26]], 67108864
|
|
; CHECK-NEXT: [[TMP28:%.*]] = icmp eq i129 [[A3]], 0
|
|
; CHECK-NEXT: [[TMP29:%.*]] = trunc i129 [[TMP27]] to i32
|
|
; CHECK-NEXT: [[TMP30:%.*]] = lshr i129 [[TMP27]], 32
|
|
; CHECK-NEXT: [[TMP31:%.*]] = trunc i129 [[TMP30]] to i32
|
|
; CHECK-NEXT: br i1 [[TMP28]], label [[ITOFP_IF_END26:%.*]], label [[ITOFP_IF_THEN20:%.*]], !prof [[PROF2]]
|
|
; CHECK: itofp-if-then20:
|
|
; CHECK-NEXT: [[TMP32:%.*]] = lshr i129 [[TMP26]], 3
|
|
; CHECK-NEXT: [[TMP33:%.*]] = trunc i129 [[TMP32]] to i32
|
|
; CHECK-NEXT: [[TMP34:%.*]] = lshr i129 [[TMP32]], 32
|
|
; CHECK-NEXT: [[TMP35:%.*]] = trunc i129 [[TMP34]] to i32
|
|
; CHECK-NEXT: br label [[ITOFP_IF_END26]]
|
|
; CHECK: itofp-if-else:
|
|
; CHECK-NEXT: [[TMP36:%.*]] = add i32 [[TMP5]], -105
|
|
; CHECK-NEXT: [[TMP37:%.*]] = zext i32 [[TMP36]] to i129
|
|
; CHECK-NEXT: [[TMP38:%.*]] = shl i129 [[A]], [[TMP37]]
|
|
; CHECK-NEXT: [[TMP39:%.*]] = trunc i129 [[TMP38]] to i32
|
|
; CHECK-NEXT: [[TMP40:%.*]] = lshr i129 [[TMP38]], 32
|
|
; CHECK-NEXT: [[TMP41:%.*]] = trunc i129 [[TMP40]] to i32
|
|
; CHECK-NEXT: br label [[ITOFP_IF_END26]]
|
|
; CHECK: itofp-if-end26:
|
|
; CHECK-NEXT: [[TMP42:%.*]] = phi i32 [ [[TMP33]], [[ITOFP_IF_THEN20]] ], [ [[TMP29]], [[ITOFP_SW_EPILOG]] ], [ [[TMP39]], [[ITOFP_IF_ELSE]] ]
|
|
; CHECK-NEXT: [[TMP43:%.*]] = phi i32 [ [[TMP6]], [[ITOFP_IF_THEN20]] ], [ [[TMP7]], [[ITOFP_SW_EPILOG]] ], [ [[TMP7]], [[ITOFP_IF_ELSE]] ]
|
|
; CHECK-NEXT: [[TMP44:%.*]] = trunc i129 [[TMP1]] to i32
|
|
; CHECK-NEXT: [[TMP45:%.*]] = and i32 [[TMP44]], -2147483648
|
|
; CHECK-NEXT: [[TMP46:%.*]] = shl i32 [[TMP43]], 23
|
|
; CHECK-NEXT: [[TMP47:%.*]] = add i32 [[TMP46]], 1065353216
|
|
; CHECK-NEXT: [[TMP48:%.*]] = and i32 [[TMP42]], 8388607
|
|
; CHECK-NEXT: [[TMP49:%.*]] = or i32 [[TMP48]], [[TMP45]]
|
|
; CHECK-NEXT: [[TMP50:%.*]] = or i32 [[TMP48]], [[TMP47]]
|
|
; CHECK-NEXT: [[TMP51:%.*]] = bitcast i32 [[TMP50]] to float
|
|
; CHECK-NEXT: [[TMP52:%.*]] = fptrunc float [[TMP51]] to half
|
|
; CHECK-NEXT: [[TMP54:%.*]] = icmp uge i32 [[TMP7]], 128
|
|
; CHECK-NEXT: [[TMP55:%.*]] = select i1 [[TMP54]], half +inf, half [[TMP52]]
|
|
; CHECK-NEXT: br label [[ITOFP_RETURN]]
|
|
; CHECK: itofp-return:
|
|
; CHECK-NEXT: [[TMP53:%.*]] = phi half [ [[TMP55]], [[ITOFP_IF_END26]] ], [ 0.000000e+00, [[ITOFP_ENTRY:%.*]] ]
|
|
; CHECK-NEXT: ret half [[TMP53]]
|
|
;
|
|
%conv = uitofp i129 %a to half
|
|
ret half %conv
|
|
}
|
|
|
|
define float @ui129tofloat(i129 %a) {
|
|
; CHECK-LABEL: @ui129tofloat(
|
|
; CHECK-NEXT: itofp-entry:
|
|
; CHECK-NEXT: [[A:%.*]] = freeze i129 [[A1:%.*]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i129 [[A]], 0
|
|
; CHECK-NEXT: br i1 [[TMP0]], label [[ITOFP_RETURN:%.*]], label [[ITOFP_IF_END:%.*]], !prof [[PROF1]]
|
|
; CHECK: itofp-if-end:
|
|
; CHECK-NEXT: [[TMP1:%.*]] = ashr i129 [[A]], 128
|
|
; CHECK-NEXT: [[TMP2:%.*]] = xor i129 [[TMP1]], [[A]]
|
|
; CHECK-NEXT: [[TMP3:%.*]] = sub i129 [[TMP2]], [[TMP1]]
|
|
; CHECK-NEXT: [[TMP4:%.*]] = call i129 @llvm.ctlz.i129(i129 [[A]], i1 true)
|
|
; CHECK-NEXT: [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
|
|
; CHECK-NEXT: [[TMP6:%.*]] = sub i32 129, [[TMP5]]
|
|
; CHECK-NEXT: [[TMP7:%.*]] = sub i32 128, [[TMP5]]
|
|
; CHECK-NEXT: [[TMP8:%.*]] = icmp sgt i32 [[TMP6]], 24
|
|
; CHECK-NEXT: br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]], !prof [[PROF2]]
|
|
; CHECK: itofp-if-then4:
|
|
; CHECK-NEXT: switch i32 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
|
|
; CHECK-NEXT: i32 25, label [[ITOFP_SW_BB:%.*]]
|
|
; CHECK-NEXT: i32 26, label [[ITOFP_SW_EPILOG:%.*]]
|
|
; CHECK-NEXT: ], !prof [[PROF3]]
|
|
; CHECK: itofp-sw-bb:
|
|
; CHECK-NEXT: [[TMP9:%.*]] = shl i129 [[A]], 1
|
|
; CHECK-NEXT: br label [[ITOFP_SW_EPILOG]]
|
|
; CHECK: itofp-sw-default:
|
|
; CHECK-NEXT: [[TMP10:%.*]] = sub i32 103, [[TMP5]]
|
|
; CHECK-NEXT: [[TMP11:%.*]] = zext i32 [[TMP10]] to i129
|
|
; CHECK-NEXT: [[TMP12:%.*]] = lshr i129 [[A]], [[TMP11]]
|
|
; CHECK-NEXT: [[TMP13:%.*]] = add i32 [[TMP5]], 26
|
|
; CHECK-NEXT: [[TMP14:%.*]] = zext i32 [[TMP13]] to i129
|
|
; CHECK-NEXT: [[TMP15:%.*]] = lshr i129 -1, [[TMP14]]
|
|
; CHECK-NEXT: [[TMP16:%.*]] = and i129 [[TMP15]], [[A]]
|
|
; CHECK-NEXT: [[TMP17:%.*]] = icmp ne i129 [[TMP16]], 0
|
|
; CHECK-NEXT: [[TMP18:%.*]] = zext i1 [[TMP17]] to i129
|
|
; CHECK-NEXT: [[TMP19:%.*]] = or i129 [[TMP12]], [[TMP18]]
|
|
; CHECK-NEXT: br label [[ITOFP_SW_EPILOG]]
|
|
; CHECK: itofp-sw-epilog:
|
|
; CHECK-NEXT: [[TMP20:%.*]] = phi i129 [ [[TMP19]], [[ITOFP_SW_DEFAULT]] ], [ [[A]], [[ITOFP_IF_THEN4]] ], [ [[TMP9]], [[ITOFP_SW_BB]] ]
|
|
; CHECK-NEXT: [[TMP21:%.*]] = trunc i129 [[TMP20]] to i32
|
|
; CHECK-NEXT: [[TMP22:%.*]] = lshr i32 [[TMP21]], 2
|
|
; CHECK-NEXT: [[TMP23:%.*]] = and i32 [[TMP22]], 1
|
|
; CHECK-NEXT: [[TMP24:%.*]] = zext i32 [[TMP23]] to i129
|
|
; CHECK-NEXT: [[TMP25:%.*]] = or i129 [[TMP20]], [[TMP24]]
|
|
; CHECK-NEXT: [[TMP26:%.*]] = add i129 [[TMP25]], 1
|
|
; CHECK-NEXT: [[TMP27:%.*]] = lshr i129 [[TMP26]], 2
|
|
; CHECK-NEXT: [[A3:%.*]] = and i129 [[TMP26]], 67108864
|
|
; CHECK-NEXT: [[TMP28:%.*]] = icmp eq i129 [[A3]], 0
|
|
; CHECK-NEXT: [[TMP29:%.*]] = trunc i129 [[TMP27]] to i32
|
|
; CHECK-NEXT: [[TMP30:%.*]] = lshr i129 [[TMP27]], 32
|
|
; CHECK-NEXT: [[TMP31:%.*]] = trunc i129 [[TMP30]] to i32
|
|
; CHECK-NEXT: br i1 [[TMP28]], label [[ITOFP_IF_END26:%.*]], label [[ITOFP_IF_THEN20:%.*]], !prof [[PROF2]]
|
|
; CHECK: itofp-if-then20:
|
|
; CHECK-NEXT: [[TMP32:%.*]] = lshr i129 [[TMP26]], 3
|
|
; CHECK-NEXT: [[TMP33:%.*]] = trunc i129 [[TMP32]] to i32
|
|
; CHECK-NEXT: [[TMP34:%.*]] = lshr i129 [[TMP32]], 32
|
|
; CHECK-NEXT: [[TMP35:%.*]] = trunc i129 [[TMP34]] to i32
|
|
; CHECK-NEXT: br label [[ITOFP_IF_END26]]
|
|
; CHECK: itofp-if-else:
|
|
; CHECK-NEXT: [[TMP36:%.*]] = add i32 [[TMP5]], -105
|
|
; CHECK-NEXT: [[TMP37:%.*]] = zext i32 [[TMP36]] to i129
|
|
; CHECK-NEXT: [[TMP38:%.*]] = shl i129 [[A]], [[TMP37]]
|
|
; CHECK-NEXT: [[TMP39:%.*]] = trunc i129 [[TMP38]] to i32
|
|
; CHECK-NEXT: [[TMP40:%.*]] = lshr i129 [[TMP38]], 32
|
|
; CHECK-NEXT: [[TMP41:%.*]] = trunc i129 [[TMP40]] to i32
|
|
; CHECK-NEXT: br label [[ITOFP_IF_END26]]
|
|
; CHECK: itofp-if-end26:
|
|
; CHECK-NEXT: [[TMP42:%.*]] = phi i32 [ [[TMP33]], [[ITOFP_IF_THEN20]] ], [ [[TMP29]], [[ITOFP_SW_EPILOG]] ], [ [[TMP39]], [[ITOFP_IF_ELSE]] ]
|
|
; CHECK-NEXT: [[TMP43:%.*]] = phi i32 [ [[TMP6]], [[ITOFP_IF_THEN20]] ], [ [[TMP7]], [[ITOFP_SW_EPILOG]] ], [ [[TMP7]], [[ITOFP_IF_ELSE]] ]
|
|
; CHECK-NEXT: [[TMP44:%.*]] = trunc i129 [[TMP1]] to i32
|
|
; CHECK-NEXT: [[TMP45:%.*]] = and i32 [[TMP44]], -2147483648
|
|
; CHECK-NEXT: [[TMP46:%.*]] = shl i32 [[TMP43]], 23
|
|
; CHECK-NEXT: [[TMP47:%.*]] = add i32 [[TMP46]], 1065353216
|
|
; CHECK-NEXT: [[TMP48:%.*]] = and i32 [[TMP42]], 8388607
|
|
; CHECK-NEXT: [[TMP49:%.*]] = or i32 [[TMP48]], [[TMP45]]
|
|
; CHECK-NEXT: [[TMP50:%.*]] = or i32 [[TMP48]], [[TMP47]]
|
|
; CHECK-NEXT: [[TMP51:%.*]] = bitcast i32 [[TMP50]] to float
|
|
; CHECK-NEXT: [[TMP53:%.*]] = icmp uge i32 [[TMP7]], 128
|
|
; CHECK-NEXT: [[TMP54:%.*]] = select i1 [[TMP53]], float +inf, float [[TMP51]]
|
|
; CHECK-NEXT: br label [[ITOFP_RETURN]]
|
|
; CHECK: itofp-return:
|
|
; CHECK-NEXT: [[TMP52:%.*]] = phi float [ [[TMP54]], [[ITOFP_IF_END26]] ], [ 0.000000e+00, [[ITOFP_ENTRY:%.*]] ]
|
|
; CHECK-NEXT: ret float [[TMP52]]
|
|
;
|
|
%conv = uitofp i129 %a to float
|
|
ret float %conv
|
|
}
|
|
|
|
define double @ui129todouble(i129 %a) {
|
|
; CHECK-LABEL: @ui129todouble(
|
|
; CHECK-NEXT: itofp-entry:
|
|
; CHECK-NEXT: [[A:%.*]] = freeze i129 [[A1:%.*]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i129 [[A]], 0
|
|
; CHECK-NEXT: br i1 [[TMP0]], label [[ITOFP_RETURN:%.*]], label [[ITOFP_IF_END:%.*]], !prof [[PROF1]]
|
|
; CHECK: itofp-if-end:
|
|
; CHECK-NEXT: [[TMP1:%.*]] = ashr i129 [[A]], 128
|
|
; CHECK-NEXT: [[TMP2:%.*]] = xor i129 [[TMP1]], [[A]]
|
|
; CHECK-NEXT: [[TMP3:%.*]] = sub i129 [[TMP2]], [[TMP1]]
|
|
; CHECK-NEXT: [[TMP4:%.*]] = call i129 @llvm.ctlz.i129(i129 [[A]], i1 true)
|
|
; CHECK-NEXT: [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
|
|
; CHECK-NEXT: [[TMP6:%.*]] = sub i32 129, [[TMP5]]
|
|
; CHECK-NEXT: [[TMP7:%.*]] = sub i32 128, [[TMP5]]
|
|
; CHECK-NEXT: [[TMP8:%.*]] = icmp sgt i32 [[TMP6]], 53
|
|
; CHECK-NEXT: br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]], !prof [[PROF2]]
|
|
; CHECK: itofp-if-then4:
|
|
; CHECK-NEXT: switch i32 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
|
|
; CHECK-NEXT: i32 54, label [[ITOFP_SW_BB:%.*]]
|
|
; CHECK-NEXT: i32 55, label [[ITOFP_SW_EPILOG:%.*]]
|
|
; CHECK-NEXT: ], !prof [[PROF3]]
|
|
; CHECK: itofp-sw-bb:
|
|
; CHECK-NEXT: [[TMP9:%.*]] = shl i129 [[A]], 1
|
|
; CHECK-NEXT: br label [[ITOFP_SW_EPILOG]]
|
|
; CHECK: itofp-sw-default:
|
|
; CHECK-NEXT: [[TMP10:%.*]] = sub i32 74, [[TMP5]]
|
|
; CHECK-NEXT: [[TMP11:%.*]] = zext i32 [[TMP10]] to i129
|
|
; CHECK-NEXT: [[TMP12:%.*]] = lshr i129 [[A]], [[TMP11]]
|
|
; CHECK-NEXT: [[TMP13:%.*]] = add i32 [[TMP5]], 55
|
|
; CHECK-NEXT: [[TMP14:%.*]] = zext i32 [[TMP13]] to i129
|
|
; CHECK-NEXT: [[TMP15:%.*]] = lshr i129 -1, [[TMP14]]
|
|
; CHECK-NEXT: [[TMP16:%.*]] = and i129 [[TMP15]], [[A]]
|
|
; CHECK-NEXT: [[TMP17:%.*]] = icmp ne i129 [[TMP16]], 0
|
|
; CHECK-NEXT: [[TMP18:%.*]] = zext i1 [[TMP17]] to i129
|
|
; CHECK-NEXT: [[TMP19:%.*]] = or i129 [[TMP12]], [[TMP18]]
|
|
; CHECK-NEXT: br label [[ITOFP_SW_EPILOG]]
|
|
; CHECK: itofp-sw-epilog:
|
|
; CHECK-NEXT: [[TMP20:%.*]] = phi i129 [ [[TMP19]], [[ITOFP_SW_DEFAULT]] ], [ [[A]], [[ITOFP_IF_THEN4]] ], [ [[TMP9]], [[ITOFP_SW_BB]] ]
|
|
; CHECK-NEXT: [[TMP21:%.*]] = trunc i129 [[TMP20]] to i32
|
|
; CHECK-NEXT: [[TMP22:%.*]] = lshr i32 [[TMP21]], 2
|
|
; CHECK-NEXT: [[TMP23:%.*]] = and i32 [[TMP22]], 1
|
|
; CHECK-NEXT: [[TMP24:%.*]] = zext i32 [[TMP23]] to i129
|
|
; CHECK-NEXT: [[TMP25:%.*]] = or i129 [[TMP20]], [[TMP24]]
|
|
; CHECK-NEXT: [[TMP26:%.*]] = add i129 [[TMP25]], 1
|
|
; CHECK-NEXT: [[TMP27:%.*]] = lshr i129 [[TMP26]], 2
|
|
; CHECK-NEXT: [[A3:%.*]] = and i129 [[TMP26]], 36028797018963968
|
|
; CHECK-NEXT: [[TMP28:%.*]] = icmp eq i129 [[A3]], 0
|
|
; CHECK-NEXT: [[TMP29:%.*]] = trunc i129 [[TMP27]] to i64
|
|
; CHECK-NEXT: [[TMP30:%.*]] = lshr i129 [[TMP27]], 32
|
|
; CHECK-NEXT: [[TMP31:%.*]] = trunc i129 [[TMP30]] to i32
|
|
; CHECK-NEXT: br i1 [[TMP28]], label [[ITOFP_IF_END26:%.*]], label [[ITOFP_IF_THEN20:%.*]], !prof [[PROF2]]
|
|
; CHECK: itofp-if-then20:
|
|
; CHECK-NEXT: [[TMP32:%.*]] = lshr i129 [[TMP26]], 3
|
|
; CHECK-NEXT: [[TMP33:%.*]] = trunc i129 [[TMP32]] to i64
|
|
; CHECK-NEXT: [[TMP34:%.*]] = lshr i129 [[TMP32]], 32
|
|
; CHECK-NEXT: [[TMP35:%.*]] = trunc i129 [[TMP34]] to i32
|
|
; CHECK-NEXT: br label [[ITOFP_IF_END26]]
|
|
; CHECK: itofp-if-else:
|
|
; CHECK-NEXT: [[TMP36:%.*]] = add i32 [[TMP5]], -76
|
|
; CHECK-NEXT: [[TMP37:%.*]] = zext i32 [[TMP36]] to i129
|
|
; CHECK-NEXT: [[TMP38:%.*]] = shl i129 [[A]], [[TMP37]]
|
|
; CHECK-NEXT: [[TMP39:%.*]] = trunc i129 [[TMP38]] to i64
|
|
; CHECK-NEXT: [[TMP40:%.*]] = lshr i129 [[TMP38]], 32
|
|
; CHECK-NEXT: [[TMP41:%.*]] = trunc i129 [[TMP40]] to i32
|
|
; CHECK-NEXT: br label [[ITOFP_IF_END26]]
|
|
; CHECK: itofp-if-end26:
|
|
; CHECK-NEXT: [[TMP42:%.*]] = phi i64 [ [[TMP33]], [[ITOFP_IF_THEN20]] ], [ [[TMP29]], [[ITOFP_SW_EPILOG]] ], [ [[TMP39]], [[ITOFP_IF_ELSE]] ]
|
|
; CHECK-NEXT: [[TMP43:%.*]] = phi i32 [ [[TMP35]], [[ITOFP_IF_THEN20]] ], [ [[TMP31]], [[ITOFP_SW_EPILOG]] ], [ [[TMP41]], [[ITOFP_IF_ELSE]] ]
|
|
; CHECK-NEXT: [[TMP44:%.*]] = phi i32 [ [[TMP6]], [[ITOFP_IF_THEN20]] ], [ [[TMP7]], [[ITOFP_SW_EPILOG]] ], [ [[TMP7]], [[ITOFP_IF_ELSE]] ]
|
|
; CHECK-NEXT: [[TMP45:%.*]] = trunc i129 [[TMP1]] to i32
|
|
; CHECK-NEXT: [[TMP46:%.*]] = and i32 [[TMP45]], -2147483648
|
|
; CHECK-NEXT: [[TMP47:%.*]] = shl i32 [[TMP44]], 20
|
|
; CHECK-NEXT: [[TMP48:%.*]] = add i32 [[TMP47]], 1072693248
|
|
; CHECK-NEXT: [[TMP49:%.*]] = and i32 [[TMP43]], 1048575
|
|
; CHECK-NEXT: [[TMP50:%.*]] = or i32 [[TMP49]], [[TMP46]]
|
|
; CHECK-NEXT: [[TMP51:%.*]] = or i32 [[TMP49]], [[TMP48]]
|
|
; CHECK-NEXT: [[TMP52:%.*]] = zext i32 [[TMP51]] to i64
|
|
; CHECK-NEXT: [[TMP53:%.*]] = shl i64 [[TMP52]], 32
|
|
; CHECK-NEXT: [[TMP54:%.*]] = and i64 [[TMP42]], 4294967295
|
|
; CHECK-NEXT: [[TMP55:%.*]] = or i64 [[TMP53]], [[TMP54]]
|
|
; CHECK-NEXT: [[TMP56:%.*]] = bitcast i64 [[TMP55]] to double
|
|
; CHECK-NEXT: br label [[ITOFP_RETURN]]
|
|
; CHECK: itofp-return:
|
|
; CHECK-NEXT: [[TMP57:%.*]] = phi double [ [[TMP56]], [[ITOFP_IF_END26]] ], [ 0.000000e+00, [[ITOFP_ENTRY:%.*]] ]
|
|
; CHECK-NEXT: ret double [[TMP57]]
|
|
;
|
|
%conv = uitofp i129 %a to double
|
|
ret double %conv
|
|
}
|
|
|
|
define x86_fp80 @ui129tox86_fp80(i129 %a) {
|
|
; CHECK-LABEL: @ui129tox86_fp80(
|
|
; CHECK-NEXT: itofp-entry:
|
|
; CHECK-NEXT: [[A:%.*]] = freeze i129 [[A1:%.*]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i129 [[A]], 0
|
|
; CHECK-NEXT: br i1 [[TMP0]], label [[ITOFP_RETURN:%.*]], label [[ITOFP_IF_END:%.*]], !prof [[PROF1]]
|
|
; CHECK: itofp-if-end:
|
|
; CHECK-NEXT: [[TMP1:%.*]] = ashr i129 [[A]], 128
|
|
; CHECK-NEXT: [[TMP2:%.*]] = xor i129 [[TMP1]], [[A]]
|
|
; CHECK-NEXT: [[TMP3:%.*]] = sub i129 [[TMP2]], [[TMP1]]
|
|
; CHECK-NEXT: [[TMP4:%.*]] = call i129 @llvm.ctlz.i129(i129 [[A]], i1 true)
|
|
; CHECK-NEXT: [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
|
|
; CHECK-NEXT: [[TMP6:%.*]] = sub i129 129, [[TMP4]]
|
|
; CHECK-NEXT: [[TMP7:%.*]] = sub i129 128, [[TMP4]]
|
|
; CHECK-NEXT: [[TMP8:%.*]] = icmp sgt i129 [[TMP6]], 113
|
|
; CHECK-NEXT: br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]], !prof [[PROF2]]
|
|
; CHECK: itofp-if-then4:
|
|
; CHECK-NEXT: switch i129 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
|
|
; CHECK-NEXT: i129 114, label [[ITOFP_SW_BB:%.*]]
|
|
; CHECK-NEXT: i129 115, label [[ITOFP_SW_EPILOG:%.*]]
|
|
; CHECK-NEXT: ], !prof [[PROF3]]
|
|
; CHECK: itofp-sw-bb:
|
|
; CHECK-NEXT: [[TMP9:%.*]] = shl i129 [[A]], 1
|
|
; CHECK-NEXT: br label [[ITOFP_SW_EPILOG]]
|
|
; CHECK: itofp-sw-default:
|
|
; CHECK-NEXT: [[TMP10:%.*]] = sub i129 14, [[TMP4]]
|
|
; CHECK-NEXT: [[TMP11:%.*]] = lshr i129 [[A]], [[TMP10]]
|
|
; CHECK-NEXT: [[TMP12:%.*]] = add i129 [[TMP4]], 115
|
|
; CHECK-NEXT: [[TMP13:%.*]] = lshr i129 -1, [[TMP12]]
|
|
; CHECK-NEXT: [[TMP14:%.*]] = and i129 [[TMP13]], [[A]]
|
|
; CHECK-NEXT: [[TMP15:%.*]] = icmp ne i129 [[TMP14]], 0
|
|
; CHECK-NEXT: [[TMP16:%.*]] = zext i1 [[TMP15]] to i129
|
|
; CHECK-NEXT: [[TMP17:%.*]] = or i129 [[TMP11]], [[TMP16]]
|
|
; CHECK-NEXT: br label [[ITOFP_SW_EPILOG]]
|
|
; CHECK: itofp-sw-epilog:
|
|
; CHECK-NEXT: [[TMP18:%.*]] = phi i129 [ [[TMP17]], [[ITOFP_SW_DEFAULT]] ], [ [[A]], [[ITOFP_IF_THEN4]] ], [ [[TMP9]], [[ITOFP_SW_BB]] ]
|
|
; CHECK-NEXT: [[TMP19:%.*]] = trunc i129 [[TMP18]] to i32
|
|
; CHECK-NEXT: [[TMP20:%.*]] = lshr i32 [[TMP19]], 2
|
|
; CHECK-NEXT: [[TMP21:%.*]] = and i32 [[TMP20]], 1
|
|
; CHECK-NEXT: [[TMP22:%.*]] = zext i32 [[TMP21]] to i129
|
|
; CHECK-NEXT: [[TMP23:%.*]] = or i129 [[TMP18]], [[TMP22]]
|
|
; CHECK-NEXT: [[TMP24:%.*]] = add i129 [[TMP23]], 1
|
|
; CHECK-NEXT: [[TMP25:%.*]] = lshr i129 [[TMP24]], 2
|
|
; CHECK-NEXT: [[A3:%.*]] = and i129 [[TMP24]], 41538374868278621028243970633760768
|
|
; CHECK-NEXT: [[TMP26:%.*]] = icmp eq i129 [[A3]], 0
|
|
; CHECK-NEXT: [[TMP27:%.*]] = trunc i129 [[TMP25]] to i128
|
|
; CHECK-NEXT: [[TMP28:%.*]] = lshr i129 [[TMP25]], 32
|
|
; CHECK-NEXT: [[TMP29:%.*]] = trunc i129 [[TMP7]] to i64
|
|
; CHECK-NEXT: br i1 [[TMP26]], label [[ITOFP_IF_END26:%.*]], label [[ITOFP_IF_THEN20:%.*]], !prof [[PROF2]]
|
|
; CHECK: itofp-if-then20:
|
|
; CHECK-NEXT: [[TMP30:%.*]] = lshr i129 [[TMP24]], 3
|
|
; CHECK-NEXT: [[TMP31:%.*]] = trunc i129 [[TMP30]] to i128
|
|
; CHECK-NEXT: [[TMP32:%.*]] = lshr i129 [[TMP30]], 32
|
|
; CHECK-NEXT: [[TMP33:%.*]] = trunc i129 [[TMP6]] to i64
|
|
; CHECK-NEXT: br label [[ITOFP_IF_END26]]
|
|
; CHECK: itofp-if-else:
|
|
; CHECK-NEXT: [[TMP34:%.*]] = add i129 [[TMP4]], -16
|
|
; CHECK-NEXT: [[TMP35:%.*]] = shl i129 [[A]], [[TMP34]]
|
|
; CHECK-NEXT: [[TMP36:%.*]] = trunc i129 [[TMP35]] to i128
|
|
; CHECK-NEXT: [[TMP37:%.*]] = lshr i129 [[TMP35]], 32
|
|
; CHECK-NEXT: [[TMP38:%.*]] = trunc i129 [[TMP7]] to i64
|
|
; CHECK-NEXT: br label [[ITOFP_IF_END26]]
|
|
; CHECK: itofp-if-end26:
|
|
; CHECK-NEXT: [[TMP39:%.*]] = phi i128 [ [[TMP31]], [[ITOFP_IF_THEN20]] ], [ [[TMP27]], [[ITOFP_SW_EPILOG]] ], [ [[TMP36]], [[ITOFP_IF_ELSE]] ]
|
|
; CHECK-NEXT: [[TMP40:%.*]] = phi i64 [ [[TMP33]], [[ITOFP_IF_THEN20]] ], [ [[TMP29]], [[ITOFP_SW_EPILOG]] ], [ [[TMP38]], [[ITOFP_IF_ELSE]] ]
|
|
; CHECK-NEXT: [[AND29:%.*]] = and i129 [[TMP1]], 9223372036854775808
|
|
; CHECK-NEXT: [[TMP41:%.*]] = shl i64 [[TMP40]], 48
|
|
; CHECK-NEXT: [[TMP42:%.*]] = add i64 [[TMP41]], 4611404543450677248
|
|
; CHECK-NEXT: [[TMP43:%.*]] = zext i64 [[TMP42]] to i128
|
|
; CHECK-NEXT: [[TMP44:%.*]] = trunc i129 [[AND29]] to i128
|
|
; CHECK-NEXT: [[TMP45:%.*]] = or i128 [[TMP44]], [[TMP43]]
|
|
; CHECK-NEXT: [[TMP46:%.*]] = shl i128 [[TMP45]], 64
|
|
; CHECK-NEXT: [[TMP47:%.*]] = and i128 [[TMP39]], 5192296858534827628530496329220095
|
|
; CHECK-NEXT: [[TMP48:%.*]] = or i128 [[TMP46]], [[TMP47]]
|
|
; CHECK-NEXT: [[TMP49:%.*]] = bitcast i128 [[TMP48]] to fp128
|
|
; CHECK-NEXT: [[TMP50:%.*]] = fptrunc fp128 [[TMP49]] to x86_fp80
|
|
; CHECK-NEXT: br label [[ITOFP_RETURN]]
|
|
; CHECK: itofp-return:
|
|
; CHECK-NEXT: [[TMP51:%.*]] = phi x86_fp80 [ [[TMP50]], [[ITOFP_IF_END26]] ], [ 0.000000e+00, [[ITOFP_ENTRY:%.*]] ]
|
|
; CHECK-NEXT: ret x86_fp80 [[TMP51]]
|
|
;
|
|
%conv = uitofp i129 %a to x86_fp80
|
|
ret x86_fp80 %conv
|
|
}
|
|
|
|
define fp128 @ui129tofp128(i129 %a) {
|
|
; CHECK-LABEL: @ui129tofp128(
|
|
; CHECK-NEXT: itofp-entry:
|
|
; CHECK-NEXT: [[A:%.*]] = freeze i129 [[A1:%.*]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i129 [[A]], 0
|
|
; CHECK-NEXT: br i1 [[TMP0]], label [[ITOFP_RETURN:%.*]], label [[ITOFP_IF_END:%.*]], !prof [[PROF1]]
|
|
; CHECK: itofp-if-end:
|
|
; CHECK-NEXT: [[TMP1:%.*]] = ashr i129 [[A]], 128
|
|
; CHECK-NEXT: [[TMP2:%.*]] = xor i129 [[TMP1]], [[A]]
|
|
; CHECK-NEXT: [[TMP3:%.*]] = sub i129 [[TMP2]], [[TMP1]]
|
|
; CHECK-NEXT: [[TMP4:%.*]] = call i129 @llvm.ctlz.i129(i129 [[A]], i1 true)
|
|
; CHECK-NEXT: [[TMP5:%.*]] = trunc i129 [[TMP4]] to i32
|
|
; CHECK-NEXT: [[TMP6:%.*]] = sub i129 129, [[TMP4]]
|
|
; CHECK-NEXT: [[TMP7:%.*]] = sub i129 128, [[TMP4]]
|
|
; CHECK-NEXT: [[TMP8:%.*]] = icmp sgt i129 [[TMP6]], 113
|
|
; CHECK-NEXT: br i1 [[TMP8]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]], !prof [[PROF2]]
|
|
; CHECK: itofp-if-then4:
|
|
; CHECK-NEXT: switch i129 [[TMP6]], label [[ITOFP_SW_DEFAULT:%.*]] [
|
|
; CHECK-NEXT: i129 114, label [[ITOFP_SW_BB:%.*]]
|
|
; CHECK-NEXT: i129 115, label [[ITOFP_SW_EPILOG:%.*]]
|
|
; CHECK-NEXT: ], !prof [[PROF3]]
|
|
; CHECK: itofp-sw-bb:
|
|
; CHECK-NEXT: [[TMP9:%.*]] = shl i129 [[A]], 1
|
|
; CHECK-NEXT: br label [[ITOFP_SW_EPILOG]]
|
|
; CHECK: itofp-sw-default:
|
|
; CHECK-NEXT: [[TMP10:%.*]] = sub i129 14, [[TMP4]]
|
|
; CHECK-NEXT: [[TMP11:%.*]] = lshr i129 [[A]], [[TMP10]]
|
|
; CHECK-NEXT: [[TMP12:%.*]] = add i129 [[TMP4]], 115
|
|
; CHECK-NEXT: [[TMP13:%.*]] = lshr i129 -1, [[TMP12]]
|
|
; CHECK-NEXT: [[TMP14:%.*]] = and i129 [[TMP13]], [[A]]
|
|
; CHECK-NEXT: [[TMP15:%.*]] = icmp ne i129 [[TMP14]], 0
|
|
; CHECK-NEXT: [[TMP16:%.*]] = zext i1 [[TMP15]] to i129
|
|
; CHECK-NEXT: [[TMP17:%.*]] = or i129 [[TMP11]], [[TMP16]]
|
|
; CHECK-NEXT: br label [[ITOFP_SW_EPILOG]]
|
|
; CHECK: itofp-sw-epilog:
|
|
; CHECK-NEXT: [[TMP18:%.*]] = phi i129 [ [[TMP17]], [[ITOFP_SW_DEFAULT]] ], [ [[A]], [[ITOFP_IF_THEN4]] ], [ [[TMP9]], [[ITOFP_SW_BB]] ]
|
|
; CHECK-NEXT: [[TMP19:%.*]] = trunc i129 [[TMP18]] to i32
|
|
; CHECK-NEXT: [[TMP20:%.*]] = lshr i32 [[TMP19]], 2
|
|
; CHECK-NEXT: [[TMP21:%.*]] = and i32 [[TMP20]], 1
|
|
; CHECK-NEXT: [[TMP22:%.*]] = zext i32 [[TMP21]] to i129
|
|
; CHECK-NEXT: [[TMP23:%.*]] = or i129 [[TMP18]], [[TMP22]]
|
|
; CHECK-NEXT: [[TMP24:%.*]] = add i129 [[TMP23]], 1
|
|
; CHECK-NEXT: [[TMP25:%.*]] = lshr i129 [[TMP24]], 2
|
|
; CHECK-NEXT: [[A3:%.*]] = and i129 [[TMP24]], 41538374868278621028243970633760768
|
|
; CHECK-NEXT: [[TMP26:%.*]] = icmp eq i129 [[A3]], 0
|
|
; CHECK-NEXT: [[TMP27:%.*]] = trunc i129 [[TMP25]] to i128
|
|
; CHECK-NEXT: [[TMP28:%.*]] = lshr i129 [[TMP25]], 32
|
|
; CHECK-NEXT: [[TMP29:%.*]] = trunc i129 [[TMP7]] to i64
|
|
; CHECK-NEXT: br i1 [[TMP26]], label [[ITOFP_IF_END26:%.*]], label [[ITOFP_IF_THEN20:%.*]], !prof [[PROF2]]
|
|
; CHECK: itofp-if-then20:
|
|
; CHECK-NEXT: [[TMP30:%.*]] = lshr i129 [[TMP24]], 3
|
|
; CHECK-NEXT: [[TMP31:%.*]] = trunc i129 [[TMP30]] to i128
|
|
; CHECK-NEXT: [[TMP32:%.*]] = lshr i129 [[TMP30]], 32
|
|
; CHECK-NEXT: [[TMP33:%.*]] = trunc i129 [[TMP6]] to i64
|
|
; CHECK-NEXT: br label [[ITOFP_IF_END26]]
|
|
; CHECK: itofp-if-else:
|
|
; CHECK-NEXT: [[TMP34:%.*]] = add i129 [[TMP4]], -16
|
|
; CHECK-NEXT: [[TMP35:%.*]] = shl i129 [[A]], [[TMP34]]
|
|
; CHECK-NEXT: [[TMP36:%.*]] = trunc i129 [[TMP35]] to i128
|
|
; CHECK-NEXT: [[TMP37:%.*]] = lshr i129 [[TMP35]], 32
|
|
; CHECK-NEXT: [[TMP38:%.*]] = trunc i129 [[TMP7]] to i64
|
|
; CHECK-NEXT: br label [[ITOFP_IF_END26]]
|
|
; CHECK: itofp-if-end26:
|
|
; CHECK-NEXT: [[TMP39:%.*]] = phi i128 [ [[TMP31]], [[ITOFP_IF_THEN20]] ], [ [[TMP27]], [[ITOFP_SW_EPILOG]] ], [ [[TMP36]], [[ITOFP_IF_ELSE]] ]
|
|
; CHECK-NEXT: [[TMP40:%.*]] = phi i64 [ [[TMP33]], [[ITOFP_IF_THEN20]] ], [ [[TMP29]], [[ITOFP_SW_EPILOG]] ], [ [[TMP38]], [[ITOFP_IF_ELSE]] ]
|
|
; CHECK-NEXT: [[AND29:%.*]] = and i129 [[TMP1]], 9223372036854775808
|
|
; CHECK-NEXT: [[TMP41:%.*]] = shl i64 [[TMP40]], 48
|
|
; CHECK-NEXT: [[TMP42:%.*]] = add i64 [[TMP41]], 4611404543450677248
|
|
; CHECK-NEXT: [[TMP43:%.*]] = zext i64 [[TMP42]] to i128
|
|
; CHECK-NEXT: [[TMP44:%.*]] = trunc i129 [[AND29]] to i128
|
|
; CHECK-NEXT: [[TMP45:%.*]] = or i128 [[TMP44]], [[TMP43]]
|
|
; CHECK-NEXT: [[TMP46:%.*]] = shl i128 [[TMP45]], 64
|
|
; CHECK-NEXT: [[TMP47:%.*]] = and i128 [[TMP39]], 5192296858534827628530496329220095
|
|
; CHECK-NEXT: [[TMP48:%.*]] = or i128 [[TMP46]], [[TMP47]]
|
|
; CHECK-NEXT: [[TMP49:%.*]] = bitcast i128 [[TMP48]] to fp128
|
|
; CHECK-NEXT: br label [[ITOFP_RETURN]]
|
|
; CHECK: itofp-return:
|
|
; CHECK-NEXT: [[TMP50:%.*]] = phi fp128 [ [[TMP49]], [[ITOFP_IF_END26]] ], [ 0.000000e+00, [[ITOFP_ENTRY:%.*]] ]
|
|
; CHECK-NEXT: ret fp128 [[TMP50]]
|
|
;
|
|
%conv = uitofp i129 %a to fp128
|
|
ret fp128 %conv
|
|
}
|
|
|
|
define <2 x float> @ui129tofloatv2(<2 x i129> %a) {
|
|
; CHECK-LABEL: @ui129tofloatv2(
|
|
; CHECK-NEXT: itofp-entryitofp-entry:
|
|
; CHECK-NEXT: [[TMP0:%.*]] = extractelement <2 x i129> [[A:%.*]], i64 0
|
|
; CHECK-NEXT: [[TMP10:%.*]] = freeze i129 [[TMP0]]
|
|
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i129 [[TMP10]], 0
|
|
; CHECK-NEXT: br i1 [[TMP1]], label [[ITOFP_RETURN1:%.*]], label [[ITOFP_IF_END2:%.*]], !prof [[PROF1]]
|
|
; CHECK: itofp-if-end2:
|
|
; CHECK-NEXT: [[TMP2:%.*]] = ashr i129 [[TMP10]], 128
|
|
; CHECK-NEXT: [[TMP3:%.*]] = xor i129 [[TMP2]], [[TMP10]]
|
|
; CHECK-NEXT: [[TMP4:%.*]] = sub i129 [[TMP3]], [[TMP2]]
|
|
; CHECK-NEXT: [[TMP5:%.*]] = call i129 @llvm.ctlz.i129(i129 [[TMP10]], i1 true)
|
|
; CHECK-NEXT: [[TMP6:%.*]] = trunc i129 [[TMP5]] to i32
|
|
; CHECK-NEXT: [[TMP7:%.*]] = sub i32 129, [[TMP6]]
|
|
; CHECK-NEXT: [[TMP8:%.*]] = sub i32 128, [[TMP6]]
|
|
; CHECK-NEXT: [[TMP9:%.*]] = icmp sgt i32 [[TMP7]], 24
|
|
; CHECK-NEXT: br i1 [[TMP9]], label [[ITOFP_IF_THEN43:%.*]], label [[ITOFP_IF_ELSE8:%.*]], !prof [[PROF2]]
|
|
; CHECK: itofp-if-then43:
|
|
; CHECK-NEXT: switch i32 [[TMP7]], label [[ITOFP_SW_DEFAULT5:%.*]] [
|
|
; CHECK-NEXT: i32 25, label [[ITOFP_SW_BB4:%.*]]
|
|
; CHECK-NEXT: i32 26, label [[ITOFP_SW_EPILOG6:%.*]]
|
|
; CHECK-NEXT: ], !prof [[PROF3]]
|
|
; CHECK: itofp-sw-bb4:
|
|
; CHECK-NEXT: [[TMP65:%.*]] = shl i129 [[TMP10]], 1
|
|
; CHECK-NEXT: br label [[ITOFP_SW_EPILOG6]]
|
|
; CHECK: itofp-sw-default5:
|
|
; CHECK-NEXT: [[TMP11:%.*]] = sub i32 103, [[TMP6]]
|
|
; CHECK-NEXT: [[TMP12:%.*]] = zext i32 [[TMP11]] to i129
|
|
; CHECK-NEXT: [[TMP13:%.*]] = lshr i129 [[TMP10]], [[TMP12]]
|
|
; CHECK-NEXT: [[TMP14:%.*]] = add i32 [[TMP6]], 26
|
|
; CHECK-NEXT: [[TMP15:%.*]] = zext i32 [[TMP14]] to i129
|
|
; CHECK-NEXT: [[TMP16:%.*]] = lshr i129 -1, [[TMP15]]
|
|
; CHECK-NEXT: [[TMP17:%.*]] = and i129 [[TMP16]], [[TMP10]]
|
|
; CHECK-NEXT: [[TMP18:%.*]] = icmp ne i129 [[TMP17]], 0
|
|
; CHECK-NEXT: [[TMP19:%.*]] = zext i1 [[TMP18]] to i129
|
|
; CHECK-NEXT: [[TMP20:%.*]] = or i129 [[TMP13]], [[TMP19]]
|
|
; CHECK-NEXT: br label [[ITOFP_SW_EPILOG6]]
|
|
; CHECK: itofp-sw-epilog6:
|
|
; CHECK-NEXT: [[TMP21:%.*]] = phi i129 [ [[TMP20]], [[ITOFP_SW_DEFAULT5]] ], [ [[TMP10]], [[ITOFP_IF_THEN43]] ], [ [[TMP65]], [[ITOFP_SW_BB4]] ]
|
|
; CHECK-NEXT: [[TMP22:%.*]] = trunc i129 [[TMP21]] to i32
|
|
; CHECK-NEXT: [[TMP23:%.*]] = lshr i32 [[TMP22]], 2
|
|
; CHECK-NEXT: [[TMP24:%.*]] = and i32 [[TMP23]], 1
|
|
; CHECK-NEXT: [[TMP25:%.*]] = zext i32 [[TMP24]] to i129
|
|
; CHECK-NEXT: [[TMP26:%.*]] = or i129 [[TMP21]], [[TMP25]]
|
|
; CHECK-NEXT: [[TMP27:%.*]] = add i129 [[TMP26]], 1
|
|
; CHECK-NEXT: [[TMP28:%.*]] = lshr i129 [[TMP27]], 2
|
|
; CHECK-NEXT: [[A310:%.*]] = and i129 [[TMP27]], 67108864
|
|
; CHECK-NEXT: [[TMP29:%.*]] = icmp eq i129 [[A310]], 0
|
|
; CHECK-NEXT: [[TMP30:%.*]] = trunc i129 [[TMP28]] to i32
|
|
; CHECK-NEXT: [[TMP31:%.*]] = lshr i129 [[TMP28]], 32
|
|
; CHECK-NEXT: [[TMP32:%.*]] = trunc i129 [[TMP31]] to i32
|
|
; CHECK-NEXT: br i1 [[TMP29]], label [[ITOFP_IF_END269:%.*]], label [[ITOFP_IF_THEN207:%.*]], !prof [[PROF2]]
|
|
; CHECK: itofp-if-then207:
|
|
; CHECK-NEXT: [[TMP33:%.*]] = lshr i129 [[TMP27]], 3
|
|
; CHECK-NEXT: [[TMP34:%.*]] = trunc i129 [[TMP33]] to i32
|
|
; CHECK-NEXT: [[TMP35:%.*]] = lshr i129 [[TMP33]], 32
|
|
; CHECK-NEXT: [[TMP36:%.*]] = trunc i129 [[TMP35]] to i32
|
|
; CHECK-NEXT: br label [[ITOFP_IF_END269]]
|
|
; CHECK: itofp-if-else8:
|
|
; CHECK-NEXT: [[TMP37:%.*]] = add i32 [[TMP6]], -105
|
|
; CHECK-NEXT: [[TMP38:%.*]] = zext i32 [[TMP37]] to i129
|
|
; CHECK-NEXT: [[TMP39:%.*]] = shl i129 [[TMP10]], [[TMP38]]
|
|
; CHECK-NEXT: [[TMP40:%.*]] = trunc i129 [[TMP39]] to i32
|
|
; CHECK-NEXT: [[TMP41:%.*]] = lshr i129 [[TMP39]], 32
|
|
; CHECK-NEXT: [[TMP42:%.*]] = trunc i129 [[TMP41]] to i32
|
|
; CHECK-NEXT: br label [[ITOFP_IF_END269]]
|
|
; CHECK: itofp-if-end269:
|
|
; CHECK-NEXT: [[TMP43:%.*]] = phi i32 [ [[TMP34]], [[ITOFP_IF_THEN207]] ], [ [[TMP30]], [[ITOFP_SW_EPILOG6]] ], [ [[TMP40]], [[ITOFP_IF_ELSE8]] ]
|
|
; CHECK-NEXT: [[TMP44:%.*]] = phi i32 [ [[TMP7]], [[ITOFP_IF_THEN207]] ], [ [[TMP8]], [[ITOFP_SW_EPILOG6]] ], [ [[TMP8]], [[ITOFP_IF_ELSE8]] ]
|
|
; CHECK-NEXT: [[TMP45:%.*]] = trunc i129 [[TMP2]] to i32
|
|
; CHECK-NEXT: [[TMP46:%.*]] = and i32 [[TMP45]], -2147483648
|
|
; CHECK-NEXT: [[TMP47:%.*]] = shl i32 [[TMP44]], 23
|
|
; CHECK-NEXT: [[TMP48:%.*]] = add i32 [[TMP47]], 1065353216
|
|
; CHECK-NEXT: [[TMP49:%.*]] = and i32 [[TMP43]], 8388607
|
|
; CHECK-NEXT: [[TMP50:%.*]] = or i32 [[TMP49]], [[TMP46]]
|
|
; CHECK-NEXT: [[TMP51:%.*]] = or i32 [[TMP49]], [[TMP48]]
|
|
; CHECK-NEXT: [[TMP52:%.*]] = bitcast i32 [[TMP51]] to float
|
|
; CHECK-NEXT: [[TMP114:%.*]] = icmp uge i32 [[TMP8]], 128
|
|
; CHECK-NEXT: [[TMP115:%.*]] = select i1 [[TMP114]], float +inf, float [[TMP52]]
|
|
; CHECK-NEXT: br label [[ITOFP_RETURN1]]
|
|
; CHECK: itofp-return1:
|
|
; CHECK-NEXT: [[TMP53:%.*]] = phi float [ [[TMP115]], [[ITOFP_IF_END269]] ], [ 0.000000e+00, [[ITOFP_ENTRYITOFP_ENTRY:%.*]] ]
|
|
; CHECK-NEXT: [[TMP54:%.*]] = insertelement <2 x float> poison, float [[TMP53]], i64 0
|
|
; CHECK-NEXT: [[TMP55:%.*]] = extractelement <2 x i129> [[A]], i64 1
|
|
; CHECK-NEXT: [[TMP110:%.*]] = freeze i129 [[TMP55]]
|
|
; CHECK-NEXT: [[TMP56:%.*]] = icmp eq i129 [[TMP110]], 0
|
|
; CHECK-NEXT: br i1 [[TMP56]], label [[ITOFP_RETURN:%.*]], label [[ITOFP_IF_END:%.*]], !prof [[PROF1]]
|
|
; CHECK: itofp-if-end:
|
|
; CHECK-NEXT: [[TMP57:%.*]] = ashr i129 [[TMP110]], 128
|
|
; CHECK-NEXT: [[TMP58:%.*]] = xor i129 [[TMP57]], [[TMP110]]
|
|
; CHECK-NEXT: [[TMP59:%.*]] = sub i129 [[TMP58]], [[TMP57]]
|
|
; CHECK-NEXT: [[TMP60:%.*]] = call i129 @llvm.ctlz.i129(i129 [[TMP110]], i1 true)
|
|
; CHECK-NEXT: [[TMP61:%.*]] = trunc i129 [[TMP60]] to i32
|
|
; CHECK-NEXT: [[TMP62:%.*]] = sub i32 129, [[TMP61]]
|
|
; CHECK-NEXT: [[TMP63:%.*]] = sub i32 128, [[TMP61]]
|
|
; CHECK-NEXT: [[TMP64:%.*]] = icmp sgt i32 [[TMP62]], 24
|
|
; CHECK-NEXT: br i1 [[TMP64]], label [[ITOFP_IF_THEN4:%.*]], label [[ITOFP_IF_ELSE:%.*]], !prof [[PROF2]]
|
|
; CHECK: itofp-if-then4:
|
|
; CHECK-NEXT: switch i32 [[TMP62]], label [[ITOFP_SW_DEFAULT:%.*]] [
|
|
; CHECK-NEXT: i32 25, label [[ITOFP_SW_BB:%.*]]
|
|
; CHECK-NEXT: i32 26, label [[ITOFP_SW_EPILOG:%.*]]
|
|
; CHECK-NEXT: ], !prof [[PROF3]]
|
|
; CHECK: itofp-sw-bb:
|
|
; CHECK-NEXT: [[TMP111:%.*]] = shl i129 [[TMP110]], 1
|
|
; CHECK-NEXT: br label [[ITOFP_SW_EPILOG]]
|
|
; CHECK: itofp-sw-default:
|
|
; CHECK-NEXT: [[TMP66:%.*]] = sub i32 103, [[TMP61]]
|
|
; CHECK-NEXT: [[TMP67:%.*]] = zext i32 [[TMP66]] to i129
|
|
; CHECK-NEXT: [[TMP68:%.*]] = lshr i129 [[TMP110]], [[TMP67]]
|
|
; CHECK-NEXT: [[TMP69:%.*]] = add i32 [[TMP61]], 26
|
|
; CHECK-NEXT: [[TMP70:%.*]] = zext i32 [[TMP69]] to i129
|
|
; CHECK-NEXT: [[TMP71:%.*]] = lshr i129 -1, [[TMP70]]
|
|
; CHECK-NEXT: [[TMP72:%.*]] = and i129 [[TMP71]], [[TMP110]]
|
|
; CHECK-NEXT: [[TMP73:%.*]] = icmp ne i129 [[TMP72]], 0
|
|
; CHECK-NEXT: [[TMP74:%.*]] = zext i1 [[TMP73]] to i129
|
|
; CHECK-NEXT: [[TMP75:%.*]] = or i129 [[TMP68]], [[TMP74]]
|
|
; CHECK-NEXT: br label [[ITOFP_SW_EPILOG]]
|
|
; CHECK: itofp-sw-epilog:
|
|
; CHECK-NEXT: [[TMP76:%.*]] = phi i129 [ [[TMP75]], [[ITOFP_SW_DEFAULT]] ], [ [[TMP110]], [[ITOFP_IF_THEN4]] ], [ [[TMP111]], [[ITOFP_SW_BB]] ]
|
|
; CHECK-NEXT: [[TMP77:%.*]] = trunc i129 [[TMP76]] to i32
|
|
; CHECK-NEXT: [[TMP78:%.*]] = lshr i32 [[TMP77]], 2
|
|
; CHECK-NEXT: [[TMP79:%.*]] = and i32 [[TMP78]], 1
|
|
; CHECK-NEXT: [[TMP80:%.*]] = zext i32 [[TMP79]] to i129
|
|
; CHECK-NEXT: [[TMP81:%.*]] = or i129 [[TMP76]], [[TMP80]]
|
|
; CHECK-NEXT: [[TMP82:%.*]] = add i129 [[TMP81]], 1
|
|
; CHECK-NEXT: [[TMP83:%.*]] = lshr i129 [[TMP82]], 2
|
|
; CHECK-NEXT: [[A3:%.*]] = and i129 [[TMP82]], 67108864
|
|
; CHECK-NEXT: [[TMP84:%.*]] = icmp eq i129 [[A3]], 0
|
|
; CHECK-NEXT: [[TMP85:%.*]] = trunc i129 [[TMP83]] to i32
|
|
; CHECK-NEXT: [[TMP86:%.*]] = lshr i129 [[TMP83]], 32
|
|
; CHECK-NEXT: [[TMP87:%.*]] = trunc i129 [[TMP86]] to i32
|
|
; CHECK-NEXT: br i1 [[TMP84]], label [[ITOFP_IF_END26:%.*]], label [[ITOFP_IF_THEN20:%.*]], !prof [[PROF2]]
|
|
; CHECK: itofp-if-then20:
|
|
; CHECK-NEXT: [[TMP88:%.*]] = lshr i129 [[TMP82]], 3
|
|
; CHECK-NEXT: [[TMP89:%.*]] = trunc i129 [[TMP88]] to i32
|
|
; CHECK-NEXT: [[TMP90:%.*]] = lshr i129 [[TMP88]], 32
|
|
; CHECK-NEXT: [[TMP91:%.*]] = trunc i129 [[TMP90]] to i32
|
|
; CHECK-NEXT: br label [[ITOFP_IF_END26]]
|
|
; CHECK: itofp-if-else:
|
|
; CHECK-NEXT: [[TMP92:%.*]] = add i32 [[TMP61]], -105
|
|
; CHECK-NEXT: [[TMP93:%.*]] = zext i32 [[TMP92]] to i129
|
|
; CHECK-NEXT: [[TMP94:%.*]] = shl i129 [[TMP110]], [[TMP93]]
|
|
; CHECK-NEXT: [[TMP95:%.*]] = trunc i129 [[TMP94]] to i32
|
|
; CHECK-NEXT: [[TMP96:%.*]] = lshr i129 [[TMP94]], 32
|
|
; CHECK-NEXT: [[TMP97:%.*]] = trunc i129 [[TMP96]] to i32
|
|
; CHECK-NEXT: br label [[ITOFP_IF_END26]]
|
|
; CHECK: itofp-if-end26:
|
|
; CHECK-NEXT: [[TMP98:%.*]] = phi i32 [ [[TMP89]], [[ITOFP_IF_THEN20]] ], [ [[TMP85]], [[ITOFP_SW_EPILOG]] ], [ [[TMP95]], [[ITOFP_IF_ELSE]] ]
|
|
; CHECK-NEXT: [[TMP99:%.*]] = phi i32 [ [[TMP62]], [[ITOFP_IF_THEN20]] ], [ [[TMP63]], [[ITOFP_SW_EPILOG]] ], [ [[TMP63]], [[ITOFP_IF_ELSE]] ]
|
|
; CHECK-NEXT: [[TMP100:%.*]] = trunc i129 [[TMP57]] to i32
|
|
; CHECK-NEXT: [[TMP101:%.*]] = and i32 [[TMP100]], -2147483648
|
|
; CHECK-NEXT: [[TMP102:%.*]] = shl i32 [[TMP99]], 23
|
|
; CHECK-NEXT: [[TMP103:%.*]] = add i32 [[TMP102]], 1065353216
|
|
; CHECK-NEXT: [[TMP104:%.*]] = and i32 [[TMP98]], 8388607
|
|
; CHECK-NEXT: [[TMP105:%.*]] = or i32 [[TMP104]], [[TMP101]]
|
|
; CHECK-NEXT: [[TMP106:%.*]] = or i32 [[TMP104]], [[TMP103]]
|
|
; CHECK-NEXT: [[TMP107:%.*]] = bitcast i32 [[TMP106]] to float
|
|
; CHECK-NEXT: [[TMP112:%.*]] = icmp uge i32 [[TMP63]], 128
|
|
; CHECK-NEXT: [[TMP113:%.*]] = select i1 [[TMP112]], float +inf, float [[TMP107]]
|
|
; CHECK-NEXT: br label [[ITOFP_RETURN]]
|
|
; CHECK: itofp-return:
|
|
; CHECK-NEXT: [[TMP108:%.*]] = phi float [ [[TMP113]], [[ITOFP_IF_END26]] ], [ 0.000000e+00, [[ITOFP_RETURN1]] ]
|
|
; CHECK-NEXT: [[TMP109:%.*]] = insertelement <2 x float> [[TMP54]], float [[TMP108]], i64 1
|
|
; CHECK-NEXT: ret <2 x float> [[TMP109]]
|
|
;
|
|
%conv = uitofp <2 x i129> %a to <2 x float>
|
|
ret <2 x float> %conv
|
|
}
|
|
|
|
!0 = !{!"function_entry_count", i64 1000}
|
|
;.
|
|
; CHECK: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
|
|
;.
|
|
; CHECK: [[META0:![0-9]+]] = !{!"function_entry_count", i64 1000}
|
|
; CHECK: [[PROF1]] = !{!"branch_weights", i32 1, i32 1048575}
|
|
; CHECK: [[PROF2]] = !{!"branch_weights", i32 1048575, i32 1}
|
|
; CHECK: [[PROF3]] = !{!"branch_weights", i32 1048575, i32 1, i32 1}
|
|
;.
|