269 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=thumbv6-none-eabi -float-abi=soft %s -o - | FileCheck %s --check-prefixes=SOFT3; RUN: llc -mtriple=thumbv7-none-eabi -mattr=+vfp2 %s -o - | FileCheck %s --check-prefixes=VFP,VFP24; RUN: llc -mtriple=thumbv8.1m.main-eabi -mattr=+fullfp16,+fp64 %s -o - | FileCheck %s --check-prefixes=VFP,FP165 6declare i32 @llvm.fptosi.sat.i32.f64(double)7declare i32 @llvm.fptosi.sat.i32.f32(float)8declare i32 @llvm.fptoui.sat.i32.f64(double)9declare i32 @llvm.fptoui.sat.i32.f32(float)10 11define void @test_signed_i32_f32(ptr %d, float %f) nounwind {12; SOFT-LABEL: test_signed_i32_f32:13; SOFT: @ %bb.0:14; SOFT-NEXT: .save {r4, r5, r6, r7, lr}15; SOFT-NEXT: push {r4, r5, r6, r7, lr}16; SOFT-NEXT: .pad #417; SOFT-NEXT: sub sp, #418; SOFT-NEXT: mov r5, r119; SOFT-NEXT: mov r4, r020; SOFT-NEXT: movs r0, #20721; SOFT-NEXT: lsls r1, r0, #2422; SOFT-NEXT: mov r0, r523; SOFT-NEXT: bl __aeabi_fcmpge24; SOFT-NEXT: mov r7, r025; SOFT-NEXT: mov r0, r526; SOFT-NEXT: bl __aeabi_f2iz27; SOFT-NEXT: cmp r7, #028; SOFT-NEXT: beq .LBB0_229; SOFT-NEXT: @ %bb.1:30; SOFT-NEXT: mov r6, r031; SOFT-NEXT: b .LBB0_332; SOFT-NEXT: .LBB0_2:33; SOFT-NEXT: movs r0, #134; SOFT-NEXT: lsls r6, r0, #3135; SOFT-NEXT: .LBB0_3:36; SOFT-NEXT: ldr r1, .LCPI0_037; SOFT-NEXT: mov r0, r538; SOFT-NEXT: bl __aeabi_fcmpgt39; SOFT-NEXT: cmp r0, #040; SOFT-NEXT: beq .LBB0_541; SOFT-NEXT: @ %bb.4:42; SOFT-NEXT: ldr r6, .LCPI0_143; SOFT-NEXT: .LBB0_5:44; SOFT-NEXT: mov r0, r545; SOFT-NEXT: mov r1, r546; SOFT-NEXT: bl __aeabi_fcmpun47; SOFT-NEXT: cmp r0, #048; SOFT-NEXT: beq .LBB0_749; SOFT-NEXT: @ %bb.6:50; SOFT-NEXT: movs r6, #051; SOFT-NEXT: .LBB0_7:52; SOFT-NEXT: str r6, [r4]53; SOFT-NEXT: add sp, #454; SOFT-NEXT: pop {r4, r5, r6, r7, pc}55; SOFT-NEXT: .p2align 256; SOFT-NEXT: @ %bb.8:57; SOFT-NEXT: .LCPI0_0:58; SOFT-NEXT: .long 1325400063 @ 0x4effffff59; SOFT-NEXT: .LCPI0_1:60; SOFT-NEXT: .long 2147483647 @ 0x7fffffff61;62; VFP-LABEL: test_signed_i32_f32:63; VFP: @ %bb.0:64; VFP-NEXT: vmov s0, r165; VFP-NEXT: vcvt.s32.f32 s0, s066; VFP-NEXT: vstr s0, [r0]67; VFP-NEXT: bx lr68 %r = call i32 @llvm.fptosi.sat.i32.f32(float %f)69 store i32 %r, ptr %d, align 470 ret void71}72 73define void @test_signed_i32_f64(ptr %d, double %f) nounwind {74; SOFT-LABEL: test_signed_i32_f64:75; SOFT: @ %bb.0:76; SOFT-NEXT: .save {r4, r5, r6, r7, lr}77; SOFT-NEXT: push {r4, r5, r6, r7, lr}78; SOFT-NEXT: .pad #479; SOFT-NEXT: sub sp, #480; SOFT-NEXT: mov r6, r381; SOFT-NEXT: mov r7, r282; SOFT-NEXT: str r0, [sp] @ 4-byte Spill83; SOFT-NEXT: movs r5, #084; SOFT-NEXT: ldr r3, .LCPI1_085; SOFT-NEXT: mov r0, r286; SOFT-NEXT: mov r1, r687; SOFT-NEXT: mov r2, r588; SOFT-NEXT: bl __aeabi_dcmpge89; SOFT-NEXT: mov r4, r090; SOFT-NEXT: mov r0, r791; SOFT-NEXT: mov r1, r692; SOFT-NEXT: bl __aeabi_d2iz93; SOFT-NEXT: cmp r4, #094; SOFT-NEXT: beq .LBB1_295; SOFT-NEXT: @ %bb.1:96; SOFT-NEXT: mov r4, r097; SOFT-NEXT: b .LBB1_398; SOFT-NEXT: .LBB1_2:99; SOFT-NEXT: movs r0, #1100; SOFT-NEXT: lsls r4, r0, #31101; SOFT-NEXT: .LBB1_3:102; SOFT-NEXT: ldr r2, .LCPI1_1103; SOFT-NEXT: ldr r3, .LCPI1_2104; SOFT-NEXT: mov r0, r7105; SOFT-NEXT: mov r1, r6106; SOFT-NEXT: bl __aeabi_dcmpgt107; SOFT-NEXT: cmp r0, #0108; SOFT-NEXT: beq .LBB1_5109; SOFT-NEXT: @ %bb.4:110; SOFT-NEXT: ldr r4, .LCPI1_3111; SOFT-NEXT: .LBB1_5:112; SOFT-NEXT: mov r0, r7113; SOFT-NEXT: mov r1, r6114; SOFT-NEXT: mov r2, r7115; SOFT-NEXT: mov r3, r6116; SOFT-NEXT: bl __aeabi_dcmpun117; SOFT-NEXT: cmp r0, #0118; SOFT-NEXT: bne .LBB1_7119; SOFT-NEXT: @ %bb.6:120; SOFT-NEXT: mov r5, r4121; SOFT-NEXT: .LBB1_7:122; SOFT-NEXT: ldr r0, [sp] @ 4-byte Reload123; SOFT-NEXT: str r5, [r0]124; SOFT-NEXT: add sp, #4125; SOFT-NEXT: pop {r4, r5, r6, r7, pc}126; SOFT-NEXT: .p2align 2127; SOFT-NEXT: @ %bb.8:128; SOFT-NEXT: .LCPI1_0:129; SOFT-NEXT: .long 3252682752 @ 0xc1e00000130; SOFT-NEXT: .LCPI1_1:131; SOFT-NEXT: .long 4290772992 @ 0xffc00000132; SOFT-NEXT: .LCPI1_2:133; SOFT-NEXT: .long 1105199103 @ 0x41dfffff134; SOFT-NEXT: .LCPI1_3:135; SOFT-NEXT: .long 2147483647 @ 0x7fffffff136;137; VFP2-LABEL: test_signed_i32_f64:138; VFP2: @ %bb.0:139; VFP2-NEXT: vmov d16, r2, r3140; VFP2-NEXT: vcvt.s32.f64 s0, d16141; VFP2-NEXT: vstr s0, [r0]142; VFP2-NEXT: bx lr143;144; FP16-LABEL: test_signed_i32_f64:145; FP16: @ %bb.0:146; FP16-NEXT: vmov d0, r2, r3147; FP16-NEXT: vcvt.s32.f64 s0, d0148; FP16-NEXT: vstr s0, [r0]149; FP16-NEXT: bx lr150 %r = call i32 @llvm.fptosi.sat.i32.f64(double %f)151 store i32 %r, ptr %d, align 4152 ret void153}154 155define void @test_unsigned_i32_f32(ptr %d, float %f) nounwind {156; SOFT-LABEL: test_unsigned_i32_f32:157; SOFT: @ %bb.0:158; SOFT-NEXT: .save {r4, r5, r6, r7, lr}159; SOFT-NEXT: push {r4, r5, r6, r7, lr}160; SOFT-NEXT: .pad #4161; SOFT-NEXT: sub sp, #4162; SOFT-NEXT: mov r6, r1163; SOFT-NEXT: str r0, [sp] @ 4-byte Spill164; SOFT-NEXT: movs r5, #0165; SOFT-NEXT: mov r0, r1166; SOFT-NEXT: mov r1, r5167; SOFT-NEXT: bl __aeabi_fcmpge168; SOFT-NEXT: mov r7, r0169; SOFT-NEXT: mov r0, r6170; SOFT-NEXT: bl __aeabi_f2uiz171; SOFT-NEXT: mov r4, r0172; SOFT-NEXT: cmp r7, #0173; SOFT-NEXT: bne .LBB2_2174; SOFT-NEXT: @ %bb.1:175; SOFT-NEXT: mov r4, r7176; SOFT-NEXT: .LBB2_2:177; SOFT-NEXT: ldr r1, .LCPI2_0178; SOFT-NEXT: mov r0, r6179; SOFT-NEXT: bl __aeabi_fcmpgt180; SOFT-NEXT: cmp r0, #0181; SOFT-NEXT: beq .LBB2_4182; SOFT-NEXT: @ %bb.3:183; SOFT-NEXT: mvns r4, r5184; SOFT-NEXT: .LBB2_4:185; SOFT-NEXT: ldr r0, [sp] @ 4-byte Reload186; SOFT-NEXT: str r4, [r0]187; SOFT-NEXT: add sp, #4188; SOFT-NEXT: pop {r4, r5, r6, r7, pc}189; SOFT-NEXT: .p2align 2190; SOFT-NEXT: @ %bb.5:191; SOFT-NEXT: .LCPI2_0:192; SOFT-NEXT: .long 1333788671 @ 0x4f7fffff193;194; VFP-LABEL: test_unsigned_i32_f32:195; VFP: @ %bb.0:196; VFP-NEXT: vmov s0, r1197; VFP-NEXT: vcvt.u32.f32 s0, s0198; VFP-NEXT: vstr s0, [r0]199; VFP-NEXT: bx lr200 %r = call i32 @llvm.fptoui.sat.i32.f32(float %f)201 store i32 %r, ptr %d, align 4202 ret void203}204 205define void @test_unsigned_i32_f64(ptr %d, double %f) nounwind {206; SOFT-LABEL: test_unsigned_i32_f64:207; SOFT: @ %bb.0:208; SOFT-NEXT: .save {r4, r5, r6, r7, lr}209; SOFT-NEXT: push {r4, r5, r6, r7, lr}210; SOFT-NEXT: .pad #4211; SOFT-NEXT: sub sp, #4212; SOFT-NEXT: mov r6, r3213; SOFT-NEXT: mov r7, r2214; SOFT-NEXT: str r0, [sp] @ 4-byte Spill215; SOFT-NEXT: movs r5, #0216; SOFT-NEXT: mov r0, r2217; SOFT-NEXT: mov r1, r3218; SOFT-NEXT: mov r2, r5219; SOFT-NEXT: mov r3, r5220; SOFT-NEXT: bl __aeabi_dcmpge221; SOFT-NEXT: mov r4, r0222; SOFT-NEXT: mov r0, r7223; SOFT-NEXT: mov r1, r6224; SOFT-NEXT: bl __aeabi_d2uiz225; SOFT-NEXT: cmp r4, #0226; SOFT-NEXT: bne .LBB3_2227; SOFT-NEXT: @ %bb.1:228; SOFT-NEXT: mov r0, r4229; SOFT-NEXT: .LBB3_2:230; SOFT-NEXT: mov r4, r0231; SOFT-NEXT: ldr r2, .LCPI3_0232; SOFT-NEXT: ldr r3, .LCPI3_1233; SOFT-NEXT: mov r0, r7234; SOFT-NEXT: mov r1, r6235; SOFT-NEXT: bl __aeabi_dcmpgt236; SOFT-NEXT: cmp r0, #0237; SOFT-NEXT: beq .LBB3_4238; SOFT-NEXT: @ %bb.3:239; SOFT-NEXT: mvns r4, r5240; SOFT-NEXT: .LBB3_4:241; SOFT-NEXT: ldr r0, [sp] @ 4-byte Reload242; SOFT-NEXT: str r4, [r0]243; SOFT-NEXT: add sp, #4244; SOFT-NEXT: pop {r4, r5, r6, r7, pc}245; SOFT-NEXT: .p2align 2246; SOFT-NEXT: @ %bb.5:247; SOFT-NEXT: .LCPI3_0:248; SOFT-NEXT: .long 4292870144 @ 0xffe00000249; SOFT-NEXT: .LCPI3_1:250; SOFT-NEXT: .long 1106247679 @ 0x41efffff251;252; VFP2-LABEL: test_unsigned_i32_f64:253; VFP2: @ %bb.0:254; VFP2-NEXT: vmov d16, r2, r3255; VFP2-NEXT: vcvt.u32.f64 s0, d16256; VFP2-NEXT: vstr s0, [r0]257; VFP2-NEXT: bx lr258;259; FP16-LABEL: test_unsigned_i32_f64:260; FP16: @ %bb.0:261; FP16-NEXT: vmov d0, r2, r3262; FP16-NEXT: vcvt.u32.f64 s0, d0263; FP16-NEXT: vstr s0, [r0]264; FP16-NEXT: bx lr265 %r = call i32 @llvm.fptoui.sat.i32.f64(double %f)266 store i32 %r, ptr %d, align 4267 ret void268}269