1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=thumbv6-none-eabi -float-abi=soft %s -o - | FileCheck %s --check-prefixes=SOFT 3; RUN: llc -mtriple=thumbv7-none-eabi -mattr=+vfp2 %s -o - | FileCheck %s --check-prefixes=VFP,VFP2 4; RUN: llc -mtriple=thumbv8.1m.main-eabi -mattr=+fullfp16,+fp64 %s -o - | FileCheck %s --check-prefixes=VFP,FP16 5 6; 7; 32-bit float to signed integer 8; 9 10declare i1 @llvm.fptosi.sat.i1.f32 (float) 11declare i8 @llvm.fptosi.sat.i8.f32 (float) 12declare i13 @llvm.fptosi.sat.i13.f32 (float) 13declare i16 @llvm.fptosi.sat.i16.f32 (float) 14declare i19 @llvm.fptosi.sat.i19.f32 (float) 15declare i32 @llvm.fptosi.sat.i32.f32 (float) 16declare i50 @llvm.fptosi.sat.i50.f32 (float) 17declare i64 @llvm.fptosi.sat.i64.f32 (float) 18declare i100 @llvm.fptosi.sat.i100.f32(float) 19declare i128 @llvm.fptosi.sat.i128.f32(float) 20 21define i1 @test_signed_i1_f32(float %f) nounwind { 22; SOFT-LABEL: test_signed_i1_f32: 23; SOFT: @ %bb.0: 24; SOFT-NEXT: .save {r4, r5, r6, r7, lr} 25; SOFT-NEXT: push {r4, r5, r6, r7, lr} 26; SOFT-NEXT: .pad #4 27; SOFT-NEXT: sub sp, #4 28; SOFT-NEXT: mov r4, r0 29; SOFT-NEXT: ldr r1, .LCPI0_0 30; SOFT-NEXT: bl __aeabi_fcmpge 31; SOFT-NEXT: mov r7, r0 32; SOFT-NEXT: mov r0, r4 33; SOFT-NEXT: bl __aeabi_f2iz 34; SOFT-NEXT: movs r5, #0 35; SOFT-NEXT: cmp r7, #0 36; SOFT-NEXT: beq .LBB0_2 37; SOFT-NEXT: @ %bb.1: 38; SOFT-NEXT: mov r6, r0 39; SOFT-NEXT: b .LBB0_3 40; SOFT-NEXT: .LBB0_2: 41; SOFT-NEXT: mvns r6, r5 42; SOFT-NEXT: .LBB0_3: 43; SOFT-NEXT: mov r0, r4 44; SOFT-NEXT: mov r1, r5 45; SOFT-NEXT: bl __aeabi_fcmpgt 46; SOFT-NEXT: cmp r0, #0 47; SOFT-NEXT: mov r7, r5 48; SOFT-NEXT: bne .LBB0_5 49; SOFT-NEXT: @ %bb.4: 50; SOFT-NEXT: mov r7, r6 51; SOFT-NEXT: .LBB0_5: 52; SOFT-NEXT: mov r0, r4 53; SOFT-NEXT: mov r1, r4 54; SOFT-NEXT: bl __aeabi_fcmpun 55; SOFT-NEXT: cmp r0, #0 56; SOFT-NEXT: bne .LBB0_7 57; SOFT-NEXT: @ %bb.6: 58; SOFT-NEXT: mov r5, r7 59; SOFT-NEXT: .LBB0_7: 60; SOFT-NEXT: mov r0, r5 61; SOFT-NEXT: add sp, #4 62; SOFT-NEXT: pop {r4, r5, r6, r7, pc} 63; SOFT-NEXT: .p2align 2 64; SOFT-NEXT: @ %bb.8: 65; SOFT-NEXT: .LCPI0_0: 66; SOFT-NEXT: .long 3212836864 @ 0xbf800000 67; 68; VFP2-LABEL: test_signed_i1_f32: 69; VFP2: @ %bb.0: 70; VFP2-NEXT: vmov s2, r0 71; VFP2-NEXT: vmov.f32 s0, #-1.000000e+00 72; VFP2-NEXT: vcvt.s32.f32 s4, s2 73; VFP2-NEXT: vcmp.f32 s2, s0 74; VFP2-NEXT: vmov r0, s4 75; VFP2-NEXT: vmrs APSR_nzcv, fpscr 76; VFP2-NEXT: it lt 77; VFP2-NEXT: movlt.w r0, #-1 78; VFP2-NEXT: vcmp.f32 s2, #0 79; VFP2-NEXT: vmrs APSR_nzcv, fpscr 80; VFP2-NEXT: it gt 81; VFP2-NEXT: movgt r0, #0 82; VFP2-NEXT: vcmp.f32 s2, s2 83; VFP2-NEXT: vmrs APSR_nzcv, fpscr 84; VFP2-NEXT: it vs 85; VFP2-NEXT: movvs r0, #0 86; VFP2-NEXT: bx lr 87; 88; FP16-LABEL: test_signed_i1_f32: 89; FP16: @ %bb.0: 90; FP16-NEXT: vmov s2, r0 91; FP16-NEXT: vldr s4, .LCPI0_0 92; FP16-NEXT: vmov.f32 s0, #-1.000000e+00 93; FP16-NEXT: vmaxnm.f32 s0, s2, s0 94; FP16-NEXT: vcmp.f32 s2, s2 95; FP16-NEXT: vminnm.f32 s0, s0, s4 96; FP16-NEXT: vmrs APSR_nzcv, fpscr 97; FP16-NEXT: vcvt.s32.f32 s0, s0 98; FP16-NEXT: vmov r0, s0 99; FP16-NEXT: it vs 100; FP16-NEXT: movvs r0, #0 101; FP16-NEXT: bx lr 102; FP16-NEXT: .p2align 2 103; FP16-NEXT: @ %bb.1: 104; FP16-NEXT: .LCPI0_0: 105; FP16-NEXT: .long 0x00000000 @ float 0 106 %x = call i1 @llvm.fptosi.sat.i1.f32(float %f) 107 ret i1 %x 108} 109 110define i8 @test_signed_i8_f32(float %f) nounwind { 111; SOFT-LABEL: test_signed_i8_f32: 112; SOFT: @ %bb.0: 113; SOFT-NEXT: .save {r4, r5, r6, r7, lr} 114; SOFT-NEXT: push {r4, r5, r6, r7, lr} 115; SOFT-NEXT: .pad #4 116; SOFT-NEXT: sub sp, #4 117; SOFT-NEXT: mov r4, r0 118; SOFT-NEXT: movs r0, #195 119; SOFT-NEXT: lsls r1, r0, #24 120; SOFT-NEXT: mov r0, r4 121; SOFT-NEXT: bl __aeabi_fcmpge 122; SOFT-NEXT: mov r7, r0 123; SOFT-NEXT: mov r0, r4 124; SOFT-NEXT: bl __aeabi_f2iz 125; SOFT-NEXT: movs r5, #127 126; SOFT-NEXT: cmp r7, #0 127; SOFT-NEXT: beq .LBB1_2 128; SOFT-NEXT: @ %bb.1: 129; SOFT-NEXT: mov r6, r0 130; SOFT-NEXT: b .LBB1_3 131; SOFT-NEXT: .LBB1_2: 132; SOFT-NEXT: mvns r6, r5 133; SOFT-NEXT: .LBB1_3: 134; SOFT-NEXT: ldr r1, .LCPI1_0 135; SOFT-NEXT: mov r0, r4 136; SOFT-NEXT: bl __aeabi_fcmpgt 137; SOFT-NEXT: cmp r0, #0 138; SOFT-NEXT: bne .LBB1_5 139; SOFT-NEXT: @ %bb.4: 140; SOFT-NEXT: mov r5, r6 141; SOFT-NEXT: .LBB1_5: 142; SOFT-NEXT: mov r0, r4 143; SOFT-NEXT: mov r1, r4 144; SOFT-NEXT: bl __aeabi_fcmpun 145; SOFT-NEXT: cmp r0, #0 146; SOFT-NEXT: beq .LBB1_7 147; SOFT-NEXT: @ %bb.6: 148; SOFT-NEXT: movs r5, #0 149; SOFT-NEXT: .LBB1_7: 150; SOFT-NEXT: mov r0, r5 151; SOFT-NEXT: add sp, #4 152; SOFT-NEXT: pop {r4, r5, r6, r7, pc} 153; SOFT-NEXT: .p2align 2 154; SOFT-NEXT: @ %bb.8: 155; SOFT-NEXT: .LCPI1_0: 156; SOFT-NEXT: .long 1123942400 @ 0x42fe0000 157; 158; VFP2-LABEL: test_signed_i8_f32: 159; VFP2: @ %bb.0: 160; VFP2-NEXT: vmov s0, r0 161; VFP2-NEXT: vldr s2, .LCPI1_0 162; VFP2-NEXT: vldr s6, .LCPI1_1 163; VFP2-NEXT: vcvt.s32.f32 s4, s0 164; VFP2-NEXT: vcmp.f32 s0, s2 165; VFP2-NEXT: vmrs APSR_nzcv, fpscr 166; VFP2-NEXT: vcmp.f32 s0, s6 167; VFP2-NEXT: vmov r0, s4 168; VFP2-NEXT: it lt 169; VFP2-NEXT: mvnlt r0, #127 170; VFP2-NEXT: vmrs APSR_nzcv, fpscr 171; VFP2-NEXT: it gt 172; VFP2-NEXT: movgt r0, #127 173; VFP2-NEXT: vcmp.f32 s0, s0 174; VFP2-NEXT: vmrs APSR_nzcv, fpscr 175; VFP2-NEXT: it vs 176; VFP2-NEXT: movvs r0, #0 177; VFP2-NEXT: bx lr 178; VFP2-NEXT: .p2align 2 179; VFP2-NEXT: @ %bb.1: 180; VFP2-NEXT: .LCPI1_0: 181; VFP2-NEXT: .long 0xc3000000 @ float -128 182; VFP2-NEXT: .LCPI1_1: 183; VFP2-NEXT: .long 0x42fe0000 @ float 127 184; 185; FP16-LABEL: test_signed_i8_f32: 186; FP16: @ %bb.0: 187; FP16-NEXT: vldr s0, .LCPI1_0 188; FP16-NEXT: vmov s2, r0 189; FP16-NEXT: vldr s4, .LCPI1_1 190; FP16-NEXT: vmaxnm.f32 s0, s2, s0 191; FP16-NEXT: vcmp.f32 s2, s2 192; FP16-NEXT: vminnm.f32 s0, s0, s4 193; FP16-NEXT: vmrs APSR_nzcv, fpscr 194; FP16-NEXT: vcvt.s32.f32 s0, s0 195; FP16-NEXT: vmov r0, s0 196; FP16-NEXT: it vs 197; FP16-NEXT: movvs r0, #0 198; FP16-NEXT: bx lr 199; FP16-NEXT: .p2align 2 200; FP16-NEXT: @ %bb.1: 201; FP16-NEXT: .LCPI1_0: 202; FP16-NEXT: .long 0xc3000000 @ float -128 203; FP16-NEXT: .LCPI1_1: 204; FP16-NEXT: .long 0x42fe0000 @ float 127 205 %x = call i8 @llvm.fptosi.sat.i8.f32(float %f) 206 ret i8 %x 207} 208 209define i13 @test_signed_i13_f32(float %f) nounwind { 210; SOFT-LABEL: test_signed_i13_f32: 211; SOFT: @ %bb.0: 212; SOFT-NEXT: .save {r4, r5, r6, lr} 213; SOFT-NEXT: push {r4, r5, r6, lr} 214; SOFT-NEXT: mov r4, r0 215; SOFT-NEXT: ldr r1, .LCPI2_0 216; SOFT-NEXT: bl __aeabi_fcmpge 217; SOFT-NEXT: mov r6, r0 218; SOFT-NEXT: mov r0, r4 219; SOFT-NEXT: bl __aeabi_f2iz 220; SOFT-NEXT: cmp r6, #0 221; SOFT-NEXT: beq .LBB2_2 222; SOFT-NEXT: @ %bb.1: 223; SOFT-NEXT: mov r5, r0 224; SOFT-NEXT: b .LBB2_3 225; SOFT-NEXT: .LBB2_2: 226; SOFT-NEXT: ldr r5, .LCPI2_1 227; SOFT-NEXT: .LBB2_3: 228; SOFT-NEXT: ldr r1, .LCPI2_2 229; SOFT-NEXT: mov r0, r4 230; SOFT-NEXT: bl __aeabi_fcmpgt 231; SOFT-NEXT: cmp r0, #0 232; SOFT-NEXT: beq .LBB2_5 233; SOFT-NEXT: @ %bb.4: 234; SOFT-NEXT: ldr r5, .LCPI2_3 235; SOFT-NEXT: .LBB2_5: 236; SOFT-NEXT: mov r0, r4 237; SOFT-NEXT: mov r1, r4 238; SOFT-NEXT: bl __aeabi_fcmpun 239; SOFT-NEXT: cmp r0, #0 240; SOFT-NEXT: beq .LBB2_7 241; SOFT-NEXT: @ %bb.6: 242; SOFT-NEXT: movs r5, #0 243; SOFT-NEXT: .LBB2_7: 244; SOFT-NEXT: mov r0, r5 245; SOFT-NEXT: pop {r4, r5, r6, pc} 246; SOFT-NEXT: .p2align 2 247; SOFT-NEXT: @ %bb.8: 248; SOFT-NEXT: .LCPI2_0: 249; SOFT-NEXT: .long 3313500160 @ 0xc5800000 250; SOFT-NEXT: .LCPI2_1: 251; SOFT-NEXT: .long 4294963200 @ 0xfffff000 252; SOFT-NEXT: .LCPI2_2: 253; SOFT-NEXT: .long 1166012416 @ 0x457ff000 254; SOFT-NEXT: .LCPI2_3: 255; SOFT-NEXT: .long 4095 @ 0xfff 256; 257; VFP2-LABEL: test_signed_i13_f32: 258; VFP2: @ %bb.0: 259; VFP2-NEXT: vmov s0, r0 260; VFP2-NEXT: vldr s2, .LCPI2_0 261; VFP2-NEXT: vldr s6, .LCPI2_1 262; VFP2-NEXT: vcvt.s32.f32 s4, s0 263; VFP2-NEXT: vcmp.f32 s0, s2 264; VFP2-NEXT: vmrs APSR_nzcv, fpscr 265; VFP2-NEXT: vcmp.f32 s0, s6 266; VFP2-NEXT: vmov r0, s4 267; VFP2-NEXT: itt lt 268; VFP2-NEXT: movwlt r0, #61440 269; VFP2-NEXT: movtlt r0, #65535 270; VFP2-NEXT: vmrs APSR_nzcv, fpscr 271; VFP2-NEXT: it gt 272; VFP2-NEXT: movwgt r0, #4095 273; VFP2-NEXT: vcmp.f32 s0, s0 274; VFP2-NEXT: vmrs APSR_nzcv, fpscr 275; VFP2-NEXT: it vs 276; VFP2-NEXT: movvs r0, #0 277; VFP2-NEXT: bx lr 278; VFP2-NEXT: .p2align 2 279; VFP2-NEXT: @ %bb.1: 280; VFP2-NEXT: .LCPI2_0: 281; VFP2-NEXT: .long 0xc5800000 @ float -4096 282; VFP2-NEXT: .LCPI2_1: 283; VFP2-NEXT: .long 0x457ff000 @ float 4095 284; 285; FP16-LABEL: test_signed_i13_f32: 286; FP16: @ %bb.0: 287; FP16-NEXT: vldr s0, .LCPI2_0 288; FP16-NEXT: vmov s2, r0 289; FP16-NEXT: vldr s4, .LCPI2_1 290; FP16-NEXT: vmaxnm.f32 s0, s2, s0 291; FP16-NEXT: vcmp.f32 s2, s2 292; FP16-NEXT: vminnm.f32 s0, s0, s4 293; FP16-NEXT: vmrs APSR_nzcv, fpscr 294; FP16-NEXT: vcvt.s32.f32 s0, s0 295; FP16-NEXT: vmov r0, s0 296; FP16-NEXT: it vs 297; FP16-NEXT: movvs r0, #0 298; FP16-NEXT: bx lr 299; FP16-NEXT: .p2align 2 300; FP16-NEXT: @ %bb.1: 301; FP16-NEXT: .LCPI2_0: 302; FP16-NEXT: .long 0xc5800000 @ float -4096 303; FP16-NEXT: .LCPI2_1: 304; FP16-NEXT: .long 0x457ff000 @ float 4095 305 %x = call i13 @llvm.fptosi.sat.i13.f32(float %f) 306 ret i13 %x 307} 308 309define i16 @test_signed_i16_f32(float %f) nounwind { 310; SOFT-LABEL: test_signed_i16_f32: 311; SOFT: @ %bb.0: 312; SOFT-NEXT: .save {r4, r5, r6, lr} 313; SOFT-NEXT: push {r4, r5, r6, lr} 314; SOFT-NEXT: mov r4, r0 315; SOFT-NEXT: movs r0, #199 316; SOFT-NEXT: lsls r1, r0, #24 317; SOFT-NEXT: mov r0, r4 318; SOFT-NEXT: bl __aeabi_fcmpge 319; SOFT-NEXT: mov r6, r0 320; SOFT-NEXT: mov r0, r4 321; SOFT-NEXT: bl __aeabi_f2iz 322; SOFT-NEXT: cmp r6, #0 323; SOFT-NEXT: beq .LBB3_2 324; SOFT-NEXT: @ %bb.1: 325; SOFT-NEXT: mov r5, r0 326; SOFT-NEXT: b .LBB3_3 327; SOFT-NEXT: .LBB3_2: 328; SOFT-NEXT: ldr r5, .LCPI3_0 329; SOFT-NEXT: .LBB3_3: 330; SOFT-NEXT: ldr r1, .LCPI3_1 331; SOFT-NEXT: mov r0, r4 332; SOFT-NEXT: bl __aeabi_fcmpgt 333; SOFT-NEXT: cmp r0, #0 334; SOFT-NEXT: beq .LBB3_5 335; SOFT-NEXT: @ %bb.4: 336; SOFT-NEXT: ldr r5, .LCPI3_2 337; SOFT-NEXT: .LBB3_5: 338; SOFT-NEXT: mov r0, r4 339; SOFT-NEXT: mov r1, r4 340; SOFT-NEXT: bl __aeabi_fcmpun 341; SOFT-NEXT: cmp r0, #0 342; SOFT-NEXT: beq .LBB3_7 343; SOFT-NEXT: @ %bb.6: 344; SOFT-NEXT: movs r5, #0 345; SOFT-NEXT: .LBB3_7: 346; SOFT-NEXT: mov r0, r5 347; SOFT-NEXT: pop {r4, r5, r6, pc} 348; SOFT-NEXT: .p2align 2 349; SOFT-NEXT: @ %bb.8: 350; SOFT-NEXT: .LCPI3_0: 351; SOFT-NEXT: .long 4294934528 @ 0xffff8000 352; SOFT-NEXT: .LCPI3_1: 353; SOFT-NEXT: .long 1191181824 @ 0x46fffe00 354; SOFT-NEXT: .LCPI3_2: 355; SOFT-NEXT: .long 32767 @ 0x7fff 356; 357; VFP2-LABEL: test_signed_i16_f32: 358; VFP2: @ %bb.0: 359; VFP2-NEXT: vmov s0, r0 360; VFP2-NEXT: vldr s2, .LCPI3_0 361; VFP2-NEXT: vldr s6, .LCPI3_1 362; VFP2-NEXT: vcvt.s32.f32 s4, s0 363; VFP2-NEXT: vcmp.f32 s0, s2 364; VFP2-NEXT: vmrs APSR_nzcv, fpscr 365; VFP2-NEXT: vcmp.f32 s0, s6 366; VFP2-NEXT: vmov r0, s4 367; VFP2-NEXT: itt lt 368; VFP2-NEXT: movwlt r0, #32768 369; VFP2-NEXT: movtlt r0, #65535 370; VFP2-NEXT: vmrs APSR_nzcv, fpscr 371; VFP2-NEXT: it gt 372; VFP2-NEXT: movwgt r0, #32767 373; VFP2-NEXT: vcmp.f32 s0, s0 374; VFP2-NEXT: vmrs APSR_nzcv, fpscr 375; VFP2-NEXT: it vs 376; VFP2-NEXT: movvs r0, #0 377; VFP2-NEXT: bx lr 378; VFP2-NEXT: .p2align 2 379; VFP2-NEXT: @ %bb.1: 380; VFP2-NEXT: .LCPI3_0: 381; VFP2-NEXT: .long 0xc7000000 @ float -32768 382; VFP2-NEXT: .LCPI3_1: 383; VFP2-NEXT: .long 0x46fffe00 @ float 32767 384; 385; FP16-LABEL: test_signed_i16_f32: 386; FP16: @ %bb.0: 387; FP16-NEXT: vldr s0, .LCPI3_0 388; FP16-NEXT: vmov s2, r0 389; FP16-NEXT: vldr s4, .LCPI3_1 390; FP16-NEXT: vmaxnm.f32 s0, s2, s0 391; FP16-NEXT: vcmp.f32 s2, s2 392; FP16-NEXT: vminnm.f32 s0, s0, s4 393; FP16-NEXT: vmrs APSR_nzcv, fpscr 394; FP16-NEXT: vcvt.s32.f32 s0, s0 395; FP16-NEXT: vmov r0, s0 396; FP16-NEXT: it vs 397; FP16-NEXT: movvs r0, #0 398; FP16-NEXT: bx lr 399; FP16-NEXT: .p2align 2 400; FP16-NEXT: @ %bb.1: 401; FP16-NEXT: .LCPI3_0: 402; FP16-NEXT: .long 0xc7000000 @ float -32768 403; FP16-NEXT: .LCPI3_1: 404; FP16-NEXT: .long 0x46fffe00 @ float 32767 405 %x = call i16 @llvm.fptosi.sat.i16.f32(float %f) 406 ret i16 %x 407} 408 409define i19 @test_signed_i19_f32(float %f) nounwind { 410; SOFT-LABEL: test_signed_i19_f32: 411; SOFT: @ %bb.0: 412; SOFT-NEXT: .save {r4, r5, r6, lr} 413; SOFT-NEXT: push {r4, r5, r6, lr} 414; SOFT-NEXT: mov r4, r0 415; SOFT-NEXT: ldr r1, .LCPI4_0 416; SOFT-NEXT: bl __aeabi_fcmpge 417; SOFT-NEXT: mov r6, r0 418; SOFT-NEXT: mov r0, r4 419; SOFT-NEXT: bl __aeabi_f2iz 420; SOFT-NEXT: cmp r6, #0 421; SOFT-NEXT: beq .LBB4_2 422; SOFT-NEXT: @ %bb.1: 423; SOFT-NEXT: mov r5, r0 424; SOFT-NEXT: b .LBB4_3 425; SOFT-NEXT: .LBB4_2: 426; SOFT-NEXT: ldr r5, .LCPI4_1 427; SOFT-NEXT: .LBB4_3: 428; SOFT-NEXT: ldr r1, .LCPI4_2 429; SOFT-NEXT: mov r0, r4 430; SOFT-NEXT: bl __aeabi_fcmpgt 431; SOFT-NEXT: cmp r0, #0 432; SOFT-NEXT: beq .LBB4_5 433; SOFT-NEXT: @ %bb.4: 434; SOFT-NEXT: ldr r5, .LCPI4_3 435; SOFT-NEXT: .LBB4_5: 436; SOFT-NEXT: mov r0, r4 437; SOFT-NEXT: mov r1, r4 438; SOFT-NEXT: bl __aeabi_fcmpun 439; SOFT-NEXT: cmp r0, #0 440; SOFT-NEXT: beq .LBB4_7 441; SOFT-NEXT: @ %bb.6: 442; SOFT-NEXT: movs r5, #0 443; SOFT-NEXT: .LBB4_7: 444; SOFT-NEXT: mov r0, r5 445; SOFT-NEXT: pop {r4, r5, r6, pc} 446; SOFT-NEXT: .p2align 2 447; SOFT-NEXT: @ %bb.8: 448; SOFT-NEXT: .LCPI4_0: 449; SOFT-NEXT: .long 3363831808 @ 0xc8800000 450; SOFT-NEXT: .LCPI4_1: 451; SOFT-NEXT: .long 4294705152 @ 0xfffc0000 452; SOFT-NEXT: .LCPI4_2: 453; SOFT-NEXT: .long 1216348096 @ 0x487fffc0 454; SOFT-NEXT: .LCPI4_3: 455; SOFT-NEXT: .long 262143 @ 0x3ffff 456; 457; VFP2-LABEL: test_signed_i19_f32: 458; VFP2: @ %bb.0: 459; VFP2-NEXT: vmov s0, r0 460; VFP2-NEXT: vldr s2, .LCPI4_0 461; VFP2-NEXT: vldr s6, .LCPI4_1 462; VFP2-NEXT: vcvt.s32.f32 s4, s0 463; VFP2-NEXT: vcmp.f32 s0, s2 464; VFP2-NEXT: vmrs APSR_nzcv, fpscr 465; VFP2-NEXT: vcmp.f32 s0, s6 466; VFP2-NEXT: vmov r0, s4 467; VFP2-NEXT: itt lt 468; VFP2-NEXT: movlt r0, #0 469; VFP2-NEXT: movtlt r0, #65532 470; VFP2-NEXT: vmrs APSR_nzcv, fpscr 471; VFP2-NEXT: vcmp.f32 s0, s0 472; VFP2-NEXT: itt gt 473; VFP2-NEXT: movwgt r0, #65535 474; VFP2-NEXT: movtgt r0, #3 475; VFP2-NEXT: vmrs APSR_nzcv, fpscr 476; VFP2-NEXT: it vs 477; VFP2-NEXT: movvs r0, #0 478; VFP2-NEXT: bx lr 479; VFP2-NEXT: .p2align 2 480; VFP2-NEXT: @ %bb.1: 481; VFP2-NEXT: .LCPI4_0: 482; VFP2-NEXT: .long 0xc8800000 @ float -262144 483; VFP2-NEXT: .LCPI4_1: 484; VFP2-NEXT: .long 0x487fffc0 @ float 262143 485; 486; FP16-LABEL: test_signed_i19_f32: 487; FP16: @ %bb.0: 488; FP16-NEXT: vldr s0, .LCPI4_0 489; FP16-NEXT: vmov s2, r0 490; FP16-NEXT: vldr s4, .LCPI4_1 491; FP16-NEXT: vmaxnm.f32 s0, s2, s0 492; FP16-NEXT: vcmp.f32 s2, s2 493; FP16-NEXT: vminnm.f32 s0, s0, s4 494; FP16-NEXT: vmrs APSR_nzcv, fpscr 495; FP16-NEXT: vcvt.s32.f32 s0, s0 496; FP16-NEXT: vmov r0, s0 497; FP16-NEXT: it vs 498; FP16-NEXT: movvs r0, #0 499; FP16-NEXT: bx lr 500; FP16-NEXT: .p2align 2 501; FP16-NEXT: @ %bb.1: 502; FP16-NEXT: .LCPI4_0: 503; FP16-NEXT: .long 0xc8800000 @ float -262144 504; FP16-NEXT: .LCPI4_1: 505; FP16-NEXT: .long 0x487fffc0 @ float 262143 506 %x = call i19 @llvm.fptosi.sat.i19.f32(float %f) 507 ret i19 %x 508} 509 510define i32 @test_signed_i32_f32(float %f) nounwind { 511; SOFT-LABEL: test_signed_i32_f32: 512; SOFT: @ %bb.0: 513; SOFT-NEXT: .save {r4, r5, r6, lr} 514; SOFT-NEXT: push {r4, r5, r6, lr} 515; SOFT-NEXT: mov r4, r0 516; SOFT-NEXT: movs r0, #207 517; SOFT-NEXT: lsls r1, r0, #24 518; SOFT-NEXT: mov r0, r4 519; SOFT-NEXT: bl __aeabi_fcmpge 520; SOFT-NEXT: mov r6, r0 521; SOFT-NEXT: mov r0, r4 522; SOFT-NEXT: bl __aeabi_f2iz 523; SOFT-NEXT: cmp r6, #0 524; SOFT-NEXT: beq .LBB5_2 525; SOFT-NEXT: @ %bb.1: 526; SOFT-NEXT: mov r5, r0 527; SOFT-NEXT: b .LBB5_3 528; SOFT-NEXT: .LBB5_2: 529; SOFT-NEXT: movs r0, #1 530; SOFT-NEXT: lsls r5, r0, #31 531; SOFT-NEXT: .LBB5_3: 532; SOFT-NEXT: ldr r1, .LCPI5_0 533; SOFT-NEXT: mov r0, r4 534; SOFT-NEXT: bl __aeabi_fcmpgt 535; SOFT-NEXT: cmp r0, #0 536; SOFT-NEXT: beq .LBB5_5 537; SOFT-NEXT: @ %bb.4: 538; SOFT-NEXT: ldr r5, .LCPI5_1 539; SOFT-NEXT: .LBB5_5: 540; SOFT-NEXT: mov r0, r4 541; SOFT-NEXT: mov r1, r4 542; SOFT-NEXT: bl __aeabi_fcmpun 543; SOFT-NEXT: cmp r0, #0 544; SOFT-NEXT: beq .LBB5_7 545; SOFT-NEXT: @ %bb.6: 546; SOFT-NEXT: movs r5, #0 547; SOFT-NEXT: .LBB5_7: 548; SOFT-NEXT: mov r0, r5 549; SOFT-NEXT: pop {r4, r5, r6, pc} 550; SOFT-NEXT: .p2align 2 551; SOFT-NEXT: @ %bb.8: 552; SOFT-NEXT: .LCPI5_0: 553; SOFT-NEXT: .long 1325400063 @ 0x4effffff 554; SOFT-NEXT: .LCPI5_1: 555; SOFT-NEXT: .long 2147483647 @ 0x7fffffff 556; 557; VFP-LABEL: test_signed_i32_f32: 558; VFP: @ %bb.0: 559; VFP-NEXT: vmov s0, r0 560; VFP-NEXT: vcvt.s32.f32 s0, s0 561; VFP-NEXT: vmov r0, s0 562; VFP-NEXT: bx lr 563 %x = call i32 @llvm.fptosi.sat.i32.f32(float %f) 564 ret i32 %x 565} 566 567define i50 @test_signed_i50_f32(float %f) nounwind { 568; SOFT-LABEL: test_signed_i50_f32: 569; SOFT: @ %bb.0: 570; SOFT-NEXT: .save {r4, r5, r6, r7, lr} 571; SOFT-NEXT: push {r4, r5, r6, r7, lr} 572; SOFT-NEXT: .pad #4 573; SOFT-NEXT: sub sp, #4 574; SOFT-NEXT: mov r4, r0 575; SOFT-NEXT: movs r0, #27 576; SOFT-NEXT: lsls r1, r0, #27 577; SOFT-NEXT: mov r0, r4 578; SOFT-NEXT: bl __aeabi_fcmpge 579; SOFT-NEXT: mov r7, r0 580; SOFT-NEXT: mov r0, r4 581; SOFT-NEXT: bl __aeabi_f2lz 582; SOFT-NEXT: mov r5, r0 583; SOFT-NEXT: cmp r7, #0 584; SOFT-NEXT: bne .LBB6_2 585; SOFT-NEXT: @ %bb.1: 586; SOFT-NEXT: mov r5, r7 587; SOFT-NEXT: .LBB6_2: 588; SOFT-NEXT: beq .LBB6_4 589; SOFT-NEXT: @ %bb.3: 590; SOFT-NEXT: str r1, [sp] @ 4-byte Spill 591; SOFT-NEXT: b .LBB6_5 592; SOFT-NEXT: .LBB6_4: 593; SOFT-NEXT: ldr r0, .LCPI6_0 594; SOFT-NEXT: str r0, [sp] @ 4-byte Spill 595; SOFT-NEXT: .LBB6_5: 596; SOFT-NEXT: ldr r1, .LCPI6_1 597; SOFT-NEXT: mov r0, r4 598; SOFT-NEXT: bl __aeabi_fcmpgt 599; SOFT-NEXT: movs r7, #0 600; SOFT-NEXT: mvns r6, r7 601; SOFT-NEXT: cmp r0, #0 602; SOFT-NEXT: beq .LBB6_7 603; SOFT-NEXT: @ %bb.6: 604; SOFT-NEXT: ldr r0, .LCPI6_2 605; SOFT-NEXT: str r0, [sp] @ 4-byte Spill 606; SOFT-NEXT: .LBB6_7: 607; SOFT-NEXT: bne .LBB6_9 608; SOFT-NEXT: @ %bb.8: 609; SOFT-NEXT: mov r6, r5 610; SOFT-NEXT: .LBB6_9: 611; SOFT-NEXT: mov r0, r4 612; SOFT-NEXT: mov r1, r4 613; SOFT-NEXT: bl __aeabi_fcmpun 614; SOFT-NEXT: cmp r0, #0 615; SOFT-NEXT: mov r0, r7 616; SOFT-NEXT: bne .LBB6_11 617; SOFT-NEXT: @ %bb.10: 618; SOFT-NEXT: mov r0, r6 619; SOFT-NEXT: .LBB6_11: 620; SOFT-NEXT: bne .LBB6_13 621; SOFT-NEXT: @ %bb.12: 622; SOFT-NEXT: ldr r7, [sp] @ 4-byte Reload 623; SOFT-NEXT: .LBB6_13: 624; SOFT-NEXT: mov r1, r7 625; SOFT-NEXT: add sp, #4 626; SOFT-NEXT: pop {r4, r5, r6, r7, pc} 627; SOFT-NEXT: .p2align 2 628; SOFT-NEXT: @ %bb.14: 629; SOFT-NEXT: .LCPI6_0: 630; SOFT-NEXT: .long 4294836224 @ 0xfffe0000 631; SOFT-NEXT: .LCPI6_1: 632; SOFT-NEXT: .long 1476395007 @ 0x57ffffff 633; SOFT-NEXT: .LCPI6_2: 634; SOFT-NEXT: .long 131071 @ 0x1ffff 635; 636; VFP-LABEL: test_signed_i50_f32: 637; VFP: @ %bb.0: 638; VFP-NEXT: .save {r4, lr} 639; VFP-NEXT: push {r4, lr} 640; VFP-NEXT: mov r4, r0 641; VFP-NEXT: bl __aeabi_f2lz 642; VFP-NEXT: vldr s0, .LCPI6_0 643; VFP-NEXT: vmov s2, r4 644; VFP-NEXT: vldr s4, .LCPI6_1 645; VFP-NEXT: vcmp.f32 s2, s0 646; VFP-NEXT: vmrs APSR_nzcv, fpscr 647; VFP-NEXT: ittt lt 648; VFP-NEXT: movlt r1, #0 649; VFP-NEXT: movtlt r1, #65534 650; VFP-NEXT: movlt r0, #0 651; VFP-NEXT: vcmp.f32 s2, s4 652; VFP-NEXT: vmrs APSR_nzcv, fpscr 653; VFP-NEXT: it gt 654; VFP-NEXT: movgt.w r0, #-1 655; VFP-NEXT: vcmp.f32 s2, s2 656; VFP-NEXT: itt gt 657; VFP-NEXT: movwgt r1, #65535 658; VFP-NEXT: movtgt r1, #1 659; VFP-NEXT: vmrs APSR_nzcv, fpscr 660; VFP-NEXT: itt vs 661; VFP-NEXT: movvs r0, #0 662; VFP-NEXT: movvs r1, #0 663; VFP-NEXT: pop {r4, pc} 664; VFP-NEXT: .p2align 2 665; VFP-NEXT: @ %bb.1: 666; VFP-NEXT: .LCPI6_0: 667; VFP-NEXT: .long 0xd8000000 @ float -5.62949953E+14 668; VFP-NEXT: .LCPI6_1: 669; VFP-NEXT: .long 0x57ffffff @ float 5.6294992E+14 670 %x = call i50 @llvm.fptosi.sat.i50.f32(float %f) 671 ret i50 %x 672} 673 674define i64 @test_signed_i64_f32(float %f) nounwind { 675; SOFT-LABEL: test_signed_i64_f32: 676; SOFT: @ %bb.0: 677; SOFT-NEXT: .save {r4, r5, r6, r7, lr} 678; SOFT-NEXT: push {r4, r5, r6, r7, lr} 679; SOFT-NEXT: .pad #4 680; SOFT-NEXT: sub sp, #4 681; SOFT-NEXT: mov r4, r0 682; SOFT-NEXT: movs r0, #223 683; SOFT-NEXT: lsls r1, r0, #24 684; SOFT-NEXT: mov r0, r4 685; SOFT-NEXT: bl __aeabi_fcmpge 686; SOFT-NEXT: mov r6, r0 687; SOFT-NEXT: mov r0, r4 688; SOFT-NEXT: bl __aeabi_f2lz 689; SOFT-NEXT: movs r2, #1 690; SOFT-NEXT: lsls r7, r2, #31 691; SOFT-NEXT: cmp r6, #0 692; SOFT-NEXT: bne .LBB7_2 693; SOFT-NEXT: @ %bb.1: 694; SOFT-NEXT: mov r0, r6 695; SOFT-NEXT: .LBB7_2: 696; SOFT-NEXT: str r0, [sp] @ 4-byte Spill 697; SOFT-NEXT: beq .LBB7_4 698; SOFT-NEXT: @ %bb.3: 699; SOFT-NEXT: mov r7, r1 700; SOFT-NEXT: .LBB7_4: 701; SOFT-NEXT: ldr r1, .LCPI7_0 702; SOFT-NEXT: mov r0, r4 703; SOFT-NEXT: bl __aeabi_fcmpgt 704; SOFT-NEXT: movs r6, #0 705; SOFT-NEXT: mvns r5, r6 706; SOFT-NEXT: cmp r0, #0 707; SOFT-NEXT: beq .LBB7_6 708; SOFT-NEXT: @ %bb.5: 709; SOFT-NEXT: ldr r7, .LCPI7_1 710; SOFT-NEXT: .LBB7_6: 711; SOFT-NEXT: bne .LBB7_8 712; SOFT-NEXT: @ %bb.7: 713; SOFT-NEXT: ldr r5, [sp] @ 4-byte Reload 714; SOFT-NEXT: .LBB7_8: 715; SOFT-NEXT: mov r0, r4 716; SOFT-NEXT: mov r1, r4 717; SOFT-NEXT: bl __aeabi_fcmpun 718; SOFT-NEXT: cmp r0, #0 719; SOFT-NEXT: mov r0, r6 720; SOFT-NEXT: bne .LBB7_10 721; SOFT-NEXT: @ %bb.9: 722; SOFT-NEXT: mov r0, r5 723; SOFT-NEXT: .LBB7_10: 724; SOFT-NEXT: bne .LBB7_12 725; SOFT-NEXT: @ %bb.11: 726; SOFT-NEXT: mov r6, r7 727; SOFT-NEXT: .LBB7_12: 728; SOFT-NEXT: mov r1, r6 729; SOFT-NEXT: add sp, #4 730; SOFT-NEXT: pop {r4, r5, r6, r7, pc} 731; SOFT-NEXT: .p2align 2 732; SOFT-NEXT: @ %bb.13: 733; SOFT-NEXT: .LCPI7_0: 734; SOFT-NEXT: .long 1593835519 @ 0x5effffff 735; SOFT-NEXT: .LCPI7_1: 736; SOFT-NEXT: .long 2147483647 @ 0x7fffffff 737; 738; VFP-LABEL: test_signed_i64_f32: 739; VFP: @ %bb.0: 740; VFP-NEXT: .save {r4, lr} 741; VFP-NEXT: push {r4, lr} 742; VFP-NEXT: mov r4, r0 743; VFP-NEXT: bl __aeabi_f2lz 744; VFP-NEXT: vldr s0, .LCPI7_0 745; VFP-NEXT: vmov s2, r4 746; VFP-NEXT: vldr s4, .LCPI7_1 747; VFP-NEXT: vcmp.f32 s2, s0 748; VFP-NEXT: vmrs APSR_nzcv, fpscr 749; VFP-NEXT: itt lt 750; VFP-NEXT: movlt r0, #0 751; VFP-NEXT: movlt.w r1, #-2147483648 752; VFP-NEXT: vcmp.f32 s2, s4 753; VFP-NEXT: vmrs APSR_nzcv, fpscr 754; VFP-NEXT: itt gt 755; VFP-NEXT: mvngt r1, #-2147483648 756; VFP-NEXT: movgt.w r0, #-1 757; VFP-NEXT: vcmp.f32 s2, s2 758; VFP-NEXT: vmrs APSR_nzcv, fpscr 759; VFP-NEXT: itt vs 760; VFP-NEXT: movvs r0, #0 761; VFP-NEXT: movvs r1, #0 762; VFP-NEXT: pop {r4, pc} 763; VFP-NEXT: .p2align 2 764; VFP-NEXT: @ %bb.1: 765; VFP-NEXT: .LCPI7_0: 766; VFP-NEXT: .long 0xdf000000 @ float -9.22337203E+18 767; VFP-NEXT: .LCPI7_1: 768; VFP-NEXT: .long 0x5effffff @ float 9.22337149E+18 769 %x = call i64 @llvm.fptosi.sat.i64.f32(float %f) 770 ret i64 %x 771} 772 773define i100 @test_signed_i100_f32(float %f) nounwind { 774; SOFT-LABEL: test_signed_i100_f32: 775; SOFT: @ %bb.0: 776; SOFT-NEXT: .save {r4, r5, r6, r7, lr} 777; SOFT-NEXT: push {r4, r5, r6, r7, lr} 778; SOFT-NEXT: .pad #20 779; SOFT-NEXT: sub sp, #20 780; SOFT-NEXT: mov r4, r0 781; SOFT-NEXT: movs r0, #241 782; SOFT-NEXT: lsls r1, r0, #24 783; SOFT-NEXT: mov r0, r4 784; SOFT-NEXT: bl __aeabi_fcmpge 785; SOFT-NEXT: mov r6, r0 786; SOFT-NEXT: mov r0, r4 787; SOFT-NEXT: bl __fixsfti 788; SOFT-NEXT: movs r5, #7 789; SOFT-NEXT: str r5, [sp, #16] @ 4-byte Spill 790; SOFT-NEXT: mvns r7, r5 791; SOFT-NEXT: cmp r6, #0 792; SOFT-NEXT: beq .LBB8_17 793; SOFT-NEXT: @ %bb.1: 794; SOFT-NEXT: beq .LBB8_18 795; SOFT-NEXT: .LBB8_2: 796; SOFT-NEXT: bne .LBB8_4 797; SOFT-NEXT: .LBB8_3: 798; SOFT-NEXT: mov r2, r6 799; SOFT-NEXT: .LBB8_4: 800; SOFT-NEXT: str r2, [sp, #4] @ 4-byte Spill 801; SOFT-NEXT: str r1, [sp, #8] @ 4-byte Spill 802; SOFT-NEXT: str r0, [sp, #12] @ 4-byte Spill 803; SOFT-NEXT: beq .LBB8_6 804; SOFT-NEXT: @ %bb.5: 805; SOFT-NEXT: mov r7, r3 806; SOFT-NEXT: .LBB8_6: 807; SOFT-NEXT: ldr r1, .LCPI8_0 808; SOFT-NEXT: mov r0, r4 809; SOFT-NEXT: bl __aeabi_fcmpgt 810; SOFT-NEXT: movs r6, #0 811; SOFT-NEXT: mvns r5, r6 812; SOFT-NEXT: cmp r0, #0 813; SOFT-NEXT: beq .LBB8_19 814; SOFT-NEXT: @ %bb.7: 815; SOFT-NEXT: mov r0, r5 816; SOFT-NEXT: beq .LBB8_20 817; SOFT-NEXT: .LBB8_8: 818; SOFT-NEXT: mov r7, r5 819; SOFT-NEXT: beq .LBB8_21 820; SOFT-NEXT: .LBB8_9: 821; SOFT-NEXT: str r0, [sp, #8] @ 4-byte Spill 822; SOFT-NEXT: bne .LBB8_11 823; SOFT-NEXT: .LBB8_10: 824; SOFT-NEXT: ldr r5, [sp, #12] @ 4-byte Reload 825; SOFT-NEXT: .LBB8_11: 826; SOFT-NEXT: mov r0, r4 827; SOFT-NEXT: mov r1, r4 828; SOFT-NEXT: bl __aeabi_fcmpun 829; SOFT-NEXT: cmp r0, #0 830; SOFT-NEXT: mov r0, r6 831; SOFT-NEXT: beq .LBB8_22 832; SOFT-NEXT: @ %bb.12: 833; SOFT-NEXT: mov r1, r6 834; SOFT-NEXT: beq .LBB8_23 835; SOFT-NEXT: .LBB8_13: 836; SOFT-NEXT: mov r2, r6 837; SOFT-NEXT: beq .LBB8_24 838; SOFT-NEXT: .LBB8_14: 839; SOFT-NEXT: bne .LBB8_16 840; SOFT-NEXT: .LBB8_15: 841; SOFT-NEXT: ldr r6, [sp, #16] @ 4-byte Reload 842; SOFT-NEXT: .LBB8_16: 843; SOFT-NEXT: mov r3, r6 844; SOFT-NEXT: add sp, #20 845; SOFT-NEXT: pop {r4, r5, r6, r7, pc} 846; SOFT-NEXT: .LBB8_17: 847; SOFT-NEXT: mov r0, r6 848; SOFT-NEXT: bne .LBB8_2 849; SOFT-NEXT: .LBB8_18: 850; SOFT-NEXT: mov r1, r6 851; SOFT-NEXT: beq .LBB8_3 852; SOFT-NEXT: b .LBB8_4 853; SOFT-NEXT: .LBB8_19: 854; SOFT-NEXT: str r7, [sp, #16] @ 4-byte Spill 855; SOFT-NEXT: mov r0, r5 856; SOFT-NEXT: bne .LBB8_8 857; SOFT-NEXT: .LBB8_20: 858; SOFT-NEXT: ldr r0, [sp, #4] @ 4-byte Reload 859; SOFT-NEXT: mov r7, r5 860; SOFT-NEXT: bne .LBB8_9 861; SOFT-NEXT: .LBB8_21: 862; SOFT-NEXT: ldr r7, [sp, #8] @ 4-byte Reload 863; SOFT-NEXT: str r0, [sp, #8] @ 4-byte Spill 864; SOFT-NEXT: beq .LBB8_10 865; SOFT-NEXT: b .LBB8_11 866; SOFT-NEXT: .LBB8_22: 867; SOFT-NEXT: mov r0, r5 868; SOFT-NEXT: mov r1, r6 869; SOFT-NEXT: bne .LBB8_13 870; SOFT-NEXT: .LBB8_23: 871; SOFT-NEXT: mov r1, r7 872; SOFT-NEXT: mov r2, r6 873; SOFT-NEXT: bne .LBB8_14 874; SOFT-NEXT: .LBB8_24: 875; SOFT-NEXT: ldr r2, [sp, #8] @ 4-byte Reload 876; SOFT-NEXT: beq .LBB8_15 877; SOFT-NEXT: b .LBB8_16 878; SOFT-NEXT: .p2align 2 879; SOFT-NEXT: @ %bb.25: 880; SOFT-NEXT: .LCPI8_0: 881; SOFT-NEXT: .long 1895825407 @ 0x70ffffff 882; 883; VFP-LABEL: test_signed_i100_f32: 884; VFP: @ %bb.0: 885; VFP-NEXT: .save {r4, lr} 886; VFP-NEXT: push {r4, lr} 887; VFP-NEXT: mov r4, r0 888; VFP-NEXT: bl __fixsfti 889; VFP-NEXT: vldr s0, .LCPI8_0 890; VFP-NEXT: vmov s2, r4 891; VFP-NEXT: vldr s4, .LCPI8_1 892; VFP-NEXT: vcmp.f32 s2, s0 893; VFP-NEXT: vmrs APSR_nzcv, fpscr 894; VFP-NEXT: itttt lt 895; VFP-NEXT: movlt r0, #0 896; VFP-NEXT: movlt r1, #0 897; VFP-NEXT: movlt r2, #0 898; VFP-NEXT: mvnlt r3, #7 899; VFP-NEXT: vcmp.f32 s2, s4 900; VFP-NEXT: vmrs APSR_nzcv, fpscr 901; VFP-NEXT: itttt gt 902; VFP-NEXT: movgt r3, #7 903; VFP-NEXT: movgt.w r2, #-1 904; VFP-NEXT: movgt.w r1, #-1 905; VFP-NEXT: movgt.w r0, #-1 906; VFP-NEXT: vcmp.f32 s2, s2 907; VFP-NEXT: vmrs APSR_nzcv, fpscr 908; VFP-NEXT: itttt vs 909; VFP-NEXT: movvs r0, #0 910; VFP-NEXT: movvs r1, #0 911; VFP-NEXT: movvs r2, #0 912; VFP-NEXT: movvs r3, #0 913; VFP-NEXT: pop {r4, pc} 914; VFP-NEXT: .p2align 2 915; VFP-NEXT: @ %bb.1: 916; VFP-NEXT: .LCPI8_0: 917; VFP-NEXT: .long 0xf1000000 @ float -6.338253E+29 918; VFP-NEXT: .LCPI8_1: 919; VFP-NEXT: .long 0x70ffffff @ float 6.33825262E+29 920 %x = call i100 @llvm.fptosi.sat.i100.f32(float %f) 921 ret i100 %x 922} 923 924define i128 @test_signed_i128_f32(float %f) nounwind { 925; SOFT-LABEL: test_signed_i128_f32: 926; SOFT: @ %bb.0: 927; SOFT-NEXT: .save {r4, r5, r6, r7, lr} 928; SOFT-NEXT: push {r4, r5, r6, r7, lr} 929; SOFT-NEXT: .pad #20 930; SOFT-NEXT: sub sp, #20 931; SOFT-NEXT: mov r4, r0 932; SOFT-NEXT: movs r0, #255 933; SOFT-NEXT: lsls r1, r0, #24 934; SOFT-NEXT: mov r0, r4 935; SOFT-NEXT: bl __aeabi_fcmpge 936; SOFT-NEXT: mov r6, r0 937; SOFT-NEXT: mov r0, r4 938; SOFT-NEXT: bl __fixsfti 939; SOFT-NEXT: movs r5, #1 940; SOFT-NEXT: lsls r7, r5, #31 941; SOFT-NEXT: cmp r6, #0 942; SOFT-NEXT: beq .LBB9_18 943; SOFT-NEXT: @ %bb.1: 944; SOFT-NEXT: beq .LBB9_19 945; SOFT-NEXT: .LBB9_2: 946; SOFT-NEXT: bne .LBB9_4 947; SOFT-NEXT: .LBB9_3: 948; SOFT-NEXT: mov r2, r6 949; SOFT-NEXT: .LBB9_4: 950; SOFT-NEXT: str r2, [sp, #4] @ 4-byte Spill 951; SOFT-NEXT: str r1, [sp, #8] @ 4-byte Spill 952; SOFT-NEXT: str r0, [sp, #12] @ 4-byte Spill 953; SOFT-NEXT: beq .LBB9_6 954; SOFT-NEXT: @ %bb.5: 955; SOFT-NEXT: mov r7, r3 956; SOFT-NEXT: .LBB9_6: 957; SOFT-NEXT: ldr r1, .LCPI9_0 958; SOFT-NEXT: mov r0, r4 959; SOFT-NEXT: bl __aeabi_fcmpgt 960; SOFT-NEXT: movs r6, #0 961; SOFT-NEXT: mvns r5, r6 962; SOFT-NEXT: cmp r0, #0 963; SOFT-NEXT: beq .LBB9_8 964; SOFT-NEXT: @ %bb.7: 965; SOFT-NEXT: ldr r7, .LCPI9_1 966; SOFT-NEXT: .LBB9_8: 967; SOFT-NEXT: str r7, [sp, #16] @ 4-byte Spill 968; SOFT-NEXT: mov r0, r5 969; SOFT-NEXT: beq .LBB9_20 970; SOFT-NEXT: @ %bb.9: 971; SOFT-NEXT: mov r7, r5 972; SOFT-NEXT: beq .LBB9_21 973; SOFT-NEXT: .LBB9_10: 974; SOFT-NEXT: str r0, [sp, #8] @ 4-byte Spill 975; SOFT-NEXT: bne .LBB9_12 976; SOFT-NEXT: .LBB9_11: 977; SOFT-NEXT: ldr r5, [sp, #12] @ 4-byte Reload 978; SOFT-NEXT: .LBB9_12: 979; SOFT-NEXT: mov r0, r4 980; SOFT-NEXT: mov r1, r4 981; SOFT-NEXT: bl __aeabi_fcmpun 982; SOFT-NEXT: cmp r0, #0 983; SOFT-NEXT: mov r0, r6 984; SOFT-NEXT: beq .LBB9_22 985; SOFT-NEXT: @ %bb.13: 986; SOFT-NEXT: mov r1, r6 987; SOFT-NEXT: beq .LBB9_23 988; SOFT-NEXT: .LBB9_14: 989; SOFT-NEXT: mov r2, r6 990; SOFT-NEXT: beq .LBB9_24 991; SOFT-NEXT: .LBB9_15: 992; SOFT-NEXT: ldr r3, [sp, #16] @ 4-byte Reload 993; SOFT-NEXT: bne .LBB9_17 994; SOFT-NEXT: .LBB9_16: 995; SOFT-NEXT: mov r6, r3 996; SOFT-NEXT: .LBB9_17: 997; SOFT-NEXT: mov r3, r6 998; SOFT-NEXT: add sp, #20 999; SOFT-NEXT: pop {r4, r5, r6, r7, pc} 1000; SOFT-NEXT: .LBB9_18: 1001; SOFT-NEXT: mov r0, r6 1002; SOFT-NEXT: bne .LBB9_2 1003; SOFT-NEXT: .LBB9_19: 1004; SOFT-NEXT: mov r1, r6 1005; SOFT-NEXT: beq .LBB9_3 1006; SOFT-NEXT: b .LBB9_4 1007; SOFT-NEXT: .LBB9_20: 1008; SOFT-NEXT: ldr r0, [sp, #4] @ 4-byte Reload 1009; SOFT-NEXT: mov r7, r5 1010; SOFT-NEXT: bne .LBB9_10 1011; SOFT-NEXT: .LBB9_21: 1012; SOFT-NEXT: ldr r7, [sp, #8] @ 4-byte Reload 1013; SOFT-NEXT: str r0, [sp, #8] @ 4-byte Spill 1014; SOFT-NEXT: beq .LBB9_11 1015; SOFT-NEXT: b .LBB9_12 1016; SOFT-NEXT: .LBB9_22: 1017; SOFT-NEXT: mov r0, r5 1018; SOFT-NEXT: mov r1, r6 1019; SOFT-NEXT: bne .LBB9_14 1020; SOFT-NEXT: .LBB9_23: 1021; SOFT-NEXT: mov r1, r7 1022; SOFT-NEXT: mov r2, r6 1023; SOFT-NEXT: bne .LBB9_15 1024; SOFT-NEXT: .LBB9_24: 1025; SOFT-NEXT: ldr r2, [sp, #8] @ 4-byte Reload 1026; SOFT-NEXT: ldr r3, [sp, #16] @ 4-byte Reload 1027; SOFT-NEXT: beq .LBB9_16 1028; SOFT-NEXT: b .LBB9_17 1029; SOFT-NEXT: .p2align 2 1030; SOFT-NEXT: @ %bb.25: 1031; SOFT-NEXT: .LCPI9_0: 1032; SOFT-NEXT: .long 2130706431 @ 0x7effffff 1033; SOFT-NEXT: .LCPI9_1: 1034; SOFT-NEXT: .long 2147483647 @ 0x7fffffff 1035; 1036; VFP-LABEL: test_signed_i128_f32: 1037; VFP: @ %bb.0: 1038; VFP-NEXT: .save {r4, lr} 1039; VFP-NEXT: push {r4, lr} 1040; VFP-NEXT: mov r4, r0 1041; VFP-NEXT: bl __fixsfti 1042; VFP-NEXT: vldr s0, .LCPI9_0 1043; VFP-NEXT: vmov s2, r4 1044; VFP-NEXT: vldr s4, .LCPI9_1 1045; VFP-NEXT: vcmp.f32 s2, s0 1046; VFP-NEXT: vmrs APSR_nzcv, fpscr 1047; VFP-NEXT: itttt lt 1048; VFP-NEXT: movlt r0, #0 1049; VFP-NEXT: movlt r1, #0 1050; VFP-NEXT: movlt r2, #0 1051; VFP-NEXT: movlt.w r3, #-2147483648 1052; VFP-NEXT: vcmp.f32 s2, s4 1053; VFP-NEXT: vmrs APSR_nzcv, fpscr 1054; VFP-NEXT: itttt gt 1055; VFP-NEXT: mvngt r3, #-2147483648 1056; VFP-NEXT: movgt.w r2, #-1 1057; VFP-NEXT: movgt.w r1, #-1 1058; VFP-NEXT: movgt.w r0, #-1 1059; VFP-NEXT: vcmp.f32 s2, s2 1060; VFP-NEXT: vmrs APSR_nzcv, fpscr 1061; VFP-NEXT: itttt vs 1062; VFP-NEXT: movvs r0, #0 1063; VFP-NEXT: movvs r1, #0 1064; VFP-NEXT: movvs r2, #0 1065; VFP-NEXT: movvs r3, #0 1066; VFP-NEXT: pop {r4, pc} 1067; VFP-NEXT: .p2align 2 1068; VFP-NEXT: @ %bb.1: 1069; VFP-NEXT: .LCPI9_0: 1070; VFP-NEXT: .long 0xff000000 @ float -1.70141183E+38 1071; VFP-NEXT: .LCPI9_1: 1072; VFP-NEXT: .long 0x7effffff @ float 1.70141173E+38 1073 %x = call i128 @llvm.fptosi.sat.i128.f32(float %f) 1074 ret i128 %x 1075} 1076 1077; 1078; 64-bit float to signed integer 1079; 1080 1081declare i1 @llvm.fptosi.sat.i1.f64 (double) 1082declare i8 @llvm.fptosi.sat.i8.f64 (double) 1083declare i13 @llvm.fptosi.sat.i13.f64 (double) 1084declare i16 @llvm.fptosi.sat.i16.f64 (double) 1085declare i19 @llvm.fptosi.sat.i19.f64 (double) 1086declare i32 @llvm.fptosi.sat.i32.f64 (double) 1087declare i50 @llvm.fptosi.sat.i50.f64 (double) 1088declare i64 @llvm.fptosi.sat.i64.f64 (double) 1089declare i100 @llvm.fptosi.sat.i100.f64(double) 1090declare i128 @llvm.fptosi.sat.i128.f64(double) 1091 1092define i1 @test_signed_i1_f64(double %f) nounwind { 1093; SOFT-LABEL: test_signed_i1_f64: 1094; SOFT: @ %bb.0: 1095; SOFT-NEXT: .save {r4, r5, r6, r7, lr} 1096; SOFT-NEXT: push {r4, r5, r6, r7, lr} 1097; SOFT-NEXT: .pad #4 1098; SOFT-NEXT: sub sp, #4 1099; SOFT-NEXT: mov r5, r1 1100; SOFT-NEXT: mov r6, r0 1101; SOFT-NEXT: movs r4, #0 1102; SOFT-NEXT: ldr r3, .LCPI10_0 1103; SOFT-NEXT: mov r2, r4 1104; SOFT-NEXT: bl __aeabi_dcmpge 1105; SOFT-NEXT: mov r7, r0 1106; SOFT-NEXT: mov r0, r6 1107; SOFT-NEXT: mov r1, r5 1108; SOFT-NEXT: bl __aeabi_d2iz 1109; SOFT-NEXT: cmp r7, #0 1110; SOFT-NEXT: bne .LBB10_2 1111; SOFT-NEXT: @ %bb.1: 1112; SOFT-NEXT: mvns r0, r4 1113; SOFT-NEXT: .LBB10_2: 1114; SOFT-NEXT: str r0, [sp] @ 4-byte Spill 1115; SOFT-NEXT: mov r0, r6 1116; SOFT-NEXT: mov r1, r5 1117; SOFT-NEXT: mov r2, r4 1118; SOFT-NEXT: mov r3, r4 1119; SOFT-NEXT: bl __aeabi_dcmpgt 1120; SOFT-NEXT: cmp r0, #0 1121; SOFT-NEXT: mov r7, r4 1122; SOFT-NEXT: bne .LBB10_4 1123; SOFT-NEXT: @ %bb.3: 1124; SOFT-NEXT: ldr r7, [sp] @ 4-byte Reload 1125; SOFT-NEXT: .LBB10_4: 1126; SOFT-NEXT: mov r0, r6 1127; SOFT-NEXT: mov r1, r5 1128; SOFT-NEXT: mov r2, r6 1129; SOFT-NEXT: mov r3, r5 1130; SOFT-NEXT: bl __aeabi_dcmpun 1131; SOFT-NEXT: cmp r0, #0 1132; SOFT-NEXT: bne .LBB10_6 1133; SOFT-NEXT: @ %bb.5: 1134; SOFT-NEXT: mov r4, r7 1135; SOFT-NEXT: .LBB10_6: 1136; SOFT-NEXT: mov r0, r4 1137; SOFT-NEXT: add sp, #4 1138; SOFT-NEXT: pop {r4, r5, r6, r7, pc} 1139; SOFT-NEXT: .p2align 2 1140; SOFT-NEXT: @ %bb.7: 1141; SOFT-NEXT: .LCPI10_0: 1142; SOFT-NEXT: .long 3220176896 @ 0xbff00000 1143; 1144; VFP2-LABEL: test_signed_i1_f64: 1145; VFP2: @ %bb.0: 1146; VFP2-NEXT: vmov.f64 d17, #-1.000000e+00 1147; VFP2-NEXT: vmov d16, r0, r1 1148; VFP2-NEXT: vcmp.f64 d16, d17 1149; VFP2-NEXT: vcvt.s32.f64 s0, d16 1150; VFP2-NEXT: vmrs APSR_nzcv, fpscr 1151; VFP2-NEXT: vmov r0, s0 1152; VFP2-NEXT: vcmp.f64 d16, #0 1153; VFP2-NEXT: it lt 1154; VFP2-NEXT: movlt.w r0, #-1 1155; VFP2-NEXT: vmrs APSR_nzcv, fpscr 1156; VFP2-NEXT: it gt 1157; VFP2-NEXT: movgt r0, #0 1158; VFP2-NEXT: vcmp.f64 d16, d16 1159; VFP2-NEXT: vmrs APSR_nzcv, fpscr 1160; VFP2-NEXT: it vs 1161; VFP2-NEXT: movvs r0, #0 1162; VFP2-NEXT: bx lr 1163; 1164; FP16-LABEL: test_signed_i1_f64: 1165; FP16: @ %bb.0: 1166; FP16-NEXT: vmov.f64 d0, #-1.000000e+00 1167; FP16-NEXT: vmov d1, r0, r1 1168; FP16-NEXT: vldr d2, .LCPI10_0 1169; FP16-NEXT: vmaxnm.f64 d0, d1, d0 1170; FP16-NEXT: vminnm.f64 d0, d0, d2 1171; FP16-NEXT: vcmp.f64 d1, d1 1172; FP16-NEXT: vcvt.s32.f64 s0, d0 1173; FP16-NEXT: vmov r0, s0 1174; FP16-NEXT: vmrs APSR_nzcv, fpscr 1175; FP16-NEXT: it vs 1176; FP16-NEXT: movvs r0, #0 1177; FP16-NEXT: bx lr 1178; FP16-NEXT: .p2align 3 1179; FP16-NEXT: @ %bb.1: 1180; FP16-NEXT: .LCPI10_0: 1181; FP16-NEXT: .long 0 @ double 0 1182; FP16-NEXT: .long 0 1183 %x = call i1 @llvm.fptosi.sat.i1.f64(double %f) 1184 ret i1 %x 1185} 1186 1187define i8 @test_signed_i8_f64(double %f) nounwind { 1188; SOFT-LABEL: test_signed_i8_f64: 1189; SOFT: @ %bb.0: 1190; SOFT-NEXT: .save {r4, r5, r6, r7, lr} 1191; SOFT-NEXT: push {r4, r5, r6, r7, lr} 1192; SOFT-NEXT: .pad #4 1193; SOFT-NEXT: sub sp, #4 1194; SOFT-NEXT: mov r5, r1 1195; SOFT-NEXT: mov r6, r0 1196; SOFT-NEXT: movs r4, #0 1197; SOFT-NEXT: ldr r3, .LCPI11_0 1198; SOFT-NEXT: mov r2, r4 1199; SOFT-NEXT: bl __aeabi_dcmpge 1200; SOFT-NEXT: mov r7, r0 1201; SOFT-NEXT: mov r0, r6 1202; SOFT-NEXT: mov r1, r5 1203; SOFT-NEXT: bl __aeabi_d2iz 1204; SOFT-NEXT: movs r1, #127 1205; SOFT-NEXT: cmp r7, #0 1206; SOFT-NEXT: beq .LBB11_2 1207; SOFT-NEXT: @ %bb.1: 1208; SOFT-NEXT: str r0, [sp] @ 4-byte Spill 1209; SOFT-NEXT: mov r7, r1 1210; SOFT-NEXT: b .LBB11_3 1211; SOFT-NEXT: .LBB11_2: 1212; SOFT-NEXT: mov r7, r1 1213; SOFT-NEXT: mvns r0, r1 1214; SOFT-NEXT: str r0, [sp] @ 4-byte Spill 1215; SOFT-NEXT: .LBB11_3: 1216; SOFT-NEXT: ldr r3, .LCPI11_1 1217; SOFT-NEXT: mov r0, r6 1218; SOFT-NEXT: mov r1, r5 1219; SOFT-NEXT: mov r2, r4 1220; SOFT-NEXT: bl __aeabi_dcmpgt 1221; SOFT-NEXT: cmp r0, #0 1222; SOFT-NEXT: bne .LBB11_5 1223; SOFT-NEXT: @ %bb.4: 1224; SOFT-NEXT: ldr r7, [sp] @ 4-byte Reload 1225; SOFT-NEXT: .LBB11_5: 1226; SOFT-NEXT: mov r0, r6 1227; SOFT-NEXT: mov r1, r5 1228; SOFT-NEXT: mov r2, r6 1229; SOFT-NEXT: mov r3, r5 1230; SOFT-NEXT: bl __aeabi_dcmpun 1231; SOFT-NEXT: cmp r0, #0 1232; SOFT-NEXT: bne .LBB11_7 1233; SOFT-NEXT: @ %bb.6: 1234; SOFT-NEXT: mov r4, r7 1235; SOFT-NEXT: .LBB11_7: 1236; SOFT-NEXT: mov r0, r4 1237; SOFT-NEXT: add sp, #4 1238; SOFT-NEXT: pop {r4, r5, r6, r7, pc} 1239; SOFT-NEXT: .p2align 2 1240; SOFT-NEXT: @ %bb.8: 1241; SOFT-NEXT: .LCPI11_0: 1242; SOFT-NEXT: .long 3227516928 @ 0xc0600000 1243; SOFT-NEXT: .LCPI11_1: 1244; SOFT-NEXT: .long 1080016896 @ 0x405fc000 1245; 1246; VFP2-LABEL: test_signed_i8_f64: 1247; VFP2: @ %bb.0: 1248; VFP2-NEXT: vmov d16, r0, r1 1249; VFP2-NEXT: vldr d17, .LCPI11_0 1250; VFP2-NEXT: vldr d18, .LCPI11_1 1251; VFP2-NEXT: vcvt.s32.f64 s0, d16 1252; VFP2-NEXT: vcmp.f64 d16, d17 1253; VFP2-NEXT: vmrs APSR_nzcv, fpscr 1254; VFP2-NEXT: vmov r0, s0 1255; VFP2-NEXT: vcmp.f64 d16, d18 1256; VFP2-NEXT: it lt 1257; VFP2-NEXT: mvnlt r0, #127 1258; VFP2-NEXT: vmrs APSR_nzcv, fpscr 1259; VFP2-NEXT: it gt 1260; VFP2-NEXT: movgt r0, #127 1261; VFP2-NEXT: vcmp.f64 d16, d16 1262; VFP2-NEXT: vmrs APSR_nzcv, fpscr 1263; VFP2-NEXT: it vs 1264; VFP2-NEXT: movvs r0, #0 1265; VFP2-NEXT: bx lr 1266; VFP2-NEXT: .p2align 3 1267; VFP2-NEXT: @ %bb.1: 1268; VFP2-NEXT: .LCPI11_0: 1269; VFP2-NEXT: .long 0 @ double -128 1270; VFP2-NEXT: .long 3227516928 1271; VFP2-NEXT: .LCPI11_1: 1272; VFP2-NEXT: .long 0 @ double 127 1273; VFP2-NEXT: .long 1080016896 1274; 1275; FP16-LABEL: test_signed_i8_f64: 1276; FP16: @ %bb.0: 1277; FP16-NEXT: vldr d0, .LCPI11_0 1278; FP16-NEXT: vmov d1, r0, r1 1279; FP16-NEXT: vldr d2, .LCPI11_1 1280; FP16-NEXT: vmaxnm.f64 d0, d1, d0 1281; FP16-NEXT: vcmp.f64 d1, d1 1282; FP16-NEXT: vminnm.f64 d0, d0, d2 1283; FP16-NEXT: vcvt.s32.f64 s0, d0 1284; FP16-NEXT: vmov r0, s0 1285; FP16-NEXT: vmrs APSR_nzcv, fpscr 1286; FP16-NEXT: it vs 1287; FP16-NEXT: movvs r0, #0 1288; FP16-NEXT: bx lr 1289; FP16-NEXT: .p2align 3 1290; FP16-NEXT: @ %bb.1: 1291; FP16-NEXT: .LCPI11_0: 1292; FP16-NEXT: .long 0 @ double -128 1293; FP16-NEXT: .long 3227516928 1294; FP16-NEXT: .LCPI11_1: 1295; FP16-NEXT: .long 0 @ double 127 1296; FP16-NEXT: .long 1080016896 1297 %x = call i8 @llvm.fptosi.sat.i8.f64(double %f) 1298 ret i8 %x 1299} 1300 1301define i13 @test_signed_i13_f64(double %f) nounwind { 1302; SOFT-LABEL: test_signed_i13_f64: 1303; SOFT: @ %bb.0: 1304; SOFT-NEXT: .save {r4, r5, r6, r7, lr} 1305; SOFT-NEXT: push {r4, r5, r6, r7, lr} 1306; SOFT-NEXT: .pad #4 1307; SOFT-NEXT: sub sp, #4 1308; SOFT-NEXT: mov r5, r1 1309; SOFT-NEXT: mov r6, r0 1310; SOFT-NEXT: movs r4, #0 1311; SOFT-NEXT: ldr r3, .LCPI12_0 1312; SOFT-NEXT: mov r2, r4 1313; SOFT-NEXT: bl __aeabi_dcmpge 1314; SOFT-NEXT: mov r7, r0 1315; SOFT-NEXT: mov r0, r6 1316; SOFT-NEXT: mov r1, r5 1317; SOFT-NEXT: bl __aeabi_d2iz 1318; SOFT-NEXT: cmp r7, #0 1319; SOFT-NEXT: beq .LBB12_2 1320; SOFT-NEXT: @ %bb.1: 1321; SOFT-NEXT: mov r7, r0 1322; SOFT-NEXT: b .LBB12_3 1323; SOFT-NEXT: .LBB12_2: 1324; SOFT-NEXT: ldr r7, .LCPI12_1 1325; SOFT-NEXT: .LBB12_3: 1326; SOFT-NEXT: ldr r3, .LCPI12_2 1327; SOFT-NEXT: mov r0, r6 1328; SOFT-NEXT: mov r1, r5 1329; SOFT-NEXT: mov r2, r4 1330; SOFT-NEXT: bl __aeabi_dcmpgt 1331; SOFT-NEXT: cmp r0, #0 1332; SOFT-NEXT: beq .LBB12_5 1333; SOFT-NEXT: @ %bb.4: 1334; SOFT-NEXT: ldr r7, .LCPI12_3 1335; SOFT-NEXT: .LBB12_5: 1336; SOFT-NEXT: mov r0, r6 1337; SOFT-NEXT: mov r1, r5 1338; SOFT-NEXT: mov r2, r6 1339; SOFT-NEXT: mov r3, r5 1340; SOFT-NEXT: bl __aeabi_dcmpun 1341; SOFT-NEXT: cmp r0, #0 1342; SOFT-NEXT: bne .LBB12_7 1343; SOFT-NEXT: @ %bb.6: 1344; SOFT-NEXT: mov r4, r7 1345; SOFT-NEXT: .LBB12_7: 1346; SOFT-NEXT: mov r0, r4 1347; SOFT-NEXT: add sp, #4 1348; SOFT-NEXT: pop {r4, r5, r6, r7, pc} 1349; SOFT-NEXT: .p2align 2 1350; SOFT-NEXT: @ %bb.8: 1351; SOFT-NEXT: .LCPI12_0: 1352; SOFT-NEXT: .long 3232759808 @ 0xc0b00000 1353; SOFT-NEXT: .LCPI12_1: 1354; SOFT-NEXT: .long 4294963200 @ 0xfffff000 1355; SOFT-NEXT: .LCPI12_2: 1356; SOFT-NEXT: .long 1085275648 @ 0x40affe00 1357; SOFT-NEXT: .LCPI12_3: 1358; SOFT-NEXT: .long 4095 @ 0xfff 1359; 1360; VFP2-LABEL: test_signed_i13_f64: 1361; VFP2: @ %bb.0: 1362; VFP2-NEXT: vmov d16, r0, r1 1363; VFP2-NEXT: vldr d17, .LCPI12_0 1364; VFP2-NEXT: vldr d18, .LCPI12_1 1365; VFP2-NEXT: vcvt.s32.f64 s0, d16 1366; VFP2-NEXT: vcmp.f64 d16, d17 1367; VFP2-NEXT: vmrs APSR_nzcv, fpscr 1368; VFP2-NEXT: vmov r0, s0 1369; VFP2-NEXT: vcmp.f64 d16, d18 1370; VFP2-NEXT: itt lt 1371; VFP2-NEXT: movwlt r0, #61440 1372; VFP2-NEXT: movtlt r0, #65535 1373; VFP2-NEXT: vmrs APSR_nzcv, fpscr 1374; VFP2-NEXT: it gt 1375; VFP2-NEXT: movwgt r0, #4095 1376; VFP2-NEXT: vcmp.f64 d16, d16 1377; VFP2-NEXT: vmrs APSR_nzcv, fpscr 1378; VFP2-NEXT: it vs 1379; VFP2-NEXT: movvs r0, #0 1380; VFP2-NEXT: bx lr 1381; VFP2-NEXT: .p2align 3 1382; VFP2-NEXT: @ %bb.1: 1383; VFP2-NEXT: .LCPI12_0: 1384; VFP2-NEXT: .long 0 @ double -4096 1385; VFP2-NEXT: .long 3232759808 1386; VFP2-NEXT: .LCPI12_1: 1387; VFP2-NEXT: .long 0 @ double 4095 1388; VFP2-NEXT: .long 1085275648 1389; 1390; FP16-LABEL: test_signed_i13_f64: 1391; FP16: @ %bb.0: 1392; FP16-NEXT: vldr d0, .LCPI12_0 1393; FP16-NEXT: vmov d1, r0, r1 1394; FP16-NEXT: vldr d2, .LCPI12_1 1395; FP16-NEXT: vmaxnm.f64 d0, d1, d0 1396; FP16-NEXT: vcmp.f64 d1, d1 1397; FP16-NEXT: vminnm.f64 d0, d0, d2 1398; FP16-NEXT: vcvt.s32.f64 s0, d0 1399; FP16-NEXT: vmov r0, s0 1400; FP16-NEXT: vmrs APSR_nzcv, fpscr 1401; FP16-NEXT: it vs 1402; FP16-NEXT: movvs r0, #0 1403; FP16-NEXT: bx lr 1404; FP16-NEXT: .p2align 3 1405; FP16-NEXT: @ %bb.1: 1406; FP16-NEXT: .LCPI12_0: 1407; FP16-NEXT: .long 0 @ double -4096 1408; FP16-NEXT: .long 3232759808 1409; FP16-NEXT: .LCPI12_1: 1410; FP16-NEXT: .long 0 @ double 4095 1411; FP16-NEXT: .long 1085275648 1412 %x = call i13 @llvm.fptosi.sat.i13.f64(double %f) 1413 ret i13 %x 1414} 1415 1416define i16 @test_signed_i16_f64(double %f) nounwind { 1417; SOFT-LABEL: test_signed_i16_f64: 1418; SOFT: @ %bb.0: 1419; SOFT-NEXT: .save {r4, r5, r6, r7, lr} 1420; SOFT-NEXT: push {r4, r5, r6, r7, lr} 1421; SOFT-NEXT: .pad #4 1422; SOFT-NEXT: sub sp, #4 1423; SOFT-NEXT: mov r5, r1 1424; SOFT-NEXT: mov r6, r0 1425; SOFT-NEXT: movs r4, #0 1426; SOFT-NEXT: ldr r3, .LCPI13_0 1427; SOFT-NEXT: mov r2, r4 1428; SOFT-NEXT: bl __aeabi_dcmpge 1429; SOFT-NEXT: mov r7, r0 1430; SOFT-NEXT: mov r0, r6 1431; SOFT-NEXT: mov r1, r5 1432; SOFT-NEXT: bl __aeabi_d2iz 1433; SOFT-NEXT: cmp r7, #0 1434; SOFT-NEXT: beq .LBB13_2 1435; SOFT-NEXT: @ %bb.1: 1436; SOFT-NEXT: mov r7, r0 1437; SOFT-NEXT: b .LBB13_3 1438; SOFT-NEXT: .LBB13_2: 1439; SOFT-NEXT: ldr r7, .LCPI13_1 1440; SOFT-NEXT: .LBB13_3: 1441; SOFT-NEXT: ldr r3, .LCPI13_2 1442; SOFT-NEXT: mov r0, r6 1443; SOFT-NEXT: mov r1, r5 1444; SOFT-NEXT: mov r2, r4 1445; SOFT-NEXT: bl __aeabi_dcmpgt 1446; SOFT-NEXT: cmp r0, #0 1447; SOFT-NEXT: beq .LBB13_5 1448; SOFT-NEXT: @ %bb.4: 1449; SOFT-NEXT: ldr r7, .LCPI13_3 1450; SOFT-NEXT: .LBB13_5: 1451; SOFT-NEXT: mov r0, r6 1452; SOFT-NEXT: mov r1, r5 1453; SOFT-NEXT: mov r2, r6 1454; SOFT-NEXT: mov r3, r5 1455; SOFT-NEXT: bl __aeabi_dcmpun 1456; SOFT-NEXT: cmp r0, #0 1457; SOFT-NEXT: bne .LBB13_7 1458; SOFT-NEXT: @ %bb.6: 1459; SOFT-NEXT: mov r4, r7 1460; SOFT-NEXT: .LBB13_7: 1461; SOFT-NEXT: mov r0, r4 1462; SOFT-NEXT: add sp, #4 1463; SOFT-NEXT: pop {r4, r5, r6, r7, pc} 1464; SOFT-NEXT: .p2align 2 1465; SOFT-NEXT: @ %bb.8: 1466; SOFT-NEXT: .LCPI13_0: 1467; SOFT-NEXT: .long 3235905536 @ 0xc0e00000 1468; SOFT-NEXT: .LCPI13_1: 1469; SOFT-NEXT: .long 4294934528 @ 0xffff8000 1470; SOFT-NEXT: .LCPI13_2: 1471; SOFT-NEXT: .long 1088421824 @ 0x40dfffc0 1472; SOFT-NEXT: .LCPI13_3: 1473; SOFT-NEXT: .long 32767 @ 0x7fff 1474; 1475; VFP2-LABEL: test_signed_i16_f64: 1476; VFP2: @ %bb.0: 1477; VFP2-NEXT: vmov d16, r0, r1 1478; VFP2-NEXT: vldr d17, .LCPI13_0 1479; VFP2-NEXT: vldr d18, .LCPI13_1 1480; VFP2-NEXT: vcvt.s32.f64 s0, d16 1481; VFP2-NEXT: vcmp.f64 d16, d17 1482; VFP2-NEXT: vmrs APSR_nzcv, fpscr 1483; VFP2-NEXT: vmov r0, s0 1484; VFP2-NEXT: vcmp.f64 d16, d18 1485; VFP2-NEXT: itt lt 1486; VFP2-NEXT: movwlt r0, #32768 1487; VFP2-NEXT: movtlt r0, #65535 1488; VFP2-NEXT: vmrs APSR_nzcv, fpscr 1489; VFP2-NEXT: it gt 1490; VFP2-NEXT: movwgt r0, #32767 1491; VFP2-NEXT: vcmp.f64 d16, d16 1492; VFP2-NEXT: vmrs APSR_nzcv, fpscr 1493; VFP2-NEXT: it vs 1494; VFP2-NEXT: movvs r0, #0 1495; VFP2-NEXT: bx lr 1496; VFP2-NEXT: .p2align 3 1497; VFP2-NEXT: @ %bb.1: 1498; VFP2-NEXT: .LCPI13_0: 1499; VFP2-NEXT: .long 0 @ double -32768 1500; VFP2-NEXT: .long 3235905536 1501; VFP2-NEXT: .LCPI13_1: 1502; VFP2-NEXT: .long 0 @ double 32767 1503; VFP2-NEXT: .long 1088421824 1504; 1505; FP16-LABEL: test_signed_i16_f64: 1506; FP16: @ %bb.0: 1507; FP16-NEXT: vldr d0, .LCPI13_0 1508; FP16-NEXT: vmov d1, r0, r1 1509; FP16-NEXT: vldr d2, .LCPI13_1 1510; FP16-NEXT: vmaxnm.f64 d0, d1, d0 1511; FP16-NEXT: vcmp.f64 d1, d1 1512; FP16-NEXT: vminnm.f64 d0, d0, d2 1513; FP16-NEXT: vcvt.s32.f64 s0, d0 1514; FP16-NEXT: vmov r0, s0 1515; FP16-NEXT: vmrs APSR_nzcv, fpscr 1516; FP16-NEXT: it vs 1517; FP16-NEXT: movvs r0, #0 1518; FP16-NEXT: bx lr 1519; FP16-NEXT: .p2align 3 1520; FP16-NEXT: @ %bb.1: 1521; FP16-NEXT: .LCPI13_0: 1522; FP16-NEXT: .long 0 @ double -32768 1523; FP16-NEXT: .long 3235905536 1524; FP16-NEXT: .LCPI13_1: 1525; FP16-NEXT: .long 0 @ double 32767 1526; FP16-NEXT: .long 1088421824 1527 %x = call i16 @llvm.fptosi.sat.i16.f64(double %f) 1528 ret i16 %x 1529} 1530 1531define i19 @test_signed_i19_f64(double %f) nounwind { 1532; SOFT-LABEL: test_signed_i19_f64: 1533; SOFT: @ %bb.0: 1534; SOFT-NEXT: .save {r4, r5, r6, r7, lr} 1535; SOFT-NEXT: push {r4, r5, r6, r7, lr} 1536; SOFT-NEXT: .pad #4 1537; SOFT-NEXT: sub sp, #4 1538; SOFT-NEXT: mov r5, r1 1539; SOFT-NEXT: mov r6, r0 1540; SOFT-NEXT: movs r4, #0 1541; SOFT-NEXT: ldr r3, .LCPI14_0 1542; SOFT-NEXT: mov r2, r4 1543; SOFT-NEXT: bl __aeabi_dcmpge 1544; SOFT-NEXT: mov r7, r0 1545; SOFT-NEXT: mov r0, r6 1546; SOFT-NEXT: mov r1, r5 1547; SOFT-NEXT: bl __aeabi_d2iz 1548; SOFT-NEXT: cmp r7, #0 1549; SOFT-NEXT: beq .LBB14_2 1550; SOFT-NEXT: @ %bb.1: 1551; SOFT-NEXT: mov r7, r0 1552; SOFT-NEXT: b .LBB14_3 1553; SOFT-NEXT: .LBB14_2: 1554; SOFT-NEXT: ldr r7, .LCPI14_1 1555; SOFT-NEXT: .LBB14_3: 1556; SOFT-NEXT: ldr r3, .LCPI14_2 1557; SOFT-NEXT: mov r0, r6 1558; SOFT-NEXT: mov r1, r5 1559; SOFT-NEXT: mov r2, r4 1560; SOFT-NEXT: bl __aeabi_dcmpgt 1561; SOFT-NEXT: cmp r0, #0 1562; SOFT-NEXT: beq .LBB14_5 1563; SOFT-NEXT: @ %bb.4: 1564; SOFT-NEXT: ldr r7, .LCPI14_3 1565; SOFT-NEXT: .LBB14_5: 1566; SOFT-NEXT: mov r0, r6 1567; SOFT-NEXT: mov r1, r5 1568; SOFT-NEXT: mov r2, r6 1569; SOFT-NEXT: mov r3, r5 1570; SOFT-NEXT: bl __aeabi_dcmpun 1571; SOFT-NEXT: cmp r0, #0 1572; SOFT-NEXT: bne .LBB14_7 1573; SOFT-NEXT: @ %bb.6: 1574; SOFT-NEXT: mov r4, r7 1575; SOFT-NEXT: .LBB14_7: 1576; SOFT-NEXT: mov r0, r4 1577; SOFT-NEXT: add sp, #4 1578; SOFT-NEXT: pop {r4, r5, r6, r7, pc} 1579; SOFT-NEXT: .p2align 2 1580; SOFT-NEXT: @ %bb.8: 1581; SOFT-NEXT: .LCPI14_0: 1582; SOFT-NEXT: .long 3239051264 @ 0xc1100000 1583; SOFT-NEXT: .LCPI14_1: 1584; SOFT-NEXT: .long 4294705152 @ 0xfffc0000 1585; SOFT-NEXT: .LCPI14_2: 1586; SOFT-NEXT: .long 1091567608 @ 0x410ffff8 1587; SOFT-NEXT: .LCPI14_3: 1588; SOFT-NEXT: .long 262143 @ 0x3ffff 1589; 1590; VFP2-LABEL: test_signed_i19_f64: 1591; VFP2: @ %bb.0: 1592; VFP2-NEXT: vmov d16, r0, r1 1593; VFP2-NEXT: vldr d17, .LCPI14_0 1594; VFP2-NEXT: vldr d18, .LCPI14_1 1595; VFP2-NEXT: vcvt.s32.f64 s0, d16 1596; VFP2-NEXT: vcmp.f64 d16, d17 1597; VFP2-NEXT: vmrs APSR_nzcv, fpscr 1598; VFP2-NEXT: vmov r0, s0 1599; VFP2-NEXT: vcmp.f64 d16, d18 1600; VFP2-NEXT: itt lt 1601; VFP2-NEXT: movlt r0, #0 1602; VFP2-NEXT: movtlt r0, #65532 1603; VFP2-NEXT: vmrs APSR_nzcv, fpscr 1604; VFP2-NEXT: itt gt 1605; VFP2-NEXT: movwgt r0, #65535 1606; VFP2-NEXT: movtgt r0, #3 1607; VFP2-NEXT: vcmp.f64 d16, d16 1608; VFP2-NEXT: vmrs APSR_nzcv, fpscr 1609; VFP2-NEXT: it vs 1610; VFP2-NEXT: movvs r0, #0 1611; VFP2-NEXT: bx lr 1612; VFP2-NEXT: .p2align 3 1613; VFP2-NEXT: @ %bb.1: 1614; VFP2-NEXT: .LCPI14_0: 1615; VFP2-NEXT: .long 0 @ double -262144 1616; VFP2-NEXT: .long 3239051264 1617; VFP2-NEXT: .LCPI14_1: 1618; VFP2-NEXT: .long 0 @ double 262143 1619; VFP2-NEXT: .long 1091567608 1620; 1621; FP16-LABEL: test_signed_i19_f64: 1622; FP16: @ %bb.0: 1623; FP16-NEXT: vldr d0, .LCPI14_0 1624; FP16-NEXT: vmov d1, r0, r1 1625; FP16-NEXT: vldr d2, .LCPI14_1 1626; FP16-NEXT: vmaxnm.f64 d0, d1, d0 1627; FP16-NEXT: vcmp.f64 d1, d1 1628; FP16-NEXT: vminnm.f64 d0, d0, d2 1629; FP16-NEXT: vcvt.s32.f64 s0, d0 1630; FP16-NEXT: vmov r0, s0 1631; FP16-NEXT: vmrs APSR_nzcv, fpscr 1632; FP16-NEXT: it vs 1633; FP16-NEXT: movvs r0, #0 1634; FP16-NEXT: bx lr 1635; FP16-NEXT: .p2align 3 1636; FP16-NEXT: @ %bb.1: 1637; FP16-NEXT: .LCPI14_0: 1638; FP16-NEXT: .long 0 @ double -262144 1639; FP16-NEXT: .long 3239051264 1640; FP16-NEXT: .LCPI14_1: 1641; FP16-NEXT: .long 0 @ double 262143 1642; FP16-NEXT: .long 1091567608 1643 %x = call i19 @llvm.fptosi.sat.i19.f64(double %f) 1644 ret i19 %x 1645} 1646 1647define i32 @test_signed_i32_f64(double %f) nounwind { 1648; SOFT-LABEL: test_signed_i32_f64: 1649; SOFT: @ %bb.0: 1650; SOFT-NEXT: .save {r4, r5, r6, r7, lr} 1651; SOFT-NEXT: push {r4, r5, r6, r7, lr} 1652; SOFT-NEXT: .pad #4 1653; SOFT-NEXT: sub sp, #4 1654; SOFT-NEXT: mov r5, r1 1655; SOFT-NEXT: mov r6, r0 1656; SOFT-NEXT: movs r4, #0 1657; SOFT-NEXT: ldr r3, .LCPI15_0 1658; SOFT-NEXT: mov r2, r4 1659; SOFT-NEXT: bl __aeabi_dcmpge 1660; SOFT-NEXT: mov r7, r0 1661; SOFT-NEXT: mov r0, r6 1662; SOFT-NEXT: mov r1, r5 1663; SOFT-NEXT: bl __aeabi_d2iz 1664; SOFT-NEXT: cmp r7, #0 1665; SOFT-NEXT: beq .LBB15_2 1666; SOFT-NEXT: @ %bb.1: 1667; SOFT-NEXT: mov r7, r0 1668; SOFT-NEXT: b .LBB15_3 1669; SOFT-NEXT: .LBB15_2: 1670; SOFT-NEXT: movs r0, #1 1671; SOFT-NEXT: lsls r7, r0, #31 1672; SOFT-NEXT: .LBB15_3: 1673; SOFT-NEXT: ldr r2, .LCPI15_1 1674; SOFT-NEXT: ldr r3, .LCPI15_2 1675; SOFT-NEXT: mov r0, r6 1676; SOFT-NEXT: mov r1, r5 1677; SOFT-NEXT: bl __aeabi_dcmpgt 1678; SOFT-NEXT: cmp r0, #0 1679; SOFT-NEXT: beq .LBB15_5 1680; SOFT-NEXT: @ %bb.4: 1681; SOFT-NEXT: ldr r7, .LCPI15_3 1682; SOFT-NEXT: .LBB15_5: 1683; SOFT-NEXT: mov r0, r6 1684; SOFT-NEXT: mov r1, r5 1685; SOFT-NEXT: mov r2, r6 1686; SOFT-NEXT: mov r3, r5 1687; SOFT-NEXT: bl __aeabi_dcmpun 1688; SOFT-NEXT: cmp r0, #0 1689; SOFT-NEXT: bne .LBB15_7 1690; SOFT-NEXT: @ %bb.6: 1691; SOFT-NEXT: mov r4, r7 1692; SOFT-NEXT: .LBB15_7: 1693; SOFT-NEXT: mov r0, r4 1694; SOFT-NEXT: add sp, #4 1695; SOFT-NEXT: pop {r4, r5, r6, r7, pc} 1696; SOFT-NEXT: .p2align 2 1697; SOFT-NEXT: @ %bb.8: 1698; SOFT-NEXT: .LCPI15_0: 1699; SOFT-NEXT: .long 3252682752 @ 0xc1e00000 1700; SOFT-NEXT: .LCPI15_1: 1701; SOFT-NEXT: .long 4290772992 @ 0xffc00000 1702; SOFT-NEXT: .LCPI15_2: 1703; SOFT-NEXT: .long 1105199103 @ 0x41dfffff 1704; SOFT-NEXT: .LCPI15_3: 1705; SOFT-NEXT: .long 2147483647 @ 0x7fffffff 1706; 1707; VFP2-LABEL: test_signed_i32_f64: 1708; VFP2: @ %bb.0: 1709; VFP2-NEXT: vmov d16, r0, r1 1710; VFP2-NEXT: vcvt.s32.f64 s0, d16 1711; VFP2-NEXT: vmov r0, s0 1712; VFP2-NEXT: bx lr 1713; 1714; FP16-LABEL: test_signed_i32_f64: 1715; FP16: @ %bb.0: 1716; FP16-NEXT: vmov d0, r0, r1 1717; FP16-NEXT: vcvt.s32.f64 s0, d0 1718; FP16-NEXT: vmov r0, s0 1719; FP16-NEXT: bx lr 1720 %x = call i32 @llvm.fptosi.sat.i32.f64(double %f) 1721 ret i32 %x 1722} 1723 1724define i50 @test_signed_i50_f64(double %f) nounwind { 1725; SOFT-LABEL: test_signed_i50_f64: 1726; SOFT: @ %bb.0: 1727; SOFT-NEXT: .save {r4, r5, r6, r7, lr} 1728; SOFT-NEXT: push {r4, r5, r6, r7, lr} 1729; SOFT-NEXT: .pad #12 1730; SOFT-NEXT: sub sp, #12 1731; SOFT-NEXT: mov r5, r1 1732; SOFT-NEXT: mov r6, r0 1733; SOFT-NEXT: movs r0, #195 1734; SOFT-NEXT: lsls r3, r0, #24 1735; SOFT-NEXT: movs r4, #0 1736; SOFT-NEXT: mov r0, r6 1737; SOFT-NEXT: mov r2, r4 1738; SOFT-NEXT: bl __aeabi_dcmpge 1739; SOFT-NEXT: mov r7, r0 1740; SOFT-NEXT: mov r0, r6 1741; SOFT-NEXT: mov r1, r5 1742; SOFT-NEXT: bl __aeabi_d2lz 1743; SOFT-NEXT: str r0, [sp, #4] @ 4-byte Spill 1744; SOFT-NEXT: cmp r7, #0 1745; SOFT-NEXT: bne .LBB16_2 1746; SOFT-NEXT: @ %bb.1: 1747; SOFT-NEXT: str r7, [sp, #4] @ 4-byte Spill 1748; SOFT-NEXT: .LBB16_2: 1749; SOFT-NEXT: beq .LBB16_4 1750; SOFT-NEXT: @ %bb.3: 1751; SOFT-NEXT: str r1, [sp, #8] @ 4-byte Spill 1752; SOFT-NEXT: b .LBB16_5 1753; SOFT-NEXT: .LBB16_4: 1754; SOFT-NEXT: ldr r0, .LCPI16_0 1755; SOFT-NEXT: str r0, [sp, #8] @ 4-byte Spill 1756; SOFT-NEXT: .LBB16_5: 1757; SOFT-NEXT: movs r0, #15 1758; SOFT-NEXT: mvns r2, r0 1759; SOFT-NEXT: ldr r3, .LCPI16_1 1760; SOFT-NEXT: mov r0, r6 1761; SOFT-NEXT: mov r1, r5 1762; SOFT-NEXT: bl __aeabi_dcmpgt 1763; SOFT-NEXT: mvns r7, r4 1764; SOFT-NEXT: cmp r0, #0 1765; SOFT-NEXT: beq .LBB16_7 1766; SOFT-NEXT: @ %bb.6: 1767; SOFT-NEXT: ldr r0, .LCPI16_2 1768; SOFT-NEXT: str r0, [sp, #8] @ 4-byte Spill 1769; SOFT-NEXT: .LBB16_7: 1770; SOFT-NEXT: bne .LBB16_9 1771; SOFT-NEXT: @ %bb.8: 1772; SOFT-NEXT: ldr r7, [sp, #4] @ 4-byte Reload 1773; SOFT-NEXT: .LBB16_9: 1774; SOFT-NEXT: mov r0, r6 1775; SOFT-NEXT: mov r1, r5 1776; SOFT-NEXT: mov r2, r6 1777; SOFT-NEXT: mov r3, r5 1778; SOFT-NEXT: bl __aeabi_dcmpun 1779; SOFT-NEXT: cmp r0, #0 1780; SOFT-NEXT: mov r0, r4 1781; SOFT-NEXT: bne .LBB16_11 1782; SOFT-NEXT: @ %bb.10: 1783; SOFT-NEXT: mov r0, r7 1784; SOFT-NEXT: .LBB16_11: 1785; SOFT-NEXT: bne .LBB16_13 1786; SOFT-NEXT: @ %bb.12: 1787; SOFT-NEXT: ldr r4, [sp, #8] @ 4-byte Reload 1788; SOFT-NEXT: .LBB16_13: 1789; SOFT-NEXT: mov r1, r4 1790; SOFT-NEXT: add sp, #12 1791; SOFT-NEXT: pop {r4, r5, r6, r7, pc} 1792; SOFT-NEXT: .p2align 2 1793; SOFT-NEXT: @ %bb.14: 1794; SOFT-NEXT: .LCPI16_0: 1795; SOFT-NEXT: .long 4294836224 @ 0xfffe0000 1796; SOFT-NEXT: .LCPI16_1: 1797; SOFT-NEXT: .long 1124073471 @ 0x42ffffff 1798; SOFT-NEXT: .LCPI16_2: 1799; SOFT-NEXT: .long 131071 @ 0x1ffff 1800; 1801; VFP2-LABEL: test_signed_i50_f64: 1802; VFP2: @ %bb.0: 1803; VFP2-NEXT: .save {r4, r5, r7, lr} 1804; VFP2-NEXT: push {r4, r5, r7, lr} 1805; VFP2-NEXT: mov r4, r1 1806; VFP2-NEXT: mov r5, r0 1807; VFP2-NEXT: bl __aeabi_d2lz 1808; VFP2-NEXT: vldr d16, .LCPI16_0 1809; VFP2-NEXT: vmov d17, r5, r4 1810; VFP2-NEXT: vldr d18, .LCPI16_1 1811; VFP2-NEXT: vcmp.f64 d17, d16 1812; VFP2-NEXT: vmrs APSR_nzcv, fpscr 1813; VFP2-NEXT: ittt lt 1814; VFP2-NEXT: movlt r1, #0 1815; VFP2-NEXT: movtlt r1, #65534 1816; VFP2-NEXT: movlt r0, #0 1817; VFP2-NEXT: vcmp.f64 d17, d18 1818; VFP2-NEXT: vmrs APSR_nzcv, fpscr 1819; VFP2-NEXT: it gt 1820; VFP2-NEXT: movgt.w r0, #-1 1821; VFP2-NEXT: vcmp.f64 d17, d17 1822; VFP2-NEXT: itt gt 1823; VFP2-NEXT: movwgt r1, #65535 1824; VFP2-NEXT: movtgt r1, #1 1825; VFP2-NEXT: vmrs APSR_nzcv, fpscr 1826; VFP2-NEXT: itt vs 1827; VFP2-NEXT: movvs r0, #0 1828; VFP2-NEXT: movvs r1, #0 1829; VFP2-NEXT: pop {r4, r5, r7, pc} 1830; VFP2-NEXT: .p2align 3 1831; VFP2-NEXT: @ %bb.1: 1832; VFP2-NEXT: .LCPI16_0: 1833; VFP2-NEXT: .long 0 @ double -562949953421312 1834; VFP2-NEXT: .long 3271557120 1835; VFP2-NEXT: .LCPI16_1: 1836; VFP2-NEXT: .long 4294967280 @ double 562949953421311 1837; VFP2-NEXT: .long 1124073471 1838; 1839; FP16-LABEL: test_signed_i50_f64: 1840; FP16: @ %bb.0: 1841; FP16-NEXT: .save {r7, lr} 1842; FP16-NEXT: push {r7, lr} 1843; FP16-NEXT: .vsave {d8} 1844; FP16-NEXT: vpush {d8} 1845; FP16-NEXT: vldr d0, .LCPI16_0 1846; FP16-NEXT: vmov d8, r0, r1 1847; FP16-NEXT: vldr d1, .LCPI16_1 1848; FP16-NEXT: vmaxnm.f64 d0, d8, d0 1849; FP16-NEXT: vminnm.f64 d0, d0, d1 1850; FP16-NEXT: vmov r0, r1, d0 1851; FP16-NEXT: bl __aeabi_d2lz 1852; FP16-NEXT: vcmp.f64 d8, d8 1853; FP16-NEXT: vmrs APSR_nzcv, fpscr 1854; FP16-NEXT: itt vs 1855; FP16-NEXT: movvs r0, #0 1856; FP16-NEXT: movvs r1, #0 1857; FP16-NEXT: vpop {d8} 1858; FP16-NEXT: pop {r7, pc} 1859; FP16-NEXT: .p2align 3 1860; FP16-NEXT: @ %bb.1: 1861; FP16-NEXT: .LCPI16_0: 1862; FP16-NEXT: .long 0 @ double -562949953421312 1863; FP16-NEXT: .long 3271557120 1864; FP16-NEXT: .LCPI16_1: 1865; FP16-NEXT: .long 4294967280 @ double 562949953421311 1866; FP16-NEXT: .long 1124073471 1867 %x = call i50 @llvm.fptosi.sat.i50.f64(double %f) 1868 ret i50 %x 1869} 1870 1871define i64 @test_signed_i64_f64(double %f) nounwind { 1872; SOFT-LABEL: test_signed_i64_f64: 1873; SOFT: @ %bb.0: 1874; SOFT-NEXT: .save {r4, r5, r6, r7, lr} 1875; SOFT-NEXT: push {r4, r5, r6, r7, lr} 1876; SOFT-NEXT: .pad #12 1877; SOFT-NEXT: sub sp, #12 1878; SOFT-NEXT: mov r5, r1 1879; SOFT-NEXT: mov r6, r0 1880; SOFT-NEXT: movs r4, #0 1881; SOFT-NEXT: ldr r3, .LCPI17_0 1882; SOFT-NEXT: mov r2, r4 1883; SOFT-NEXT: bl __aeabi_dcmpge 1884; SOFT-NEXT: mov r7, r0 1885; SOFT-NEXT: mov r0, r6 1886; SOFT-NEXT: mov r1, r5 1887; SOFT-NEXT: bl __aeabi_d2lz 1888; SOFT-NEXT: str r0, [sp, #4] @ 4-byte Spill 1889; SOFT-NEXT: movs r0, #1 1890; SOFT-NEXT: lsls r0, r0, #31 1891; SOFT-NEXT: cmp r7, #0 1892; SOFT-NEXT: bne .LBB17_2 1893; SOFT-NEXT: @ %bb.1: 1894; SOFT-NEXT: str r7, [sp, #4] @ 4-byte Spill 1895; SOFT-NEXT: .LBB17_2: 1896; SOFT-NEXT: beq .LBB17_4 1897; SOFT-NEXT: @ %bb.3: 1898; SOFT-NEXT: mov r0, r1 1899; SOFT-NEXT: .LBB17_4: 1900; SOFT-NEXT: str r0, [sp, #8] @ 4-byte Spill 1901; SOFT-NEXT: mvns r7, r4 1902; SOFT-NEXT: ldr r3, .LCPI17_1 1903; SOFT-NEXT: mov r0, r6 1904; SOFT-NEXT: mov r1, r5 1905; SOFT-NEXT: mov r2, r7 1906; SOFT-NEXT: bl __aeabi_dcmpgt 1907; SOFT-NEXT: cmp r0, #0 1908; SOFT-NEXT: beq .LBB17_6 1909; SOFT-NEXT: @ %bb.5: 1910; SOFT-NEXT: ldr r0, .LCPI17_2 1911; SOFT-NEXT: str r0, [sp, #8] @ 4-byte Spill 1912; SOFT-NEXT: .LBB17_6: 1913; SOFT-NEXT: bne .LBB17_8 1914; SOFT-NEXT: @ %bb.7: 1915; SOFT-NEXT: ldr r7, [sp, #4] @ 4-byte Reload 1916; SOFT-NEXT: .LBB17_8: 1917; SOFT-NEXT: mov r0, r6 1918; SOFT-NEXT: mov r1, r5 1919; SOFT-NEXT: mov r2, r6 1920; SOFT-NEXT: mov r3, r5 1921; SOFT-NEXT: bl __aeabi_dcmpun 1922; SOFT-NEXT: cmp r0, #0 1923; SOFT-NEXT: mov r0, r4 1924; SOFT-NEXT: bne .LBB17_10 1925; SOFT-NEXT: @ %bb.9: 1926; SOFT-NEXT: mov r0, r7 1927; SOFT-NEXT: .LBB17_10: 1928; SOFT-NEXT: bne .LBB17_12 1929; SOFT-NEXT: @ %bb.11: 1930; SOFT-NEXT: ldr r4, [sp, #8] @ 4-byte Reload 1931; SOFT-NEXT: .LBB17_12: 1932; SOFT-NEXT: mov r1, r4 1933; SOFT-NEXT: add sp, #12 1934; SOFT-NEXT: pop {r4, r5, r6, r7, pc} 1935; SOFT-NEXT: .p2align 2 1936; SOFT-NEXT: @ %bb.13: 1937; SOFT-NEXT: .LCPI17_0: 1938; SOFT-NEXT: .long 3286237184 @ 0xc3e00000 1939; SOFT-NEXT: .LCPI17_1: 1940; SOFT-NEXT: .long 1138753535 @ 0x43dfffff 1941; SOFT-NEXT: .LCPI17_2: 1942; SOFT-NEXT: .long 2147483647 @ 0x7fffffff 1943; 1944; VFP2-LABEL: test_signed_i64_f64: 1945; VFP2: @ %bb.0: 1946; VFP2-NEXT: .save {r4, r5, r7, lr} 1947; VFP2-NEXT: push {r4, r5, r7, lr} 1948; VFP2-NEXT: mov r4, r1 1949; VFP2-NEXT: mov r5, r0 1950; VFP2-NEXT: bl __aeabi_d2lz 1951; VFP2-NEXT: vldr d16, .LCPI17_0 1952; VFP2-NEXT: vmov d17, r5, r4 1953; VFP2-NEXT: vldr d18, .LCPI17_1 1954; VFP2-NEXT: vcmp.f64 d17, d16 1955; VFP2-NEXT: vmrs APSR_nzcv, fpscr 1956; VFP2-NEXT: itt lt 1957; VFP2-NEXT: movlt r0, #0 1958; VFP2-NEXT: movlt.w r1, #-2147483648 1959; VFP2-NEXT: vcmp.f64 d17, d18 1960; VFP2-NEXT: vmrs APSR_nzcv, fpscr 1961; VFP2-NEXT: itt gt 1962; VFP2-NEXT: mvngt r1, #-2147483648 1963; VFP2-NEXT: movgt.w r0, #-1 1964; VFP2-NEXT: vcmp.f64 d17, d17 1965; VFP2-NEXT: vmrs APSR_nzcv, fpscr 1966; VFP2-NEXT: itt vs 1967; VFP2-NEXT: movvs r0, #0 1968; VFP2-NEXT: movvs r1, #0 1969; VFP2-NEXT: pop {r4, r5, r7, pc} 1970; VFP2-NEXT: .p2align 3 1971; VFP2-NEXT: @ %bb.1: 1972; VFP2-NEXT: .LCPI17_0: 1973; VFP2-NEXT: .long 0 @ double -9.2233720368547758E+18 1974; VFP2-NEXT: .long 3286237184 1975; VFP2-NEXT: .LCPI17_1: 1976; VFP2-NEXT: .long 4294967295 @ double 9.2233720368547748E+18 1977; VFP2-NEXT: .long 1138753535 1978; 1979; FP16-LABEL: test_signed_i64_f64: 1980; FP16: @ %bb.0: 1981; FP16-NEXT: .save {r4, r5, r7, lr} 1982; FP16-NEXT: push {r4, r5, r7, lr} 1983; FP16-NEXT: mov r4, r1 1984; FP16-NEXT: mov r5, r0 1985; FP16-NEXT: bl __aeabi_d2lz 1986; FP16-NEXT: vldr d0, .LCPI17_0 1987; FP16-NEXT: vmov d1, r5, r4 1988; FP16-NEXT: vldr d2, .LCPI17_1 1989; FP16-NEXT: vcmp.f64 d1, d0 1990; FP16-NEXT: vmrs APSR_nzcv, fpscr 1991; FP16-NEXT: itt lt 1992; FP16-NEXT: movlt r0, #0 1993; FP16-NEXT: movlt.w r1, #-2147483648 1994; FP16-NEXT: vcmp.f64 d1, d2 1995; FP16-NEXT: vmrs APSR_nzcv, fpscr 1996; FP16-NEXT: itt gt 1997; FP16-NEXT: mvngt r1, #-2147483648 1998; FP16-NEXT: movgt.w r0, #-1 1999; FP16-NEXT: vcmp.f64 d1, d1 2000; FP16-NEXT: vmrs APSR_nzcv, fpscr 2001; FP16-NEXT: itt vs 2002; FP16-NEXT: movvs r0, #0 2003; FP16-NEXT: movvs r1, #0 2004; FP16-NEXT: pop {r4, r5, r7, pc} 2005; FP16-NEXT: .p2align 3 2006; FP16-NEXT: @ %bb.1: 2007; FP16-NEXT: .LCPI17_0: 2008; FP16-NEXT: .long 0 @ double -9.2233720368547758E+18 2009; FP16-NEXT: .long 3286237184 2010; FP16-NEXT: .LCPI17_1: 2011; FP16-NEXT: .long 4294967295 @ double 9.2233720368547748E+18 2012; FP16-NEXT: .long 1138753535 2013 %x = call i64 @llvm.fptosi.sat.i64.f64(double %f) 2014 ret i64 %x 2015} 2016 2017define i100 @test_signed_i100_f64(double %f) nounwind { 2018; SOFT-LABEL: test_signed_i100_f64: 2019; SOFT: @ %bb.0: 2020; SOFT-NEXT: .save {r4, r5, r6, r7, lr} 2021; SOFT-NEXT: push {r4, r5, r6, r7, lr} 2022; SOFT-NEXT: .pad #20 2023; SOFT-NEXT: sub sp, #20 2024; SOFT-NEXT: mov r5, r1 2025; SOFT-NEXT: mov r6, r0 2026; SOFT-NEXT: movs r4, #0 2027; SOFT-NEXT: ldr r3, .LCPI18_0 2028; SOFT-NEXT: mov r2, r4 2029; SOFT-NEXT: bl __aeabi_dcmpge 2030; SOFT-NEXT: mov r7, r0 2031; SOFT-NEXT: mov r0, r6 2032; SOFT-NEXT: mov r1, r5 2033; SOFT-NEXT: bl __fixdfti 2034; SOFT-NEXT: str r0, [sp, #12] @ 4-byte Spill 2035; SOFT-NEXT: str r1, [sp, #8] @ 4-byte Spill 2036; SOFT-NEXT: str r2, [sp, #4] @ 4-byte Spill 2037; SOFT-NEXT: movs r0, #7 2038; SOFT-NEXT: str r0, [sp, #16] @ 4-byte Spill 2039; SOFT-NEXT: mvns r0, r0 2040; SOFT-NEXT: cmp r7, #0 2041; SOFT-NEXT: beq .LBB18_17 2042; SOFT-NEXT: @ %bb.1: 2043; SOFT-NEXT: beq .LBB18_18 2044; SOFT-NEXT: .LBB18_2: 2045; SOFT-NEXT: beq .LBB18_19 2046; SOFT-NEXT: .LBB18_3: 2047; SOFT-NEXT: beq .LBB18_5 2048; SOFT-NEXT: .LBB18_4: 2049; SOFT-NEXT: mov r0, r3 2050; SOFT-NEXT: .LBB18_5: 2051; SOFT-NEXT: str r0, [sp] @ 4-byte Spill 2052; SOFT-NEXT: mvns r7, r4 2053; SOFT-NEXT: ldr r3, .LCPI18_1 2054; SOFT-NEXT: mov r0, r6 2055; SOFT-NEXT: mov r1, r5 2056; SOFT-NEXT: mov r2, r7 2057; SOFT-NEXT: bl __aeabi_dcmpgt 2058; SOFT-NEXT: cmp r0, #0 2059; SOFT-NEXT: beq .LBB18_20 2060; SOFT-NEXT: @ %bb.6: 2061; SOFT-NEXT: mov r0, r7 2062; SOFT-NEXT: beq .LBB18_21 2063; SOFT-NEXT: .LBB18_7: 2064; SOFT-NEXT: mov r1, r7 2065; SOFT-NEXT: bne .LBB18_9 2066; SOFT-NEXT: .LBB18_8: 2067; SOFT-NEXT: ldr r1, [sp, #8] @ 4-byte Reload 2068; SOFT-NEXT: .LBB18_9: 2069; SOFT-NEXT: str r1, [sp, #4] @ 4-byte Spill 2070; SOFT-NEXT: str r0, [sp, #8] @ 4-byte Spill 2071; SOFT-NEXT: bne .LBB18_11 2072; SOFT-NEXT: @ %bb.10: 2073; SOFT-NEXT: ldr r7, [sp, #12] @ 4-byte Reload 2074; SOFT-NEXT: .LBB18_11: 2075; SOFT-NEXT: mov r0, r6 2076; SOFT-NEXT: mov r1, r5 2077; SOFT-NEXT: mov r2, r6 2078; SOFT-NEXT: mov r3, r5 2079; SOFT-NEXT: bl __aeabi_dcmpun 2080; SOFT-NEXT: cmp r0, #0 2081; SOFT-NEXT: mov r0, r4 2082; SOFT-NEXT: beq .LBB18_22 2083; SOFT-NEXT: @ %bb.12: 2084; SOFT-NEXT: mov r1, r4 2085; SOFT-NEXT: beq .LBB18_23 2086; SOFT-NEXT: .LBB18_13: 2087; SOFT-NEXT: mov r2, r4 2088; SOFT-NEXT: beq .LBB18_24 2089; SOFT-NEXT: .LBB18_14: 2090; SOFT-NEXT: bne .LBB18_16 2091; SOFT-NEXT: .LBB18_15: 2092; SOFT-NEXT: ldr r4, [sp, #16] @ 4-byte Reload 2093; SOFT-NEXT: .LBB18_16: 2094; SOFT-NEXT: mov r3, r4 2095; SOFT-NEXT: add sp, #20 2096; SOFT-NEXT: pop {r4, r5, r6, r7, pc} 2097; SOFT-NEXT: .LBB18_17: 2098; SOFT-NEXT: str r7, [sp, #12] @ 4-byte Spill 2099; SOFT-NEXT: bne .LBB18_2 2100; SOFT-NEXT: .LBB18_18: 2101; SOFT-NEXT: str r7, [sp, #8] @ 4-byte Spill 2102; SOFT-NEXT: bne .LBB18_3 2103; SOFT-NEXT: .LBB18_19: 2104; SOFT-NEXT: str r7, [sp, #4] @ 4-byte Spill 2105; SOFT-NEXT: bne .LBB18_4 2106; SOFT-NEXT: b .LBB18_5 2107; SOFT-NEXT: .LBB18_20: 2108; SOFT-NEXT: ldr r0, [sp] @ 4-byte Reload 2109; SOFT-NEXT: str r0, [sp, #16] @ 4-byte Spill 2110; SOFT-NEXT: mov r0, r7 2111; SOFT-NEXT: bne .LBB18_7 2112; SOFT-NEXT: .LBB18_21: 2113; SOFT-NEXT: ldr r0, [sp, #4] @ 4-byte Reload 2114; SOFT-NEXT: mov r1, r7 2115; SOFT-NEXT: beq .LBB18_8 2116; SOFT-NEXT: b .LBB18_9 2117; SOFT-NEXT: .LBB18_22: 2118; SOFT-NEXT: mov r0, r7 2119; SOFT-NEXT: mov r1, r4 2120; SOFT-NEXT: bne .LBB18_13 2121; SOFT-NEXT: .LBB18_23: 2122; SOFT-NEXT: ldr r1, [sp, #4] @ 4-byte Reload 2123; SOFT-NEXT: mov r2, r4 2124; SOFT-NEXT: bne .LBB18_14 2125; SOFT-NEXT: .LBB18_24: 2126; SOFT-NEXT: ldr r2, [sp, #8] @ 4-byte Reload 2127; SOFT-NEXT: beq .LBB18_15 2128; SOFT-NEXT: b .LBB18_16 2129; SOFT-NEXT: .p2align 2 2130; SOFT-NEXT: @ %bb.25: 2131; SOFT-NEXT: .LCPI18_0: 2132; SOFT-NEXT: .long 3323985920 @ 0xc6200000 2133; SOFT-NEXT: .LCPI18_1: 2134; SOFT-NEXT: .long 1176502271 @ 0x461fffff 2135; 2136; VFP2-LABEL: test_signed_i100_f64: 2137; VFP2: @ %bb.0: 2138; VFP2-NEXT: .save {r4, r5, r7, lr} 2139; VFP2-NEXT: push {r4, r5, r7, lr} 2140; VFP2-NEXT: mov r4, r1 2141; VFP2-NEXT: mov r5, r0 2142; VFP2-NEXT: bl __fixdfti 2143; VFP2-NEXT: vldr d16, .LCPI18_0 2144; VFP2-NEXT: vmov d17, r5, r4 2145; VFP2-NEXT: vldr d18, .LCPI18_1 2146; VFP2-NEXT: vcmp.f64 d17, d16 2147; VFP2-NEXT: vmrs APSR_nzcv, fpscr 2148; VFP2-NEXT: itttt lt 2149; VFP2-NEXT: movlt r0, #0 2150; VFP2-NEXT: movlt r1, #0 2151; VFP2-NEXT: movlt r2, #0 2152; VFP2-NEXT: mvnlt r3, #7 2153; VFP2-NEXT: vcmp.f64 d17, d18 2154; VFP2-NEXT: vmrs APSR_nzcv, fpscr 2155; VFP2-NEXT: itttt gt 2156; VFP2-NEXT: movgt r3, #7 2157; VFP2-NEXT: movgt.w r2, #-1 2158; VFP2-NEXT: movgt.w r1, #-1 2159; VFP2-NEXT: movgt.w r0, #-1 2160; VFP2-NEXT: vcmp.f64 d17, d17 2161; VFP2-NEXT: vmrs APSR_nzcv, fpscr 2162; VFP2-NEXT: itttt vs 2163; VFP2-NEXT: movvs r0, #0 2164; VFP2-NEXT: movvs r1, #0 2165; VFP2-NEXT: movvs r2, #0 2166; VFP2-NEXT: movvs r3, #0 2167; VFP2-NEXT: pop {r4, r5, r7, pc} 2168; VFP2-NEXT: .p2align 3 2169; VFP2-NEXT: @ %bb.1: 2170; VFP2-NEXT: .LCPI18_0: 2171; VFP2-NEXT: .long 0 @ double -6.338253001141147E+29 2172; VFP2-NEXT: .long 3323985920 2173; VFP2-NEXT: .LCPI18_1: 2174; VFP2-NEXT: .long 4294967295 @ double 6.3382530011411463E+29 2175; VFP2-NEXT: .long 1176502271 2176; 2177; FP16-LABEL: test_signed_i100_f64: 2178; FP16: @ %bb.0: 2179; FP16-NEXT: .save {r4, r5, r7, lr} 2180; FP16-NEXT: push {r4, r5, r7, lr} 2181; FP16-NEXT: mov r4, r1 2182; FP16-NEXT: mov r5, r0 2183; FP16-NEXT: bl __fixdfti 2184; FP16-NEXT: vldr d0, .LCPI18_0 2185; FP16-NEXT: vmov d1, r5, r4 2186; FP16-NEXT: vldr d2, .LCPI18_1 2187; FP16-NEXT: vcmp.f64 d1, d0 2188; FP16-NEXT: vmrs APSR_nzcv, fpscr 2189; FP16-NEXT: itttt lt 2190; FP16-NEXT: movlt r0, #0 2191; FP16-NEXT: movlt r1, #0 2192; FP16-NEXT: movlt r2, #0 2193; FP16-NEXT: mvnlt r3, #7 2194; FP16-NEXT: vcmp.f64 d1, d2 2195; FP16-NEXT: vmrs APSR_nzcv, fpscr 2196; FP16-NEXT: itttt gt 2197; FP16-NEXT: movgt r3, #7 2198; FP16-NEXT: movgt.w r2, #-1 2199; FP16-NEXT: movgt.w r1, #-1 2200; FP16-NEXT: movgt.w r0, #-1 2201; FP16-NEXT: vcmp.f64 d1, d1 2202; FP16-NEXT: vmrs APSR_nzcv, fpscr 2203; FP16-NEXT: itttt vs 2204; FP16-NEXT: movvs r0, #0 2205; FP16-NEXT: movvs r1, #0 2206; FP16-NEXT: movvs r2, #0 2207; FP16-NEXT: movvs r3, #0 2208; FP16-NEXT: pop {r4, r5, r7, pc} 2209; FP16-NEXT: .p2align 3 2210; FP16-NEXT: @ %bb.1: 2211; FP16-NEXT: .LCPI18_0: 2212; FP16-NEXT: .long 0 @ double -6.338253001141147E+29 2213; FP16-NEXT: .long 3323985920 2214; FP16-NEXT: .LCPI18_1: 2215; FP16-NEXT: .long 4294967295 @ double 6.3382530011411463E+29 2216; FP16-NEXT: .long 1176502271 2217 %x = call i100 @llvm.fptosi.sat.i100.f64(double %f) 2218 ret i100 %x 2219} 2220 2221define i128 @test_signed_i128_f64(double %f) nounwind { 2222; SOFT-LABEL: test_signed_i128_f64: 2223; SOFT: @ %bb.0: 2224; SOFT-NEXT: .save {r4, r5, r6, r7, lr} 2225; SOFT-NEXT: push {r4, r5, r6, r7, lr} 2226; SOFT-NEXT: .pad #20 2227; SOFT-NEXT: sub sp, #20 2228; SOFT-NEXT: mov r5, r1 2229; SOFT-NEXT: mov r6, r0 2230; SOFT-NEXT: movs r4, #0 2231; SOFT-NEXT: ldr r3, .LCPI19_0 2232; SOFT-NEXT: mov r2, r4 2233; SOFT-NEXT: bl __aeabi_dcmpge 2234; SOFT-NEXT: mov r7, r0 2235; SOFT-NEXT: mov r0, r6 2236; SOFT-NEXT: mov r1, r5 2237; SOFT-NEXT: bl __fixdfti 2238; SOFT-NEXT: str r0, [sp, #12] @ 4-byte Spill 2239; SOFT-NEXT: str r1, [sp, #8] @ 4-byte Spill 2240; SOFT-NEXT: str r2, [sp, #4] @ 4-byte Spill 2241; SOFT-NEXT: movs r0, #1 2242; SOFT-NEXT: lsls r0, r0, #31 2243; SOFT-NEXT: str r0, [sp, #16] @ 4-byte Spill 2244; SOFT-NEXT: cmp r7, #0 2245; SOFT-NEXT: beq .LBB19_17 2246; SOFT-NEXT: @ %bb.1: 2247; SOFT-NEXT: beq .LBB19_18 2248; SOFT-NEXT: .LBB19_2: 2249; SOFT-NEXT: beq .LBB19_19 2250; SOFT-NEXT: .LBB19_3: 2251; SOFT-NEXT: beq .LBB19_5 2252; SOFT-NEXT: .LBB19_4: 2253; SOFT-NEXT: str r3, [sp, #16] @ 4-byte Spill 2254; SOFT-NEXT: .LBB19_5: 2255; SOFT-NEXT: mvns r7, r4 2256; SOFT-NEXT: ldr r3, .LCPI19_1 2257; SOFT-NEXT: mov r0, r6 2258; SOFT-NEXT: mov r1, r5 2259; SOFT-NEXT: mov r2, r7 2260; SOFT-NEXT: bl __aeabi_dcmpgt 2261; SOFT-NEXT: cmp r0, #0 2262; SOFT-NEXT: bne .LBB19_20 2263; SOFT-NEXT: @ %bb.6: 2264; SOFT-NEXT: mov r0, r7 2265; SOFT-NEXT: beq .LBB19_21 2266; SOFT-NEXT: .LBB19_7: 2267; SOFT-NEXT: mov r1, r7 2268; SOFT-NEXT: bne .LBB19_9 2269; SOFT-NEXT: .LBB19_8: 2270; SOFT-NEXT: ldr r1, [sp, #8] @ 4-byte Reload 2271; SOFT-NEXT: .LBB19_9: 2272; SOFT-NEXT: str r1, [sp, #4] @ 4-byte Spill 2273; SOFT-NEXT: str r0, [sp, #8] @ 4-byte Spill 2274; SOFT-NEXT: bne .LBB19_11 2275; SOFT-NEXT: @ %bb.10: 2276; SOFT-NEXT: ldr r7, [sp, #12] @ 4-byte Reload 2277; SOFT-NEXT: .LBB19_11: 2278; SOFT-NEXT: mov r0, r6 2279; SOFT-NEXT: mov r1, r5 2280; SOFT-NEXT: mov r2, r6 2281; SOFT-NEXT: mov r3, r5 2282; SOFT-NEXT: bl __aeabi_dcmpun 2283; SOFT-NEXT: cmp r0, #0 2284; SOFT-NEXT: mov r0, r4 2285; SOFT-NEXT: beq .LBB19_22 2286; SOFT-NEXT: @ %bb.12: 2287; SOFT-NEXT: mov r1, r4 2288; SOFT-NEXT: beq .LBB19_23 2289; SOFT-NEXT: .LBB19_13: 2290; SOFT-NEXT: mov r2, r4 2291; SOFT-NEXT: beq .LBB19_24 2292; SOFT-NEXT: .LBB19_14: 2293; SOFT-NEXT: bne .LBB19_16 2294; SOFT-NEXT: .LBB19_15: 2295; SOFT-NEXT: ldr r4, [sp, #16] @ 4-byte Reload 2296; SOFT-NEXT: .LBB19_16: 2297; SOFT-NEXT: mov r3, r4 2298; SOFT-NEXT: add sp, #20 2299; SOFT-NEXT: pop {r4, r5, r6, r7, pc} 2300; SOFT-NEXT: .LBB19_17: 2301; SOFT-NEXT: str r7, [sp, #12] @ 4-byte Spill 2302; SOFT-NEXT: bne .LBB19_2 2303; SOFT-NEXT: .LBB19_18: 2304; SOFT-NEXT: str r7, [sp, #8] @ 4-byte Spill 2305; SOFT-NEXT: bne .LBB19_3 2306; SOFT-NEXT: .LBB19_19: 2307; SOFT-NEXT: str r7, [sp, #4] @ 4-byte Spill 2308; SOFT-NEXT: bne .LBB19_4 2309; SOFT-NEXT: b .LBB19_5 2310; SOFT-NEXT: .LBB19_20: 2311; SOFT-NEXT: ldr r0, .LCPI19_2 2312; SOFT-NEXT: str r0, [sp, #16] @ 4-byte Spill 2313; SOFT-NEXT: mov r0, r7 2314; SOFT-NEXT: bne .LBB19_7 2315; SOFT-NEXT: .LBB19_21: 2316; SOFT-NEXT: ldr r0, [sp, #4] @ 4-byte Reload 2317; SOFT-NEXT: mov r1, r7 2318; SOFT-NEXT: beq .LBB19_8 2319; SOFT-NEXT: b .LBB19_9 2320; SOFT-NEXT: .LBB19_22: 2321; SOFT-NEXT: mov r0, r7 2322; SOFT-NEXT: mov r1, r4 2323; SOFT-NEXT: bne .LBB19_13 2324; SOFT-NEXT: .LBB19_23: 2325; SOFT-NEXT: ldr r1, [sp, #4] @ 4-byte Reload 2326; SOFT-NEXT: mov r2, r4 2327; SOFT-NEXT: bne .LBB19_14 2328; SOFT-NEXT: .LBB19_24: 2329; SOFT-NEXT: ldr r2, [sp, #8] @ 4-byte Reload 2330; SOFT-NEXT: beq .LBB19_15 2331; SOFT-NEXT: b .LBB19_16 2332; SOFT-NEXT: .p2align 2 2333; SOFT-NEXT: @ %bb.25: 2334; SOFT-NEXT: .LCPI19_0: 2335; SOFT-NEXT: .long 3353346048 @ 0xc7e00000 2336; SOFT-NEXT: .LCPI19_1: 2337; SOFT-NEXT: .long 1205862399 @ 0x47dfffff 2338; SOFT-NEXT: .LCPI19_2: 2339; SOFT-NEXT: .long 2147483647 @ 0x7fffffff 2340; 2341; VFP2-LABEL: test_signed_i128_f64: 2342; VFP2: @ %bb.0: 2343; VFP2-NEXT: .save {r4, r5, r7, lr} 2344; VFP2-NEXT: push {r4, r5, r7, lr} 2345; VFP2-NEXT: mov r4, r1 2346; VFP2-NEXT: mov r5, r0 2347; VFP2-NEXT: bl __fixdfti 2348; VFP2-NEXT: vldr d16, .LCPI19_0 2349; VFP2-NEXT: vmov d17, r5, r4 2350; VFP2-NEXT: vldr d18, .LCPI19_1 2351; VFP2-NEXT: vcmp.f64 d17, d16 2352; VFP2-NEXT: vmrs APSR_nzcv, fpscr 2353; VFP2-NEXT: itttt lt 2354; VFP2-NEXT: movlt r0, #0 2355; VFP2-NEXT: movlt r1, #0 2356; VFP2-NEXT: movlt r2, #0 2357; VFP2-NEXT: movlt.w r3, #-2147483648 2358; VFP2-NEXT: vcmp.f64 d17, d18 2359; VFP2-NEXT: vmrs APSR_nzcv, fpscr 2360; VFP2-NEXT: itttt gt 2361; VFP2-NEXT: mvngt r3, #-2147483648 2362; VFP2-NEXT: movgt.w r2, #-1 2363; VFP2-NEXT: movgt.w r1, #-1 2364; VFP2-NEXT: movgt.w r0, #-1 2365; VFP2-NEXT: vcmp.f64 d17, d17 2366; VFP2-NEXT: vmrs APSR_nzcv, fpscr 2367; VFP2-NEXT: itttt vs 2368; VFP2-NEXT: movvs r0, #0 2369; VFP2-NEXT: movvs r1, #0 2370; VFP2-NEXT: movvs r2, #0 2371; VFP2-NEXT: movvs r3, #0 2372; VFP2-NEXT: pop {r4, r5, r7, pc} 2373; VFP2-NEXT: .p2align 3 2374; VFP2-NEXT: @ %bb.1: 2375; VFP2-NEXT: .LCPI19_0: 2376; VFP2-NEXT: .long 0 @ double -1.7014118346046923E+38 2377; VFP2-NEXT: .long 3353346048 2378; VFP2-NEXT: .LCPI19_1: 2379; VFP2-NEXT: .long 4294967295 @ double 1.7014118346046921E+38 2380; VFP2-NEXT: .long 1205862399 2381; 2382; FP16-LABEL: test_signed_i128_f64: 2383; FP16: @ %bb.0: 2384; FP16-NEXT: .save {r4, r5, r7, lr} 2385; FP16-NEXT: push {r4, r5, r7, lr} 2386; FP16-NEXT: mov r4, r1 2387; FP16-NEXT: mov r5, r0 2388; FP16-NEXT: bl __fixdfti 2389; FP16-NEXT: vldr d0, .LCPI19_0 2390; FP16-NEXT: vmov d1, r5, r4 2391; FP16-NEXT: vldr d2, .LCPI19_1 2392; FP16-NEXT: vcmp.f64 d1, d0 2393; FP16-NEXT: vmrs APSR_nzcv, fpscr 2394; FP16-NEXT: itttt lt 2395; FP16-NEXT: movlt r0, #0 2396; FP16-NEXT: movlt r1, #0 2397; FP16-NEXT: movlt r2, #0 2398; FP16-NEXT: movlt.w r3, #-2147483648 2399; FP16-NEXT: vcmp.f64 d1, d2 2400; FP16-NEXT: vmrs APSR_nzcv, fpscr 2401; FP16-NEXT: itttt gt 2402; FP16-NEXT: mvngt r3, #-2147483648 2403; FP16-NEXT: movgt.w r2, #-1 2404; FP16-NEXT: movgt.w r1, #-1 2405; FP16-NEXT: movgt.w r0, #-1 2406; FP16-NEXT: vcmp.f64 d1, d1 2407; FP16-NEXT: vmrs APSR_nzcv, fpscr 2408; FP16-NEXT: itttt vs 2409; FP16-NEXT: movvs r0, #0 2410; FP16-NEXT: movvs r1, #0 2411; FP16-NEXT: movvs r2, #0 2412; FP16-NEXT: movvs r3, #0 2413; FP16-NEXT: pop {r4, r5, r7, pc} 2414; FP16-NEXT: .p2align 3 2415; FP16-NEXT: @ %bb.1: 2416; FP16-NEXT: .LCPI19_0: 2417; FP16-NEXT: .long 0 @ double -1.7014118346046923E+38 2418; FP16-NEXT: .long 3353346048 2419; FP16-NEXT: .LCPI19_1: 2420; FP16-NEXT: .long 4294967295 @ double 1.7014118346046921E+38 2421; FP16-NEXT: .long 1205862399 2422 %x = call i128 @llvm.fptosi.sat.i128.f64(double %f) 2423 ret i128 %x 2424} 2425 2426; 2427; 16-bit float to signed integer 2428; 2429 2430declare i1 @llvm.fptosi.sat.i1.f16 (half) 2431declare i8 @llvm.fptosi.sat.i8.f16 (half) 2432declare i13 @llvm.fptosi.sat.i13.f16 (half) 2433declare i16 @llvm.fptosi.sat.i16.f16 (half) 2434declare i19 @llvm.fptosi.sat.i19.f16 (half) 2435declare i32 @llvm.fptosi.sat.i32.f16 (half) 2436declare i50 @llvm.fptosi.sat.i50.f16 (half) 2437declare i64 @llvm.fptosi.sat.i64.f16 (half) 2438declare i100 @llvm.fptosi.sat.i100.f16(half) 2439declare i128 @llvm.fptosi.sat.i128.f16(half) 2440 2441define i1 @test_signed_i1_f16(half %f) nounwind { 2442; SOFT-LABEL: test_signed_i1_f16: 2443; SOFT: @ %bb.0: 2444; SOFT-NEXT: .save {r4, r5, r6, r7, lr} 2445; SOFT-NEXT: push {r4, r5, r6, r7, lr} 2446; SOFT-NEXT: .pad #4 2447; SOFT-NEXT: sub sp, #4 2448; SOFT-NEXT: uxth r0, r0 2449; SOFT-NEXT: bl __aeabi_h2f 2450; SOFT-NEXT: mov r4, r0 2451; SOFT-NEXT: ldr r1, .LCPI20_0 2452; SOFT-NEXT: bl __aeabi_fcmpge 2453; SOFT-NEXT: mov r7, r0 2454; SOFT-NEXT: mov r0, r4 2455; SOFT-NEXT: bl __aeabi_f2iz 2456; SOFT-NEXT: movs r5, #0 2457; SOFT-NEXT: cmp r7, #0 2458; SOFT-NEXT: beq .LBB20_2 2459; SOFT-NEXT: @ %bb.1: 2460; SOFT-NEXT: mov r6, r0 2461; SOFT-NEXT: b .LBB20_3 2462; SOFT-NEXT: .LBB20_2: 2463; SOFT-NEXT: mvns r6, r5 2464; SOFT-NEXT: .LBB20_3: 2465; SOFT-NEXT: mov r0, r4 2466; SOFT-NEXT: mov r1, r5 2467; SOFT-NEXT: bl __aeabi_fcmpgt 2468; SOFT-NEXT: cmp r0, #0 2469; SOFT-NEXT: mov r7, r5 2470; SOFT-NEXT: bne .LBB20_5 2471; SOFT-NEXT: @ %bb.4: 2472; SOFT-NEXT: mov r7, r6 2473; SOFT-NEXT: .LBB20_5: 2474; SOFT-NEXT: mov r0, r4 2475; SOFT-NEXT: mov r1, r4 2476; SOFT-NEXT: bl __aeabi_fcmpun 2477; SOFT-NEXT: cmp r0, #0 2478; SOFT-NEXT: bne .LBB20_7 2479; SOFT-NEXT: @ %bb.6: 2480; SOFT-NEXT: mov r5, r7 2481; SOFT-NEXT: .LBB20_7: 2482; SOFT-NEXT: mov r0, r5 2483; SOFT-NEXT: add sp, #4 2484; SOFT-NEXT: pop {r4, r5, r6, r7, pc} 2485; SOFT-NEXT: .p2align 2 2486; SOFT-NEXT: @ %bb.8: 2487; SOFT-NEXT: .LCPI20_0: 2488; SOFT-NEXT: .long 3212836864 @ 0xbf800000 2489; 2490; VFP2-LABEL: test_signed_i1_f16: 2491; VFP2: @ %bb.0: 2492; VFP2-NEXT: .save {r7, lr} 2493; VFP2-NEXT: push {r7, lr} 2494; VFP2-NEXT: bl __aeabi_h2f 2495; VFP2-NEXT: vmov s2, r0 2496; VFP2-NEXT: vmov.f32 s0, #-1.000000e+00 2497; VFP2-NEXT: vcvt.s32.f32 s4, s2 2498; VFP2-NEXT: vcmp.f32 s2, s0 2499; VFP2-NEXT: vmov r0, s4 2500; VFP2-NEXT: vmrs APSR_nzcv, fpscr 2501; VFP2-NEXT: it lt 2502; VFP2-NEXT: movlt.w r0, #-1 2503; VFP2-NEXT: vcmp.f32 s2, #0 2504; VFP2-NEXT: vmrs APSR_nzcv, fpscr 2505; VFP2-NEXT: it gt 2506; VFP2-NEXT: movgt r0, #0 2507; VFP2-NEXT: vcmp.f32 s2, s2 2508; VFP2-NEXT: vmrs APSR_nzcv, fpscr 2509; VFP2-NEXT: it vs 2510; VFP2-NEXT: movvs r0, #0 2511; VFP2-NEXT: pop {r7, pc} 2512; 2513; FP16-LABEL: test_signed_i1_f16: 2514; FP16: @ %bb.0: 2515; FP16-NEXT: vmov.f16 s0, r0 2516; FP16-NEXT: vldr s2, .LCPI20_0 2517; FP16-NEXT: vcvtb.f32.f16 s0, s0 2518; FP16-NEXT: vmov.f32 s4, #-1.000000e+00 2519; FP16-NEXT: vmaxnm.f32 s4, s0, s4 2520; FP16-NEXT: vcmp.f32 s0, s0 2521; FP16-NEXT: vminnm.f32 s2, s4, s2 2522; FP16-NEXT: vmrs APSR_nzcv, fpscr 2523; FP16-NEXT: vcvt.s32.f32 s2, s2 2524; FP16-NEXT: vmov r0, s2 2525; FP16-NEXT: it vs 2526; FP16-NEXT: movvs r0, #0 2527; FP16-NEXT: bx lr 2528; FP16-NEXT: .p2align 2 2529; FP16-NEXT: @ %bb.1: 2530; FP16-NEXT: .LCPI20_0: 2531; FP16-NEXT: .long 0x00000000 @ float 0 2532 %x = call i1 @llvm.fptosi.sat.i1.f16(half %f) 2533 ret i1 %x 2534} 2535 2536define i8 @test_signed_i8_f16(half %f) nounwind { 2537; SOFT-LABEL: test_signed_i8_f16: 2538; SOFT: @ %bb.0: 2539; SOFT-NEXT: .save {r4, r5, r6, r7, lr} 2540; SOFT-NEXT: push {r4, r5, r6, r7, lr} 2541; SOFT-NEXT: .pad #4 2542; SOFT-NEXT: sub sp, #4 2543; SOFT-NEXT: uxth r0, r0 2544; SOFT-NEXT: bl __aeabi_h2f 2545; SOFT-NEXT: mov r4, r0 2546; SOFT-NEXT: movs r0, #195 2547; SOFT-NEXT: lsls r1, r0, #24 2548; SOFT-NEXT: mov r0, r4 2549; SOFT-NEXT: bl __aeabi_fcmpge 2550; SOFT-NEXT: mov r7, r0 2551; SOFT-NEXT: mov r0, r4 2552; SOFT-NEXT: bl __aeabi_f2iz 2553; SOFT-NEXT: movs r5, #127 2554; SOFT-NEXT: cmp r7, #0 2555; SOFT-NEXT: beq .LBB21_2 2556; SOFT-NEXT: @ %bb.1: 2557; SOFT-NEXT: mov r6, r0 2558; SOFT-NEXT: b .LBB21_3 2559; SOFT-NEXT: .LBB21_2: 2560; SOFT-NEXT: mvns r6, r5 2561; SOFT-NEXT: .LBB21_3: 2562; SOFT-NEXT: ldr r1, .LCPI21_0 2563; SOFT-NEXT: mov r0, r4 2564; SOFT-NEXT: bl __aeabi_fcmpgt 2565; SOFT-NEXT: cmp r0, #0 2566; SOFT-NEXT: bne .LBB21_5 2567; SOFT-NEXT: @ %bb.4: 2568; SOFT-NEXT: mov r5, r6 2569; SOFT-NEXT: .LBB21_5: 2570; SOFT-NEXT: mov r0, r4 2571; SOFT-NEXT: mov r1, r4 2572; SOFT-NEXT: bl __aeabi_fcmpun 2573; SOFT-NEXT: cmp r0, #0 2574; SOFT-NEXT: beq .LBB21_7 2575; SOFT-NEXT: @ %bb.6: 2576; SOFT-NEXT: movs r5, #0 2577; SOFT-NEXT: .LBB21_7: 2578; SOFT-NEXT: mov r0, r5 2579; SOFT-NEXT: add sp, #4 2580; SOFT-NEXT: pop {r4, r5, r6, r7, pc} 2581; SOFT-NEXT: .p2align 2 2582; SOFT-NEXT: @ %bb.8: 2583; SOFT-NEXT: .LCPI21_0: 2584; SOFT-NEXT: .long 1123942400 @ 0x42fe0000 2585; 2586; VFP2-LABEL: test_signed_i8_f16: 2587; VFP2: @ %bb.0: 2588; VFP2-NEXT: .save {r7, lr} 2589; VFP2-NEXT: push {r7, lr} 2590; VFP2-NEXT: bl __aeabi_h2f 2591; VFP2-NEXT: vmov s0, r0 2592; VFP2-NEXT: vldr s2, .LCPI21_0 2593; VFP2-NEXT: vldr s6, .LCPI21_1 2594; VFP2-NEXT: vcvt.s32.f32 s4, s0 2595; VFP2-NEXT: vcmp.f32 s0, s2 2596; VFP2-NEXT: vmrs APSR_nzcv, fpscr 2597; VFP2-NEXT: vcmp.f32 s0, s6 2598; VFP2-NEXT: vmov r0, s4 2599; VFP2-NEXT: it lt 2600; VFP2-NEXT: mvnlt r0, #127 2601; VFP2-NEXT: vmrs APSR_nzcv, fpscr 2602; VFP2-NEXT: it gt 2603; VFP2-NEXT: movgt r0, #127 2604; VFP2-NEXT: vcmp.f32 s0, s0 2605; VFP2-NEXT: vmrs APSR_nzcv, fpscr 2606; VFP2-NEXT: it vs 2607; VFP2-NEXT: movvs r0, #0 2608; VFP2-NEXT: pop {r7, pc} 2609; VFP2-NEXT: .p2align 2 2610; VFP2-NEXT: @ %bb.1: 2611; VFP2-NEXT: .LCPI21_0: 2612; VFP2-NEXT: .long 0xc3000000 @ float -128 2613; VFP2-NEXT: .LCPI21_1: 2614; VFP2-NEXT: .long 0x42fe0000 @ float 127 2615; 2616; FP16-LABEL: test_signed_i8_f16: 2617; FP16: @ %bb.0: 2618; FP16-NEXT: vmov.f16 s0, r0 2619; FP16-NEXT: vldr s4, .LCPI21_1 2620; FP16-NEXT: vcvtb.f32.f16 s0, s0 2621; FP16-NEXT: vldr s2, .LCPI21_0 2622; FP16-NEXT: vmaxnm.f32 s4, s0, s4 2623; FP16-NEXT: vcmp.f32 s0, s0 2624; FP16-NEXT: vminnm.f32 s2, s4, s2 2625; FP16-NEXT: vmrs APSR_nzcv, fpscr 2626; FP16-NEXT: vcvt.s32.f32 s2, s2 2627; FP16-NEXT: vmov r0, s2 2628; FP16-NEXT: it vs 2629; FP16-NEXT: movvs r0, #0 2630; FP16-NEXT: bx lr 2631; FP16-NEXT: .p2align 2 2632; FP16-NEXT: @ %bb.1: 2633; FP16-NEXT: .LCPI21_0: 2634; FP16-NEXT: .long 0x42fe0000 @ float 127 2635; FP16-NEXT: .LCPI21_1: 2636; FP16-NEXT: .long 0xc3000000 @ float -128 2637 %x = call i8 @llvm.fptosi.sat.i8.f16(half %f) 2638 ret i8 %x 2639} 2640 2641define i13 @test_signed_i13_f16(half %f) nounwind { 2642; SOFT-LABEL: test_signed_i13_f16: 2643; SOFT: @ %bb.0: 2644; SOFT-NEXT: .save {r4, r5, r6, lr} 2645; SOFT-NEXT: push {r4, r5, r6, lr} 2646; SOFT-NEXT: uxth r0, r0 2647; SOFT-NEXT: bl __aeabi_h2f 2648; SOFT-NEXT: mov r4, r0 2649; SOFT-NEXT: ldr r1, .LCPI22_0 2650; SOFT-NEXT: bl __aeabi_fcmpge 2651; SOFT-NEXT: mov r6, r0 2652; SOFT-NEXT: mov r0, r4 2653; SOFT-NEXT: bl __aeabi_f2iz 2654; SOFT-NEXT: cmp r6, #0 2655; SOFT-NEXT: beq .LBB22_2 2656; SOFT-NEXT: @ %bb.1: 2657; SOFT-NEXT: mov r5, r0 2658; SOFT-NEXT: b .LBB22_3 2659; SOFT-NEXT: .LBB22_2: 2660; SOFT-NEXT: ldr r5, .LCPI22_1 2661; SOFT-NEXT: .LBB22_3: 2662; SOFT-NEXT: ldr r1, .LCPI22_2 2663; SOFT-NEXT: mov r0, r4 2664; SOFT-NEXT: bl __aeabi_fcmpgt 2665; SOFT-NEXT: cmp r0, #0 2666; SOFT-NEXT: beq .LBB22_5 2667; SOFT-NEXT: @ %bb.4: 2668; SOFT-NEXT: ldr r5, .LCPI22_3 2669; SOFT-NEXT: .LBB22_5: 2670; SOFT-NEXT: mov r0, r4 2671; SOFT-NEXT: mov r1, r4 2672; SOFT-NEXT: bl __aeabi_fcmpun 2673; SOFT-NEXT: cmp r0, #0 2674; SOFT-NEXT: beq .LBB22_7 2675; SOFT-NEXT: @ %bb.6: 2676; SOFT-NEXT: movs r5, #0 2677; SOFT-NEXT: .LBB22_7: 2678; SOFT-NEXT: mov r0, r5 2679; SOFT-NEXT: pop {r4, r5, r6, pc} 2680; SOFT-NEXT: .p2align 2 2681; SOFT-NEXT: @ %bb.8: 2682; SOFT-NEXT: .LCPI22_0: 2683; SOFT-NEXT: .long 3313500160 @ 0xc5800000 2684; SOFT-NEXT: .LCPI22_1: 2685; SOFT-NEXT: .long 4294963200 @ 0xfffff000 2686; SOFT-NEXT: .LCPI22_2: 2687; SOFT-NEXT: .long 1166012416 @ 0x457ff000 2688; SOFT-NEXT: .LCPI22_3: 2689; SOFT-NEXT: .long 4095 @ 0xfff 2690; 2691; VFP2-LABEL: test_signed_i13_f16: 2692; VFP2: @ %bb.0: 2693; VFP2-NEXT: .save {r7, lr} 2694; VFP2-NEXT: push {r7, lr} 2695; VFP2-NEXT: bl __aeabi_h2f 2696; VFP2-NEXT: vmov s0, r0 2697; VFP2-NEXT: vldr s2, .LCPI22_0 2698; VFP2-NEXT: vldr s6, .LCPI22_1 2699; VFP2-NEXT: vcvt.s32.f32 s4, s0 2700; VFP2-NEXT: vcmp.f32 s0, s2 2701; VFP2-NEXT: vmrs APSR_nzcv, fpscr 2702; VFP2-NEXT: vcmp.f32 s0, s6 2703; VFP2-NEXT: vmov r0, s4 2704; VFP2-NEXT: itt lt 2705; VFP2-NEXT: movwlt r0, #61440 2706; VFP2-NEXT: movtlt r0, #65535 2707; VFP2-NEXT: vmrs APSR_nzcv, fpscr 2708; VFP2-NEXT: it gt 2709; VFP2-NEXT: movwgt r0, #4095 2710; VFP2-NEXT: vcmp.f32 s0, s0 2711; VFP2-NEXT: vmrs APSR_nzcv, fpscr 2712; VFP2-NEXT: it vs 2713; VFP2-NEXT: movvs r0, #0 2714; VFP2-NEXT: pop {r7, pc} 2715; VFP2-NEXT: .p2align 2 2716; VFP2-NEXT: @ %bb.1: 2717; VFP2-NEXT: .LCPI22_0: 2718; VFP2-NEXT: .long 0xc5800000 @ float -4096 2719; VFP2-NEXT: .LCPI22_1: 2720; VFP2-NEXT: .long 0x457ff000 @ float 4095 2721; 2722; FP16-LABEL: test_signed_i13_f16: 2723; FP16: @ %bb.0: 2724; FP16-NEXT: vmov.f16 s0, r0 2725; FP16-NEXT: vldr s4, .LCPI22_1 2726; FP16-NEXT: vcvtb.f32.f16 s0, s0 2727; FP16-NEXT: vldr s2, .LCPI22_0 2728; FP16-NEXT: vmaxnm.f32 s4, s0, s4 2729; FP16-NEXT: vcmp.f32 s0, s0 2730; FP16-NEXT: vminnm.f32 s2, s4, s2 2731; FP16-NEXT: vmrs APSR_nzcv, fpscr 2732; FP16-NEXT: vcvt.s32.f32 s2, s2 2733; FP16-NEXT: vmov r0, s2 2734; FP16-NEXT: it vs 2735; FP16-NEXT: movvs r0, #0 2736; FP16-NEXT: bx lr 2737; FP16-NEXT: .p2align 2 2738; FP16-NEXT: @ %bb.1: 2739; FP16-NEXT: .LCPI22_0: 2740; FP16-NEXT: .long 0x457ff000 @ float 4095 2741; FP16-NEXT: .LCPI22_1: 2742; FP16-NEXT: .long 0xc5800000 @ float -4096 2743 %x = call i13 @llvm.fptosi.sat.i13.f16(half %f) 2744 ret i13 %x 2745} 2746 2747define i16 @test_signed_i16_f16(half %f) nounwind { 2748; SOFT-LABEL: test_signed_i16_f16: 2749; SOFT: @ %bb.0: 2750; SOFT-NEXT: .save {r4, r5, r6, lr} 2751; SOFT-NEXT: push {r4, r5, r6, lr} 2752; SOFT-NEXT: uxth r0, r0 2753; SOFT-NEXT: bl __aeabi_h2f 2754; SOFT-NEXT: mov r4, r0 2755; SOFT-NEXT: movs r0, #199 2756; SOFT-NEXT: lsls r1, r0, #24 2757; SOFT-NEXT: mov r0, r4 2758; SOFT-NEXT: bl __aeabi_fcmpge 2759; SOFT-NEXT: mov r6, r0 2760; SOFT-NEXT: mov r0, r4 2761; SOFT-NEXT: bl __aeabi_f2iz 2762; SOFT-NEXT: cmp r6, #0 2763; SOFT-NEXT: beq .LBB23_2 2764; SOFT-NEXT: @ %bb.1: 2765; SOFT-NEXT: mov r5, r0 2766; SOFT-NEXT: b .LBB23_3 2767; SOFT-NEXT: .LBB23_2: 2768; SOFT-NEXT: ldr r5, .LCPI23_0 2769; SOFT-NEXT: .LBB23_3: 2770; SOFT-NEXT: ldr r1, .LCPI23_1 2771; SOFT-NEXT: mov r0, r4 2772; SOFT-NEXT: bl __aeabi_fcmpgt 2773; SOFT-NEXT: cmp r0, #0 2774; SOFT-NEXT: beq .LBB23_5 2775; SOFT-NEXT: @ %bb.4: 2776; SOFT-NEXT: ldr r5, .LCPI23_2 2777; SOFT-NEXT: .LBB23_5: 2778; SOFT-NEXT: mov r0, r4 2779; SOFT-NEXT: mov r1, r4 2780; SOFT-NEXT: bl __aeabi_fcmpun 2781; SOFT-NEXT: cmp r0, #0 2782; SOFT-NEXT: beq .LBB23_7 2783; SOFT-NEXT: @ %bb.6: 2784; SOFT-NEXT: movs r5, #0 2785; SOFT-NEXT: .LBB23_7: 2786; SOFT-NEXT: mov r0, r5 2787; SOFT-NEXT: pop {r4, r5, r6, pc} 2788; SOFT-NEXT: .p2align 2 2789; SOFT-NEXT: @ %bb.8: 2790; SOFT-NEXT: .LCPI23_0: 2791; SOFT-NEXT: .long 4294934528 @ 0xffff8000 2792; SOFT-NEXT: .LCPI23_1: 2793; SOFT-NEXT: .long 1191181824 @ 0x46fffe00 2794; SOFT-NEXT: .LCPI23_2: 2795; SOFT-NEXT: .long 32767 @ 0x7fff 2796; 2797; VFP2-LABEL: test_signed_i16_f16: 2798; VFP2: @ %bb.0: 2799; VFP2-NEXT: .save {r7, lr} 2800; VFP2-NEXT: push {r7, lr} 2801; VFP2-NEXT: bl __aeabi_h2f 2802; VFP2-NEXT: vmov s0, r0 2803; VFP2-NEXT: vldr s2, .LCPI23_0 2804; VFP2-NEXT: vldr s6, .LCPI23_1 2805; VFP2-NEXT: vcvt.s32.f32 s4, s0 2806; VFP2-NEXT: vcmp.f32 s0, s2 2807; VFP2-NEXT: vmrs APSR_nzcv, fpscr 2808; VFP2-NEXT: vcmp.f32 s0, s6 2809; VFP2-NEXT: vmov r0, s4 2810; VFP2-NEXT: itt lt 2811; VFP2-NEXT: movwlt r0, #32768 2812; VFP2-NEXT: movtlt r0, #65535 2813; VFP2-NEXT: vmrs APSR_nzcv, fpscr 2814; VFP2-NEXT: it gt 2815; VFP2-NEXT: movwgt r0, #32767 2816; VFP2-NEXT: vcmp.f32 s0, s0 2817; VFP2-NEXT: vmrs APSR_nzcv, fpscr 2818; VFP2-NEXT: it vs 2819; VFP2-NEXT: movvs r0, #0 2820; VFP2-NEXT: pop {r7, pc} 2821; VFP2-NEXT: .p2align 2 2822; VFP2-NEXT: @ %bb.1: 2823; VFP2-NEXT: .LCPI23_0: 2824; VFP2-NEXT: .long 0xc7000000 @ float -32768 2825; VFP2-NEXT: .LCPI23_1: 2826; VFP2-NEXT: .long 0x46fffe00 @ float 32767 2827; 2828; FP16-LABEL: test_signed_i16_f16: 2829; FP16: @ %bb.0: 2830; FP16-NEXT: vmov.f16 s0, r0 2831; FP16-NEXT: vldr s4, .LCPI23_1 2832; FP16-NEXT: vcvtb.f32.f16 s0, s0 2833; FP16-NEXT: vldr s2, .LCPI23_0 2834; FP16-NEXT: vmaxnm.f32 s4, s0, s4 2835; FP16-NEXT: vcmp.f32 s0, s0 2836; FP16-NEXT: vminnm.f32 s2, s4, s2 2837; FP16-NEXT: vmrs APSR_nzcv, fpscr 2838; FP16-NEXT: vcvt.s32.f32 s2, s2 2839; FP16-NEXT: vmov r0, s2 2840; FP16-NEXT: it vs 2841; FP16-NEXT: movvs r0, #0 2842; FP16-NEXT: bx lr 2843; FP16-NEXT: .p2align 2 2844; FP16-NEXT: @ %bb.1: 2845; FP16-NEXT: .LCPI23_0: 2846; FP16-NEXT: .long 0x46fffe00 @ float 32767 2847; FP16-NEXT: .LCPI23_1: 2848; FP16-NEXT: .long 0xc7000000 @ float -32768 2849 %x = call i16 @llvm.fptosi.sat.i16.f16(half %f) 2850 ret i16 %x 2851} 2852 2853define i19 @test_signed_i19_f16(half %f) nounwind { 2854; SOFT-LABEL: test_signed_i19_f16: 2855; SOFT: @ %bb.0: 2856; SOFT-NEXT: .save {r4, r5, r6, lr} 2857; SOFT-NEXT: push {r4, r5, r6, lr} 2858; SOFT-NEXT: uxth r0, r0 2859; SOFT-NEXT: bl __aeabi_h2f 2860; SOFT-NEXT: mov r4, r0 2861; SOFT-NEXT: ldr r1, .LCPI24_0 2862; SOFT-NEXT: bl __aeabi_fcmpge 2863; SOFT-NEXT: mov r6, r0 2864; SOFT-NEXT: mov r0, r4 2865; SOFT-NEXT: bl __aeabi_f2iz 2866; SOFT-NEXT: cmp r6, #0 2867; SOFT-NEXT: beq .LBB24_2 2868; SOFT-NEXT: @ %bb.1: 2869; SOFT-NEXT: mov r5, r0 2870; SOFT-NEXT: b .LBB24_3 2871; SOFT-NEXT: .LBB24_2: 2872; SOFT-NEXT: ldr r5, .LCPI24_1 2873; SOFT-NEXT: .LBB24_3: 2874; SOFT-NEXT: ldr r1, .LCPI24_2 2875; SOFT-NEXT: mov r0, r4 2876; SOFT-NEXT: bl __aeabi_fcmpgt 2877; SOFT-NEXT: cmp r0, #0 2878; SOFT-NEXT: beq .LBB24_5 2879; SOFT-NEXT: @ %bb.4: 2880; SOFT-NEXT: ldr r5, .LCPI24_3 2881; SOFT-NEXT: .LBB24_5: 2882; SOFT-NEXT: mov r0, r4 2883; SOFT-NEXT: mov r1, r4 2884; SOFT-NEXT: bl __aeabi_fcmpun 2885; SOFT-NEXT: cmp r0, #0 2886; SOFT-NEXT: beq .LBB24_7 2887; SOFT-NEXT: @ %bb.6: 2888; SOFT-NEXT: movs r5, #0 2889; SOFT-NEXT: .LBB24_7: 2890; SOFT-NEXT: mov r0, r5 2891; SOFT-NEXT: pop {r4, r5, r6, pc} 2892; SOFT-NEXT: .p2align 2 2893; SOFT-NEXT: @ %bb.8: 2894; SOFT-NEXT: .LCPI24_0: 2895; SOFT-NEXT: .long 3363831808 @ 0xc8800000 2896; SOFT-NEXT: .LCPI24_1: 2897; SOFT-NEXT: .long 4294705152 @ 0xfffc0000 2898; SOFT-NEXT: .LCPI24_2: 2899; SOFT-NEXT: .long 1216348096 @ 0x487fffc0 2900; SOFT-NEXT: .LCPI24_3: 2901; SOFT-NEXT: .long 262143 @ 0x3ffff 2902; 2903; VFP2-LABEL: test_signed_i19_f16: 2904; VFP2: @ %bb.0: 2905; VFP2-NEXT: .save {r7, lr} 2906; VFP2-NEXT: push {r7, lr} 2907; VFP2-NEXT: bl __aeabi_h2f 2908; VFP2-NEXT: vmov s0, r0 2909; VFP2-NEXT: vldr s2, .LCPI24_0 2910; VFP2-NEXT: vldr s6, .LCPI24_1 2911; VFP2-NEXT: vcvt.s32.f32 s4, s0 2912; VFP2-NEXT: vcmp.f32 s0, s2 2913; VFP2-NEXT: vmrs APSR_nzcv, fpscr 2914; VFP2-NEXT: vcmp.f32 s0, s6 2915; VFP2-NEXT: vmov r0, s4 2916; VFP2-NEXT: itt lt 2917; VFP2-NEXT: movlt r0, #0 2918; VFP2-NEXT: movtlt r0, #65532 2919; VFP2-NEXT: vmrs APSR_nzcv, fpscr 2920; VFP2-NEXT: vcmp.f32 s0, s0 2921; VFP2-NEXT: itt gt 2922; VFP2-NEXT: movwgt r0, #65535 2923; VFP2-NEXT: movtgt r0, #3 2924; VFP2-NEXT: vmrs APSR_nzcv, fpscr 2925; VFP2-NEXT: it vs 2926; VFP2-NEXT: movvs r0, #0 2927; VFP2-NEXT: pop {r7, pc} 2928; VFP2-NEXT: .p2align 2 2929; VFP2-NEXT: @ %bb.1: 2930; VFP2-NEXT: .LCPI24_0: 2931; VFP2-NEXT: .long 0xc8800000 @ float -262144 2932; VFP2-NEXT: .LCPI24_1: 2933; VFP2-NEXT: .long 0x487fffc0 @ float 262143 2934; 2935; FP16-LABEL: test_signed_i19_f16: 2936; FP16: @ %bb.0: 2937; FP16-NEXT: vmov.f16 s0, r0 2938; FP16-NEXT: vldr s4, .LCPI24_1 2939; FP16-NEXT: vcvtb.f32.f16 s0, s0 2940; FP16-NEXT: vldr s2, .LCPI24_0 2941; FP16-NEXT: vmaxnm.f32 s4, s0, s4 2942; FP16-NEXT: vcmp.f32 s0, s0 2943; FP16-NEXT: vminnm.f32 s2, s4, s2 2944; FP16-NEXT: vmrs APSR_nzcv, fpscr 2945; FP16-NEXT: vcvt.s32.f32 s2, s2 2946; FP16-NEXT: vmov r0, s2 2947; FP16-NEXT: it vs 2948; FP16-NEXT: movvs r0, #0 2949; FP16-NEXT: bx lr 2950; FP16-NEXT: .p2align 2 2951; FP16-NEXT: @ %bb.1: 2952; FP16-NEXT: .LCPI24_0: 2953; FP16-NEXT: .long 0x487fffc0 @ float 262143 2954; FP16-NEXT: .LCPI24_1: 2955; FP16-NEXT: .long 0xc8800000 @ float -262144 2956 %x = call i19 @llvm.fptosi.sat.i19.f16(half %f) 2957 ret i19 %x 2958} 2959 2960define i32 @test_signed_i32_f16(half %f) nounwind { 2961; SOFT-LABEL: test_signed_i32_f16: 2962; SOFT: @ %bb.0: 2963; SOFT-NEXT: .save {r4, r5, r6, lr} 2964; SOFT-NEXT: push {r4, r5, r6, lr} 2965; SOFT-NEXT: uxth r0, r0 2966; SOFT-NEXT: bl __aeabi_h2f 2967; SOFT-NEXT: mov r4, r0 2968; SOFT-NEXT: movs r0, #207 2969; SOFT-NEXT: lsls r1, r0, #24 2970; SOFT-NEXT: mov r0, r4 2971; SOFT-NEXT: bl __aeabi_fcmpge 2972; SOFT-NEXT: mov r6, r0 2973; SOFT-NEXT: mov r0, r4 2974; SOFT-NEXT: bl __aeabi_f2iz 2975; SOFT-NEXT: cmp r6, #0 2976; SOFT-NEXT: beq .LBB25_2 2977; SOFT-NEXT: @ %bb.1: 2978; SOFT-NEXT: mov r5, r0 2979; SOFT-NEXT: b .LBB25_3 2980; SOFT-NEXT: .LBB25_2: 2981; SOFT-NEXT: movs r0, #1 2982; SOFT-NEXT: lsls r5, r0, #31 2983; SOFT-NEXT: .LBB25_3: 2984; SOFT-NEXT: ldr r1, .LCPI25_0 2985; SOFT-NEXT: mov r0, r4 2986; SOFT-NEXT: bl __aeabi_fcmpgt 2987; SOFT-NEXT: cmp r0, #0 2988; SOFT-NEXT: beq .LBB25_5 2989; SOFT-NEXT: @ %bb.4: 2990; SOFT-NEXT: ldr r5, .LCPI25_1 2991; SOFT-NEXT: .LBB25_5: 2992; SOFT-NEXT: mov r0, r4 2993; SOFT-NEXT: mov r1, r4 2994; SOFT-NEXT: bl __aeabi_fcmpun 2995; SOFT-NEXT: cmp r0, #0 2996; SOFT-NEXT: beq .LBB25_7 2997; SOFT-NEXT: @ %bb.6: 2998; SOFT-NEXT: movs r5, #0 2999; SOFT-NEXT: .LBB25_7: 3000; SOFT-NEXT: mov r0, r5 3001; SOFT-NEXT: pop {r4, r5, r6, pc} 3002; SOFT-NEXT: .p2align 2 3003; SOFT-NEXT: @ %bb.8: 3004; SOFT-NEXT: .LCPI25_0: 3005; SOFT-NEXT: .long 1325400063 @ 0x4effffff 3006; SOFT-NEXT: .LCPI25_1: 3007; SOFT-NEXT: .long 2147483647 @ 0x7fffffff 3008; 3009; VFP2-LABEL: test_signed_i32_f16: 3010; VFP2: @ %bb.0: 3011; VFP2-NEXT: .save {r7, lr} 3012; VFP2-NEXT: push {r7, lr} 3013; VFP2-NEXT: bl __aeabi_h2f 3014; VFP2-NEXT: vmov s0, r0 3015; VFP2-NEXT: vcvt.s32.f32 s0, s0 3016; VFP2-NEXT: vmov r0, s0 3017; VFP2-NEXT: pop {r7, pc} 3018; 3019; FP16-LABEL: test_signed_i32_f16: 3020; FP16: @ %bb.0: 3021; FP16-NEXT: vmov.f16 s0, r0 3022; FP16-NEXT: vcvt.s32.f16 s0, s0 3023; FP16-NEXT: vmov r0, s0 3024; FP16-NEXT: bx lr 3025 %x = call i32 @llvm.fptosi.sat.i32.f16(half %f) 3026 ret i32 %x 3027} 3028 3029define i50 @test_signed_i50_f16(half %f) nounwind { 3030; SOFT-LABEL: test_signed_i50_f16: 3031; SOFT: @ %bb.0: 3032; SOFT-NEXT: .save {r4, r5, r6, r7, lr} 3033; SOFT-NEXT: push {r4, r5, r6, r7, lr} 3034; SOFT-NEXT: .pad #4 3035; SOFT-NEXT: sub sp, #4 3036; SOFT-NEXT: uxth r0, r0 3037; SOFT-NEXT: bl __aeabi_h2f 3038; SOFT-NEXT: mov r4, r0 3039; SOFT-NEXT: movs r0, #27 3040; SOFT-NEXT: lsls r1, r0, #27 3041; SOFT-NEXT: mov r0, r4 3042; SOFT-NEXT: bl __aeabi_fcmpge 3043; SOFT-NEXT: mov r7, r0 3044; SOFT-NEXT: mov r0, r4 3045; SOFT-NEXT: bl __aeabi_f2lz 3046; SOFT-NEXT: mov r5, r0 3047; SOFT-NEXT: cmp r7, #0 3048; SOFT-NEXT: bne .LBB26_2 3049; SOFT-NEXT: @ %bb.1: 3050; SOFT-NEXT: mov r5, r7 3051; SOFT-NEXT: .LBB26_2: 3052; SOFT-NEXT: beq .LBB26_4 3053; SOFT-NEXT: @ %bb.3: 3054; SOFT-NEXT: str r1, [sp] @ 4-byte Spill 3055; SOFT-NEXT: b .LBB26_5 3056; SOFT-NEXT: .LBB26_4: 3057; SOFT-NEXT: ldr r0, .LCPI26_0 3058; SOFT-NEXT: str r0, [sp] @ 4-byte Spill 3059; SOFT-NEXT: .LBB26_5: 3060; SOFT-NEXT: ldr r1, .LCPI26_1 3061; SOFT-NEXT: mov r0, r4 3062; SOFT-NEXT: bl __aeabi_fcmpgt 3063; SOFT-NEXT: movs r7, #0 3064; SOFT-NEXT: mvns r6, r7 3065; SOFT-NEXT: cmp r0, #0 3066; SOFT-NEXT: beq .LBB26_7 3067; SOFT-NEXT: @ %bb.6: 3068; SOFT-NEXT: ldr r0, .LCPI26_2 3069; SOFT-NEXT: str r0, [sp] @ 4-byte Spill 3070; SOFT-NEXT: .LBB26_7: 3071; SOFT-NEXT: bne .LBB26_9 3072; SOFT-NEXT: @ %bb.8: 3073; SOFT-NEXT: mov r6, r5 3074; SOFT-NEXT: .LBB26_9: 3075; SOFT-NEXT: mov r0, r4 3076; SOFT-NEXT: mov r1, r4 3077; SOFT-NEXT: bl __aeabi_fcmpun 3078; SOFT-NEXT: cmp r0, #0 3079; SOFT-NEXT: mov r0, r7 3080; SOFT-NEXT: bne .LBB26_11 3081; SOFT-NEXT: @ %bb.10: 3082; SOFT-NEXT: mov r0, r6 3083; SOFT-NEXT: .LBB26_11: 3084; SOFT-NEXT: bne .LBB26_13 3085; SOFT-NEXT: @ %bb.12: 3086; SOFT-NEXT: ldr r7, [sp] @ 4-byte Reload 3087; SOFT-NEXT: .LBB26_13: 3088; SOFT-NEXT: mov r1, r7 3089; SOFT-NEXT: add sp, #4 3090; SOFT-NEXT: pop {r4, r5, r6, r7, pc} 3091; SOFT-NEXT: .p2align 2 3092; SOFT-NEXT: @ %bb.14: 3093; SOFT-NEXT: .LCPI26_0: 3094; SOFT-NEXT: .long 4294836224 @ 0xfffe0000 3095; SOFT-NEXT: .LCPI26_1: 3096; SOFT-NEXT: .long 1476395007 @ 0x57ffffff 3097; SOFT-NEXT: .LCPI26_2: 3098; SOFT-NEXT: .long 131071 @ 0x1ffff 3099; 3100; VFP2-LABEL: test_signed_i50_f16: 3101; VFP2: @ %bb.0: 3102; VFP2-NEXT: .save {r4, lr} 3103; VFP2-NEXT: push {r4, lr} 3104; VFP2-NEXT: bl __aeabi_h2f 3105; VFP2-NEXT: mov r4, r0 3106; VFP2-NEXT: bl __aeabi_f2lz 3107; VFP2-NEXT: vldr s0, .LCPI26_0 3108; VFP2-NEXT: vmov s2, r4 3109; VFP2-NEXT: vldr s4, .LCPI26_1 3110; VFP2-NEXT: vcmp.f32 s2, s0 3111; VFP2-NEXT: vmrs APSR_nzcv, fpscr 3112; VFP2-NEXT: ittt lt 3113; VFP2-NEXT: movlt r1, #0 3114; VFP2-NEXT: movtlt r1, #65534 3115; VFP2-NEXT: movlt r0, #0 3116; VFP2-NEXT: vcmp.f32 s2, s4 3117; VFP2-NEXT: vmrs APSR_nzcv, fpscr 3118; VFP2-NEXT: it gt 3119; VFP2-NEXT: movgt.w r0, #-1 3120; VFP2-NEXT: vcmp.f32 s2, s2 3121; VFP2-NEXT: itt gt 3122; VFP2-NEXT: movwgt r1, #65535 3123; VFP2-NEXT: movtgt r1, #1 3124; VFP2-NEXT: vmrs APSR_nzcv, fpscr 3125; VFP2-NEXT: itt vs 3126; VFP2-NEXT: movvs r0, #0 3127; VFP2-NEXT: movvs r1, #0 3128; VFP2-NEXT: pop {r4, pc} 3129; VFP2-NEXT: .p2align 2 3130; VFP2-NEXT: @ %bb.1: 3131; VFP2-NEXT: .LCPI26_0: 3132; VFP2-NEXT: .long 0xd8000000 @ float -5.62949953E+14 3133; VFP2-NEXT: .LCPI26_1: 3134; VFP2-NEXT: .long 0x57ffffff @ float 5.6294992E+14 3135; 3136; FP16-LABEL: test_signed_i50_f16: 3137; FP16: @ %bb.0: 3138; FP16-NEXT: .save {r7, lr} 3139; FP16-NEXT: push {r7, lr} 3140; FP16-NEXT: .vsave {d8} 3141; FP16-NEXT: vpush {d8} 3142; FP16-NEXT: vmov.f16 s0, r0 3143; FP16-NEXT: vcvtb.f32.f16 s16, s0 3144; FP16-NEXT: vmov r0, s16 3145; FP16-NEXT: bl __aeabi_f2lz 3146; FP16-NEXT: vldr s0, .LCPI26_0 3147; FP16-NEXT: vldr s2, .LCPI26_1 3148; FP16-NEXT: vcmp.f32 s16, s0 3149; FP16-NEXT: vmrs APSR_nzcv, fpscr 3150; FP16-NEXT: ittt lt 3151; FP16-NEXT: movlt r1, #0 3152; FP16-NEXT: movtlt r1, #65534 3153; FP16-NEXT: movlt r0, #0 3154; FP16-NEXT: vcmp.f32 s16, s2 3155; FP16-NEXT: vmrs APSR_nzcv, fpscr 3156; FP16-NEXT: it gt 3157; FP16-NEXT: movgt.w r0, #-1 3158; FP16-NEXT: vcmp.f32 s16, s16 3159; FP16-NEXT: itt gt 3160; FP16-NEXT: movwgt r1, #65535 3161; FP16-NEXT: movtgt r1, #1 3162; FP16-NEXT: vmrs APSR_nzcv, fpscr 3163; FP16-NEXT: itt vs 3164; FP16-NEXT: movvs r0, #0 3165; FP16-NEXT: movvs r1, #0 3166; FP16-NEXT: vpop {d8} 3167; FP16-NEXT: pop {r7, pc} 3168; FP16-NEXT: .p2align 2 3169; FP16-NEXT: @ %bb.1: 3170; FP16-NEXT: .LCPI26_0: 3171; FP16-NEXT: .long 0xd8000000 @ float -5.62949953E+14 3172; FP16-NEXT: .LCPI26_1: 3173; FP16-NEXT: .long 0x57ffffff @ float 5.6294992E+14 3174 %x = call i50 @llvm.fptosi.sat.i50.f16(half %f) 3175 ret i50 %x 3176} 3177 3178define i64 @test_signed_i64_f16(half %f) nounwind { 3179; SOFT-LABEL: test_signed_i64_f16: 3180; SOFT: @ %bb.0: 3181; SOFT-NEXT: .save {r4, r5, r6, r7, lr} 3182; SOFT-NEXT: push {r4, r5, r6, r7, lr} 3183; SOFT-NEXT: .pad #4 3184; SOFT-NEXT: sub sp, #4 3185; SOFT-NEXT: uxth r0, r0 3186; SOFT-NEXT: bl __aeabi_h2f 3187; SOFT-NEXT: mov r4, r0 3188; SOFT-NEXT: movs r0, #223 3189; SOFT-NEXT: lsls r1, r0, #24 3190; SOFT-NEXT: mov r0, r4 3191; SOFT-NEXT: bl __aeabi_fcmpge 3192; SOFT-NEXT: mov r6, r0 3193; SOFT-NEXT: mov r0, r4 3194; SOFT-NEXT: bl __aeabi_f2lz 3195; SOFT-NEXT: movs r2, #1 3196; SOFT-NEXT: lsls r7, r2, #31 3197; SOFT-NEXT: cmp r6, #0 3198; SOFT-NEXT: bne .LBB27_2 3199; SOFT-NEXT: @ %bb.1: 3200; SOFT-NEXT: mov r0, r6 3201; SOFT-NEXT: .LBB27_2: 3202; SOFT-NEXT: str r0, [sp] @ 4-byte Spill 3203; SOFT-NEXT: beq .LBB27_4 3204; SOFT-NEXT: @ %bb.3: 3205; SOFT-NEXT: mov r7, r1 3206; SOFT-NEXT: .LBB27_4: 3207; SOFT-NEXT: ldr r1, .LCPI27_0 3208; SOFT-NEXT: mov r0, r4 3209; SOFT-NEXT: bl __aeabi_fcmpgt 3210; SOFT-NEXT: movs r6, #0 3211; SOFT-NEXT: mvns r5, r6 3212; SOFT-NEXT: cmp r0, #0 3213; SOFT-NEXT: beq .LBB27_6 3214; SOFT-NEXT: @ %bb.5: 3215; SOFT-NEXT: ldr r7, .LCPI27_1 3216; SOFT-NEXT: .LBB27_6: 3217; SOFT-NEXT: bne .LBB27_8 3218; SOFT-NEXT: @ %bb.7: 3219; SOFT-NEXT: ldr r5, [sp] @ 4-byte Reload 3220; SOFT-NEXT: .LBB27_8: 3221; SOFT-NEXT: mov r0, r4 3222; SOFT-NEXT: mov r1, r4 3223; SOFT-NEXT: bl __aeabi_fcmpun 3224; SOFT-NEXT: cmp r0, #0 3225; SOFT-NEXT: mov r0, r6 3226; SOFT-NEXT: bne .LBB27_10 3227; SOFT-NEXT: @ %bb.9: 3228; SOFT-NEXT: mov r0, r5 3229; SOFT-NEXT: .LBB27_10: 3230; SOFT-NEXT: bne .LBB27_12 3231; SOFT-NEXT: @ %bb.11: 3232; SOFT-NEXT: mov r6, r7 3233; SOFT-NEXT: .LBB27_12: 3234; SOFT-NEXT: mov r1, r6 3235; SOFT-NEXT: add sp, #4 3236; SOFT-NEXT: pop {r4, r5, r6, r7, pc} 3237; SOFT-NEXT: .p2align 2 3238; SOFT-NEXT: @ %bb.13: 3239; SOFT-NEXT: .LCPI27_0: 3240; SOFT-NEXT: .long 1593835519 @ 0x5effffff 3241; SOFT-NEXT: .LCPI27_1: 3242; SOFT-NEXT: .long 2147483647 @ 0x7fffffff 3243; 3244; VFP2-LABEL: test_signed_i64_f16: 3245; VFP2: @ %bb.0: 3246; VFP2-NEXT: .save {r4, lr} 3247; VFP2-NEXT: push {r4, lr} 3248; VFP2-NEXT: bl __aeabi_h2f 3249; VFP2-NEXT: mov r4, r0 3250; VFP2-NEXT: bl __aeabi_f2lz 3251; VFP2-NEXT: vldr s0, .LCPI27_0 3252; VFP2-NEXT: vmov s2, r4 3253; VFP2-NEXT: vldr s4, .LCPI27_1 3254; VFP2-NEXT: vcmp.f32 s2, s0 3255; VFP2-NEXT: vmrs APSR_nzcv, fpscr 3256; VFP2-NEXT: itt lt 3257; VFP2-NEXT: movlt r0, #0 3258; VFP2-NEXT: movlt.w r1, #-2147483648 3259; VFP2-NEXT: vcmp.f32 s2, s4 3260; VFP2-NEXT: vmrs APSR_nzcv, fpscr 3261; VFP2-NEXT: itt gt 3262; VFP2-NEXT: mvngt r1, #-2147483648 3263; VFP2-NEXT: movgt.w r0, #-1 3264; VFP2-NEXT: vcmp.f32 s2, s2 3265; VFP2-NEXT: vmrs APSR_nzcv, fpscr 3266; VFP2-NEXT: itt vs 3267; VFP2-NEXT: movvs r0, #0 3268; VFP2-NEXT: movvs r1, #0 3269; VFP2-NEXT: pop {r4, pc} 3270; VFP2-NEXT: .p2align 2 3271; VFP2-NEXT: @ %bb.1: 3272; VFP2-NEXT: .LCPI27_0: 3273; VFP2-NEXT: .long 0xdf000000 @ float -9.22337203E+18 3274; VFP2-NEXT: .LCPI27_1: 3275; VFP2-NEXT: .long 0x5effffff @ float 9.22337149E+18 3276; 3277; FP16-LABEL: test_signed_i64_f16: 3278; FP16: @ %bb.0: 3279; FP16-NEXT: .save {r7, lr} 3280; FP16-NEXT: push {r7, lr} 3281; FP16-NEXT: .vsave {d8} 3282; FP16-NEXT: vpush {d8} 3283; FP16-NEXT: vmov.f16 s0, r0 3284; FP16-NEXT: vcvtb.f32.f16 s16, s0 3285; FP16-NEXT: vmov r0, s16 3286; FP16-NEXT: bl __aeabi_f2lz 3287; FP16-NEXT: vldr s0, .LCPI27_0 3288; FP16-NEXT: vldr s2, .LCPI27_1 3289; FP16-NEXT: vcmp.f32 s16, s0 3290; FP16-NEXT: vmrs APSR_nzcv, fpscr 3291; FP16-NEXT: itt lt 3292; FP16-NEXT: movlt r0, #0 3293; FP16-NEXT: movlt.w r1, #-2147483648 3294; FP16-NEXT: vcmp.f32 s16, s2 3295; FP16-NEXT: vmrs APSR_nzcv, fpscr 3296; FP16-NEXT: itt gt 3297; FP16-NEXT: mvngt r1, #-2147483648 3298; FP16-NEXT: movgt.w r0, #-1 3299; FP16-NEXT: vcmp.f32 s16, s16 3300; FP16-NEXT: vmrs APSR_nzcv, fpscr 3301; FP16-NEXT: itt vs 3302; FP16-NEXT: movvs r0, #0 3303; FP16-NEXT: movvs r1, #0 3304; FP16-NEXT: vpop {d8} 3305; FP16-NEXT: pop {r7, pc} 3306; FP16-NEXT: .p2align 2 3307; FP16-NEXT: @ %bb.1: 3308; FP16-NEXT: .LCPI27_0: 3309; FP16-NEXT: .long 0xdf000000 @ float -9.22337203E+18 3310; FP16-NEXT: .LCPI27_1: 3311; FP16-NEXT: .long 0x5effffff @ float 9.22337149E+18 3312 %x = call i64 @llvm.fptosi.sat.i64.f16(half %f) 3313 ret i64 %x 3314} 3315 3316define i100 @test_signed_i100_f16(half %f) nounwind { 3317; SOFT-LABEL: test_signed_i100_f16: 3318; SOFT: @ %bb.0: 3319; SOFT-NEXT: .save {r4, r5, r6, r7, lr} 3320; SOFT-NEXT: push {r4, r5, r6, r7, lr} 3321; SOFT-NEXT: .pad #20 3322; SOFT-NEXT: sub sp, #20 3323; SOFT-NEXT: uxth r0, r0 3324; SOFT-NEXT: bl __aeabi_h2f 3325; SOFT-NEXT: mov r4, r0 3326; SOFT-NEXT: movs r0, #241 3327; SOFT-NEXT: lsls r1, r0, #24 3328; SOFT-NEXT: mov r0, r4 3329; SOFT-NEXT: bl __aeabi_fcmpge 3330; SOFT-NEXT: mov r6, r0 3331; SOFT-NEXT: mov r0, r4 3332; SOFT-NEXT: bl __fixsfti 3333; SOFT-NEXT: movs r5, #7 3334; SOFT-NEXT: str r5, [sp, #16] @ 4-byte Spill 3335; SOFT-NEXT: mvns r7, r5 3336; SOFT-NEXT: cmp r6, #0 3337; SOFT-NEXT: beq .LBB28_17 3338; SOFT-NEXT: @ %bb.1: 3339; SOFT-NEXT: beq .LBB28_18 3340; SOFT-NEXT: .LBB28_2: 3341; SOFT-NEXT: bne .LBB28_4 3342; SOFT-NEXT: .LBB28_3: 3343; SOFT-NEXT: mov r2, r6 3344; SOFT-NEXT: .LBB28_4: 3345; SOFT-NEXT: str r2, [sp, #4] @ 4-byte Spill 3346; SOFT-NEXT: str r1, [sp, #8] @ 4-byte Spill 3347; SOFT-NEXT: str r0, [sp, #12] @ 4-byte Spill 3348; SOFT-NEXT: beq .LBB28_6 3349; SOFT-NEXT: @ %bb.5: 3350; SOFT-NEXT: mov r7, r3 3351; SOFT-NEXT: .LBB28_6: 3352; SOFT-NEXT: ldr r1, .LCPI28_0 3353; SOFT-NEXT: mov r0, r4 3354; SOFT-NEXT: bl __aeabi_fcmpgt 3355; SOFT-NEXT: movs r6, #0 3356; SOFT-NEXT: mvns r5, r6 3357; SOFT-NEXT: cmp r0, #0 3358; SOFT-NEXT: beq .LBB28_19 3359; SOFT-NEXT: @ %bb.7: 3360; SOFT-NEXT: mov r0, r5 3361; SOFT-NEXT: beq .LBB28_20 3362; SOFT-NEXT: .LBB28_8: 3363; SOFT-NEXT: mov r7, r5 3364; SOFT-NEXT: beq .LBB28_21 3365; SOFT-NEXT: .LBB28_9: 3366; SOFT-NEXT: str r0, [sp, #8] @ 4-byte Spill 3367; SOFT-NEXT: bne .LBB28_11 3368; SOFT-NEXT: .LBB28_10: 3369; SOFT-NEXT: ldr r5, [sp, #12] @ 4-byte Reload 3370; SOFT-NEXT: .LBB28_11: 3371; SOFT-NEXT: mov r0, r4 3372; SOFT-NEXT: mov r1, r4 3373; SOFT-NEXT: bl __aeabi_fcmpun 3374; SOFT-NEXT: cmp r0, #0 3375; SOFT-NEXT: mov r0, r6 3376; SOFT-NEXT: beq .LBB28_22 3377; SOFT-NEXT: @ %bb.12: 3378; SOFT-NEXT: mov r1, r6 3379; SOFT-NEXT: beq .LBB28_23 3380; SOFT-NEXT: .LBB28_13: 3381; SOFT-NEXT: mov r2, r6 3382; SOFT-NEXT: beq .LBB28_24 3383; SOFT-NEXT: .LBB28_14: 3384; SOFT-NEXT: bne .LBB28_16 3385; SOFT-NEXT: .LBB28_15: 3386; SOFT-NEXT: ldr r6, [sp, #16] @ 4-byte Reload 3387; SOFT-NEXT: .LBB28_16: 3388; SOFT-NEXT: mov r3, r6 3389; SOFT-NEXT: add sp, #20 3390; SOFT-NEXT: pop {r4, r5, r6, r7, pc} 3391; SOFT-NEXT: .LBB28_17: 3392; SOFT-NEXT: mov r0, r6 3393; SOFT-NEXT: bne .LBB28_2 3394; SOFT-NEXT: .LBB28_18: 3395; SOFT-NEXT: mov r1, r6 3396; SOFT-NEXT: beq .LBB28_3 3397; SOFT-NEXT: b .LBB28_4 3398; SOFT-NEXT: .LBB28_19: 3399; SOFT-NEXT: str r7, [sp, #16] @ 4-byte Spill 3400; SOFT-NEXT: mov r0, r5 3401; SOFT-NEXT: bne .LBB28_8 3402; SOFT-NEXT: .LBB28_20: 3403; SOFT-NEXT: ldr r0, [sp, #4] @ 4-byte Reload 3404; SOFT-NEXT: mov r7, r5 3405; SOFT-NEXT: bne .LBB28_9 3406; SOFT-NEXT: .LBB28_21: 3407; SOFT-NEXT: ldr r7, [sp, #8] @ 4-byte Reload 3408; SOFT-NEXT: str r0, [sp, #8] @ 4-byte Spill 3409; SOFT-NEXT: beq .LBB28_10 3410; SOFT-NEXT: b .LBB28_11 3411; SOFT-NEXT: .LBB28_22: 3412; SOFT-NEXT: mov r0, r5 3413; SOFT-NEXT: mov r1, r6 3414; SOFT-NEXT: bne .LBB28_13 3415; SOFT-NEXT: .LBB28_23: 3416; SOFT-NEXT: mov r1, r7 3417; SOFT-NEXT: mov r2, r6 3418; SOFT-NEXT: bne .LBB28_14 3419; SOFT-NEXT: .LBB28_24: 3420; SOFT-NEXT: ldr r2, [sp, #8] @ 4-byte Reload 3421; SOFT-NEXT: beq .LBB28_15 3422; SOFT-NEXT: b .LBB28_16 3423; SOFT-NEXT: .p2align 2 3424; SOFT-NEXT: @ %bb.25: 3425; SOFT-NEXT: .LCPI28_0: 3426; SOFT-NEXT: .long 1895825407 @ 0x70ffffff 3427; 3428; VFP2-LABEL: test_signed_i100_f16: 3429; VFP2: @ %bb.0: 3430; VFP2-NEXT: .save {r4, lr} 3431; VFP2-NEXT: push {r4, lr} 3432; VFP2-NEXT: bl __aeabi_h2f 3433; VFP2-NEXT: mov r4, r0 3434; VFP2-NEXT: bl __fixsfti 3435; VFP2-NEXT: vldr s0, .LCPI28_0 3436; VFP2-NEXT: vmov s2, r4 3437; VFP2-NEXT: vldr s4, .LCPI28_1 3438; VFP2-NEXT: vcmp.f32 s2, s0 3439; VFP2-NEXT: vmrs APSR_nzcv, fpscr 3440; VFP2-NEXT: itttt lt 3441; VFP2-NEXT: movlt r0, #0 3442; VFP2-NEXT: movlt r1, #0 3443; VFP2-NEXT: movlt r2, #0 3444; VFP2-NEXT: mvnlt r3, #7 3445; VFP2-NEXT: vcmp.f32 s2, s4 3446; VFP2-NEXT: vmrs APSR_nzcv, fpscr 3447; VFP2-NEXT: itttt gt 3448; VFP2-NEXT: movgt r3, #7 3449; VFP2-NEXT: movgt.w r2, #-1 3450; VFP2-NEXT: movgt.w r1, #-1 3451; VFP2-NEXT: movgt.w r0, #-1 3452; VFP2-NEXT: vcmp.f32 s2, s2 3453; VFP2-NEXT: vmrs APSR_nzcv, fpscr 3454; VFP2-NEXT: itttt vs 3455; VFP2-NEXT: movvs r0, #0 3456; VFP2-NEXT: movvs r1, #0 3457; VFP2-NEXT: movvs r2, #0 3458; VFP2-NEXT: movvs r3, #0 3459; VFP2-NEXT: pop {r4, pc} 3460; VFP2-NEXT: .p2align 2 3461; VFP2-NEXT: @ %bb.1: 3462; VFP2-NEXT: .LCPI28_0: 3463; VFP2-NEXT: .long 0xf1000000 @ float -6.338253E+29 3464; VFP2-NEXT: .LCPI28_1: 3465; VFP2-NEXT: .long 0x70ffffff @ float 6.33825262E+29 3466; 3467; FP16-LABEL: test_signed_i100_f16: 3468; FP16: @ %bb.0: 3469; FP16-NEXT: .save {r7, lr} 3470; FP16-NEXT: push {r7, lr} 3471; FP16-NEXT: .vsave {d8} 3472; FP16-NEXT: vpush {d8} 3473; FP16-NEXT: vmov.f16 s0, r0 3474; FP16-NEXT: vcvtb.f32.f16 s16, s0 3475; FP16-NEXT: vmov r0, s16 3476; FP16-NEXT: bl __fixsfti 3477; FP16-NEXT: vldr s0, .LCPI28_0 3478; FP16-NEXT: vldr s2, .LCPI28_1 3479; FP16-NEXT: vcmp.f32 s16, s0 3480; FP16-NEXT: vmrs APSR_nzcv, fpscr 3481; FP16-NEXT: itttt lt 3482; FP16-NEXT: movlt r0, #0 3483; FP16-NEXT: movlt r1, #0 3484; FP16-NEXT: movlt r2, #0 3485; FP16-NEXT: mvnlt r3, #7 3486; FP16-NEXT: vcmp.f32 s16, s2 3487; FP16-NEXT: vmrs APSR_nzcv, fpscr 3488; FP16-NEXT: itttt gt 3489; FP16-NEXT: movgt r3, #7 3490; FP16-NEXT: movgt.w r2, #-1 3491; FP16-NEXT: movgt.w r1, #-1 3492; FP16-NEXT: movgt.w r0, #-1 3493; FP16-NEXT: vcmp.f32 s16, s16 3494; FP16-NEXT: vmrs APSR_nzcv, fpscr 3495; FP16-NEXT: itttt vs 3496; FP16-NEXT: movvs r0, #0 3497; FP16-NEXT: movvs r1, #0 3498; FP16-NEXT: movvs r2, #0 3499; FP16-NEXT: movvs r3, #0 3500; FP16-NEXT: vpop {d8} 3501; FP16-NEXT: pop {r7, pc} 3502; FP16-NEXT: .p2align 2 3503; FP16-NEXT: @ %bb.1: 3504; FP16-NEXT: .LCPI28_0: 3505; FP16-NEXT: .long 0xf1000000 @ float -6.338253E+29 3506; FP16-NEXT: .LCPI28_1: 3507; FP16-NEXT: .long 0x70ffffff @ float 6.33825262E+29 3508 %x = call i100 @llvm.fptosi.sat.i100.f16(half %f) 3509 ret i100 %x 3510} 3511 3512define i128 @test_signed_i128_f16(half %f) nounwind { 3513; SOFT-LABEL: test_signed_i128_f16: 3514; SOFT: @ %bb.0: 3515; SOFT-NEXT: .save {r4, r5, r6, r7, lr} 3516; SOFT-NEXT: push {r4, r5, r6, r7, lr} 3517; SOFT-NEXT: .pad #20 3518; SOFT-NEXT: sub sp, #20 3519; SOFT-NEXT: uxth r0, r0 3520; SOFT-NEXT: bl __aeabi_h2f 3521; SOFT-NEXT: mov r4, r0 3522; SOFT-NEXT: movs r0, #255 3523; SOFT-NEXT: lsls r1, r0, #24 3524; SOFT-NEXT: mov r0, r4 3525; SOFT-NEXT: bl __aeabi_fcmpge 3526; SOFT-NEXT: mov r6, r0 3527; SOFT-NEXT: mov r0, r4 3528; SOFT-NEXT: bl __fixsfti 3529; SOFT-NEXT: movs r5, #1 3530; SOFT-NEXT: lsls r7, r5, #31 3531; SOFT-NEXT: cmp r6, #0 3532; SOFT-NEXT: beq .LBB29_18 3533; SOFT-NEXT: @ %bb.1: 3534; SOFT-NEXT: beq .LBB29_19 3535; SOFT-NEXT: .LBB29_2: 3536; SOFT-NEXT: bne .LBB29_4 3537; SOFT-NEXT: .LBB29_3: 3538; SOFT-NEXT: mov r2, r6 3539; SOFT-NEXT: .LBB29_4: 3540; SOFT-NEXT: str r2, [sp, #4] @ 4-byte Spill 3541; SOFT-NEXT: str r1, [sp, #8] @ 4-byte Spill 3542; SOFT-NEXT: str r0, [sp, #12] @ 4-byte Spill 3543; SOFT-NEXT: beq .LBB29_6 3544; SOFT-NEXT: @ %bb.5: 3545; SOFT-NEXT: mov r7, r3 3546; SOFT-NEXT: .LBB29_6: 3547; SOFT-NEXT: ldr r1, .LCPI29_0 3548; SOFT-NEXT: mov r0, r4 3549; SOFT-NEXT: bl __aeabi_fcmpgt 3550; SOFT-NEXT: movs r6, #0 3551; SOFT-NEXT: mvns r5, r6 3552; SOFT-NEXT: cmp r0, #0 3553; SOFT-NEXT: beq .LBB29_8 3554; SOFT-NEXT: @ %bb.7: 3555; SOFT-NEXT: ldr r7, .LCPI29_1 3556; SOFT-NEXT: .LBB29_8: 3557; SOFT-NEXT: str r7, [sp, #16] @ 4-byte Spill 3558; SOFT-NEXT: mov r0, r5 3559; SOFT-NEXT: beq .LBB29_20 3560; SOFT-NEXT: @ %bb.9: 3561; SOFT-NEXT: mov r7, r5 3562; SOFT-NEXT: beq .LBB29_21 3563; SOFT-NEXT: .LBB29_10: 3564; SOFT-NEXT: str r0, [sp, #8] @ 4-byte Spill 3565; SOFT-NEXT: bne .LBB29_12 3566; SOFT-NEXT: .LBB29_11: 3567; SOFT-NEXT: ldr r5, [sp, #12] @ 4-byte Reload 3568; SOFT-NEXT: .LBB29_12: 3569; SOFT-NEXT: mov r0, r4 3570; SOFT-NEXT: mov r1, r4 3571; SOFT-NEXT: bl __aeabi_fcmpun 3572; SOFT-NEXT: cmp r0, #0 3573; SOFT-NEXT: mov r0, r6 3574; SOFT-NEXT: beq .LBB29_22 3575; SOFT-NEXT: @ %bb.13: 3576; SOFT-NEXT: mov r1, r6 3577; SOFT-NEXT: beq .LBB29_23 3578; SOFT-NEXT: .LBB29_14: 3579; SOFT-NEXT: mov r2, r6 3580; SOFT-NEXT: beq .LBB29_24 3581; SOFT-NEXT: .LBB29_15: 3582; SOFT-NEXT: ldr r3, [sp, #16] @ 4-byte Reload 3583; SOFT-NEXT: bne .LBB29_17 3584; SOFT-NEXT: .LBB29_16: 3585; SOFT-NEXT: mov r6, r3 3586; SOFT-NEXT: .LBB29_17: 3587; SOFT-NEXT: mov r3, r6 3588; SOFT-NEXT: add sp, #20 3589; SOFT-NEXT: pop {r4, r5, r6, r7, pc} 3590; SOFT-NEXT: .LBB29_18: 3591; SOFT-NEXT: mov r0, r6 3592; SOFT-NEXT: bne .LBB29_2 3593; SOFT-NEXT: .LBB29_19: 3594; SOFT-NEXT: mov r1, r6 3595; SOFT-NEXT: beq .LBB29_3 3596; SOFT-NEXT: b .LBB29_4 3597; SOFT-NEXT: .LBB29_20: 3598; SOFT-NEXT: ldr r0, [sp, #4] @ 4-byte Reload 3599; SOFT-NEXT: mov r7, r5 3600; SOFT-NEXT: bne .LBB29_10 3601; SOFT-NEXT: .LBB29_21: 3602; SOFT-NEXT: ldr r7, [sp, #8] @ 4-byte Reload 3603; SOFT-NEXT: str r0, [sp, #8] @ 4-byte Spill 3604; SOFT-NEXT: beq .LBB29_11 3605; SOFT-NEXT: b .LBB29_12 3606; SOFT-NEXT: .LBB29_22: 3607; SOFT-NEXT: mov r0, r5 3608; SOFT-NEXT: mov r1, r6 3609; SOFT-NEXT: bne .LBB29_14 3610; SOFT-NEXT: .LBB29_23: 3611; SOFT-NEXT: mov r1, r7 3612; SOFT-NEXT: mov r2, r6 3613; SOFT-NEXT: bne .LBB29_15 3614; SOFT-NEXT: .LBB29_24: 3615; SOFT-NEXT: ldr r2, [sp, #8] @ 4-byte Reload 3616; SOFT-NEXT: ldr r3, [sp, #16] @ 4-byte Reload 3617; SOFT-NEXT: beq .LBB29_16 3618; SOFT-NEXT: b .LBB29_17 3619; SOFT-NEXT: .p2align 2 3620; SOFT-NEXT: @ %bb.25: 3621; SOFT-NEXT: .LCPI29_0: 3622; SOFT-NEXT: .long 2130706431 @ 0x7effffff 3623; SOFT-NEXT: .LCPI29_1: 3624; SOFT-NEXT: .long 2147483647 @ 0x7fffffff 3625; 3626; VFP2-LABEL: test_signed_i128_f16: 3627; VFP2: @ %bb.0: 3628; VFP2-NEXT: .save {r4, lr} 3629; VFP2-NEXT: push {r4, lr} 3630; VFP2-NEXT: bl __aeabi_h2f 3631; VFP2-NEXT: mov r4, r0 3632; VFP2-NEXT: bl __fixsfti 3633; VFP2-NEXT: vldr s0, .LCPI29_0 3634; VFP2-NEXT: vmov s2, r4 3635; VFP2-NEXT: vldr s4, .LCPI29_1 3636; VFP2-NEXT: vcmp.f32 s2, s0 3637; VFP2-NEXT: vmrs APSR_nzcv, fpscr 3638; VFP2-NEXT: itttt lt 3639; VFP2-NEXT: movlt r0, #0 3640; VFP2-NEXT: movlt r1, #0 3641; VFP2-NEXT: movlt r2, #0 3642; VFP2-NEXT: movlt.w r3, #-2147483648 3643; VFP2-NEXT: vcmp.f32 s2, s4 3644; VFP2-NEXT: vmrs APSR_nzcv, fpscr 3645; VFP2-NEXT: itttt gt 3646; VFP2-NEXT: mvngt r3, #-2147483648 3647; VFP2-NEXT: movgt.w r2, #-1 3648; VFP2-NEXT: movgt.w r1, #-1 3649; VFP2-NEXT: movgt.w r0, #-1 3650; VFP2-NEXT: vcmp.f32 s2, s2 3651; VFP2-NEXT: vmrs APSR_nzcv, fpscr 3652; VFP2-NEXT: itttt vs 3653; VFP2-NEXT: movvs r0, #0 3654; VFP2-NEXT: movvs r1, #0 3655; VFP2-NEXT: movvs r2, #0 3656; VFP2-NEXT: movvs r3, #0 3657; VFP2-NEXT: pop {r4, pc} 3658; VFP2-NEXT: .p2align 2 3659; VFP2-NEXT: @ %bb.1: 3660; VFP2-NEXT: .LCPI29_0: 3661; VFP2-NEXT: .long 0xff000000 @ float -1.70141183E+38 3662; VFP2-NEXT: .LCPI29_1: 3663; VFP2-NEXT: .long 0x7effffff @ float 1.70141173E+38 3664; 3665; FP16-LABEL: test_signed_i128_f16: 3666; FP16: @ %bb.0: 3667; FP16-NEXT: .save {r7, lr} 3668; FP16-NEXT: push {r7, lr} 3669; FP16-NEXT: .vsave {d8} 3670; FP16-NEXT: vpush {d8} 3671; FP16-NEXT: vmov.f16 s0, r0 3672; FP16-NEXT: vcvtb.f32.f16 s16, s0 3673; FP16-NEXT: vmov r0, s16 3674; FP16-NEXT: bl __fixsfti 3675; FP16-NEXT: vldr s0, .LCPI29_0 3676; FP16-NEXT: vldr s2, .LCPI29_1 3677; FP16-NEXT: vcmp.f32 s16, s0 3678; FP16-NEXT: vmrs APSR_nzcv, fpscr 3679; FP16-NEXT: itttt lt 3680; FP16-NEXT: movlt r0, #0 3681; FP16-NEXT: movlt r1, #0 3682; FP16-NEXT: movlt r2, #0 3683; FP16-NEXT: movlt.w r3, #-2147483648 3684; FP16-NEXT: vcmp.f32 s16, s2 3685; FP16-NEXT: vmrs APSR_nzcv, fpscr 3686; FP16-NEXT: itttt gt 3687; FP16-NEXT: mvngt r3, #-2147483648 3688; FP16-NEXT: movgt.w r2, #-1 3689; FP16-NEXT: movgt.w r1, #-1 3690; FP16-NEXT: movgt.w r0, #-1 3691; FP16-NEXT: vcmp.f32 s16, s16 3692; FP16-NEXT: vmrs APSR_nzcv, fpscr 3693; FP16-NEXT: itttt vs 3694; FP16-NEXT: movvs r0, #0 3695; FP16-NEXT: movvs r1, #0 3696; FP16-NEXT: movvs r2, #0 3697; FP16-NEXT: movvs r3, #0 3698; FP16-NEXT: vpop {d8} 3699; FP16-NEXT: pop {r7, pc} 3700; FP16-NEXT: .p2align 2 3701; FP16-NEXT: @ %bb.1: 3702; FP16-NEXT: .LCPI29_0: 3703; FP16-NEXT: .long 0xff000000 @ float -1.70141183E+38 3704; FP16-NEXT: .LCPI29_1: 3705; FP16-NEXT: .long 0x7effffff @ float 1.70141173E+38 3706 %x = call i128 @llvm.fptosi.sat.i128.f16(half %f) 3707 ret i128 %x 3708} 3709