blob: b007115130b9967edca2e19de6afa4463781a833 [file] [log] [blame]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=thumbv6-none-eabi -float-abi=soft %s -o - | FileCheck %s --check-prefixes=SOFT
; RUN: llc -mtriple=thumbv7-none-eabi -mattr=+vfp2 %s -o - | FileCheck %s --check-prefixes=VFP,VFP2
; RUN: llc -mtriple=thumbv8.1m.main-eabi -mattr=+fullfp16,+fp64 %s -o - | FileCheck %s --check-prefixes=VFP,FP16
declare i32 @llvm.fptosi.sat.i32.f64(double)
declare i32 @llvm.fptosi.sat.i32.f32(float)
declare i32 @llvm.fptoui.sat.i32.f64(double)
declare i32 @llvm.fptoui.sat.i32.f32(float)
define void @test_signed_i32_f32(i32* %d, float %f) nounwind {
; SOFT-LABEL: test_signed_i32_f32:
; SOFT: @ %bb.0:
; SOFT-NEXT: .save {r4, r5, r6, r7, lr}
; SOFT-NEXT: push {r4, r5, r6, r7, lr}
; SOFT-NEXT: .pad #4
; SOFT-NEXT: sub sp, #4
; SOFT-NEXT: mov r5, r1
; SOFT-NEXT: mov r4, r0
; SOFT-NEXT: movs r0, #207
; SOFT-NEXT: lsls r1, r0, #24
; SOFT-NEXT: mov r0, r5
; SOFT-NEXT: bl __aeabi_fcmpge
; SOFT-NEXT: mov r7, r0
; SOFT-NEXT: mov r0, r5
; SOFT-NEXT: bl __aeabi_f2iz
; SOFT-NEXT: cmp r7, #0
; SOFT-NEXT: beq .LBB0_2
; SOFT-NEXT: @ %bb.1:
; SOFT-NEXT: mov r6, r0
; SOFT-NEXT: b .LBB0_3
; SOFT-NEXT: .LBB0_2:
; SOFT-NEXT: movs r0, #1
; SOFT-NEXT: lsls r6, r0, #31
; SOFT-NEXT: .LBB0_3:
; SOFT-NEXT: ldr r1, .LCPI0_0
; SOFT-NEXT: mov r0, r5
; SOFT-NEXT: bl __aeabi_fcmpgt
; SOFT-NEXT: cmp r0, #0
; SOFT-NEXT: beq .LBB0_5
; SOFT-NEXT: @ %bb.4:
; SOFT-NEXT: ldr r6, .LCPI0_1
; SOFT-NEXT: .LBB0_5:
; SOFT-NEXT: mov r0, r5
; SOFT-NEXT: mov r1, r5
; SOFT-NEXT: bl __aeabi_fcmpun
; SOFT-NEXT: cmp r0, #0
; SOFT-NEXT: beq .LBB0_7
; SOFT-NEXT: @ %bb.6:
; SOFT-NEXT: movs r6, #0
; SOFT-NEXT: .LBB0_7:
; SOFT-NEXT: str r6, [r4]
; SOFT-NEXT: add sp, #4
; SOFT-NEXT: pop {r4, r5, r6, r7, pc}
; SOFT-NEXT: .p2align 2
; SOFT-NEXT: @ %bb.8:
; SOFT-NEXT: .LCPI0_0:
; SOFT-NEXT: .long 1325400063 @ 0x4effffff
; SOFT-NEXT: .LCPI0_1:
; SOFT-NEXT: .long 2147483647 @ 0x7fffffff
;
; VFP-LABEL: test_signed_i32_f32:
; VFP: @ %bb.0:
; VFP-NEXT: vmov s0, r1
; VFP-NEXT: vcvt.s32.f32 s0, s0
; VFP-NEXT: vstr s0, [r0]
; VFP-NEXT: bx lr
%r = call i32 @llvm.fptosi.sat.i32.f32(float %f)
store i32 %r, i32* %d, align 4
ret void
}
define void @test_signed_i32_f64(i32* %d, double %f) nounwind {
; SOFT-LABEL: test_signed_i32_f64:
; SOFT: @ %bb.0:
; SOFT-NEXT: .save {r4, r5, r6, r7, lr}
; SOFT-NEXT: push {r4, r5, r6, r7, lr}
; SOFT-NEXT: .pad #12
; SOFT-NEXT: sub sp, #12
; SOFT-NEXT: mov r5, r3
; SOFT-NEXT: mov r6, r2
; SOFT-NEXT: str r0, [sp, #8] @ 4-byte Spill
; SOFT-NEXT: ldr r2, .LCPI1_0
; SOFT-NEXT: ldr r3, .LCPI1_1
; SOFT-NEXT: mov r0, r6
; SOFT-NEXT: mov r1, r5
; SOFT-NEXT: bl __aeabi_dcmpgt
; SOFT-NEXT: str r0, [sp, #4] @ 4-byte Spill
; SOFT-NEXT: movs r7, #0
; SOFT-NEXT: ldr r3, .LCPI1_2
; SOFT-NEXT: mov r0, r6
; SOFT-NEXT: mov r1, r5
; SOFT-NEXT: mov r2, r7
; SOFT-NEXT: bl __aeabi_dcmpge
; SOFT-NEXT: mov r4, r0
; SOFT-NEXT: mov r0, r6
; SOFT-NEXT: mov r1, r5
; SOFT-NEXT: bl __aeabi_d2iz
; SOFT-NEXT: cmp r4, #0
; SOFT-NEXT: bne .LBB1_2
; SOFT-NEXT: @ %bb.1:
; SOFT-NEXT: movs r0, #1
; SOFT-NEXT: lsls r0, r0, #31
; SOFT-NEXT: .LBB1_2:
; SOFT-NEXT: ldr r1, [sp, #4] @ 4-byte Reload
; SOFT-NEXT: cmp r1, #0
; SOFT-NEXT: bne .LBB1_4
; SOFT-NEXT: @ %bb.3:
; SOFT-NEXT: mov r4, r0
; SOFT-NEXT: b .LBB1_5
; SOFT-NEXT: .LBB1_4:
; SOFT-NEXT: ldr r4, .LCPI1_3
; SOFT-NEXT: .LBB1_5:
; SOFT-NEXT: mov r0, r6
; SOFT-NEXT: mov r1, r5
; SOFT-NEXT: mov r2, r6
; SOFT-NEXT: mov r3, r5
; SOFT-NEXT: bl __aeabi_dcmpun
; SOFT-NEXT: cmp r0, #0
; SOFT-NEXT: bne .LBB1_7
; SOFT-NEXT: @ %bb.6:
; SOFT-NEXT: mov r7, r4
; SOFT-NEXT: .LBB1_7:
; SOFT-NEXT: ldr r0, [sp, #8] @ 4-byte Reload
; SOFT-NEXT: str r7, [r0]
; SOFT-NEXT: add sp, #12
; SOFT-NEXT: pop {r4, r5, r6, r7, pc}
; SOFT-NEXT: .p2align 2
; SOFT-NEXT: @ %bb.8:
; SOFT-NEXT: .LCPI1_0:
; SOFT-NEXT: .long 4290772992 @ 0xffc00000
; SOFT-NEXT: .LCPI1_1:
; SOFT-NEXT: .long 1105199103 @ 0x41dfffff
; SOFT-NEXT: .LCPI1_2:
; SOFT-NEXT: .long 3252682752 @ 0xc1e00000
; SOFT-NEXT: .LCPI1_3:
; SOFT-NEXT: .long 2147483647 @ 0x7fffffff
;
; VFP2-LABEL: test_signed_i32_f64:
; VFP2: @ %bb.0:
; VFP2-NEXT: vmov d16, r2, r3
; VFP2-NEXT: vcvt.s32.f64 s0, d16
; VFP2-NEXT: vstr s0, [r0]
; VFP2-NEXT: bx lr
;
; FP16-LABEL: test_signed_i32_f64:
; FP16: @ %bb.0:
; FP16-NEXT: vmov d0, r2, r3
; FP16-NEXT: vcvt.s32.f64 s0, d0
; FP16-NEXT: vstr s0, [r0]
; FP16-NEXT: bx lr
%r = call i32 @llvm.fptosi.sat.i32.f64(double %f)
store i32 %r, i32* %d, align 4
ret void
}
define void @test_unsigned_i32_f32(i32* %d, float %f) nounwind {
; SOFT-LABEL: test_unsigned_i32_f32:
; SOFT: @ %bb.0:
; SOFT-NEXT: .save {r4, r5, r6, r7, lr}
; SOFT-NEXT: push {r4, r5, r6, r7, lr}
; SOFT-NEXT: .pad #4
; SOFT-NEXT: sub sp, #4
; SOFT-NEXT: mov r7, r1
; SOFT-NEXT: str r0, [sp] @ 4-byte Spill
; SOFT-NEXT: ldr r1, .LCPI2_0
; SOFT-NEXT: mov r0, r7
; SOFT-NEXT: bl __aeabi_fcmpgt
; SOFT-NEXT: mov r6, r0
; SOFT-NEXT: movs r5, #0
; SOFT-NEXT: mov r0, r7
; SOFT-NEXT: mov r1, r5
; SOFT-NEXT: bl __aeabi_fcmpge
; SOFT-NEXT: mov r4, r0
; SOFT-NEXT: mov r0, r7
; SOFT-NEXT: bl __aeabi_f2uiz
; SOFT-NEXT: cmp r4, #0
; SOFT-NEXT: bne .LBB2_2
; SOFT-NEXT: @ %bb.1:
; SOFT-NEXT: mov r0, r4
; SOFT-NEXT: .LBB2_2:
; SOFT-NEXT: cmp r6, #0
; SOFT-NEXT: beq .LBB2_4
; SOFT-NEXT: @ %bb.3:
; SOFT-NEXT: mvns r0, r5
; SOFT-NEXT: .LBB2_4:
; SOFT-NEXT: ldr r1, [sp] @ 4-byte Reload
; SOFT-NEXT: str r0, [r1]
; SOFT-NEXT: add sp, #4
; SOFT-NEXT: pop {r4, r5, r6, r7, pc}
; SOFT-NEXT: .p2align 2
; SOFT-NEXT: @ %bb.5:
; SOFT-NEXT: .LCPI2_0:
; SOFT-NEXT: .long 1333788671 @ 0x4f7fffff
;
; VFP-LABEL: test_unsigned_i32_f32:
; VFP: @ %bb.0:
; VFP-NEXT: vmov s0, r1
; VFP-NEXT: vcvt.u32.f32 s0, s0
; VFP-NEXT: vstr s0, [r0]
; VFP-NEXT: bx lr
%r = call i32 @llvm.fptoui.sat.i32.f32(float %f)
store i32 %r, i32* %d, align 4
ret void
}
define void @test_unsigned_i32_f64(i32* %d, double %f) nounwind {
; SOFT-LABEL: test_unsigned_i32_f64:
; SOFT: @ %bb.0:
; SOFT-NEXT: .save {r4, r5, r6, r7, lr}
; SOFT-NEXT: push {r4, r5, r6, r7, lr}
; SOFT-NEXT: .pad #12
; SOFT-NEXT: sub sp, #12
; SOFT-NEXT: mov r5, r3
; SOFT-NEXT: mov r4, r2
; SOFT-NEXT: str r0, [sp, #8] @ 4-byte Spill
; SOFT-NEXT: ldr r2, .LCPI3_0
; SOFT-NEXT: ldr r3, .LCPI3_1
; SOFT-NEXT: mov r0, r4
; SOFT-NEXT: mov r1, r5
; SOFT-NEXT: bl __aeabi_dcmpgt
; SOFT-NEXT: str r0, [sp, #4] @ 4-byte Spill
; SOFT-NEXT: movs r6, #0
; SOFT-NEXT: mov r0, r4
; SOFT-NEXT: mov r1, r5
; SOFT-NEXT: mov r2, r6
; SOFT-NEXT: mov r3, r6
; SOFT-NEXT: bl __aeabi_dcmpge
; SOFT-NEXT: mov r7, r0
; SOFT-NEXT: mov r0, r4
; SOFT-NEXT: mov r1, r5
; SOFT-NEXT: bl __aeabi_d2uiz
; SOFT-NEXT: cmp r7, #0
; SOFT-NEXT: bne .LBB3_2
; SOFT-NEXT: @ %bb.1:
; SOFT-NEXT: mov r0, r7
; SOFT-NEXT: .LBB3_2:
; SOFT-NEXT: ldr r1, [sp, #4] @ 4-byte Reload
; SOFT-NEXT: cmp r1, #0
; SOFT-NEXT: beq .LBB3_4
; SOFT-NEXT: @ %bb.3:
; SOFT-NEXT: mvns r0, r6
; SOFT-NEXT: .LBB3_4:
; SOFT-NEXT: ldr r1, [sp, #8] @ 4-byte Reload
; SOFT-NEXT: str r0, [r1]
; SOFT-NEXT: add sp, #12
; SOFT-NEXT: pop {r4, r5, r6, r7, pc}
; SOFT-NEXT: .p2align 2
; SOFT-NEXT: @ %bb.5:
; SOFT-NEXT: .LCPI3_0:
; SOFT-NEXT: .long 4292870144 @ 0xffe00000
; SOFT-NEXT: .LCPI3_1:
; SOFT-NEXT: .long 1106247679 @ 0x41efffff
;
; VFP2-LABEL: test_unsigned_i32_f64:
; VFP2: @ %bb.0:
; VFP2-NEXT: vmov d16, r2, r3
; VFP2-NEXT: vcvt.u32.f64 s0, d16
; VFP2-NEXT: vstr s0, [r0]
; VFP2-NEXT: bx lr
;
; FP16-LABEL: test_unsigned_i32_f64:
; FP16: @ %bb.0:
; FP16-NEXT: vmov d0, r2, r3
; FP16-NEXT: vcvt.u32.f64 s0, d0
; FP16-NEXT: vstr s0, [r0]
; FP16-NEXT: bx lr
%r = call i32 @llvm.fptoui.sat.i32.f64(double %f)
store i32 %r, i32* %d, align 4
ret void
}