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
2179 lines
78 KiB
LLVM
2179 lines
78 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
|
|
; RUN: llc -mtriple=aarch64 %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
|
; RUN: llc -mtriple=aarch64 -global-isel=true -global-isel-abort=2 %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
|
|
|
|
; CHECK-GI: warning: Instruction selection used fallback path for s256_to_f32
|
|
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for u256_to_f32
|
|
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for s256_to_f64
|
|
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for u256_to_f64
|
|
|
|
define float @s256_to_f32(i256 %val) {
|
|
; CHECK-LABEL: s256_to_f32:
|
|
; CHECK: // %bb.0: // %itofp-entry
|
|
; CHECK-NEXT: orr x8, x1, x3
|
|
; CHECK-NEXT: orr x9, x0, x2
|
|
; CHECK-NEXT: orr x8, x9, x8
|
|
; CHECK-NEXT: cbz x8, .LBB0_7
|
|
; CHECK-NEXT: // %bb.1: // %itofp-if-end
|
|
; CHECK-NEXT: sub sp, sp, #192
|
|
; CHECK-NEXT: .cfi_def_cfa_offset 192
|
|
; CHECK-NEXT: asr x8, x3, #63
|
|
; CHECK-NEXT: eor x9, x0, x8
|
|
; CHECK-NEXT: eor x11, x1, x8
|
|
; CHECK-NEXT: subs x10, x9, x8
|
|
; CHECK-NEXT: eor x9, x2, x8
|
|
; CHECK-NEXT: sbcs x13, x11, x8
|
|
; CHECK-NEXT: eor x11, x3, x8
|
|
; CHECK-NEXT: clz x14, x10
|
|
; CHECK-NEXT: sbcs x12, x9, x8
|
|
; CHECK-NEXT: add w14, w14, #64
|
|
; CHECK-NEXT: sbcs x11, x11, x8
|
|
; CHECK-NEXT: clz x8, x12
|
|
; CHECK-NEXT: add w8, w8, #64
|
|
; CHECK-NEXT: clz x9, x11
|
|
; CHECK-NEXT: csel w8, w9, w8, ne
|
|
; CHECK-NEXT: clz x9, x13
|
|
; CHECK-NEXT: cmp x13, #0
|
|
; CHECK-NEXT: csel w9, w9, w14, ne
|
|
; CHECK-NEXT: orr x14, x12, x11
|
|
; CHECK-NEXT: add w9, w9, #128
|
|
; CHECK-NEXT: cmp x14, #0
|
|
; CHECK-NEXT: csel w15, w8, w9, ne
|
|
; CHECK-NEXT: mov w8, #256 // =0x100
|
|
; CHECK-NEXT: sub w9, w8, w15
|
|
; CHECK-NEXT: mov w8, #255 // =0xff
|
|
; CHECK-NEXT: cmp w9, #25
|
|
; CHECK-NEXT: sub w8, w8, w15
|
|
; CHECK-NEXT: b.lt .LBB0_8
|
|
; CHECK-NEXT: // %bb.2: // %itofp-if-then4
|
|
; CHECK-NEXT: cmp w9, #26
|
|
; CHECK-NEXT: b.eq .LBB0_5
|
|
; CHECK-NEXT: // %bb.3: // %itofp-if-then4
|
|
; CHECK-NEXT: cmp w9, #25
|
|
; CHECK-NEXT: b.eq .LBB0_9
|
|
; CHECK-NEXT: // %bb.4: // %itofp-sw-default
|
|
; CHECK-NEXT: mov w14, #230 // =0xe6
|
|
; CHECK-NEXT: movi v0.2d, #0000000000000000
|
|
; CHECK-NEXT: add x17, sp, #64
|
|
; CHECK-NEXT: sub w14, w14, w15
|
|
; CHECK-NEXT: stp x10, x13, [sp, #64]
|
|
; CHECK-NEXT: mov x18, sp
|
|
; CHECK-NEXT: lsr x16, x14, #3
|
|
; CHECK-NEXT: stp x12, x11, [sp, #80]
|
|
; CHECK-NEXT: and x16, x16, #0x18
|
|
; CHECK-NEXT: stp q0, q0, [sp, #96]
|
|
; CHECK-NEXT: add x16, x17, x16
|
|
; CHECK-NEXT: ldp x16, x17, [x16]
|
|
; CHECK-NEXT: stp x10, x13, [sp, #32]
|
|
; CHECK-NEXT: add w10, w15, #26
|
|
; CHECK-NEXT: add x13, x18, #32
|
|
; CHECK-NEXT: stp q0, q0, [sp]
|
|
; CHECK-NEXT: lsr x15, x10, #3
|
|
; CHECK-NEXT: stp x12, x11, [sp, #48]
|
|
; CHECK-NEXT: and x18, x10, #0x3f
|
|
; CHECK-NEXT: lsl x17, x17, #1
|
|
; CHECK-NEXT: and x15, x15, #0x18
|
|
; CHECK-NEXT: sub x12, x13, x15
|
|
; CHECK-NEXT: ldp x13, x11, [x12, #16]
|
|
; CHECK-NEXT: ldp x12, x15, [x12]
|
|
; CHECK-NEXT: orr x11, x15, x11
|
|
; CHECK-NEXT: orr x12, x12, x13
|
|
; CHECK-NEXT: lsr x13, x15, #1
|
|
; CHECK-NEXT: orr x11, x12, x11
|
|
; CHECK-NEXT: mvn w15, w10
|
|
; CHECK-NEXT: lsr x12, x12, #1
|
|
; CHECK-NEXT: lsl x10, x11, x10
|
|
; CHECK-NEXT: lsr x11, x13, x15
|
|
; CHECK-NEXT: eor x13, x18, #0x3f
|
|
; CHECK-NEXT: and x15, x14, #0x3f
|
|
; CHECK-NEXT: lsr x12, x12, x13
|
|
; CHECK-NEXT: eor x13, x15, #0x3f
|
|
; CHECK-NEXT: orr x10, x10, x11
|
|
; CHECK-NEXT: lsr x11, x16, x14
|
|
; CHECK-NEXT: lsl x13, x17, x13
|
|
; CHECK-NEXT: orr x10, x10, x12
|
|
; CHECK-NEXT: cmp x10, #0
|
|
; CHECK-NEXT: orr x10, x13, x11
|
|
; CHECK-NEXT: cset w11, ne
|
|
; CHECK-NEXT: orr x10, x10, x11
|
|
; CHECK-NEXT: .LBB0_5: // %itofp-sw-epilog
|
|
; CHECK-NEXT: ubfx w11, w10, #2, #1
|
|
; CHECK-NEXT: orr x10, x10, x11
|
|
; CHECK-NEXT: adds x10, x10, #1
|
|
; CHECK-NEXT: lsr x11, x10, #2
|
|
; CHECK-NEXT: lsr x12, x10, #3
|
|
; CHECK-NEXT: tst w10, #0x4000000
|
|
; CHECK-NEXT: csel w9, w8, w9, eq
|
|
; CHECK-NEXT: csel w10, w11, w12, eq
|
|
; CHECK-NEXT: .LBB0_6: // %itofp-if-end26
|
|
; CHECK-NEXT: lsr x11, x3, #32
|
|
; CHECK-NEXT: mov w12, #1065353216 // =0x3f800000
|
|
; CHECK-NEXT: mov w13, #2139095040 // =0x7f800000
|
|
; CHECK-NEXT: mov w14, #-8388608 // =0xff800000
|
|
; CHECK-NEXT: add w9, w12, w9, lsl #23
|
|
; CHECK-NEXT: fmov s0, w13
|
|
; CHECK-NEXT: and w11, w11, #0x80000000
|
|
; CHECK-NEXT: fmov s1, w14
|
|
; CHECK-NEXT: cmp x3, #0
|
|
; CHECK-NEXT: bfxil w11, w10, #0, #23
|
|
; CHECK-NEXT: orr w9, w11, w9
|
|
; CHECK-NEXT: fcsel s0, s1, s0, mi
|
|
; CHECK-NEXT: cmp w8, #127
|
|
; CHECK-NEXT: fmov s1, w9
|
|
; CHECK-NEXT: fcsel s0, s0, s1, hi
|
|
; CHECK-NEXT: add sp, sp, #192
|
|
; CHECK-NEXT: ret
|
|
; CHECK-NEXT: .LBB0_7:
|
|
; CHECK-NEXT: movi d0, #0000000000000000
|
|
; CHECK-NEXT: ret
|
|
; CHECK-NEXT: .LBB0_8: // %itofp-if-else
|
|
; CHECK-NEXT: movi v0.2d, #0000000000000000
|
|
; CHECK-NEXT: sub w9, w15, #232
|
|
; CHECK-NEXT: str x10, [sp, #160]
|
|
; CHECK-NEXT: lsr x11, x9, #3
|
|
; CHECK-NEXT: add x10, sp, #128
|
|
; CHECK-NEXT: add x10, x10, #32
|
|
; CHECK-NEXT: and x11, x11, #0x18
|
|
; CHECK-NEXT: stp q0, q0, [sp, #128]
|
|
; CHECK-NEXT: sub x10, x10, x11
|
|
; CHECK-NEXT: ldr x10, [x10]
|
|
; CHECK-NEXT: lsl x10, x10, x9
|
|
; CHECK-NEXT: mov w9, w8
|
|
; CHECK-NEXT: b .LBB0_6
|
|
; CHECK-NEXT: .LBB0_9: // %itofp-sw-bb
|
|
; CHECK-NEXT: lsl x10, x10, #1
|
|
; CHECK-NEXT: b .LBB0_5
|
|
%result = sitofp i256 %val to float
|
|
ret float %result
|
|
}
|
|
|
|
define float @u256_to_f32(i256 %val) {
|
|
; CHECK-LABEL: u256_to_f32:
|
|
; CHECK: // %bb.0: // %itofp-entry
|
|
; CHECK-NEXT: orr x8, x1, x3
|
|
; CHECK-NEXT: orr x9, x0, x2
|
|
; CHECK-NEXT: orr x8, x9, x8
|
|
; CHECK-NEXT: cbz x8, .LBB1_7
|
|
; CHECK-NEXT: // %bb.1: // %itofp-if-end
|
|
; CHECK-NEXT: sub sp, sp, #192
|
|
; CHECK-NEXT: .cfi_def_cfa_offset 192
|
|
; CHECK-NEXT: clz x8, x2
|
|
; CHECK-NEXT: clz x9, x3
|
|
; CHECK-NEXT: cmp x3, #0
|
|
; CHECK-NEXT: add w8, w8, #64
|
|
; CHECK-NEXT: clz x10, x0
|
|
; CHECK-NEXT: csel w8, w9, w8, ne
|
|
; CHECK-NEXT: add w9, w10, #64
|
|
; CHECK-NEXT: clz x10, x1
|
|
; CHECK-NEXT: cmp x1, #0
|
|
; CHECK-NEXT: csel w9, w10, w9, ne
|
|
; CHECK-NEXT: orr x10, x2, x3
|
|
; CHECK-NEXT: add w9, w9, #128
|
|
; CHECK-NEXT: cmp x10, #0
|
|
; CHECK-NEXT: csel w11, w8, w9, ne
|
|
; CHECK-NEXT: mov w8, #256 // =0x100
|
|
; CHECK-NEXT: sub w9, w8, w11
|
|
; CHECK-NEXT: mov w8, #255 // =0xff
|
|
; CHECK-NEXT: cmp w9, #25
|
|
; CHECK-NEXT: sub w8, w8, w11
|
|
; CHECK-NEXT: b.lt .LBB1_8
|
|
; CHECK-NEXT: // %bb.2: // %itofp-if-then4
|
|
; CHECK-NEXT: cmp w9, #26
|
|
; CHECK-NEXT: b.eq .LBB1_5
|
|
; CHECK-NEXT: // %bb.3: // %itofp-if-then4
|
|
; CHECK-NEXT: cmp w9, #25
|
|
; CHECK-NEXT: b.eq .LBB1_9
|
|
; CHECK-NEXT: // %bb.4: // %itofp-sw-default
|
|
; CHECK-NEXT: mov w10, #230 // =0xe6
|
|
; CHECK-NEXT: movi v0.2d, #0000000000000000
|
|
; CHECK-NEXT: add x13, sp, #64
|
|
; CHECK-NEXT: sub w10, w10, w11
|
|
; CHECK-NEXT: add w11, w11, #26
|
|
; CHECK-NEXT: mov x15, sp
|
|
; CHECK-NEXT: lsr x12, x10, #3
|
|
; CHECK-NEXT: lsr x14, x11, #3
|
|
; CHECK-NEXT: stp x0, x1, [sp, #64]
|
|
; CHECK-NEXT: stp x2, x3, [sp, #80]
|
|
; CHECK-NEXT: add x15, x15, #32
|
|
; CHECK-NEXT: and x18, x11, #0x3f
|
|
; CHECK-NEXT: and x12, x12, #0x18
|
|
; CHECK-NEXT: stp q0, q0, [sp, #96]
|
|
; CHECK-NEXT: and x14, x14, #0x18
|
|
; CHECK-NEXT: add x12, x13, x12
|
|
; CHECK-NEXT: sub x14, x15, x14
|
|
; CHECK-NEXT: ldp x12, x13, [x12]
|
|
; CHECK-NEXT: stp x0, x1, [sp, #32]
|
|
; CHECK-NEXT: stp q0, q0, [sp]
|
|
; CHECK-NEXT: stp x2, x3, [sp, #48]
|
|
; CHECK-NEXT: ldp x16, x15, [x14, #16]
|
|
; CHECK-NEXT: lsl x13, x13, #1
|
|
; CHECK-NEXT: ldp x14, x17, [x14]
|
|
; CHECK-NEXT: orr x15, x17, x15
|
|
; CHECK-NEXT: orr x14, x14, x16
|
|
; CHECK-NEXT: lsr x16, x17, #1
|
|
; CHECK-NEXT: orr x15, x14, x15
|
|
; CHECK-NEXT: mvn w17, w11
|
|
; CHECK-NEXT: lsr x14, x14, #1
|
|
; CHECK-NEXT: lsl x11, x15, x11
|
|
; CHECK-NEXT: lsr x15, x16, x17
|
|
; CHECK-NEXT: eor x16, x18, #0x3f
|
|
; CHECK-NEXT: and x17, x10, #0x3f
|
|
; CHECK-NEXT: lsr x14, x14, x16
|
|
; CHECK-NEXT: lsr x10, x12, x10
|
|
; CHECK-NEXT: eor x16, x17, #0x3f
|
|
; CHECK-NEXT: orr x11, x11, x15
|
|
; CHECK-NEXT: lsl x12, x13, x16
|
|
; CHECK-NEXT: orr x11, x11, x14
|
|
; CHECK-NEXT: cmp x11, #0
|
|
; CHECK-NEXT: orr x10, x12, x10
|
|
; CHECK-NEXT: cset w11, ne
|
|
; CHECK-NEXT: orr x0, x10, x11
|
|
; CHECK-NEXT: .LBB1_5: // %itofp-sw-epilog
|
|
; CHECK-NEXT: ubfx w10, w0, #2, #1
|
|
; CHECK-NEXT: orr x10, x0, x10
|
|
; CHECK-NEXT: adds x10, x10, #1
|
|
; CHECK-NEXT: lsr x11, x10, #2
|
|
; CHECK-NEXT: lsr x12, x10, #3
|
|
; CHECK-NEXT: tst w10, #0x4000000
|
|
; CHECK-NEXT: csel w9, w8, w9, eq
|
|
; CHECK-NEXT: csel w10, w11, w12, eq
|
|
; CHECK-NEXT: .LBB1_6: // %itofp-if-end26
|
|
; CHECK-NEXT: bfi w10, w9, #23, #9
|
|
; CHECK-NEXT: mov w9, #1065353216 // =0x3f800000
|
|
; CHECK-NEXT: cmp w8, #127
|
|
; CHECK-NEXT: add w9, w10, w9
|
|
; CHECK-NEXT: mov w10, #2139095040 // =0x7f800000
|
|
; CHECK-NEXT: fmov s0, w9
|
|
; CHECK-NEXT: fmov s1, w10
|
|
; CHECK-NEXT: fcsel s0, s1, s0, hi
|
|
; CHECK-NEXT: add sp, sp, #192
|
|
; CHECK-NEXT: ret
|
|
; CHECK-NEXT: .LBB1_7:
|
|
; CHECK-NEXT: movi d0, #0000000000000000
|
|
; CHECK-NEXT: ret
|
|
; CHECK-NEXT: .LBB1_8: // %itofp-if-else
|
|
; CHECK-NEXT: movi v0.2d, #0000000000000000
|
|
; CHECK-NEXT: sub w9, w11, #232
|
|
; CHECK-NEXT: add x11, sp, #128
|
|
; CHECK-NEXT: lsr x10, x9, #3
|
|
; CHECK-NEXT: add x11, x11, #32
|
|
; CHECK-NEXT: str x0, [sp, #160]
|
|
; CHECK-NEXT: and x10, x10, #0x18
|
|
; CHECK-NEXT: stp q0, q0, [sp, #128]
|
|
; CHECK-NEXT: sub x10, x11, x10
|
|
; CHECK-NEXT: ldr x10, [x10]
|
|
; CHECK-NEXT: lsl x10, x10, x9
|
|
; CHECK-NEXT: mov w9, w8
|
|
; CHECK-NEXT: b .LBB1_6
|
|
; CHECK-NEXT: .LBB1_9: // %itofp-sw-bb
|
|
; CHECK-NEXT: lsl x0, x0, #1
|
|
; CHECK-NEXT: b .LBB1_5
|
|
%result = uitofp i256 %val to float
|
|
ret float %result
|
|
}
|
|
|
|
define double @s256_to_f64(i256 %val) {
|
|
; CHECK-LABEL: s256_to_f64:
|
|
; CHECK: // %bb.0: // %itofp-entry
|
|
; CHECK-NEXT: orr x8, x1, x3
|
|
; CHECK-NEXT: orr x9, x0, x2
|
|
; CHECK-NEXT: orr x8, x9, x8
|
|
; CHECK-NEXT: cbz x8, .LBB2_7
|
|
; CHECK-NEXT: // %bb.1: // %itofp-if-end
|
|
; CHECK-NEXT: sub sp, sp, #192
|
|
; CHECK-NEXT: .cfi_def_cfa_offset 192
|
|
; CHECK-NEXT: asr x8, x3, #63
|
|
; CHECK-NEXT: eor x9, x0, x8
|
|
; CHECK-NEXT: eor x10, x1, x8
|
|
; CHECK-NEXT: eor x11, x3, x8
|
|
; CHECK-NEXT: subs x12, x9, x8
|
|
; CHECK-NEXT: eor x9, x2, x8
|
|
; CHECK-NEXT: sbcs x10, x10, x8
|
|
; CHECK-NEXT: clz x14, x12
|
|
; CHECK-NEXT: sbcs x13, x9, x8
|
|
; CHECK-NEXT: add w14, w14, #64
|
|
; CHECK-NEXT: sbcs x11, x11, x8
|
|
; CHECK-NEXT: clz x8, x13
|
|
; CHECK-NEXT: add w8, w8, #64
|
|
; CHECK-NEXT: clz x9, x11
|
|
; CHECK-NEXT: csel w8, w9, w8, ne
|
|
; CHECK-NEXT: clz x9, x10
|
|
; CHECK-NEXT: cmp x10, #0
|
|
; CHECK-NEXT: csel w9, w9, w14, ne
|
|
; CHECK-NEXT: orr x14, x13, x11
|
|
; CHECK-NEXT: add w9, w9, #128
|
|
; CHECK-NEXT: cmp x14, #0
|
|
; CHECK-NEXT: csel w14, w8, w9, ne
|
|
; CHECK-NEXT: mov w8, #256 // =0x100
|
|
; CHECK-NEXT: sub w9, w8, w14
|
|
; CHECK-NEXT: mov w8, #255 // =0xff
|
|
; CHECK-NEXT: cmp w9, #54
|
|
; CHECK-NEXT: sub w8, w8, w14
|
|
; CHECK-NEXT: b.lt .LBB2_8
|
|
; CHECK-NEXT: // %bb.2: // %itofp-if-then4
|
|
; CHECK-NEXT: cmp w9, #55
|
|
; CHECK-NEXT: b.eq .LBB2_5
|
|
; CHECK-NEXT: // %bb.3: // %itofp-if-then4
|
|
; CHECK-NEXT: cmp w9, #54
|
|
; CHECK-NEXT: b.eq .LBB2_9
|
|
; CHECK-NEXT: // %bb.4: // %itofp-sw-default
|
|
; CHECK-NEXT: mov w15, #201 // =0xc9
|
|
; CHECK-NEXT: movi v0.2d, #0000000000000000
|
|
; CHECK-NEXT: add x17, sp, #64
|
|
; CHECK-NEXT: sub w15, w15, w14
|
|
; CHECK-NEXT: stp x12, x10, [sp, #64]
|
|
; CHECK-NEXT: mov x1, sp
|
|
; CHECK-NEXT: lsr x16, x15, #3
|
|
; CHECK-NEXT: stp x13, x11, [sp, #80]
|
|
; CHECK-NEXT: and x16, x16, #0x18
|
|
; CHECK-NEXT: stp q0, q0, [sp, #96]
|
|
; CHECK-NEXT: add x16, x17, x16
|
|
; CHECK-NEXT: ldp x18, x17, [x16, #8]
|
|
; CHECK-NEXT: ldr x16, [x16]
|
|
; CHECK-NEXT: stp x12, x10, [sp, #32]
|
|
; CHECK-NEXT: add w12, w14, #55
|
|
; CHECK-NEXT: add x10, x1, #32
|
|
; CHECK-NEXT: lsr x0, x12, #3
|
|
; CHECK-NEXT: stp q0, q0, [sp]
|
|
; CHECK-NEXT: and x2, x12, #0x3f
|
|
; CHECK-NEXT: stp x13, x11, [sp, #48]
|
|
; CHECK-NEXT: and x1, x15, #0x3f
|
|
; CHECK-NEXT: sub w14, w14, #202
|
|
; CHECK-NEXT: and x0, x0, #0x18
|
|
; CHECK-NEXT: eor x1, x1, #0x3f
|
|
; CHECK-NEXT: sub x10, x10, x0
|
|
; CHECK-NEXT: ldp x13, x11, [x10, #16]
|
|
; CHECK-NEXT: ldp x10, x0, [x10]
|
|
; CHECK-NEXT: orr x11, x0, x11
|
|
; CHECK-NEXT: orr x10, x10, x13
|
|
; CHECK-NEXT: lsl x13, x17, #1
|
|
; CHECK-NEXT: lsr x17, x0, #1
|
|
; CHECK-NEXT: orr x11, x10, x11
|
|
; CHECK-NEXT: mvn w0, w12
|
|
; CHECK-NEXT: lsr x10, x10, #1
|
|
; CHECK-NEXT: lsl x11, x11, x12
|
|
; CHECK-NEXT: lsl x13, x13, x14
|
|
; CHECK-NEXT: lsr x12, x17, x0
|
|
; CHECK-NEXT: eor x17, x2, #0x3f
|
|
; CHECK-NEXT: lsl x0, x18, #1
|
|
; CHECK-NEXT: lsr x10, x10, x17
|
|
; CHECK-NEXT: lsr x17, x18, x15
|
|
; CHECK-NEXT: orr x11, x11, x12
|
|
; CHECK-NEXT: lsr x12, x16, x15
|
|
; CHECK-NEXT: lsl x14, x0, x1
|
|
; CHECK-NEXT: orr x10, x11, x10
|
|
; CHECK-NEXT: cmp x10, #0
|
|
; CHECK-NEXT: orr x11, x14, x12
|
|
; CHECK-NEXT: orr x10, x17, x13
|
|
; CHECK-NEXT: cset w12, ne
|
|
; CHECK-NEXT: orr x12, x11, x12
|
|
; CHECK-NEXT: .LBB2_5: // %itofp-sw-epilog
|
|
; CHECK-NEXT: ubfx w11, w12, #2, #1
|
|
; CHECK-NEXT: orr x11, x12, x11
|
|
; CHECK-NEXT: adds x11, x11, #1
|
|
; CHECK-NEXT: adcs x10, x10, xzr
|
|
; CHECK-NEXT: extr x12, x10, x11, #2
|
|
; CHECK-NEXT: extr x10, x10, x11, #3
|
|
; CHECK-NEXT: tst x11, #0x80000000000000
|
|
; CHECK-NEXT: csel w8, w8, w9, eq
|
|
; CHECK-NEXT: lsr x13, x12, #32
|
|
; CHECK-NEXT: lsr x14, x10, #32
|
|
; CHECK-NEXT: csel x10, x12, x10, eq
|
|
; CHECK-NEXT: csel w11, w13, w14, eq
|
|
; CHECK-NEXT: .LBB2_6: // %itofp-if-end26
|
|
; CHECK-NEXT: lsr x9, x3, #32
|
|
; CHECK-NEXT: mov w12, #1072693248 // =0x3ff00000
|
|
; CHECK-NEXT: add w8, w12, w8, lsl #20
|
|
; CHECK-NEXT: and w9, w9, #0x80000000
|
|
; CHECK-NEXT: bfxil w9, w11, #0, #20
|
|
; CHECK-NEXT: orr w8, w9, w8
|
|
; CHECK-NEXT: bfi x10, x8, #32, #32
|
|
; CHECK-NEXT: fmov d0, x10
|
|
; CHECK-NEXT: add sp, sp, #192
|
|
; CHECK-NEXT: ret
|
|
; CHECK-NEXT: .LBB2_7:
|
|
; CHECK-NEXT: movi d0, #0000000000000000
|
|
; CHECK-NEXT: ret
|
|
; CHECK-NEXT: .LBB2_8: // %itofp-if-else
|
|
; CHECK-NEXT: movi v0.2d, #0000000000000000
|
|
; CHECK-NEXT: sub w9, w14, #203
|
|
; CHECK-NEXT: stp x12, x10, [sp, #160]
|
|
; CHECK-NEXT: lsr x10, x9, #3
|
|
; CHECK-NEXT: add x12, sp, #128
|
|
; CHECK-NEXT: stp x13, x11, [sp, #176]
|
|
; CHECK-NEXT: add x12, x12, #32
|
|
; CHECK-NEXT: and x10, x10, #0x18
|
|
; CHECK-NEXT: stp q0, q0, [sp, #128]
|
|
; CHECK-NEXT: sub x10, x12, x10
|
|
; CHECK-NEXT: ldr x10, [x10]
|
|
; CHECK-NEXT: lsl x10, x10, x9
|
|
; CHECK-NEXT: lsr x11, x10, #32
|
|
; CHECK-NEXT: b .LBB2_6
|
|
; CHECK-NEXT: .LBB2_9: // %itofp-sw-bb
|
|
; CHECK-NEXT: extr x10, x10, x12, #63
|
|
; CHECK-NEXT: lsl x12, x12, #1
|
|
; CHECK-NEXT: b .LBB2_5
|
|
%result = sitofp i256 %val to double
|
|
ret double %result
|
|
}
|
|
|
|
define double @u256_to_f64(i256 %val) {
|
|
; CHECK-LABEL: u256_to_f64:
|
|
; CHECK: // %bb.0: // %itofp-entry
|
|
; CHECK-NEXT: orr x8, x1, x3
|
|
; CHECK-NEXT: orr x9, x0, x2
|
|
; CHECK-NEXT: orr x8, x9, x8
|
|
; CHECK-NEXT: cbz x8, .LBB3_7
|
|
; CHECK-NEXT: // %bb.1: // %itofp-if-end
|
|
; CHECK-NEXT: sub sp, sp, #192
|
|
; CHECK-NEXT: .cfi_def_cfa_offset 192
|
|
; CHECK-NEXT: clz x8, x2
|
|
; CHECK-NEXT: clz x9, x3
|
|
; CHECK-NEXT: cmp x3, #0
|
|
; CHECK-NEXT: add w8, w8, #64
|
|
; CHECK-NEXT: clz x10, x0
|
|
; CHECK-NEXT: csel w8, w9, w8, ne
|
|
; CHECK-NEXT: add w9, w10, #64
|
|
; CHECK-NEXT: clz x10, x1
|
|
; CHECK-NEXT: cmp x1, #0
|
|
; CHECK-NEXT: csel w9, w10, w9, ne
|
|
; CHECK-NEXT: orr x10, x2, x3
|
|
; CHECK-NEXT: add w9, w9, #128
|
|
; CHECK-NEXT: cmp x10, #0
|
|
; CHECK-NEXT: csel w10, w8, w9, ne
|
|
; CHECK-NEXT: mov w8, #256 // =0x100
|
|
; CHECK-NEXT: sub w9, w8, w10
|
|
; CHECK-NEXT: mov w8, #255 // =0xff
|
|
; CHECK-NEXT: cmp w9, #54
|
|
; CHECK-NEXT: sub w8, w8, w10
|
|
; CHECK-NEXT: b.lt .LBB3_8
|
|
; CHECK-NEXT: // %bb.2: // %itofp-if-then4
|
|
; CHECK-NEXT: cmp w9, #55
|
|
; CHECK-NEXT: b.eq .LBB3_5
|
|
; CHECK-NEXT: // %bb.3: // %itofp-if-then4
|
|
; CHECK-NEXT: cmp w9, #54
|
|
; CHECK-NEXT: b.eq .LBB3_9
|
|
; CHECK-NEXT: // %bb.4: // %itofp-sw-default
|
|
; CHECK-NEXT: mov w11, #201 // =0xc9
|
|
; CHECK-NEXT: movi v0.2d, #0000000000000000
|
|
; CHECK-NEXT: add w15, w10, #55
|
|
; CHECK-NEXT: sub w11, w11, w10
|
|
; CHECK-NEXT: lsr x16, x15, #3
|
|
; CHECK-NEXT: add x13, sp, #64
|
|
; CHECK-NEXT: lsr x12, x11, #3
|
|
; CHECK-NEXT: mov x17, sp
|
|
; CHECK-NEXT: stp x0, x1, [sp, #64]
|
|
; CHECK-NEXT: stp x2, x3, [sp, #80]
|
|
; CHECK-NEXT: add x17, x17, #32
|
|
; CHECK-NEXT: and x16, x16, #0x18
|
|
; CHECK-NEXT: and x12, x12, #0x18
|
|
; CHECK-NEXT: stp q0, q0, [sp, #96]
|
|
; CHECK-NEXT: sub x16, x17, x16
|
|
; CHECK-NEXT: add x12, x13, x12
|
|
; CHECK-NEXT: sub w10, w10, #202
|
|
; CHECK-NEXT: ldp x14, x13, [x12, #8]
|
|
; CHECK-NEXT: ldr x12, [x12]
|
|
; CHECK-NEXT: stp x0, x1, [sp, #32]
|
|
; CHECK-NEXT: and x1, x11, #0x3f
|
|
; CHECK-NEXT: stp q0, q0, [sp]
|
|
; CHECK-NEXT: eor x1, x1, #0x3f
|
|
; CHECK-NEXT: stp x2, x3, [sp, #48]
|
|
; CHECK-NEXT: and x2, x15, #0x3f
|
|
; CHECK-NEXT: lsl x13, x13, #1
|
|
; CHECK-NEXT: ldp x18, x17, [x16, #16]
|
|
; CHECK-NEXT: ldp x16, x0, [x16]
|
|
; CHECK-NEXT: lsl x10, x13, x10
|
|
; CHECK-NEXT: orr x17, x0, x17
|
|
; CHECK-NEXT: orr x16, x16, x18
|
|
; CHECK-NEXT: lsr x18, x0, #1
|
|
; CHECK-NEXT: orr x17, x16, x17
|
|
; CHECK-NEXT: mvn w0, w15
|
|
; CHECK-NEXT: lsr x16, x16, #1
|
|
; CHECK-NEXT: lsl x15, x17, x15
|
|
; CHECK-NEXT: lsr x17, x18, x0
|
|
; CHECK-NEXT: eor x18, x2, #0x3f
|
|
; CHECK-NEXT: lsl x0, x14, #1
|
|
; CHECK-NEXT: lsr x16, x16, x18
|
|
; CHECK-NEXT: lsr x14, x14, x11
|
|
; CHECK-NEXT: orr x13, x15, x17
|
|
; CHECK-NEXT: lsr x11, x12, x11
|
|
; CHECK-NEXT: lsl x12, x0, x1
|
|
; CHECK-NEXT: orr x13, x13, x16
|
|
; CHECK-NEXT: orr x1, x14, x10
|
|
; CHECK-NEXT: cmp x13, #0
|
|
; CHECK-NEXT: orr x10, x12, x11
|
|
; CHECK-NEXT: cset w11, ne
|
|
; CHECK-NEXT: orr x0, x10, x11
|
|
; CHECK-NEXT: .LBB3_5: // %itofp-sw-epilog
|
|
; CHECK-NEXT: ubfx w10, w0, #2, #1
|
|
; CHECK-NEXT: orr x10, x0, x10
|
|
; CHECK-NEXT: adds x10, x10, #1
|
|
; CHECK-NEXT: adcs x11, x1, xzr
|
|
; CHECK-NEXT: extr x12, x11, x10, #2
|
|
; CHECK-NEXT: extr x13, x11, x10, #34
|
|
; CHECK-NEXT: extr x14, x11, x10, #3
|
|
; CHECK-NEXT: extr x11, x11, x10, #35
|
|
; CHECK-NEXT: tst x10, #0x80000000000000
|
|
; CHECK-NEXT: csel x10, x12, x14, eq
|
|
; CHECK-NEXT: csel w8, w8, w9, eq
|
|
; CHECK-NEXT: csel w11, w13, w11, eq
|
|
; CHECK-NEXT: .LBB3_6: // %itofp-if-end26
|
|
; CHECK-NEXT: bfi w11, w8, #20, #12
|
|
; CHECK-NEXT: mov w8, #1072693248 // =0x3ff00000
|
|
; CHECK-NEXT: add w8, w11, w8
|
|
; CHECK-NEXT: bfi x10, x8, #32, #32
|
|
; CHECK-NEXT: fmov d0, x10
|
|
; CHECK-NEXT: add sp, sp, #192
|
|
; CHECK-NEXT: ret
|
|
; CHECK-NEXT: .LBB3_7:
|
|
; CHECK-NEXT: movi d0, #0000000000000000
|
|
; CHECK-NEXT: ret
|
|
; CHECK-NEXT: .LBB3_8: // %itofp-if-else
|
|
; CHECK-NEXT: movi v0.2d, #0000000000000000
|
|
; CHECK-NEXT: sub w9, w10, #203
|
|
; CHECK-NEXT: add x11, sp, #128
|
|
; CHECK-NEXT: lsr x10, x9, #3
|
|
; CHECK-NEXT: add x11, x11, #32
|
|
; CHECK-NEXT: stp x0, x1, [sp, #160]
|
|
; CHECK-NEXT: stp x2, x3, [sp, #176]
|
|
; CHECK-NEXT: and x10, x10, #0x18
|
|
; CHECK-NEXT: stp q0, q0, [sp, #128]
|
|
; CHECK-NEXT: sub x10, x11, x10
|
|
; CHECK-NEXT: ldr x10, [x10]
|
|
; CHECK-NEXT: lsl x10, x10, x9
|
|
; CHECK-NEXT: lsr x11, x10, #32
|
|
; CHECK-NEXT: b .LBB3_6
|
|
; CHECK-NEXT: .LBB3_9: // %itofp-sw-bb
|
|
; CHECK-NEXT: extr x1, x1, x0, #63
|
|
; CHECK-NEXT: lsl x0, x0, #1
|
|
; CHECK-NEXT: b .LBB3_5
|
|
%result = uitofp i256 %val to double
|
|
ret double %result
|
|
}
|
|
|
|
define i256 @f32_to_s256(float %val) {
|
|
; CHECK-SD-LABEL: f32_to_s256:
|
|
; CHECK-SD: // %bb.0: // %fp-to-i-entry
|
|
; CHECK-SD-NEXT: fmov w8, s0
|
|
; CHECK-SD-NEXT: ubfx w10, w8, #23, #8
|
|
; CHECK-SD-NEXT: cmp w10, #127
|
|
; CHECK-SD-NEXT: b.hs .LBB4_2
|
|
; CHECK-SD-NEXT: // %bb.1:
|
|
; CHECK-SD-NEXT: mov x0, xzr
|
|
; CHECK-SD-NEXT: mov x1, xzr
|
|
; CHECK-SD-NEXT: mov x2, xzr
|
|
; CHECK-SD-NEXT: mov x3, xzr
|
|
; CHECK-SD-NEXT: ret
|
|
; CHECK-SD-NEXT: .LBB4_2: // %fp-to-i-if-check.exp.size
|
|
; CHECK-SD-NEXT: sbfx x9, x8, #31, #1
|
|
; CHECK-SD-NEXT: mov w11, #8388608 // =0x800000
|
|
; CHECK-SD-NEXT: cmp w10, #149
|
|
; CHECK-SD-NEXT: bfxil w11, w8, #0, #23
|
|
; CHECK-SD-NEXT: orr x8, x9, #0x1
|
|
; CHECK-SD-NEXT: b.hi .LBB4_4
|
|
; CHECK-SD-NEXT: // %bb.3: // %fp-to-i-if-exp.small
|
|
; CHECK-SD-NEXT: mov w12, #150 // =0x96
|
|
; CHECK-SD-NEXT: sub w10, w12, w10
|
|
; CHECK-SD-NEXT: lsr w10, w11, w10
|
|
; CHECK-SD-NEXT: umulh x13, x10, x8
|
|
; CHECK-SD-NEXT: umulh x12, x10, x9
|
|
; CHECK-SD-NEXT: umulh x11, x9, x10
|
|
; CHECK-SD-NEXT: smull x14, w10, w9
|
|
; CHECK-SD-NEXT: smull x15, w9, w10
|
|
; CHECK-SD-NEXT: smull x9, w9, w10
|
|
; CHECK-SD-NEXT: adds x1, x14, x13
|
|
; CHECK-SD-NEXT: smull x0, w10, w8
|
|
; CHECK-SD-NEXT: adcs x2, x15, x12
|
|
; CHECK-SD-NEXT: adc x3, x11, x9
|
|
; CHECK-SD-NEXT: ret
|
|
; CHECK-SD-NEXT: .LBB4_4: // %fp-to-i-if-exp.large
|
|
; CHECK-SD-NEXT: sub sp, sp, #64
|
|
; CHECK-SD-NEXT: .cfi_def_cfa_offset 64
|
|
; CHECK-SD-NEXT: movi v0.2d, #0000000000000000
|
|
; CHECK-SD-NEXT: sub w10, w10, #150
|
|
; CHECK-SD-NEXT: str x11, [sp, #32]
|
|
; CHECK-SD-NEXT: lsr x11, x10, #3
|
|
; CHECK-SD-NEXT: mov x12, sp
|
|
; CHECK-SD-NEXT: str xzr, [sp, #56]
|
|
; CHECK-SD-NEXT: add x12, x12, #32
|
|
; CHECK-SD-NEXT: and x16, x10, #0x3f
|
|
; CHECK-SD-NEXT: mvn w2, w10
|
|
; CHECK-SD-NEXT: and x11, x11, #0x18
|
|
; CHECK-SD-NEXT: eor x16, x16, #0x3f
|
|
; CHECK-SD-NEXT: stur q0, [sp, #40]
|
|
; CHECK-SD-NEXT: sub x11, x12, x11
|
|
; CHECK-SD-NEXT: stp q0, q0, [sp]
|
|
; CHECK-SD-NEXT: ldp x12, x15, [x11]
|
|
; CHECK-SD-NEXT: ldp x1, x11, [x11, #16]
|
|
; CHECK-SD-NEXT: lsl x18, x15, x10
|
|
; CHECK-SD-NEXT: lsr x15, x15, #1
|
|
; CHECK-SD-NEXT: lsl x13, x12, x10
|
|
; CHECK-SD-NEXT: lsr x12, x12, #1
|
|
; CHECK-SD-NEXT: lsl x4, x1, x10
|
|
; CHECK-SD-NEXT: lsr x1, x1, #1
|
|
; CHECK-SD-NEXT: lsr x15, x15, x2
|
|
; CHECK-SD-NEXT: lsl x10, x11, x10
|
|
; CHECK-SD-NEXT: umulh x14, x13, x8
|
|
; CHECK-SD-NEXT: lsr x12, x12, x16
|
|
; CHECK-SD-NEXT: lsr x11, x1, x16
|
|
; CHECK-SD-NEXT: orr x15, x4, x15
|
|
; CHECK-SD-NEXT: mul x0, x13, x9
|
|
; CHECK-SD-NEXT: orr x12, x18, x12
|
|
; CHECK-SD-NEXT: orr x10, x10, x11
|
|
; CHECK-SD-NEXT: umulh x4, x8, x15
|
|
; CHECK-SD-NEXT: mul x3, x12, x8
|
|
; CHECK-SD-NEXT: umulh x11, x9, x13
|
|
; CHECK-SD-NEXT: umulh x18, x12, x8
|
|
; CHECK-SD-NEXT: adds x14, x3, x14
|
|
; CHECK-SD-NEXT: umulh x17, x13, x9
|
|
; CHECK-SD-NEXT: madd x10, x8, x10, x4
|
|
; CHECK-SD-NEXT: cinc x18, x18, hs
|
|
; CHECK-SD-NEXT: adds x1, x0, x14
|
|
; CHECK-SD-NEXT: madd x11, x9, x12, x11
|
|
; CHECK-SD-NEXT: mul x16, x12, x9
|
|
; CHECK-SD-NEXT: umulh x2, x12, x9
|
|
; CHECK-SD-NEXT: madd x10, x9, x15, x10
|
|
; CHECK-SD-NEXT: mul x12, x8, x15
|
|
; CHECK-SD-NEXT: mul x15, x9, x13
|
|
; CHECK-SD-NEXT: madd x9, x9, x13, x11
|
|
; CHECK-SD-NEXT: cinc x11, x17, hs
|
|
; CHECK-SD-NEXT: adds x11, x18, x11
|
|
; CHECK-SD-NEXT: mul x0, x13, x8
|
|
; CHECK-SD-NEXT: cset w8, hs
|
|
; CHECK-SD-NEXT: adds x11, x16, x11
|
|
; CHECK-SD-NEXT: adc x8, x2, x8
|
|
; CHECK-SD-NEXT: adds x12, x15, x12
|
|
; CHECK-SD-NEXT: adc x9, x9, x10
|
|
; CHECK-SD-NEXT: adds x2, x11, x12
|
|
; CHECK-SD-NEXT: adc x3, x8, x9
|
|
; CHECK-SD-NEXT: add sp, sp, #64
|
|
; CHECK-SD-NEXT: ret
|
|
;
|
|
; CHECK-GI-LABEL: f32_to_s256:
|
|
; CHECK-GI: // %bb.0: // %fp-to-i-entry
|
|
; CHECK-GI-NEXT: fmov w8, s0
|
|
; CHECK-GI-NEXT: mov x0, xzr
|
|
; CHECK-GI-NEXT: mov x1, xzr
|
|
; CHECK-GI-NEXT: mov x2, xzr
|
|
; CHECK-GI-NEXT: mov x3, xzr
|
|
; CHECK-GI-NEXT: ubfx w11, w8, #23, #8
|
|
; CHECK-GI-NEXT: cmp w8, #0
|
|
; CHECK-GI-NEXT: cset w9, mi
|
|
; CHECK-GI-NEXT: cmp w11, #127
|
|
; CHECK-GI-NEXT: b.lo .LBB4_4
|
|
; CHECK-GI-NEXT: // %bb.1: // %fp-to-i-if-check.exp.size
|
|
; CHECK-GI-NEXT: sbfx x10, x9, #0, #1
|
|
; CHECK-GI-NEXT: and w12, w8, #0x7fffff
|
|
; CHECK-GI-NEXT: cmp w11, #150
|
|
; CHECK-GI-NEXT: asr x9, x10, #63
|
|
; CHECK-GI-NEXT: orr x8, x10, #0x1
|
|
; CHECK-GI-NEXT: orr w10, w12, #0x800000
|
|
; CHECK-GI-NEXT: b.hs .LBB4_3
|
|
; CHECK-GI-NEXT: // %bb.2: // %fp-to-i-if-exp.small
|
|
; CHECK-GI-NEXT: mov w12, #150 // =0x96
|
|
; CHECK-GI-NEXT: umulh x15, x9, xzr
|
|
; CHECK-GI-NEXT: and x17, xzr, #0x1
|
|
; CHECK-GI-NEXT: sub w11, w12, w11
|
|
; CHECK-GI-NEXT: and x18, xzr, #0x1
|
|
; CHECK-GI-NEXT: lsr w10, w10, w11
|
|
; CHECK-GI-NEXT: umulh x12, x8, xzr
|
|
; CHECK-GI-NEXT: umulh x11, x10, x8
|
|
; CHECK-GI-NEXT: umulh x13, x10, x9
|
|
; CHECK-GI-NEXT: smull x14, w10, w9
|
|
; CHECK-GI-NEXT: smull x16, w10, w9
|
|
; CHECK-GI-NEXT: smull x0, w10, w8
|
|
; CHECK-GI-NEXT: adds x1, x11, x14
|
|
; CHECK-GI-NEXT: add x11, x17, x18
|
|
; CHECK-GI-NEXT: add x14, x12, x13
|
|
; CHECK-GI-NEXT: cset w17, hs
|
|
; CHECK-GI-NEXT: adds x14, x14, x16
|
|
; CHECK-GI-NEXT: and x16, xzr, #0x1
|
|
; CHECK-GI-NEXT: and x17, x17, #0x1
|
|
; CHECK-GI-NEXT: add x12, x12, x15
|
|
; CHECK-GI-NEXT: cset w15, hs
|
|
; CHECK-GI-NEXT: add x16, x17, x16
|
|
; CHECK-GI-NEXT: and x17, xzr, #0x1
|
|
; CHECK-GI-NEXT: add x12, x12, x13
|
|
; CHECK-GI-NEXT: smaddl x9, w10, w9, x12
|
|
; CHECK-GI-NEXT: and x12, x15, #0x1
|
|
; CHECK-GI-NEXT: add x11, x11, x17
|
|
; CHECK-GI-NEXT: adds x2, x14, x16
|
|
; CHECK-GI-NEXT: add x8, x11, x12
|
|
; CHECK-GI-NEXT: cset w10, hs
|
|
; CHECK-GI-NEXT: and x10, x10, #0x1
|
|
; CHECK-GI-NEXT: add x8, x9, x8
|
|
; CHECK-GI-NEXT: add x3, x8, x10
|
|
; CHECK-GI-NEXT: ret
|
|
; CHECK-GI-NEXT: .LBB4_3: // %fp-to-i-if-exp.large
|
|
; CHECK-GI-NEXT: sub w11, w11, #150
|
|
; CHECK-GI-NEXT: mov w13, #64 // =0x40
|
|
; CHECK-GI-NEXT: mov w12, #128 // =0x80
|
|
; CHECK-GI-NEXT: sub x14, x11, #64
|
|
; CHECK-GI-NEXT: sub x15, x13, x11
|
|
; CHECK-GI-NEXT: lsl x16, x10, x11
|
|
; CHECK-GI-NEXT: lsr x15, x10, x15
|
|
; CHECK-GI-NEXT: lsl x14, x10, x14
|
|
; CHECK-GI-NEXT: sub x12, x12, x11
|
|
; CHECK-GI-NEXT: cmp x11, #64
|
|
; CHECK-GI-NEXT: sub x17, x11, #128
|
|
; CHECK-GI-NEXT: lsr x18, x10, x12
|
|
; CHECK-GI-NEXT: csel x16, x16, xzr, lo
|
|
; CHECK-GI-NEXT: csel x14, x15, x14, lo
|
|
; CHECK-GI-NEXT: cmp x11, #0
|
|
; CHECK-GI-NEXT: sub x15, x17, #64
|
|
; CHECK-GI-NEXT: csel x14, xzr, x14, eq
|
|
; CHECK-GI-NEXT: cmp x12, #64
|
|
; CHECK-GI-NEXT: sub x13, x13, x17
|
|
; CHECK-GI-NEXT: csel x18, x18, xzr, lo
|
|
; CHECK-GI-NEXT: cmp x12, #0
|
|
; CHECK-GI-NEXT: lsl x12, x10, x17
|
|
; CHECK-GI-NEXT: lsr x13, x10, x13
|
|
; CHECK-GI-NEXT: lsl x15, x10, x15
|
|
; CHECK-GI-NEXT: csel x18, x10, x18, eq
|
|
; CHECK-GI-NEXT: cmp x17, #64
|
|
; CHECK-GI-NEXT: csel x12, x12, xzr, lo
|
|
; CHECK-GI-NEXT: csel x10, x13, x15, lo
|
|
; CHECK-GI-NEXT: cmp x17, #0
|
|
; CHECK-GI-NEXT: csel x13, xzr, x10, eq
|
|
; CHECK-GI-NEXT: cmp x11, #128
|
|
; CHECK-GI-NEXT: csel x10, x16, xzr, lo
|
|
; CHECK-GI-NEXT: csel x14, x14, xzr, lo
|
|
; CHECK-GI-NEXT: csel x12, x18, x12, lo
|
|
; CHECK-GI-NEXT: csel x13, xzr, x13, lo
|
|
; CHECK-GI-NEXT: cmp x11, #0
|
|
; CHECK-GI-NEXT: umulh x11, x10, x9
|
|
; CHECK-GI-NEXT: csel x12, xzr, x12, eq
|
|
; CHECK-GI-NEXT: csel x13, xzr, x13, eq
|
|
; CHECK-GI-NEXT: umulh x18, x14, x9
|
|
; CHECK-GI-NEXT: umulh x17, x12, x8
|
|
; CHECK-GI-NEXT: umulh x15, x10, x8
|
|
; CHECK-GI-NEXT: add x18, x18, x11
|
|
; CHECK-GI-NEXT: mul x16, x10, x9
|
|
; CHECK-GI-NEXT: add x17, x17, x18
|
|
; CHECK-GI-NEXT: mul x0, x14, x8
|
|
; CHECK-GI-NEXT: madd x17, x10, x9, x17
|
|
; CHECK-GI-NEXT: adds x15, x15, x16
|
|
; CHECK-GI-NEXT: umulh x2, x14, x8
|
|
; CHECK-GI-NEXT: cset w3, hs
|
|
; CHECK-GI-NEXT: adds x1, x15, x0
|
|
; CHECK-GI-NEXT: mul x18, x14, x9
|
|
; CHECK-GI-NEXT: cset w15, hs
|
|
; CHECK-GI-NEXT: madd x14, x14, x9, x17
|
|
; CHECK-GI-NEXT: adds x11, x2, x11
|
|
; CHECK-GI-NEXT: mul x17, x12, x8
|
|
; CHECK-GI-NEXT: cset w0, hs
|
|
; CHECK-GI-NEXT: adds x11, x11, x16
|
|
; CHECK-GI-NEXT: and x16, x0, #0x1
|
|
; CHECK-GI-NEXT: madd x9, x12, x9, x14
|
|
; CHECK-GI-NEXT: and x12, x3, #0x1
|
|
; CHECK-GI-NEXT: and x14, x15, #0x1
|
|
; CHECK-GI-NEXT: cset w15, hs
|
|
; CHECK-GI-NEXT: adds x11, x11, x18
|
|
; CHECK-GI-NEXT: and x15, x15, #0x1
|
|
; CHECK-GI-NEXT: mul x0, x10, x8
|
|
; CHECK-GI-NEXT: add x10, x12, x14
|
|
; CHECK-GI-NEXT: cset w14, hs
|
|
; CHECK-GI-NEXT: adds x11, x11, x17
|
|
; CHECK-GI-NEXT: add x12, x16, x15
|
|
; CHECK-GI-NEXT: madd x8, x13, x8, x9
|
|
; CHECK-GI-NEXT: and x9, x14, #0x1
|
|
; CHECK-GI-NEXT: cset w13, hs
|
|
; CHECK-GI-NEXT: adds x2, x11, x10
|
|
; CHECK-GI-NEXT: add x9, x12, x9
|
|
; CHECK-GI-NEXT: and x10, x13, #0x1
|
|
; CHECK-GI-NEXT: cset w11, hs
|
|
; CHECK-GI-NEXT: add x9, x9, x10
|
|
; CHECK-GI-NEXT: and x10, x11, #0x1
|
|
; CHECK-GI-NEXT: add x9, x9, x10
|
|
; CHECK-GI-NEXT: add x3, x8, x9
|
|
; CHECK-GI-NEXT: .LBB4_4: // %fp-to-i-cleanup
|
|
; CHECK-GI-NEXT: ret
|
|
%result = fptosi float %val to i256
|
|
ret i256 %result
|
|
}
|
|
|
|
define i256 @f32_to_u256(float %val) {
|
|
; CHECK-SD-LABEL: f32_to_u256:
|
|
; CHECK-SD: // %bb.0: // %fp-to-i-entry
|
|
; CHECK-SD-NEXT: fmov w10, s0
|
|
; CHECK-SD-NEXT: ubfx w9, w10, #23, #8
|
|
; CHECK-SD-NEXT: cmp w9, #127
|
|
; CHECK-SD-NEXT: b.hs .LBB5_2
|
|
; CHECK-SD-NEXT: // %bb.1:
|
|
; CHECK-SD-NEXT: mov x0, xzr
|
|
; CHECK-SD-NEXT: mov x1, xzr
|
|
; CHECK-SD-NEXT: mov x2, xzr
|
|
; CHECK-SD-NEXT: mov x3, xzr
|
|
; CHECK-SD-NEXT: ret
|
|
; CHECK-SD-NEXT: .LBB5_2: // %fp-to-i-if-check.exp.size
|
|
; CHECK-SD-NEXT: mov w8, #8388608 // =0x800000
|
|
; CHECK-SD-NEXT: cmp w9, #149
|
|
; CHECK-SD-NEXT: bfxil w8, w10, #0, #23
|
|
; CHECK-SD-NEXT: b.hi .LBB5_4
|
|
; CHECK-SD-NEXT: // %bb.3: // %fp-to-i-if-exp.small
|
|
; CHECK-SD-NEXT: mov w10, #150 // =0x96
|
|
; CHECK-SD-NEXT: mov x1, xzr
|
|
; CHECK-SD-NEXT: mov x2, xzr
|
|
; CHECK-SD-NEXT: sub w9, w10, w9
|
|
; CHECK-SD-NEXT: mov x3, xzr
|
|
; CHECK-SD-NEXT: lsr w0, w8, w9
|
|
; CHECK-SD-NEXT: ret
|
|
; CHECK-SD-NEXT: .LBB5_4: // %fp-to-i-if-exp.large
|
|
; CHECK-SD-NEXT: sub sp, sp, #64
|
|
; CHECK-SD-NEXT: .cfi_def_cfa_offset 64
|
|
; CHECK-SD-NEXT: movi v0.2d, #0000000000000000
|
|
; CHECK-SD-NEXT: sub w9, w9, #150
|
|
; CHECK-SD-NEXT: str x8, [sp, #32]
|
|
; CHECK-SD-NEXT: lsr x8, x9, #3
|
|
; CHECK-SD-NEXT: mov x10, sp
|
|
; CHECK-SD-NEXT: str xzr, [sp, #56]
|
|
; CHECK-SD-NEXT: add x10, x10, #32
|
|
; CHECK-SD-NEXT: and x13, x9, #0x3f
|
|
; CHECK-SD-NEXT: mvn w17, w9
|
|
; CHECK-SD-NEXT: and x8, x8, #0x18
|
|
; CHECK-SD-NEXT: eor x13, x13, #0x3f
|
|
; CHECK-SD-NEXT: stur q0, [sp, #40]
|
|
; CHECK-SD-NEXT: sub x8, x10, x8
|
|
; CHECK-SD-NEXT: stp q0, q0, [sp]
|
|
; CHECK-SD-NEXT: ldp x11, x10, [x8, #8]
|
|
; CHECK-SD-NEXT: ldr x12, [x8]
|
|
; CHECK-SD-NEXT: ldr x8, [x8, #24]
|
|
; CHECK-SD-NEXT: lsr x16, x12, #1
|
|
; CHECK-SD-NEXT: lsl x0, x12, x9
|
|
; CHECK-SD-NEXT: lsr x14, x10, #1
|
|
; CHECK-SD-NEXT: lsr x15, x11, #1
|
|
; CHECK-SD-NEXT: lsl x8, x8, x9
|
|
; CHECK-SD-NEXT: lsl x10, x10, x9
|
|
; CHECK-SD-NEXT: lsl x11, x11, x9
|
|
; CHECK-SD-NEXT: lsr x15, x15, x17
|
|
; CHECK-SD-NEXT: lsr x14, x14, x13
|
|
; CHECK-SD-NEXT: lsr x13, x16, x13
|
|
; CHECK-SD-NEXT: orr x3, x8, x14
|
|
; CHECK-SD-NEXT: orr x2, x10, x15
|
|
; CHECK-SD-NEXT: orr x1, x11, x13
|
|
; CHECK-SD-NEXT: add sp, sp, #64
|
|
; CHECK-SD-NEXT: ret
|
|
;
|
|
; CHECK-GI-LABEL: f32_to_u256:
|
|
; CHECK-GI: // %bb.0: // %fp-to-i-entry
|
|
; CHECK-GI-NEXT: fmov w8, s0
|
|
; CHECK-GI-NEXT: mov x0, xzr
|
|
; CHECK-GI-NEXT: mov x1, xzr
|
|
; CHECK-GI-NEXT: mov x2, xzr
|
|
; CHECK-GI-NEXT: mov x3, xzr
|
|
; CHECK-GI-NEXT: ubfx w9, w8, #23, #8
|
|
; CHECK-GI-NEXT: cmp w9, #127
|
|
; CHECK-GI-NEXT: b.lo .LBB5_4
|
|
; CHECK-GI-NEXT: // %bb.1: // %fp-to-i-if-check.exp.size
|
|
; CHECK-GI-NEXT: and w8, w8, #0x7fffff
|
|
; CHECK-GI-NEXT: cmp w9, #150
|
|
; CHECK-GI-NEXT: orr w8, w8, #0x800000
|
|
; CHECK-GI-NEXT: b.hs .LBB5_3
|
|
; CHECK-GI-NEXT: // %bb.2: // %fp-to-i-if-exp.small
|
|
; CHECK-GI-NEXT: mov w10, #150 // =0x96
|
|
; CHECK-GI-NEXT: mov x1, xzr
|
|
; CHECK-GI-NEXT: mov x2, xzr
|
|
; CHECK-GI-NEXT: sub w9, w10, w9
|
|
; CHECK-GI-NEXT: mov x3, xzr
|
|
; CHECK-GI-NEXT: lsr w0, w8, w9
|
|
; CHECK-GI-NEXT: ret
|
|
; CHECK-GI-NEXT: .LBB5_3: // %fp-to-i-if-exp.large
|
|
; CHECK-GI-NEXT: sub w9, w9, #150
|
|
; CHECK-GI-NEXT: mov w11, #64 // =0x40
|
|
; CHECK-GI-NEXT: mov w10, #128 // =0x80
|
|
; CHECK-GI-NEXT: sub x12, x9, #64
|
|
; CHECK-GI-NEXT: sub x13, x11, x9
|
|
; CHECK-GI-NEXT: lsl x14, x8, x9
|
|
; CHECK-GI-NEXT: lsr x13, x8, x13
|
|
; CHECK-GI-NEXT: lsl x12, x8, x12
|
|
; CHECK-GI-NEXT: sub x10, x10, x9
|
|
; CHECK-GI-NEXT: cmp x9, #64
|
|
; CHECK-GI-NEXT: sub x15, x9, #128
|
|
; CHECK-GI-NEXT: lsr x16, x8, x10
|
|
; CHECK-GI-NEXT: csel x14, x14, xzr, lo
|
|
; CHECK-GI-NEXT: csel x12, x13, x12, lo
|
|
; CHECK-GI-NEXT: cmp x9, #0
|
|
; CHECK-GI-NEXT: sub x13, x15, #64
|
|
; CHECK-GI-NEXT: csel x12, xzr, x12, eq
|
|
; CHECK-GI-NEXT: cmp x10, #64
|
|
; CHECK-GI-NEXT: sub x11, x11, x15
|
|
; CHECK-GI-NEXT: csel x16, x16, xzr, lo
|
|
; CHECK-GI-NEXT: cmp x10, #0
|
|
; CHECK-GI-NEXT: lsl x10, x8, x15
|
|
; CHECK-GI-NEXT: lsr x11, x8, x11
|
|
; CHECK-GI-NEXT: lsl x13, x8, x13
|
|
; CHECK-GI-NEXT: csel x8, x8, x16, eq
|
|
; CHECK-GI-NEXT: cmp x15, #64
|
|
; CHECK-GI-NEXT: csel x10, x10, xzr, lo
|
|
; CHECK-GI-NEXT: csel x11, x11, x13, lo
|
|
; CHECK-GI-NEXT: cmp x15, #0
|
|
; CHECK-GI-NEXT: csel x11, xzr, x11, eq
|
|
; CHECK-GI-NEXT: cmp x9, #128
|
|
; CHECK-GI-NEXT: csel x0, x14, xzr, lo
|
|
; CHECK-GI-NEXT: csel x1, x12, xzr, lo
|
|
; CHECK-GI-NEXT: csel x8, x8, x10, lo
|
|
; CHECK-GI-NEXT: csel x10, xzr, x11, lo
|
|
; CHECK-GI-NEXT: cmp x9, #0
|
|
; CHECK-GI-NEXT: csel x2, xzr, x8, eq
|
|
; CHECK-GI-NEXT: csel x3, xzr, x10, eq
|
|
; CHECK-GI-NEXT: .LBB5_4: // %fp-to-i-cleanup
|
|
; CHECK-GI-NEXT: ret
|
|
%result = fptoui float %val to i256
|
|
ret i256 %result
|
|
}
|
|
|
|
define i256 @f64_to_s256(double %val) {
|
|
; CHECK-SD-LABEL: f64_to_s256:
|
|
; CHECK-SD: // %bb.0: // %fp-to-i-entry
|
|
; CHECK-SD-NEXT: fmov x8, d0
|
|
; CHECK-SD-NEXT: ubfx x10, x8, #52, #11
|
|
; CHECK-SD-NEXT: cmp x10, #1023
|
|
; CHECK-SD-NEXT: b.hs .LBB6_2
|
|
; CHECK-SD-NEXT: // %bb.1:
|
|
; CHECK-SD-NEXT: mov x0, xzr
|
|
; CHECK-SD-NEXT: mov x1, xzr
|
|
; CHECK-SD-NEXT: mov x2, xzr
|
|
; CHECK-SD-NEXT: mov x3, xzr
|
|
; CHECK-SD-NEXT: ret
|
|
; CHECK-SD-NEXT: .LBB6_2: // %fp-to-i-if-check.exp.size
|
|
; CHECK-SD-NEXT: asr x9, x8, #63
|
|
; CHECK-SD-NEXT: mov x11, #4503599627370496 // =0x10000000000000
|
|
; CHECK-SD-NEXT: cmp x10, #1074
|
|
; CHECK-SD-NEXT: bfxil x11, x8, #0, #52
|
|
; CHECK-SD-NEXT: orr x8, x9, #0x1
|
|
; CHECK-SD-NEXT: b.hi .LBB6_4
|
|
; CHECK-SD-NEXT: // %bb.3: // %fp-to-i-if-exp.small
|
|
; CHECK-SD-NEXT: mov w12, #1075 // =0x433
|
|
; CHECK-SD-NEXT: sub x10, x12, x10
|
|
; CHECK-SD-NEXT: lsr x10, x11, x10
|
|
; CHECK-SD-NEXT: umulh x13, x10, x8
|
|
; CHECK-SD-NEXT: mul x14, x10, x9
|
|
; CHECK-SD-NEXT: mul x11, x9, x10
|
|
; CHECK-SD-NEXT: umulh x12, x9, x10
|
|
; CHECK-SD-NEXT: adds x1, x14, x13
|
|
; CHECK-SD-NEXT: umulh x9, x10, x9
|
|
; CHECK-SD-NEXT: mul x0, x10, x8
|
|
; CHECK-SD-NEXT: adcs x2, x11, x9
|
|
; CHECK-SD-NEXT: adc x3, x12, x11
|
|
; CHECK-SD-NEXT: ret
|
|
; CHECK-SD-NEXT: .LBB6_4: // %fp-to-i-if-exp.large
|
|
; CHECK-SD-NEXT: sub sp, sp, #64
|
|
; CHECK-SD-NEXT: .cfi_def_cfa_offset 64
|
|
; CHECK-SD-NEXT: movi v0.2d, #0000000000000000
|
|
; CHECK-SD-NEXT: sub x10, x10, #1075
|
|
; CHECK-SD-NEXT: str x11, [sp, #32]
|
|
; CHECK-SD-NEXT: lsr x11, x10, #3
|
|
; CHECK-SD-NEXT: mov x12, sp
|
|
; CHECK-SD-NEXT: str xzr, [sp, #56]
|
|
; CHECK-SD-NEXT: add x12, x12, #32
|
|
; CHECK-SD-NEXT: and x16, x10, #0x3f
|
|
; CHECK-SD-NEXT: mvn w2, w10
|
|
; CHECK-SD-NEXT: and x11, x11, #0x18
|
|
; CHECK-SD-NEXT: eor x16, x16, #0x3f
|
|
; CHECK-SD-NEXT: stur q0, [sp, #40]
|
|
; CHECK-SD-NEXT: sub x11, x12, x11
|
|
; CHECK-SD-NEXT: stp q0, q0, [sp]
|
|
; CHECK-SD-NEXT: ldp x12, x15, [x11]
|
|
; CHECK-SD-NEXT: ldp x1, x11, [x11, #16]
|
|
; CHECK-SD-NEXT: lsl x18, x15, x10
|
|
; CHECK-SD-NEXT: lsr x15, x15, #1
|
|
; CHECK-SD-NEXT: lsl x13, x12, x10
|
|
; CHECK-SD-NEXT: lsr x12, x12, #1
|
|
; CHECK-SD-NEXT: lsl x4, x1, x10
|
|
; CHECK-SD-NEXT: lsr x1, x1, #1
|
|
; CHECK-SD-NEXT: lsr x15, x15, x2
|
|
; CHECK-SD-NEXT: lsl x10, x11, x10
|
|
; CHECK-SD-NEXT: umulh x14, x13, x8
|
|
; CHECK-SD-NEXT: lsr x12, x12, x16
|
|
; CHECK-SD-NEXT: lsr x11, x1, x16
|
|
; CHECK-SD-NEXT: orr x15, x4, x15
|
|
; CHECK-SD-NEXT: mul x0, x13, x9
|
|
; CHECK-SD-NEXT: orr x12, x18, x12
|
|
; CHECK-SD-NEXT: orr x10, x10, x11
|
|
; CHECK-SD-NEXT: umulh x4, x8, x15
|
|
; CHECK-SD-NEXT: mul x3, x12, x8
|
|
; CHECK-SD-NEXT: umulh x11, x9, x13
|
|
; CHECK-SD-NEXT: umulh x18, x12, x8
|
|
; CHECK-SD-NEXT: adds x14, x3, x14
|
|
; CHECK-SD-NEXT: umulh x17, x13, x9
|
|
; CHECK-SD-NEXT: madd x10, x8, x10, x4
|
|
; CHECK-SD-NEXT: cinc x18, x18, hs
|
|
; CHECK-SD-NEXT: adds x1, x0, x14
|
|
; CHECK-SD-NEXT: madd x11, x9, x12, x11
|
|
; CHECK-SD-NEXT: mul x16, x12, x9
|
|
; CHECK-SD-NEXT: umulh x2, x12, x9
|
|
; CHECK-SD-NEXT: madd x10, x9, x15, x10
|
|
; CHECK-SD-NEXT: mul x12, x8, x15
|
|
; CHECK-SD-NEXT: mul x15, x9, x13
|
|
; CHECK-SD-NEXT: madd x9, x9, x13, x11
|
|
; CHECK-SD-NEXT: cinc x11, x17, hs
|
|
; CHECK-SD-NEXT: adds x11, x18, x11
|
|
; CHECK-SD-NEXT: mul x0, x13, x8
|
|
; CHECK-SD-NEXT: cset w8, hs
|
|
; CHECK-SD-NEXT: adds x11, x16, x11
|
|
; CHECK-SD-NEXT: adc x8, x2, x8
|
|
; CHECK-SD-NEXT: adds x12, x15, x12
|
|
; CHECK-SD-NEXT: adc x9, x9, x10
|
|
; CHECK-SD-NEXT: adds x2, x11, x12
|
|
; CHECK-SD-NEXT: adc x3, x8, x9
|
|
; CHECK-SD-NEXT: add sp, sp, #64
|
|
; CHECK-SD-NEXT: ret
|
|
;
|
|
; CHECK-GI-LABEL: f64_to_s256:
|
|
; CHECK-GI: // %bb.0: // %fp-to-i-entry
|
|
; CHECK-GI-NEXT: fmov x8, d0
|
|
; CHECK-GI-NEXT: mov x0, xzr
|
|
; CHECK-GI-NEXT: mov x1, xzr
|
|
; CHECK-GI-NEXT: mov x2, xzr
|
|
; CHECK-GI-NEXT: mov x3, xzr
|
|
; CHECK-GI-NEXT: ubfx x11, x8, #52, #11
|
|
; CHECK-GI-NEXT: cmp x8, #0
|
|
; CHECK-GI-NEXT: cset w9, mi
|
|
; CHECK-GI-NEXT: cmp x11, #1023
|
|
; CHECK-GI-NEXT: b.lo .LBB6_4
|
|
; CHECK-GI-NEXT: // %bb.1: // %fp-to-i-if-check.exp.size
|
|
; CHECK-GI-NEXT: sbfx x10, x9, #0, #1
|
|
; CHECK-GI-NEXT: and x12, x8, #0xfffffffffffff
|
|
; CHECK-GI-NEXT: cmp x11, #1075
|
|
; CHECK-GI-NEXT: asr x9, x10, #63
|
|
; CHECK-GI-NEXT: orr x8, x10, #0x1
|
|
; CHECK-GI-NEXT: orr x10, x12, #0x10000000000000
|
|
; CHECK-GI-NEXT: b.hs .LBB6_3
|
|
; CHECK-GI-NEXT: // %bb.2: // %fp-to-i-if-exp.small
|
|
; CHECK-GI-NEXT: mov w12, #1075 // =0x433
|
|
; CHECK-GI-NEXT: umulh x13, x8, xzr
|
|
; CHECK-GI-NEXT: and x16, xzr, #0x1
|
|
; CHECK-GI-NEXT: sub x11, x12, x11
|
|
; CHECK-GI-NEXT: and x17, xzr, #0x1
|
|
; CHECK-GI-NEXT: lsr x10, x10, x11
|
|
; CHECK-GI-NEXT: umulh x14, x9, xzr
|
|
; CHECK-GI-NEXT: umulh x11, x10, x8
|
|
; CHECK-GI-NEXT: mul x12, x10, x9
|
|
; CHECK-GI-NEXT: add x14, x13, x14
|
|
; CHECK-GI-NEXT: umulh x15, x10, x9
|
|
; CHECK-GI-NEXT: mul x0, x10, x8
|
|
; CHECK-GI-NEXT: adds x1, x11, x12
|
|
; CHECK-GI-NEXT: add x11, x13, x15
|
|
; CHECK-GI-NEXT: add x13, x14, x15
|
|
; CHECK-GI-NEXT: cset w14, hs
|
|
; CHECK-GI-NEXT: madd x9, x10, x9, x13
|
|
; CHECK-GI-NEXT: adds x11, x11, x12
|
|
; CHECK-GI-NEXT: and x12, x14, #0x1
|
|
; CHECK-GI-NEXT: and x13, xzr, #0x1
|
|
; CHECK-GI-NEXT: cset w14, hs
|
|
; CHECK-GI-NEXT: add x12, x12, x16
|
|
; CHECK-GI-NEXT: add x13, x17, x13
|
|
; CHECK-GI-NEXT: and x15, xzr, #0x1
|
|
; CHECK-GI-NEXT: and x8, x14, #0x1
|
|
; CHECK-GI-NEXT: add x10, x13, x15
|
|
; CHECK-GI-NEXT: adds x2, x11, x12
|
|
; CHECK-GI-NEXT: add x8, x10, x8
|
|
; CHECK-GI-NEXT: cset w10, hs
|
|
; CHECK-GI-NEXT: and x10, x10, #0x1
|
|
; CHECK-GI-NEXT: add x8, x9, x8
|
|
; CHECK-GI-NEXT: add x3, x8, x10
|
|
; CHECK-GI-NEXT: ret
|
|
; CHECK-GI-NEXT: .LBB6_3: // %fp-to-i-if-exp.large
|
|
; CHECK-GI-NEXT: sub x11, x11, #1075
|
|
; CHECK-GI-NEXT: mov w13, #64 // =0x40
|
|
; CHECK-GI-NEXT: mov w12, #128 // =0x80
|
|
; CHECK-GI-NEXT: sub x14, x11, #64
|
|
; CHECK-GI-NEXT: sub x15, x13, x11
|
|
; CHECK-GI-NEXT: lsl x16, x10, x11
|
|
; CHECK-GI-NEXT: lsr x15, x10, x15
|
|
; CHECK-GI-NEXT: lsl x14, x10, x14
|
|
; CHECK-GI-NEXT: sub x12, x12, x11
|
|
; CHECK-GI-NEXT: cmp x11, #64
|
|
; CHECK-GI-NEXT: sub x17, x11, #128
|
|
; CHECK-GI-NEXT: lsr x18, x10, x12
|
|
; CHECK-GI-NEXT: csel x16, x16, xzr, lo
|
|
; CHECK-GI-NEXT: csel x14, x15, x14, lo
|
|
; CHECK-GI-NEXT: cmp x11, #0
|
|
; CHECK-GI-NEXT: sub x15, x17, #64
|
|
; CHECK-GI-NEXT: csel x14, xzr, x14, eq
|
|
; CHECK-GI-NEXT: cmp x12, #64
|
|
; CHECK-GI-NEXT: sub x13, x13, x17
|
|
; CHECK-GI-NEXT: csel x18, x18, xzr, lo
|
|
; CHECK-GI-NEXT: cmp x12, #0
|
|
; CHECK-GI-NEXT: lsl x12, x10, x17
|
|
; CHECK-GI-NEXT: lsr x13, x10, x13
|
|
; CHECK-GI-NEXT: lsl x15, x10, x15
|
|
; CHECK-GI-NEXT: csel x18, x10, x18, eq
|
|
; CHECK-GI-NEXT: cmp x17, #64
|
|
; CHECK-GI-NEXT: csel x12, x12, xzr, lo
|
|
; CHECK-GI-NEXT: csel x10, x13, x15, lo
|
|
; CHECK-GI-NEXT: cmp x17, #0
|
|
; CHECK-GI-NEXT: csel x13, xzr, x10, eq
|
|
; CHECK-GI-NEXT: cmp x11, #128
|
|
; CHECK-GI-NEXT: csel x10, x16, xzr, lo
|
|
; CHECK-GI-NEXT: csel x14, x14, xzr, lo
|
|
; CHECK-GI-NEXT: csel x12, x18, x12, lo
|
|
; CHECK-GI-NEXT: csel x13, xzr, x13, lo
|
|
; CHECK-GI-NEXT: cmp x11, #0
|
|
; CHECK-GI-NEXT: umulh x11, x10, x9
|
|
; CHECK-GI-NEXT: csel x12, xzr, x12, eq
|
|
; CHECK-GI-NEXT: csel x13, xzr, x13, eq
|
|
; CHECK-GI-NEXT: umulh x18, x14, x9
|
|
; CHECK-GI-NEXT: umulh x17, x12, x8
|
|
; CHECK-GI-NEXT: umulh x15, x10, x8
|
|
; CHECK-GI-NEXT: add x18, x18, x11
|
|
; CHECK-GI-NEXT: mul x16, x10, x9
|
|
; CHECK-GI-NEXT: add x17, x17, x18
|
|
; CHECK-GI-NEXT: mul x0, x14, x8
|
|
; CHECK-GI-NEXT: madd x17, x10, x9, x17
|
|
; CHECK-GI-NEXT: adds x15, x15, x16
|
|
; CHECK-GI-NEXT: umulh x2, x14, x8
|
|
; CHECK-GI-NEXT: cset w3, hs
|
|
; CHECK-GI-NEXT: adds x1, x15, x0
|
|
; CHECK-GI-NEXT: mul x18, x14, x9
|
|
; CHECK-GI-NEXT: cset w15, hs
|
|
; CHECK-GI-NEXT: madd x14, x14, x9, x17
|
|
; CHECK-GI-NEXT: adds x11, x2, x11
|
|
; CHECK-GI-NEXT: mul x17, x12, x8
|
|
; CHECK-GI-NEXT: cset w0, hs
|
|
; CHECK-GI-NEXT: adds x11, x11, x16
|
|
; CHECK-GI-NEXT: and x16, x0, #0x1
|
|
; CHECK-GI-NEXT: madd x9, x12, x9, x14
|
|
; CHECK-GI-NEXT: and x12, x3, #0x1
|
|
; CHECK-GI-NEXT: and x14, x15, #0x1
|
|
; CHECK-GI-NEXT: cset w15, hs
|
|
; CHECK-GI-NEXT: adds x11, x11, x18
|
|
; CHECK-GI-NEXT: and x15, x15, #0x1
|
|
; CHECK-GI-NEXT: mul x0, x10, x8
|
|
; CHECK-GI-NEXT: add x10, x12, x14
|
|
; CHECK-GI-NEXT: cset w14, hs
|
|
; CHECK-GI-NEXT: adds x11, x11, x17
|
|
; CHECK-GI-NEXT: add x12, x16, x15
|
|
; CHECK-GI-NEXT: madd x8, x13, x8, x9
|
|
; CHECK-GI-NEXT: and x9, x14, #0x1
|
|
; CHECK-GI-NEXT: cset w13, hs
|
|
; CHECK-GI-NEXT: adds x2, x11, x10
|
|
; CHECK-GI-NEXT: add x9, x12, x9
|
|
; CHECK-GI-NEXT: and x10, x13, #0x1
|
|
; CHECK-GI-NEXT: cset w11, hs
|
|
; CHECK-GI-NEXT: add x9, x9, x10
|
|
; CHECK-GI-NEXT: and x10, x11, #0x1
|
|
; CHECK-GI-NEXT: add x9, x9, x10
|
|
; CHECK-GI-NEXT: add x3, x8, x9
|
|
; CHECK-GI-NEXT: .LBB6_4: // %fp-to-i-cleanup
|
|
; CHECK-GI-NEXT: ret
|
|
%result = fptosi double %val to i256
|
|
ret i256 %result
|
|
}
|
|
|
|
define i256 @f64_to_u256(double %val) {
|
|
; CHECK-SD-LABEL: f64_to_u256:
|
|
; CHECK-SD: // %bb.0: // %fp-to-i-entry
|
|
; CHECK-SD-NEXT: fmov x10, d0
|
|
; CHECK-SD-NEXT: ubfx x8, x10, #52, #11
|
|
; CHECK-SD-NEXT: cmp x8, #1023
|
|
; CHECK-SD-NEXT: b.hs .LBB7_2
|
|
; CHECK-SD-NEXT: // %bb.1:
|
|
; CHECK-SD-NEXT: mov x0, xzr
|
|
; CHECK-SD-NEXT: mov x1, xzr
|
|
; CHECK-SD-NEXT: mov x2, xzr
|
|
; CHECK-SD-NEXT: mov x3, xzr
|
|
; CHECK-SD-NEXT: ret
|
|
; CHECK-SD-NEXT: .LBB7_2: // %fp-to-i-if-check.exp.size
|
|
; CHECK-SD-NEXT: mov x9, #4503599627370496 // =0x10000000000000
|
|
; CHECK-SD-NEXT: cmp x8, #1074
|
|
; CHECK-SD-NEXT: bfxil x9, x10, #0, #52
|
|
; CHECK-SD-NEXT: b.hi .LBB7_4
|
|
; CHECK-SD-NEXT: // %bb.3: // %fp-to-i-if-exp.small
|
|
; CHECK-SD-NEXT: mov w10, #1075 // =0x433
|
|
; CHECK-SD-NEXT: mov x1, xzr
|
|
; CHECK-SD-NEXT: mov x2, xzr
|
|
; CHECK-SD-NEXT: sub x8, x10, x8
|
|
; CHECK-SD-NEXT: mov x3, xzr
|
|
; CHECK-SD-NEXT: lsr x0, x9, x8
|
|
; CHECK-SD-NEXT: ret
|
|
; CHECK-SD-NEXT: .LBB7_4: // %fp-to-i-if-exp.large
|
|
; CHECK-SD-NEXT: sub sp, sp, #64
|
|
; CHECK-SD-NEXT: .cfi_def_cfa_offset 64
|
|
; CHECK-SD-NEXT: movi v0.2d, #0000000000000000
|
|
; CHECK-SD-NEXT: sub x8, x8, #1075
|
|
; CHECK-SD-NEXT: str x9, [sp, #32]
|
|
; CHECK-SD-NEXT: lsr x9, x8, #3
|
|
; CHECK-SD-NEXT: mov x10, sp
|
|
; CHECK-SD-NEXT: str xzr, [sp, #56]
|
|
; CHECK-SD-NEXT: add x10, x10, #32
|
|
; CHECK-SD-NEXT: and x13, x8, #0x3f
|
|
; CHECK-SD-NEXT: mvn w17, w8
|
|
; CHECK-SD-NEXT: and x9, x9, #0x18
|
|
; CHECK-SD-NEXT: eor x13, x13, #0x3f
|
|
; CHECK-SD-NEXT: stur q0, [sp, #40]
|
|
; CHECK-SD-NEXT: sub x9, x10, x9
|
|
; CHECK-SD-NEXT: stp q0, q0, [sp]
|
|
; CHECK-SD-NEXT: ldp x11, x10, [x9, #8]
|
|
; CHECK-SD-NEXT: ldr x12, [x9]
|
|
; CHECK-SD-NEXT: ldr x9, [x9, #24]
|
|
; CHECK-SD-NEXT: lsr x16, x12, #1
|
|
; CHECK-SD-NEXT: lsl x0, x12, x8
|
|
; CHECK-SD-NEXT: lsr x14, x10, #1
|
|
; CHECK-SD-NEXT: lsr x15, x11, #1
|
|
; CHECK-SD-NEXT: lsl x9, x9, x8
|
|
; CHECK-SD-NEXT: lsl x10, x10, x8
|
|
; CHECK-SD-NEXT: lsl x11, x11, x8
|
|
; CHECK-SD-NEXT: lsr x15, x15, x17
|
|
; CHECK-SD-NEXT: lsr x14, x14, x13
|
|
; CHECK-SD-NEXT: lsr x13, x16, x13
|
|
; CHECK-SD-NEXT: orr x3, x9, x14
|
|
; CHECK-SD-NEXT: orr x2, x10, x15
|
|
; CHECK-SD-NEXT: orr x1, x11, x13
|
|
; CHECK-SD-NEXT: add sp, sp, #64
|
|
; CHECK-SD-NEXT: ret
|
|
;
|
|
; CHECK-GI-LABEL: f64_to_u256:
|
|
; CHECK-GI: // %bb.0: // %fp-to-i-entry
|
|
; CHECK-GI-NEXT: fmov x8, d0
|
|
; CHECK-GI-NEXT: mov x0, xzr
|
|
; CHECK-GI-NEXT: mov x1, xzr
|
|
; CHECK-GI-NEXT: mov x2, xzr
|
|
; CHECK-GI-NEXT: mov x3, xzr
|
|
; CHECK-GI-NEXT: ubfx x9, x8, #52, #11
|
|
; CHECK-GI-NEXT: cmp x9, #1023
|
|
; CHECK-GI-NEXT: b.lo .LBB7_4
|
|
; CHECK-GI-NEXT: // %bb.1: // %fp-to-i-if-check.exp.size
|
|
; CHECK-GI-NEXT: and x8, x8, #0xfffffffffffff
|
|
; CHECK-GI-NEXT: cmp x9, #1075
|
|
; CHECK-GI-NEXT: orr x8, x8, #0x10000000000000
|
|
; CHECK-GI-NEXT: b.hs .LBB7_3
|
|
; CHECK-GI-NEXT: // %bb.2: // %fp-to-i-if-exp.small
|
|
; CHECK-GI-NEXT: mov w10, #1075 // =0x433
|
|
; CHECK-GI-NEXT: mov x1, xzr
|
|
; CHECK-GI-NEXT: mov x2, xzr
|
|
; CHECK-GI-NEXT: sub x9, x10, x9
|
|
; CHECK-GI-NEXT: mov x3, xzr
|
|
; CHECK-GI-NEXT: lsr x0, x8, x9
|
|
; CHECK-GI-NEXT: ret
|
|
; CHECK-GI-NEXT: .LBB7_3: // %fp-to-i-if-exp.large
|
|
; CHECK-GI-NEXT: sub x9, x9, #1075
|
|
; CHECK-GI-NEXT: mov w11, #64 // =0x40
|
|
; CHECK-GI-NEXT: mov w10, #128 // =0x80
|
|
; CHECK-GI-NEXT: sub x12, x9, #64
|
|
; CHECK-GI-NEXT: sub x13, x11, x9
|
|
; CHECK-GI-NEXT: lsl x14, x8, x9
|
|
; CHECK-GI-NEXT: lsr x13, x8, x13
|
|
; CHECK-GI-NEXT: lsl x12, x8, x12
|
|
; CHECK-GI-NEXT: sub x10, x10, x9
|
|
; CHECK-GI-NEXT: cmp x9, #64
|
|
; CHECK-GI-NEXT: sub x15, x9, #128
|
|
; CHECK-GI-NEXT: lsr x16, x8, x10
|
|
; CHECK-GI-NEXT: csel x14, x14, xzr, lo
|
|
; CHECK-GI-NEXT: csel x12, x13, x12, lo
|
|
; CHECK-GI-NEXT: cmp x9, #0
|
|
; CHECK-GI-NEXT: sub x13, x15, #64
|
|
; CHECK-GI-NEXT: csel x12, xzr, x12, eq
|
|
; CHECK-GI-NEXT: cmp x10, #64
|
|
; CHECK-GI-NEXT: sub x11, x11, x15
|
|
; CHECK-GI-NEXT: csel x16, x16, xzr, lo
|
|
; CHECK-GI-NEXT: cmp x10, #0
|
|
; CHECK-GI-NEXT: lsl x10, x8, x15
|
|
; CHECK-GI-NEXT: lsr x11, x8, x11
|
|
; CHECK-GI-NEXT: lsl x13, x8, x13
|
|
; CHECK-GI-NEXT: csel x8, x8, x16, eq
|
|
; CHECK-GI-NEXT: cmp x15, #64
|
|
; CHECK-GI-NEXT: csel x10, x10, xzr, lo
|
|
; CHECK-GI-NEXT: csel x11, x11, x13, lo
|
|
; CHECK-GI-NEXT: cmp x15, #0
|
|
; CHECK-GI-NEXT: csel x11, xzr, x11, eq
|
|
; CHECK-GI-NEXT: cmp x9, #128
|
|
; CHECK-GI-NEXT: csel x0, x14, xzr, lo
|
|
; CHECK-GI-NEXT: csel x1, x12, xzr, lo
|
|
; CHECK-GI-NEXT: csel x8, x8, x10, lo
|
|
; CHECK-GI-NEXT: csel x10, xzr, x11, lo
|
|
; CHECK-GI-NEXT: cmp x9, #0
|
|
; CHECK-GI-NEXT: csel x2, xzr, x8, eq
|
|
; CHECK-GI-NEXT: csel x3, xzr, x10, eq
|
|
; CHECK-GI-NEXT: .LBB7_4: // %fp-to-i-cleanup
|
|
; CHECK-GI-NEXT: ret
|
|
%result = fptoui double %val to i256
|
|
ret i256 %result
|
|
}
|
|
|
|
define i256 @f32_to_s256_sat(float %val) {
|
|
; CHECK-SD-LABEL: f32_to_s256_sat:
|
|
; CHECK-SD: // %bb.0: // %fp-to-i-entry
|
|
; CHECK-SD-NEXT: fmov w8, s0
|
|
; CHECK-SD-NEXT: mov x0, xzr
|
|
; CHECK-SD-NEXT: ubfx w10, w8, #23, #8
|
|
; CHECK-SD-NEXT: cmp w10, #127
|
|
; CHECK-SD-NEXT: b.lo .LBB8_5
|
|
; CHECK-SD-NEXT: // %bb.1: // %fp-to-i-entry
|
|
; CHECK-SD-NEXT: fcmp s0, s0
|
|
; CHECK-SD-NEXT: mov x1, x0
|
|
; CHECK-SD-NEXT: mov x2, x0
|
|
; CHECK-SD-NEXT: mov x3, x0
|
|
; CHECK-SD-NEXT: b.vs .LBB8_7
|
|
; CHECK-SD-NEXT: // %bb.2: // %fp-to-i-if-check.saturate
|
|
; CHECK-SD-NEXT: cmp w10, #255
|
|
; CHECK-SD-NEXT: b.hs .LBB8_8
|
|
; CHECK-SD-NEXT: // %bb.3: // %fp-to-i-if-check.exp.size
|
|
; CHECK-SD-NEXT: sbfx x9, x8, #31, #1
|
|
; CHECK-SD-NEXT: mov w11, #8388608 // =0x800000
|
|
; CHECK-SD-NEXT: cmp w10, #149
|
|
; CHECK-SD-NEXT: bfxil w11, w8, #0, #23
|
|
; CHECK-SD-NEXT: orr x8, x9, #0x1
|
|
; CHECK-SD-NEXT: b.hi .LBB8_6
|
|
; CHECK-SD-NEXT: // %bb.4: // %fp-to-i-if-exp.small
|
|
; CHECK-SD-NEXT: mov w12, #150 // =0x96
|
|
; CHECK-SD-NEXT: sub w10, w12, w10
|
|
; CHECK-SD-NEXT: lsr w10, w11, w10
|
|
; CHECK-SD-NEXT: umulh x13, x10, x8
|
|
; CHECK-SD-NEXT: umulh x12, x10, x9
|
|
; CHECK-SD-NEXT: umulh x11, x9, x10
|
|
; CHECK-SD-NEXT: smull x14, w10, w9
|
|
; CHECK-SD-NEXT: smull x15, w9, w10
|
|
; CHECK-SD-NEXT: smull x9, w9, w10
|
|
; CHECK-SD-NEXT: adds x1, x14, x13
|
|
; CHECK-SD-NEXT: smull x0, w10, w8
|
|
; CHECK-SD-NEXT: adcs x2, x15, x12
|
|
; CHECK-SD-NEXT: adc x3, x11, x9
|
|
; CHECK-SD-NEXT: ret
|
|
; CHECK-SD-NEXT: .LBB8_5:
|
|
; CHECK-SD-NEXT: mov x1, x0
|
|
; CHECK-SD-NEXT: mov x2, x0
|
|
; CHECK-SD-NEXT: mov x3, x0
|
|
; CHECK-SD-NEXT: ret
|
|
; CHECK-SD-NEXT: .LBB8_6: // %fp-to-i-if-exp.large
|
|
; CHECK-SD-NEXT: sub sp, sp, #64
|
|
; CHECK-SD-NEXT: .cfi_def_cfa_offset 64
|
|
; CHECK-SD-NEXT: movi v0.2d, #0000000000000000
|
|
; CHECK-SD-NEXT: sub w10, w10, #150
|
|
; CHECK-SD-NEXT: str x11, [sp, #32]
|
|
; CHECK-SD-NEXT: lsr x11, x10, #3
|
|
; CHECK-SD-NEXT: mov x12, sp
|
|
; CHECK-SD-NEXT: str xzr, [sp, #56]
|
|
; CHECK-SD-NEXT: add x12, x12, #32
|
|
; CHECK-SD-NEXT: and x16, x10, #0x3f
|
|
; CHECK-SD-NEXT: mvn w2, w10
|
|
; CHECK-SD-NEXT: and x11, x11, #0x18
|
|
; CHECK-SD-NEXT: eor x16, x16, #0x3f
|
|
; CHECK-SD-NEXT: stur q0, [sp, #40]
|
|
; CHECK-SD-NEXT: sub x11, x12, x11
|
|
; CHECK-SD-NEXT: stp q0, q0, [sp]
|
|
; CHECK-SD-NEXT: ldp x12, x15, [x11]
|
|
; CHECK-SD-NEXT: ldp x1, x11, [x11, #16]
|
|
; CHECK-SD-NEXT: lsl x18, x15, x10
|
|
; CHECK-SD-NEXT: lsr x15, x15, #1
|
|
; CHECK-SD-NEXT: lsl x13, x12, x10
|
|
; CHECK-SD-NEXT: lsr x12, x12, #1
|
|
; CHECK-SD-NEXT: lsl x4, x1, x10
|
|
; CHECK-SD-NEXT: lsr x1, x1, #1
|
|
; CHECK-SD-NEXT: lsr x15, x15, x2
|
|
; CHECK-SD-NEXT: lsl x10, x11, x10
|
|
; CHECK-SD-NEXT: umulh x14, x13, x8
|
|
; CHECK-SD-NEXT: lsr x12, x12, x16
|
|
; CHECK-SD-NEXT: lsr x11, x1, x16
|
|
; CHECK-SD-NEXT: orr x15, x4, x15
|
|
; CHECK-SD-NEXT: mul x0, x13, x9
|
|
; CHECK-SD-NEXT: orr x12, x18, x12
|
|
; CHECK-SD-NEXT: orr x10, x10, x11
|
|
; CHECK-SD-NEXT: umulh x4, x8, x15
|
|
; CHECK-SD-NEXT: mul x3, x12, x8
|
|
; CHECK-SD-NEXT: umulh x11, x9, x13
|
|
; CHECK-SD-NEXT: umulh x18, x12, x8
|
|
; CHECK-SD-NEXT: adds x14, x3, x14
|
|
; CHECK-SD-NEXT: umulh x17, x13, x9
|
|
; CHECK-SD-NEXT: madd x10, x8, x10, x4
|
|
; CHECK-SD-NEXT: cinc x18, x18, hs
|
|
; CHECK-SD-NEXT: adds x1, x0, x14
|
|
; CHECK-SD-NEXT: madd x11, x9, x12, x11
|
|
; CHECK-SD-NEXT: mul x16, x12, x9
|
|
; CHECK-SD-NEXT: umulh x2, x12, x9
|
|
; CHECK-SD-NEXT: madd x10, x9, x15, x10
|
|
; CHECK-SD-NEXT: mul x12, x8, x15
|
|
; CHECK-SD-NEXT: mul x15, x9, x13
|
|
; CHECK-SD-NEXT: madd x9, x9, x13, x11
|
|
; CHECK-SD-NEXT: cinc x11, x17, hs
|
|
; CHECK-SD-NEXT: adds x11, x18, x11
|
|
; CHECK-SD-NEXT: mul x0, x13, x8
|
|
; CHECK-SD-NEXT: cset w8, hs
|
|
; CHECK-SD-NEXT: adds x11, x16, x11
|
|
; CHECK-SD-NEXT: adc x8, x2, x8
|
|
; CHECK-SD-NEXT: adds x12, x15, x12
|
|
; CHECK-SD-NEXT: adc x9, x9, x10
|
|
; CHECK-SD-NEXT: adds x2, x11, x12
|
|
; CHECK-SD-NEXT: adc x3, x8, x9
|
|
; CHECK-SD-NEXT: add sp, sp, #64
|
|
; CHECK-SD-NEXT: .LBB8_7: // %fp-to-i-cleanup
|
|
; CHECK-SD-NEXT: ret
|
|
; CHECK-SD-NEXT: .LBB8_8: // %fp-to-i-if-saturate
|
|
; CHECK-SD-NEXT: // kill: def $w8 killed $w8 killed $x8 def $x8
|
|
; CHECK-SD-NEXT: sbfx x8, x8, #31, #1
|
|
; CHECK-SD-NEXT: mvn x0, x8
|
|
; CHECK-SD-NEXT: eor x3, x8, #0x7fffffffffffffff
|
|
; CHECK-SD-NEXT: mov x1, x0
|
|
; CHECK-SD-NEXT: mov x2, x0
|
|
; CHECK-SD-NEXT: ret
|
|
;
|
|
; CHECK-GI-LABEL: f32_to_s256_sat:
|
|
; CHECK-GI: // %bb.0: // %fp-to-i-entry
|
|
; CHECK-GI-NEXT: fmov w8, s0
|
|
; CHECK-GI-NEXT: ubfx w11, w8, #23, #8
|
|
; CHECK-GI-NEXT: cmp w8, #0
|
|
; CHECK-GI-NEXT: cset w9, mi
|
|
; CHECK-GI-NEXT: cmp w11, #127
|
|
; CHECK-GI-NEXT: b.lo .LBB8_5
|
|
; CHECK-GI-NEXT: // %bb.1: // %fp-to-i-entry
|
|
; CHECK-GI-NEXT: fcmp s0, s0
|
|
; CHECK-GI-NEXT: b.vs .LBB8_5
|
|
; CHECK-GI-NEXT: // %bb.2: // %fp-to-i-if-check.saturate
|
|
; CHECK-GI-NEXT: cmp w11, #255
|
|
; CHECK-GI-NEXT: b.hs .LBB8_7
|
|
; CHECK-GI-NEXT: // %bb.3: // %fp-to-i-if-check.exp.size
|
|
; CHECK-GI-NEXT: sbfx x10, x9, #0, #1
|
|
; CHECK-GI-NEXT: and w12, w8, #0x7fffff
|
|
; CHECK-GI-NEXT: cmp w11, #150
|
|
; CHECK-GI-NEXT: asr x9, x10, #63
|
|
; CHECK-GI-NEXT: orr x8, x10, #0x1
|
|
; CHECK-GI-NEXT: orr w10, w12, #0x800000
|
|
; CHECK-GI-NEXT: b.hs .LBB8_6
|
|
; CHECK-GI-NEXT: // %bb.4: // %fp-to-i-if-exp.small
|
|
; CHECK-GI-NEXT: mov w12, #150 // =0x96
|
|
; CHECK-GI-NEXT: umulh x15, x9, xzr
|
|
; CHECK-GI-NEXT: and x17, xzr, #0x1
|
|
; CHECK-GI-NEXT: sub w11, w12, w11
|
|
; CHECK-GI-NEXT: and x18, xzr, #0x1
|
|
; CHECK-GI-NEXT: lsr w10, w10, w11
|
|
; CHECK-GI-NEXT: umulh x12, x8, xzr
|
|
; CHECK-GI-NEXT: umulh x11, x10, x8
|
|
; CHECK-GI-NEXT: umulh x13, x10, x9
|
|
; CHECK-GI-NEXT: smull x14, w10, w9
|
|
; CHECK-GI-NEXT: smull x16, w10, w9
|
|
; CHECK-GI-NEXT: smull x0, w10, w8
|
|
; CHECK-GI-NEXT: adds x1, x11, x14
|
|
; CHECK-GI-NEXT: add x11, x17, x18
|
|
; CHECK-GI-NEXT: add x14, x12, x13
|
|
; CHECK-GI-NEXT: cset w17, hs
|
|
; CHECK-GI-NEXT: adds x14, x14, x16
|
|
; CHECK-GI-NEXT: and x16, xzr, #0x1
|
|
; CHECK-GI-NEXT: and x17, x17, #0x1
|
|
; CHECK-GI-NEXT: add x12, x12, x15
|
|
; CHECK-GI-NEXT: cset w15, hs
|
|
; CHECK-GI-NEXT: add x16, x17, x16
|
|
; CHECK-GI-NEXT: and x17, xzr, #0x1
|
|
; CHECK-GI-NEXT: add x12, x12, x13
|
|
; CHECK-GI-NEXT: smaddl x9, w10, w9, x12
|
|
; CHECK-GI-NEXT: and x12, x15, #0x1
|
|
; CHECK-GI-NEXT: add x11, x11, x17
|
|
; CHECK-GI-NEXT: adds x2, x14, x16
|
|
; CHECK-GI-NEXT: add x8, x11, x12
|
|
; CHECK-GI-NEXT: cset w10, hs
|
|
; CHECK-GI-NEXT: and x10, x10, #0x1
|
|
; CHECK-GI-NEXT: add x8, x9, x8
|
|
; CHECK-GI-NEXT: add x3, x8, x10
|
|
; CHECK-GI-NEXT: ret
|
|
; CHECK-GI-NEXT: .LBB8_5:
|
|
; CHECK-GI-NEXT: mov x0, xzr
|
|
; CHECK-GI-NEXT: mov x1, xzr
|
|
; CHECK-GI-NEXT: mov x2, xzr
|
|
; CHECK-GI-NEXT: mov x3, xzr
|
|
; CHECK-GI-NEXT: ret
|
|
; CHECK-GI-NEXT: .LBB8_6: // %fp-to-i-if-exp.large
|
|
; CHECK-GI-NEXT: sub w11, w11, #150
|
|
; CHECK-GI-NEXT: mov w13, #64 // =0x40
|
|
; CHECK-GI-NEXT: mov w12, #128 // =0x80
|
|
; CHECK-GI-NEXT: sub x14, x11, #64
|
|
; CHECK-GI-NEXT: sub x15, x13, x11
|
|
; CHECK-GI-NEXT: lsl x16, x10, x11
|
|
; CHECK-GI-NEXT: lsr x15, x10, x15
|
|
; CHECK-GI-NEXT: lsl x14, x10, x14
|
|
; CHECK-GI-NEXT: sub x12, x12, x11
|
|
; CHECK-GI-NEXT: cmp x11, #64
|
|
; CHECK-GI-NEXT: sub x17, x11, #128
|
|
; CHECK-GI-NEXT: lsr x18, x10, x12
|
|
; CHECK-GI-NEXT: csel x16, x16, xzr, lo
|
|
; CHECK-GI-NEXT: csel x14, x15, x14, lo
|
|
; CHECK-GI-NEXT: cmp x11, #0
|
|
; CHECK-GI-NEXT: sub x15, x17, #64
|
|
; CHECK-GI-NEXT: csel x14, xzr, x14, eq
|
|
; CHECK-GI-NEXT: cmp x12, #64
|
|
; CHECK-GI-NEXT: sub x13, x13, x17
|
|
; CHECK-GI-NEXT: csel x18, x18, xzr, lo
|
|
; CHECK-GI-NEXT: cmp x12, #0
|
|
; CHECK-GI-NEXT: lsl x12, x10, x17
|
|
; CHECK-GI-NEXT: lsr x13, x10, x13
|
|
; CHECK-GI-NEXT: lsl x15, x10, x15
|
|
; CHECK-GI-NEXT: csel x18, x10, x18, eq
|
|
; CHECK-GI-NEXT: cmp x17, #64
|
|
; CHECK-GI-NEXT: csel x12, x12, xzr, lo
|
|
; CHECK-GI-NEXT: csel x10, x13, x15, lo
|
|
; CHECK-GI-NEXT: cmp x17, #0
|
|
; CHECK-GI-NEXT: csel x13, xzr, x10, eq
|
|
; CHECK-GI-NEXT: cmp x11, #128
|
|
; CHECK-GI-NEXT: csel x10, x16, xzr, lo
|
|
; CHECK-GI-NEXT: csel x14, x14, xzr, lo
|
|
; CHECK-GI-NEXT: csel x12, x18, x12, lo
|
|
; CHECK-GI-NEXT: csel x13, xzr, x13, lo
|
|
; CHECK-GI-NEXT: cmp x11, #0
|
|
; CHECK-GI-NEXT: umulh x11, x10, x9
|
|
; CHECK-GI-NEXT: csel x12, xzr, x12, eq
|
|
; CHECK-GI-NEXT: csel x13, xzr, x13, eq
|
|
; CHECK-GI-NEXT: umulh x18, x14, x9
|
|
; CHECK-GI-NEXT: umulh x17, x12, x8
|
|
; CHECK-GI-NEXT: umulh x15, x10, x8
|
|
; CHECK-GI-NEXT: add x18, x18, x11
|
|
; CHECK-GI-NEXT: mul x16, x10, x9
|
|
; CHECK-GI-NEXT: add x17, x17, x18
|
|
; CHECK-GI-NEXT: mul x0, x14, x8
|
|
; CHECK-GI-NEXT: madd x17, x10, x9, x17
|
|
; CHECK-GI-NEXT: adds x15, x15, x16
|
|
; CHECK-GI-NEXT: umulh x2, x14, x8
|
|
; CHECK-GI-NEXT: cset w3, hs
|
|
; CHECK-GI-NEXT: adds x1, x15, x0
|
|
; CHECK-GI-NEXT: mul x18, x14, x9
|
|
; CHECK-GI-NEXT: cset w15, hs
|
|
; CHECK-GI-NEXT: madd x14, x14, x9, x17
|
|
; CHECK-GI-NEXT: adds x11, x2, x11
|
|
; CHECK-GI-NEXT: mul x17, x12, x8
|
|
; CHECK-GI-NEXT: cset w0, hs
|
|
; CHECK-GI-NEXT: adds x11, x11, x16
|
|
; CHECK-GI-NEXT: and x16, x0, #0x1
|
|
; CHECK-GI-NEXT: madd x9, x12, x9, x14
|
|
; CHECK-GI-NEXT: and x12, x3, #0x1
|
|
; CHECK-GI-NEXT: and x14, x15, #0x1
|
|
; CHECK-GI-NEXT: cset w15, hs
|
|
; CHECK-GI-NEXT: adds x11, x11, x18
|
|
; CHECK-GI-NEXT: and x15, x15, #0x1
|
|
; CHECK-GI-NEXT: mul x0, x10, x8
|
|
; CHECK-GI-NEXT: add x10, x12, x14
|
|
; CHECK-GI-NEXT: cset w14, hs
|
|
; CHECK-GI-NEXT: adds x11, x11, x17
|
|
; CHECK-GI-NEXT: add x12, x16, x15
|
|
; CHECK-GI-NEXT: madd x8, x13, x8, x9
|
|
; CHECK-GI-NEXT: and x9, x14, #0x1
|
|
; CHECK-GI-NEXT: cset w13, hs
|
|
; CHECK-GI-NEXT: adds x2, x11, x10
|
|
; CHECK-GI-NEXT: add x9, x12, x9
|
|
; CHECK-GI-NEXT: and x10, x13, #0x1
|
|
; CHECK-GI-NEXT: cset w11, hs
|
|
; CHECK-GI-NEXT: add x9, x9, x10
|
|
; CHECK-GI-NEXT: and x10, x11, #0x1
|
|
; CHECK-GI-NEXT: add x9, x9, x10
|
|
; CHECK-GI-NEXT: add x3, x8, x9
|
|
; CHECK-GI-NEXT: ret
|
|
; CHECK-GI-NEXT: .LBB8_7: // %fp-to-i-if-saturate
|
|
; CHECK-GI-NEXT: cmp w8, #0
|
|
; CHECK-GI-NEXT: mov w9, wzr
|
|
; CHECK-GI-NEXT: cset w8, pl
|
|
; CHECK-GI-NEXT: cmp w9, #1
|
|
; CHECK-GI-NEXT: mov x9, #-9223372036854775808 // =0x8000000000000000
|
|
; CHECK-GI-NEXT: sbfx x0, x8, #0, #1
|
|
; CHECK-GI-NEXT: asr x8, x0, #63
|
|
; CHECK-GI-NEXT: adcs x1, x8, xzr
|
|
; CHECK-GI-NEXT: adcs x2, x8, xzr
|
|
; CHECK-GI-NEXT: adc x3, x8, x9
|
|
; CHECK-GI-NEXT: ret
|
|
%result = call i256 @llvm.fptosi.sat(float %val)
|
|
ret i256 %result
|
|
}
|
|
|
|
define i256 @f32_to_u256_sat(float %val) {
|
|
; CHECK-SD-LABEL: f32_to_u256_sat:
|
|
; CHECK-SD: // %bb.0: // %fp-to-i-entry
|
|
; CHECK-SD-NEXT: fmov w9, s0
|
|
; CHECK-SD-NEXT: mov x0, xzr
|
|
; CHECK-SD-NEXT: ubfx w8, w9, #23, #8
|
|
; CHECK-SD-NEXT: cmp w8, #127
|
|
; CHECK-SD-NEXT: b.lo .LBB9_6
|
|
; CHECK-SD-NEXT: // %bb.1: // %fp-to-i-entry
|
|
; CHECK-SD-NEXT: fcmp s0, s0
|
|
; CHECK-SD-NEXT: b.vs .LBB9_6
|
|
; CHECK-SD-NEXT: // %bb.2: // %fp-to-i-entry
|
|
; CHECK-SD-NEXT: mov x1, x0
|
|
; CHECK-SD-NEXT: mov x2, x0
|
|
; CHECK-SD-NEXT: mov x3, x0
|
|
; CHECK-SD-NEXT: tbnz w9, #31, .LBB9_8
|
|
; CHECK-SD-NEXT: // %bb.3: // %fp-to-i-if-check.saturate
|
|
; CHECK-SD-NEXT: cmp w8, #254
|
|
; CHECK-SD-NEXT: b.hi .LBB9_9
|
|
; CHECK-SD-NEXT: // %bb.4: // %fp-to-i-if-check.exp.size
|
|
; CHECK-SD-NEXT: mov w10, #8388608 // =0x800000
|
|
; CHECK-SD-NEXT: cmp w8, #149
|
|
; CHECK-SD-NEXT: bfxil w10, w9, #0, #23
|
|
; CHECK-SD-NEXT: b.hi .LBB9_7
|
|
; CHECK-SD-NEXT: // %bb.5: // %fp-to-i-if-exp.small
|
|
; CHECK-SD-NEXT: mov w9, #150 // =0x96
|
|
; CHECK-SD-NEXT: mov x1, xzr
|
|
; CHECK-SD-NEXT: mov x2, xzr
|
|
; CHECK-SD-NEXT: sub w8, w9, w8
|
|
; CHECK-SD-NEXT: mov x3, xzr
|
|
; CHECK-SD-NEXT: lsr w0, w10, w8
|
|
; CHECK-SD-NEXT: ret
|
|
; CHECK-SD-NEXT: .LBB9_6:
|
|
; CHECK-SD-NEXT: mov x1, x0
|
|
; CHECK-SD-NEXT: mov x2, x0
|
|
; CHECK-SD-NEXT: mov x3, x0
|
|
; CHECK-SD-NEXT: ret
|
|
; CHECK-SD-NEXT: .LBB9_7: // %fp-to-i-if-exp.large
|
|
; CHECK-SD-NEXT: sub sp, sp, #64
|
|
; CHECK-SD-NEXT: .cfi_def_cfa_offset 64
|
|
; CHECK-SD-NEXT: movi v0.2d, #0000000000000000
|
|
; CHECK-SD-NEXT: sub w8, w8, #150
|
|
; CHECK-SD-NEXT: str x10, [sp, #32]
|
|
; CHECK-SD-NEXT: lsr x9, x8, #3
|
|
; CHECK-SD-NEXT: mov x10, sp
|
|
; CHECK-SD-NEXT: str xzr, [sp, #56]
|
|
; CHECK-SD-NEXT: add x10, x10, #32
|
|
; CHECK-SD-NEXT: and x13, x8, #0x3f
|
|
; CHECK-SD-NEXT: mvn w17, w8
|
|
; CHECK-SD-NEXT: and x9, x9, #0x18
|
|
; CHECK-SD-NEXT: eor x13, x13, #0x3f
|
|
; CHECK-SD-NEXT: stur q0, [sp, #40]
|
|
; CHECK-SD-NEXT: sub x9, x10, x9
|
|
; CHECK-SD-NEXT: stp q0, q0, [sp]
|
|
; CHECK-SD-NEXT: ldp x11, x10, [x9, #8]
|
|
; CHECK-SD-NEXT: ldr x12, [x9]
|
|
; CHECK-SD-NEXT: ldr x9, [x9, #24]
|
|
; CHECK-SD-NEXT: lsr x16, x12, #1
|
|
; CHECK-SD-NEXT: lsl x0, x12, x8
|
|
; CHECK-SD-NEXT: lsr x14, x10, #1
|
|
; CHECK-SD-NEXT: lsr x15, x11, #1
|
|
; CHECK-SD-NEXT: lsl x9, x9, x8
|
|
; CHECK-SD-NEXT: lsl x10, x10, x8
|
|
; CHECK-SD-NEXT: lsl x11, x11, x8
|
|
; CHECK-SD-NEXT: lsr x15, x15, x17
|
|
; CHECK-SD-NEXT: lsr x14, x14, x13
|
|
; CHECK-SD-NEXT: lsr x13, x16, x13
|
|
; CHECK-SD-NEXT: orr x3, x9, x14
|
|
; CHECK-SD-NEXT: orr x2, x10, x15
|
|
; CHECK-SD-NEXT: orr x1, x11, x13
|
|
; CHECK-SD-NEXT: add sp, sp, #64
|
|
; CHECK-SD-NEXT: .LBB9_8: // %fp-to-i-cleanup
|
|
; CHECK-SD-NEXT: ret
|
|
; CHECK-SD-NEXT: .LBB9_9:
|
|
; CHECK-SD-NEXT: mov x0, #-1 // =0xffffffffffffffff
|
|
; CHECK-SD-NEXT: mov x1, #-1 // =0xffffffffffffffff
|
|
; CHECK-SD-NEXT: mov x2, #-1 // =0xffffffffffffffff
|
|
; CHECK-SD-NEXT: mov x3, #-1 // =0xffffffffffffffff
|
|
; CHECK-SD-NEXT: ret
|
|
;
|
|
; CHECK-GI-LABEL: f32_to_u256_sat:
|
|
; CHECK-GI: // %bb.0: // %fp-to-i-entry
|
|
; CHECK-GI-NEXT: fmov w8, s0
|
|
; CHECK-GI-NEXT: mov x0, xzr
|
|
; CHECK-GI-NEXT: ubfx w9, w8, #23, #8
|
|
; CHECK-GI-NEXT: cmp w9, #127
|
|
; CHECK-GI-NEXT: b.lo .LBB9_6
|
|
; CHECK-GI-NEXT: // %bb.1: // %fp-to-i-entry
|
|
; CHECK-GI-NEXT: fcmp s0, s0
|
|
; CHECK-GI-NEXT: b.vs .LBB9_6
|
|
; CHECK-GI-NEXT: // %bb.2: // %fp-to-i-entry
|
|
; CHECK-GI-NEXT: mov x1, x0
|
|
; CHECK-GI-NEXT: mov x2, x0
|
|
; CHECK-GI-NEXT: mov x3, x0
|
|
; CHECK-GI-NEXT: tbnz w8, #31, .LBB9_8
|
|
; CHECK-GI-NEXT: // %bb.3: // %fp-to-i-if-check.saturate
|
|
; CHECK-GI-NEXT: cmp w9, #255
|
|
; CHECK-GI-NEXT: b.hs .LBB9_9
|
|
; CHECK-GI-NEXT: // %bb.4: // %fp-to-i-if-check.exp.size
|
|
; CHECK-GI-NEXT: and w8, w8, #0x7fffff
|
|
; CHECK-GI-NEXT: cmp w9, #150
|
|
; CHECK-GI-NEXT: orr w8, w8, #0x800000
|
|
; CHECK-GI-NEXT: b.hs .LBB9_7
|
|
; CHECK-GI-NEXT: // %bb.5: // %fp-to-i-if-exp.small
|
|
; CHECK-GI-NEXT: mov w10, #150 // =0x96
|
|
; CHECK-GI-NEXT: mov x1, xzr
|
|
; CHECK-GI-NEXT: mov x2, xzr
|
|
; CHECK-GI-NEXT: sub w9, w10, w9
|
|
; CHECK-GI-NEXT: mov x3, xzr
|
|
; CHECK-GI-NEXT: lsr w0, w8, w9
|
|
; CHECK-GI-NEXT: ret
|
|
; CHECK-GI-NEXT: .LBB9_6:
|
|
; CHECK-GI-NEXT: mov x1, x0
|
|
; CHECK-GI-NEXT: mov x2, x0
|
|
; CHECK-GI-NEXT: mov x3, x0
|
|
; CHECK-GI-NEXT: ret
|
|
; CHECK-GI-NEXT: .LBB9_7: // %fp-to-i-if-exp.large
|
|
; CHECK-GI-NEXT: sub w9, w9, #150
|
|
; CHECK-GI-NEXT: mov w11, #64 // =0x40
|
|
; CHECK-GI-NEXT: mov w10, #128 // =0x80
|
|
; CHECK-GI-NEXT: sub x12, x9, #64
|
|
; CHECK-GI-NEXT: sub x13, x11, x9
|
|
; CHECK-GI-NEXT: lsl x14, x8, x9
|
|
; CHECK-GI-NEXT: lsr x13, x8, x13
|
|
; CHECK-GI-NEXT: lsl x12, x8, x12
|
|
; CHECK-GI-NEXT: sub x10, x10, x9
|
|
; CHECK-GI-NEXT: cmp x9, #64
|
|
; CHECK-GI-NEXT: sub x15, x9, #128
|
|
; CHECK-GI-NEXT: lsr x16, x8, x10
|
|
; CHECK-GI-NEXT: csel x14, x14, xzr, lo
|
|
; CHECK-GI-NEXT: csel x12, x13, x12, lo
|
|
; CHECK-GI-NEXT: cmp x9, #0
|
|
; CHECK-GI-NEXT: sub x13, x15, #64
|
|
; CHECK-GI-NEXT: csel x12, xzr, x12, eq
|
|
; CHECK-GI-NEXT: cmp x10, #64
|
|
; CHECK-GI-NEXT: sub x11, x11, x15
|
|
; CHECK-GI-NEXT: csel x16, x16, xzr, lo
|
|
; CHECK-GI-NEXT: cmp x10, #0
|
|
; CHECK-GI-NEXT: lsl x10, x8, x15
|
|
; CHECK-GI-NEXT: lsr x11, x8, x11
|
|
; CHECK-GI-NEXT: lsl x13, x8, x13
|
|
; CHECK-GI-NEXT: csel x8, x8, x16, eq
|
|
; CHECK-GI-NEXT: cmp x15, #64
|
|
; CHECK-GI-NEXT: csel x10, x10, xzr, lo
|
|
; CHECK-GI-NEXT: csel x11, x11, x13, lo
|
|
; CHECK-GI-NEXT: cmp x15, #0
|
|
; CHECK-GI-NEXT: csel x11, xzr, x11, eq
|
|
; CHECK-GI-NEXT: cmp x9, #128
|
|
; CHECK-GI-NEXT: csel x0, x14, xzr, lo
|
|
; CHECK-GI-NEXT: csel x1, x12, xzr, lo
|
|
; CHECK-GI-NEXT: csel x8, x8, x10, lo
|
|
; CHECK-GI-NEXT: csel x10, xzr, x11, lo
|
|
; CHECK-GI-NEXT: cmp x9, #0
|
|
; CHECK-GI-NEXT: csel x2, xzr, x8, eq
|
|
; CHECK-GI-NEXT: csel x3, xzr, x10, eq
|
|
; CHECK-GI-NEXT: .LBB9_8: // %fp-to-i-cleanup
|
|
; CHECK-GI-NEXT: ret
|
|
; CHECK-GI-NEXT: .LBB9_9:
|
|
; CHECK-GI-NEXT: mov x0, #-1 // =0xffffffffffffffff
|
|
; CHECK-GI-NEXT: mov x1, #-1 // =0xffffffffffffffff
|
|
; CHECK-GI-NEXT: mov x2, #-1 // =0xffffffffffffffff
|
|
; CHECK-GI-NEXT: mov x3, #-1 // =0xffffffffffffffff
|
|
; CHECK-GI-NEXT: ret
|
|
%result = call i256 @llvm.fptoui.sat(float %val)
|
|
ret i256 %result
|
|
}
|
|
|
|
define i256 @f64_to_s256_sat(double %val) {
|
|
; CHECK-SD-LABEL: f64_to_s256_sat:
|
|
; CHECK-SD: // %bb.0: // %fp-to-i-entry
|
|
; CHECK-SD-NEXT: fmov x9, d0
|
|
; CHECK-SD-NEXT: mov x0, xzr
|
|
; CHECK-SD-NEXT: ubfx x10, x9, #52, #11
|
|
; CHECK-SD-NEXT: cmp x10, #1023
|
|
; CHECK-SD-NEXT: b.lo .LBB10_5
|
|
; CHECK-SD-NEXT: // %bb.1: // %fp-to-i-entry
|
|
; CHECK-SD-NEXT: fcmp d0, d0
|
|
; CHECK-SD-NEXT: mov x1, x0
|
|
; CHECK-SD-NEXT: mov x2, x0
|
|
; CHECK-SD-NEXT: mov x3, x0
|
|
; CHECK-SD-NEXT: b.vs .LBB10_7
|
|
; CHECK-SD-NEXT: // %bb.2: // %fp-to-i-if-check.saturate
|
|
; CHECK-SD-NEXT: asr x8, x9, #63
|
|
; CHECK-SD-NEXT: cmp x10, #1278
|
|
; CHECK-SD-NEXT: b.hs .LBB10_8
|
|
; CHECK-SD-NEXT: // %bb.3: // %fp-to-i-if-check.exp.size
|
|
; CHECK-SD-NEXT: mov x11, #4503599627370496 // =0x10000000000000
|
|
; CHECK-SD-NEXT: cmp x10, #1074
|
|
; CHECK-SD-NEXT: bfxil x11, x9, #0, #52
|
|
; CHECK-SD-NEXT: orr x9, x8, #0x1
|
|
; CHECK-SD-NEXT: b.hi .LBB10_6
|
|
; CHECK-SD-NEXT: // %bb.4: // %fp-to-i-if-exp.small
|
|
; CHECK-SD-NEXT: mov w12, #1075 // =0x433
|
|
; CHECK-SD-NEXT: sub x10, x12, x10
|
|
; CHECK-SD-NEXT: lsr x10, x11, x10
|
|
; CHECK-SD-NEXT: umulh x13, x10, x9
|
|
; CHECK-SD-NEXT: mul x14, x10, x8
|
|
; CHECK-SD-NEXT: mul x11, x8, x10
|
|
; CHECK-SD-NEXT: umulh x12, x8, x10
|
|
; CHECK-SD-NEXT: adds x1, x14, x13
|
|
; CHECK-SD-NEXT: umulh x8, x10, x8
|
|
; CHECK-SD-NEXT: mul x0, x10, x9
|
|
; CHECK-SD-NEXT: adcs x2, x11, x8
|
|
; CHECK-SD-NEXT: adc x3, x12, x11
|
|
; CHECK-SD-NEXT: ret
|
|
; CHECK-SD-NEXT: .LBB10_5:
|
|
; CHECK-SD-NEXT: mov x1, x0
|
|
; CHECK-SD-NEXT: mov x2, x0
|
|
; CHECK-SD-NEXT: mov x3, x0
|
|
; CHECK-SD-NEXT: ret
|
|
; CHECK-SD-NEXT: .LBB10_6: // %fp-to-i-if-exp.large
|
|
; CHECK-SD-NEXT: sub sp, sp, #64
|
|
; CHECK-SD-NEXT: .cfi_def_cfa_offset 64
|
|
; CHECK-SD-NEXT: movi v0.2d, #0000000000000000
|
|
; CHECK-SD-NEXT: sub x10, x10, #1075
|
|
; CHECK-SD-NEXT: str x11, [sp, #32]
|
|
; CHECK-SD-NEXT: lsr x11, x10, #3
|
|
; CHECK-SD-NEXT: mov x12, sp
|
|
; CHECK-SD-NEXT: str xzr, [sp, #56]
|
|
; CHECK-SD-NEXT: add x12, x12, #32
|
|
; CHECK-SD-NEXT: and x16, x10, #0x3f
|
|
; CHECK-SD-NEXT: mvn w2, w10
|
|
; CHECK-SD-NEXT: and x11, x11, #0x18
|
|
; CHECK-SD-NEXT: eor x16, x16, #0x3f
|
|
; CHECK-SD-NEXT: stur q0, [sp, #40]
|
|
; CHECK-SD-NEXT: sub x11, x12, x11
|
|
; CHECK-SD-NEXT: stp q0, q0, [sp]
|
|
; CHECK-SD-NEXT: ldp x12, x15, [x11]
|
|
; CHECK-SD-NEXT: ldp x1, x11, [x11, #16]
|
|
; CHECK-SD-NEXT: lsl x18, x15, x10
|
|
; CHECK-SD-NEXT: lsr x15, x15, #1
|
|
; CHECK-SD-NEXT: lsl x13, x12, x10
|
|
; CHECK-SD-NEXT: lsr x12, x12, #1
|
|
; CHECK-SD-NEXT: lsl x4, x1, x10
|
|
; CHECK-SD-NEXT: lsr x1, x1, #1
|
|
; CHECK-SD-NEXT: lsr x15, x15, x2
|
|
; CHECK-SD-NEXT: lsl x10, x11, x10
|
|
; CHECK-SD-NEXT: umulh x14, x13, x9
|
|
; CHECK-SD-NEXT: lsr x12, x12, x16
|
|
; CHECK-SD-NEXT: lsr x11, x1, x16
|
|
; CHECK-SD-NEXT: orr x15, x4, x15
|
|
; CHECK-SD-NEXT: mul x0, x13, x8
|
|
; CHECK-SD-NEXT: orr x12, x18, x12
|
|
; CHECK-SD-NEXT: orr x10, x10, x11
|
|
; CHECK-SD-NEXT: umulh x4, x9, x15
|
|
; CHECK-SD-NEXT: mul x3, x12, x9
|
|
; CHECK-SD-NEXT: umulh x11, x8, x13
|
|
; CHECK-SD-NEXT: umulh x18, x12, x9
|
|
; CHECK-SD-NEXT: adds x14, x3, x14
|
|
; CHECK-SD-NEXT: umulh x17, x13, x8
|
|
; CHECK-SD-NEXT: madd x10, x9, x10, x4
|
|
; CHECK-SD-NEXT: cinc x18, x18, hs
|
|
; CHECK-SD-NEXT: adds x1, x0, x14
|
|
; CHECK-SD-NEXT: madd x11, x8, x12, x11
|
|
; CHECK-SD-NEXT: mul x16, x12, x8
|
|
; CHECK-SD-NEXT: umulh x2, x12, x8
|
|
; CHECK-SD-NEXT: madd x10, x8, x15, x10
|
|
; CHECK-SD-NEXT: mul x12, x9, x15
|
|
; CHECK-SD-NEXT: mul x15, x8, x13
|
|
; CHECK-SD-NEXT: madd x8, x8, x13, x11
|
|
; CHECK-SD-NEXT: cinc x11, x17, hs
|
|
; CHECK-SD-NEXT: adds x11, x18, x11
|
|
; CHECK-SD-NEXT: mul x0, x13, x9
|
|
; CHECK-SD-NEXT: cset w9, hs
|
|
; CHECK-SD-NEXT: adds x11, x16, x11
|
|
; CHECK-SD-NEXT: adc x9, x2, x9
|
|
; CHECK-SD-NEXT: adds x12, x15, x12
|
|
; CHECK-SD-NEXT: adc x8, x8, x10
|
|
; CHECK-SD-NEXT: adds x2, x11, x12
|
|
; CHECK-SD-NEXT: adc x3, x9, x8
|
|
; CHECK-SD-NEXT: add sp, sp, #64
|
|
; CHECK-SD-NEXT: .LBB10_7: // %fp-to-i-cleanup
|
|
; CHECK-SD-NEXT: ret
|
|
; CHECK-SD-NEXT: .LBB10_8: // %fp-to-i-if-saturate
|
|
; CHECK-SD-NEXT: mvn x0, x8
|
|
; CHECK-SD-NEXT: eor x3, x8, #0x7fffffffffffffff
|
|
; CHECK-SD-NEXT: mov x1, x0
|
|
; CHECK-SD-NEXT: mov x2, x0
|
|
; CHECK-SD-NEXT: ret
|
|
;
|
|
; CHECK-GI-LABEL: f64_to_s256_sat:
|
|
; CHECK-GI: // %bb.0: // %fp-to-i-entry
|
|
; CHECK-GI-NEXT: fmov x8, d0
|
|
; CHECK-GI-NEXT: ubfx x11, x8, #52, #11
|
|
; CHECK-GI-NEXT: cmp x8, #0
|
|
; CHECK-GI-NEXT: cset w9, mi
|
|
; CHECK-GI-NEXT: cmp x11, #1023
|
|
; CHECK-GI-NEXT: b.lo .LBB10_5
|
|
; CHECK-GI-NEXT: // %bb.1: // %fp-to-i-entry
|
|
; CHECK-GI-NEXT: fcmp d0, d0
|
|
; CHECK-GI-NEXT: b.vs .LBB10_5
|
|
; CHECK-GI-NEXT: // %bb.2: // %fp-to-i-if-check.saturate
|
|
; CHECK-GI-NEXT: cmp x11, #1278
|
|
; CHECK-GI-NEXT: b.hs .LBB10_7
|
|
; CHECK-GI-NEXT: // %bb.3: // %fp-to-i-if-check.exp.size
|
|
; CHECK-GI-NEXT: sbfx x10, x9, #0, #1
|
|
; CHECK-GI-NEXT: and x12, x8, #0xfffffffffffff
|
|
; CHECK-GI-NEXT: cmp x11, #1075
|
|
; CHECK-GI-NEXT: asr x9, x10, #63
|
|
; CHECK-GI-NEXT: orr x8, x10, #0x1
|
|
; CHECK-GI-NEXT: orr x10, x12, #0x10000000000000
|
|
; CHECK-GI-NEXT: b.hs .LBB10_6
|
|
; CHECK-GI-NEXT: // %bb.4: // %fp-to-i-if-exp.small
|
|
; CHECK-GI-NEXT: mov w12, #1075 // =0x433
|
|
; CHECK-GI-NEXT: umulh x13, x8, xzr
|
|
; CHECK-GI-NEXT: and x16, xzr, #0x1
|
|
; CHECK-GI-NEXT: sub x11, x12, x11
|
|
; CHECK-GI-NEXT: and x17, xzr, #0x1
|
|
; CHECK-GI-NEXT: lsr x10, x10, x11
|
|
; CHECK-GI-NEXT: umulh x14, x9, xzr
|
|
; CHECK-GI-NEXT: umulh x11, x10, x8
|
|
; CHECK-GI-NEXT: mul x12, x10, x9
|
|
; CHECK-GI-NEXT: add x14, x13, x14
|
|
; CHECK-GI-NEXT: umulh x15, x10, x9
|
|
; CHECK-GI-NEXT: mul x0, x10, x8
|
|
; CHECK-GI-NEXT: adds x1, x11, x12
|
|
; CHECK-GI-NEXT: add x11, x13, x15
|
|
; CHECK-GI-NEXT: add x13, x14, x15
|
|
; CHECK-GI-NEXT: cset w14, hs
|
|
; CHECK-GI-NEXT: madd x9, x10, x9, x13
|
|
; CHECK-GI-NEXT: adds x11, x11, x12
|
|
; CHECK-GI-NEXT: and x12, x14, #0x1
|
|
; CHECK-GI-NEXT: and x13, xzr, #0x1
|
|
; CHECK-GI-NEXT: cset w14, hs
|
|
; CHECK-GI-NEXT: add x12, x12, x16
|
|
; CHECK-GI-NEXT: add x13, x17, x13
|
|
; CHECK-GI-NEXT: and x15, xzr, #0x1
|
|
; CHECK-GI-NEXT: and x8, x14, #0x1
|
|
; CHECK-GI-NEXT: add x10, x13, x15
|
|
; CHECK-GI-NEXT: adds x2, x11, x12
|
|
; CHECK-GI-NEXT: add x8, x10, x8
|
|
; CHECK-GI-NEXT: cset w10, hs
|
|
; CHECK-GI-NEXT: and x10, x10, #0x1
|
|
; CHECK-GI-NEXT: add x8, x9, x8
|
|
; CHECK-GI-NEXT: add x3, x8, x10
|
|
; CHECK-GI-NEXT: ret
|
|
; CHECK-GI-NEXT: .LBB10_5:
|
|
; CHECK-GI-NEXT: mov x0, xzr
|
|
; CHECK-GI-NEXT: mov x1, xzr
|
|
; CHECK-GI-NEXT: mov x2, xzr
|
|
; CHECK-GI-NEXT: mov x3, xzr
|
|
; CHECK-GI-NEXT: ret
|
|
; CHECK-GI-NEXT: .LBB10_6: // %fp-to-i-if-exp.large
|
|
; CHECK-GI-NEXT: sub x11, x11, #1075
|
|
; CHECK-GI-NEXT: mov w13, #64 // =0x40
|
|
; CHECK-GI-NEXT: mov w12, #128 // =0x80
|
|
; CHECK-GI-NEXT: sub x14, x11, #64
|
|
; CHECK-GI-NEXT: sub x15, x13, x11
|
|
; CHECK-GI-NEXT: lsl x16, x10, x11
|
|
; CHECK-GI-NEXT: lsr x15, x10, x15
|
|
; CHECK-GI-NEXT: lsl x14, x10, x14
|
|
; CHECK-GI-NEXT: sub x12, x12, x11
|
|
; CHECK-GI-NEXT: cmp x11, #64
|
|
; CHECK-GI-NEXT: sub x17, x11, #128
|
|
; CHECK-GI-NEXT: lsr x18, x10, x12
|
|
; CHECK-GI-NEXT: csel x16, x16, xzr, lo
|
|
; CHECK-GI-NEXT: csel x14, x15, x14, lo
|
|
; CHECK-GI-NEXT: cmp x11, #0
|
|
; CHECK-GI-NEXT: sub x15, x17, #64
|
|
; CHECK-GI-NEXT: csel x14, xzr, x14, eq
|
|
; CHECK-GI-NEXT: cmp x12, #64
|
|
; CHECK-GI-NEXT: sub x13, x13, x17
|
|
; CHECK-GI-NEXT: csel x18, x18, xzr, lo
|
|
; CHECK-GI-NEXT: cmp x12, #0
|
|
; CHECK-GI-NEXT: lsl x12, x10, x17
|
|
; CHECK-GI-NEXT: lsr x13, x10, x13
|
|
; CHECK-GI-NEXT: lsl x15, x10, x15
|
|
; CHECK-GI-NEXT: csel x18, x10, x18, eq
|
|
; CHECK-GI-NEXT: cmp x17, #64
|
|
; CHECK-GI-NEXT: csel x12, x12, xzr, lo
|
|
; CHECK-GI-NEXT: csel x10, x13, x15, lo
|
|
; CHECK-GI-NEXT: cmp x17, #0
|
|
; CHECK-GI-NEXT: csel x13, xzr, x10, eq
|
|
; CHECK-GI-NEXT: cmp x11, #128
|
|
; CHECK-GI-NEXT: csel x10, x16, xzr, lo
|
|
; CHECK-GI-NEXT: csel x14, x14, xzr, lo
|
|
; CHECK-GI-NEXT: csel x12, x18, x12, lo
|
|
; CHECK-GI-NEXT: csel x13, xzr, x13, lo
|
|
; CHECK-GI-NEXT: cmp x11, #0
|
|
; CHECK-GI-NEXT: umulh x11, x10, x9
|
|
; CHECK-GI-NEXT: csel x12, xzr, x12, eq
|
|
; CHECK-GI-NEXT: csel x13, xzr, x13, eq
|
|
; CHECK-GI-NEXT: umulh x18, x14, x9
|
|
; CHECK-GI-NEXT: umulh x17, x12, x8
|
|
; CHECK-GI-NEXT: umulh x15, x10, x8
|
|
; CHECK-GI-NEXT: add x18, x18, x11
|
|
; CHECK-GI-NEXT: mul x16, x10, x9
|
|
; CHECK-GI-NEXT: add x17, x17, x18
|
|
; CHECK-GI-NEXT: mul x0, x14, x8
|
|
; CHECK-GI-NEXT: madd x17, x10, x9, x17
|
|
; CHECK-GI-NEXT: adds x15, x15, x16
|
|
; CHECK-GI-NEXT: umulh x2, x14, x8
|
|
; CHECK-GI-NEXT: cset w3, hs
|
|
; CHECK-GI-NEXT: adds x1, x15, x0
|
|
; CHECK-GI-NEXT: mul x18, x14, x9
|
|
; CHECK-GI-NEXT: cset w15, hs
|
|
; CHECK-GI-NEXT: madd x14, x14, x9, x17
|
|
; CHECK-GI-NEXT: adds x11, x2, x11
|
|
; CHECK-GI-NEXT: mul x17, x12, x8
|
|
; CHECK-GI-NEXT: cset w0, hs
|
|
; CHECK-GI-NEXT: adds x11, x11, x16
|
|
; CHECK-GI-NEXT: and x16, x0, #0x1
|
|
; CHECK-GI-NEXT: madd x9, x12, x9, x14
|
|
; CHECK-GI-NEXT: and x12, x3, #0x1
|
|
; CHECK-GI-NEXT: and x14, x15, #0x1
|
|
; CHECK-GI-NEXT: cset w15, hs
|
|
; CHECK-GI-NEXT: adds x11, x11, x18
|
|
; CHECK-GI-NEXT: and x15, x15, #0x1
|
|
; CHECK-GI-NEXT: mul x0, x10, x8
|
|
; CHECK-GI-NEXT: add x10, x12, x14
|
|
; CHECK-GI-NEXT: cset w14, hs
|
|
; CHECK-GI-NEXT: adds x11, x11, x17
|
|
; CHECK-GI-NEXT: add x12, x16, x15
|
|
; CHECK-GI-NEXT: madd x8, x13, x8, x9
|
|
; CHECK-GI-NEXT: and x9, x14, #0x1
|
|
; CHECK-GI-NEXT: cset w13, hs
|
|
; CHECK-GI-NEXT: adds x2, x11, x10
|
|
; CHECK-GI-NEXT: add x9, x12, x9
|
|
; CHECK-GI-NEXT: and x10, x13, #0x1
|
|
; CHECK-GI-NEXT: cset w11, hs
|
|
; CHECK-GI-NEXT: add x9, x9, x10
|
|
; CHECK-GI-NEXT: and x10, x11, #0x1
|
|
; CHECK-GI-NEXT: add x9, x9, x10
|
|
; CHECK-GI-NEXT: add x3, x8, x9
|
|
; CHECK-GI-NEXT: ret
|
|
; CHECK-GI-NEXT: .LBB10_7: // %fp-to-i-if-saturate
|
|
; CHECK-GI-NEXT: cmp x8, #0
|
|
; CHECK-GI-NEXT: mov w9, wzr
|
|
; CHECK-GI-NEXT: cset w8, pl
|
|
; CHECK-GI-NEXT: cmp w9, #1
|
|
; CHECK-GI-NEXT: mov x9, #-9223372036854775808 // =0x8000000000000000
|
|
; CHECK-GI-NEXT: sbfx x0, x8, #0, #1
|
|
; CHECK-GI-NEXT: asr x8, x0, #63
|
|
; CHECK-GI-NEXT: adcs x1, x8, xzr
|
|
; CHECK-GI-NEXT: adcs x2, x8, xzr
|
|
; CHECK-GI-NEXT: adc x3, x8, x9
|
|
; CHECK-GI-NEXT: ret
|
|
%result = call i256 @llvm.fptosi.sat(double %val)
|
|
ret i256 %result
|
|
}
|
|
|
|
define i256 @f64_to_u256_sat(double %val) {
|
|
; CHECK-SD-LABEL: f64_to_u256_sat:
|
|
; CHECK-SD: // %bb.0: // %fp-to-i-entry
|
|
; CHECK-SD-NEXT: fmov x9, d0
|
|
; CHECK-SD-NEXT: mov x0, xzr
|
|
; CHECK-SD-NEXT: ubfx x8, x9, #52, #11
|
|
; CHECK-SD-NEXT: cmp x8, #1023
|
|
; CHECK-SD-NEXT: b.lo .LBB11_6
|
|
; CHECK-SD-NEXT: // %bb.1: // %fp-to-i-entry
|
|
; CHECK-SD-NEXT: fcmp d0, d0
|
|
; CHECK-SD-NEXT: b.vs .LBB11_6
|
|
; CHECK-SD-NEXT: // %bb.2: // %fp-to-i-entry
|
|
; CHECK-SD-NEXT: mov x1, x0
|
|
; CHECK-SD-NEXT: mov x2, x0
|
|
; CHECK-SD-NEXT: mov x3, x0
|
|
; CHECK-SD-NEXT: tbnz x9, #63, .LBB11_8
|
|
; CHECK-SD-NEXT: // %bb.3: // %fp-to-i-if-check.saturate
|
|
; CHECK-SD-NEXT: cmp x8, #1278
|
|
; CHECK-SD-NEXT: b.hi .LBB11_9
|
|
; CHECK-SD-NEXT: // %bb.4: // %fp-to-i-if-check.exp.size
|
|
; CHECK-SD-NEXT: mov x10, #4503599627370496 // =0x10000000000000
|
|
; CHECK-SD-NEXT: cmp x8, #1074
|
|
; CHECK-SD-NEXT: bfxil x10, x9, #0, #52
|
|
; CHECK-SD-NEXT: b.hi .LBB11_7
|
|
; CHECK-SD-NEXT: // %bb.5: // %fp-to-i-if-exp.small
|
|
; CHECK-SD-NEXT: mov w9, #1075 // =0x433
|
|
; CHECK-SD-NEXT: mov x1, xzr
|
|
; CHECK-SD-NEXT: mov x2, xzr
|
|
; CHECK-SD-NEXT: sub x8, x9, x8
|
|
; CHECK-SD-NEXT: mov x3, xzr
|
|
; CHECK-SD-NEXT: lsr x0, x10, x8
|
|
; CHECK-SD-NEXT: ret
|
|
; CHECK-SD-NEXT: .LBB11_6:
|
|
; CHECK-SD-NEXT: mov x1, x0
|
|
; CHECK-SD-NEXT: mov x2, x0
|
|
; CHECK-SD-NEXT: mov x3, x0
|
|
; CHECK-SD-NEXT: ret
|
|
; CHECK-SD-NEXT: .LBB11_7: // %fp-to-i-if-exp.large
|
|
; CHECK-SD-NEXT: sub sp, sp, #64
|
|
; CHECK-SD-NEXT: .cfi_def_cfa_offset 64
|
|
; CHECK-SD-NEXT: movi v0.2d, #0000000000000000
|
|
; CHECK-SD-NEXT: sub x8, x8, #1075
|
|
; CHECK-SD-NEXT: str x10, [sp, #32]
|
|
; CHECK-SD-NEXT: lsr x9, x8, #3
|
|
; CHECK-SD-NEXT: mov x10, sp
|
|
; CHECK-SD-NEXT: str xzr, [sp, #56]
|
|
; CHECK-SD-NEXT: add x10, x10, #32
|
|
; CHECK-SD-NEXT: and x13, x8, #0x3f
|
|
; CHECK-SD-NEXT: mvn w17, w8
|
|
; CHECK-SD-NEXT: and x9, x9, #0x18
|
|
; CHECK-SD-NEXT: eor x13, x13, #0x3f
|
|
; CHECK-SD-NEXT: stur q0, [sp, #40]
|
|
; CHECK-SD-NEXT: sub x9, x10, x9
|
|
; CHECK-SD-NEXT: stp q0, q0, [sp]
|
|
; CHECK-SD-NEXT: ldp x11, x10, [x9, #8]
|
|
; CHECK-SD-NEXT: ldr x12, [x9]
|
|
; CHECK-SD-NEXT: ldr x9, [x9, #24]
|
|
; CHECK-SD-NEXT: lsr x16, x12, #1
|
|
; CHECK-SD-NEXT: lsl x0, x12, x8
|
|
; CHECK-SD-NEXT: lsr x14, x10, #1
|
|
; CHECK-SD-NEXT: lsr x15, x11, #1
|
|
; CHECK-SD-NEXT: lsl x9, x9, x8
|
|
; CHECK-SD-NEXT: lsl x10, x10, x8
|
|
; CHECK-SD-NEXT: lsl x11, x11, x8
|
|
; CHECK-SD-NEXT: lsr x15, x15, x17
|
|
; CHECK-SD-NEXT: lsr x14, x14, x13
|
|
; CHECK-SD-NEXT: lsr x13, x16, x13
|
|
; CHECK-SD-NEXT: orr x3, x9, x14
|
|
; CHECK-SD-NEXT: orr x2, x10, x15
|
|
; CHECK-SD-NEXT: orr x1, x11, x13
|
|
; CHECK-SD-NEXT: add sp, sp, #64
|
|
; CHECK-SD-NEXT: .LBB11_8: // %fp-to-i-cleanup
|
|
; CHECK-SD-NEXT: ret
|
|
; CHECK-SD-NEXT: .LBB11_9:
|
|
; CHECK-SD-NEXT: mov x0, #-1 // =0xffffffffffffffff
|
|
; CHECK-SD-NEXT: mov x1, #-1 // =0xffffffffffffffff
|
|
; CHECK-SD-NEXT: mov x2, #-1 // =0xffffffffffffffff
|
|
; CHECK-SD-NEXT: mov x3, #-1 // =0xffffffffffffffff
|
|
; CHECK-SD-NEXT: ret
|
|
;
|
|
; CHECK-GI-LABEL: f64_to_u256_sat:
|
|
; CHECK-GI: // %bb.0: // %fp-to-i-entry
|
|
; CHECK-GI-NEXT: fmov x8, d0
|
|
; CHECK-GI-NEXT: mov x0, xzr
|
|
; CHECK-GI-NEXT: ubfx x9, x8, #52, #11
|
|
; CHECK-GI-NEXT: cmp x9, #1023
|
|
; CHECK-GI-NEXT: b.lo .LBB11_6
|
|
; CHECK-GI-NEXT: // %bb.1: // %fp-to-i-entry
|
|
; CHECK-GI-NEXT: fcmp d0, d0
|
|
; CHECK-GI-NEXT: b.vs .LBB11_6
|
|
; CHECK-GI-NEXT: // %bb.2: // %fp-to-i-entry
|
|
; CHECK-GI-NEXT: mov x1, x0
|
|
; CHECK-GI-NEXT: mov x2, x0
|
|
; CHECK-GI-NEXT: mov x3, x0
|
|
; CHECK-GI-NEXT: tbnz x8, #63, .LBB11_8
|
|
; CHECK-GI-NEXT: // %bb.3: // %fp-to-i-if-check.saturate
|
|
; CHECK-GI-NEXT: cmp x9, #1279
|
|
; CHECK-GI-NEXT: b.hs .LBB11_9
|
|
; CHECK-GI-NEXT: // %bb.4: // %fp-to-i-if-check.exp.size
|
|
; CHECK-GI-NEXT: and x8, x8, #0xfffffffffffff
|
|
; CHECK-GI-NEXT: cmp x9, #1075
|
|
; CHECK-GI-NEXT: orr x8, x8, #0x10000000000000
|
|
; CHECK-GI-NEXT: b.hs .LBB11_7
|
|
; CHECK-GI-NEXT: // %bb.5: // %fp-to-i-if-exp.small
|
|
; CHECK-GI-NEXT: mov w10, #1075 // =0x433
|
|
; CHECK-GI-NEXT: mov x1, xzr
|
|
; CHECK-GI-NEXT: mov x2, xzr
|
|
; CHECK-GI-NEXT: sub x9, x10, x9
|
|
; CHECK-GI-NEXT: mov x3, xzr
|
|
; CHECK-GI-NEXT: lsr x0, x8, x9
|
|
; CHECK-GI-NEXT: ret
|
|
; CHECK-GI-NEXT: .LBB11_6:
|
|
; CHECK-GI-NEXT: mov x1, x0
|
|
; CHECK-GI-NEXT: mov x2, x0
|
|
; CHECK-GI-NEXT: mov x3, x0
|
|
; CHECK-GI-NEXT: ret
|
|
; CHECK-GI-NEXT: .LBB11_7: // %fp-to-i-if-exp.large
|
|
; CHECK-GI-NEXT: sub x9, x9, #1075
|
|
; CHECK-GI-NEXT: mov w11, #64 // =0x40
|
|
; CHECK-GI-NEXT: mov w10, #128 // =0x80
|
|
; CHECK-GI-NEXT: sub x12, x9, #64
|
|
; CHECK-GI-NEXT: sub x13, x11, x9
|
|
; CHECK-GI-NEXT: lsl x14, x8, x9
|
|
; CHECK-GI-NEXT: lsr x13, x8, x13
|
|
; CHECK-GI-NEXT: lsl x12, x8, x12
|
|
; CHECK-GI-NEXT: sub x10, x10, x9
|
|
; CHECK-GI-NEXT: cmp x9, #64
|
|
; CHECK-GI-NEXT: sub x15, x9, #128
|
|
; CHECK-GI-NEXT: lsr x16, x8, x10
|
|
; CHECK-GI-NEXT: csel x14, x14, xzr, lo
|
|
; CHECK-GI-NEXT: csel x12, x13, x12, lo
|
|
; CHECK-GI-NEXT: cmp x9, #0
|
|
; CHECK-GI-NEXT: sub x13, x15, #64
|
|
; CHECK-GI-NEXT: csel x12, xzr, x12, eq
|
|
; CHECK-GI-NEXT: cmp x10, #64
|
|
; CHECK-GI-NEXT: sub x11, x11, x15
|
|
; CHECK-GI-NEXT: csel x16, x16, xzr, lo
|
|
; CHECK-GI-NEXT: cmp x10, #0
|
|
; CHECK-GI-NEXT: lsl x10, x8, x15
|
|
; CHECK-GI-NEXT: lsr x11, x8, x11
|
|
; CHECK-GI-NEXT: lsl x13, x8, x13
|
|
; CHECK-GI-NEXT: csel x8, x8, x16, eq
|
|
; CHECK-GI-NEXT: cmp x15, #64
|
|
; CHECK-GI-NEXT: csel x10, x10, xzr, lo
|
|
; CHECK-GI-NEXT: csel x11, x11, x13, lo
|
|
; CHECK-GI-NEXT: cmp x15, #0
|
|
; CHECK-GI-NEXT: csel x11, xzr, x11, eq
|
|
; CHECK-GI-NEXT: cmp x9, #128
|
|
; CHECK-GI-NEXT: csel x0, x14, xzr, lo
|
|
; CHECK-GI-NEXT: csel x1, x12, xzr, lo
|
|
; CHECK-GI-NEXT: csel x8, x8, x10, lo
|
|
; CHECK-GI-NEXT: csel x10, xzr, x11, lo
|
|
; CHECK-GI-NEXT: cmp x9, #0
|
|
; CHECK-GI-NEXT: csel x2, xzr, x8, eq
|
|
; CHECK-GI-NEXT: csel x3, xzr, x10, eq
|
|
; CHECK-GI-NEXT: .LBB11_8: // %fp-to-i-cleanup
|
|
; CHECK-GI-NEXT: ret
|
|
; CHECK-GI-NEXT: .LBB11_9:
|
|
; CHECK-GI-NEXT: mov x0, #-1 // =0xffffffffffffffff
|
|
; CHECK-GI-NEXT: mov x1, #-1 // =0xffffffffffffffff
|
|
; CHECK-GI-NEXT: mov x2, #-1 // =0xffffffffffffffff
|
|
; CHECK-GI-NEXT: mov x3, #-1 // =0xffffffffffffffff
|
|
; CHECK-GI-NEXT: ret
|
|
%result = call i256 @llvm.fptoui.sat(double %val)
|
|
ret i256 %result
|
|
}
|