brintos

brintos / llvm-project-archived public Read only

0
0
Text · 15.3 KiB · 66f6c9b Raw
505 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc -mtriple=thumbv7-gnu-linux < %s | FileCheck -check-prefixes=CHECK %s3; RUN: llc -mtriple=armv6m < %s | FileCheck %s --check-prefix=THUMB4 5define { half, half } @test_modf_f16(half %a) {6; CHECK-LABEL: test_modf_f16:7; CHECK:       @ %bb.0:8; CHECK-NEXT:    push {r4, lr}9; CHECK-NEXT:    sub sp, #810; CHECK-NEXT:    bl __gnu_h2f_ieee11; CHECK-NEXT:    add r1, sp, #412; CHECK-NEXT:    bl modff13; CHECK-NEXT:    bl __gnu_f2h_ieee14; CHECK-NEXT:    mov r4, r015; CHECK-NEXT:    ldr r0, [sp, #4]16; CHECK-NEXT:    bl __gnu_f2h_ieee17; CHECK-NEXT:    mov r1, r018; CHECK-NEXT:    mov r0, r419; CHECK-NEXT:    add sp, #820; CHECK-NEXT:    pop {r4, pc}21;22; THUMB-LABEL: test_modf_f16:23; THUMB:       @ %bb.0:24; THUMB-NEXT:    push {r4, lr}25; THUMB-NEXT:    sub sp, #826; THUMB-NEXT:    uxth r0, r027; THUMB-NEXT:    bl __gnu_h2f_ieee28; THUMB-NEXT:    add r1, sp, #429; THUMB-NEXT:    bl modff30; THUMB-NEXT:    bl __gnu_f2h_ieee31; THUMB-NEXT:    mov r4, r032; THUMB-NEXT:    ldr r0, [sp, #4]33; THUMB-NEXT:    bl __gnu_f2h_ieee34; THUMB-NEXT:    mov r1, r035; THUMB-NEXT:    mov r0, r436; THUMB-NEXT:    add sp, #837; THUMB-NEXT:    pop {r4, pc}38  %result = call { half, half } @llvm.modf.f16(half %a)39  ret { half, half } %result40}41 42define half @test_modf_f16_only_use_fractional_part(half %a) {43; CHECK-LABEL: test_modf_f16_only_use_fractional_part:44; CHECK:       @ %bb.0:45; CHECK-NEXT:    push {r7, lr}46; CHECK-NEXT:    sub sp, #847; CHECK-NEXT:    bl __gnu_h2f_ieee48; CHECK-NEXT:    add r1, sp, #449; CHECK-NEXT:    bl modff50; CHECK-NEXT:    bl __gnu_f2h_ieee51; CHECK-NEXT:    add sp, #852; CHECK-NEXT:    pop {r7, pc}53;54; THUMB-LABEL: test_modf_f16_only_use_fractional_part:55; THUMB:       @ %bb.0:56; THUMB-NEXT:    push {r7, lr}57; THUMB-NEXT:    sub sp, #858; THUMB-NEXT:    uxth r0, r059; THUMB-NEXT:    bl __gnu_h2f_ieee60; THUMB-NEXT:    add r1, sp, #461; THUMB-NEXT:    bl modff62; THUMB-NEXT:    bl __gnu_f2h_ieee63; THUMB-NEXT:    add sp, #864; THUMB-NEXT:    pop {r7, pc}65  %result = call { half, half } @llvm.modf.f16(half %a)66  %result.0 = extractvalue { half, half } %result, 067  ret half %result.068}69 70define half @test_modf_f16_only_use_integral_part(half %a) {71; CHECK-LABEL: test_modf_f16_only_use_integral_part:72; CHECK:       @ %bb.0:73; CHECK-NEXT:    push {r7, lr}74; CHECK-NEXT:    sub sp, #875; CHECK-NEXT:    bl __gnu_h2f_ieee76; CHECK-NEXT:    add r1, sp, #477; CHECK-NEXT:    bl modff78; CHECK-NEXT:    ldr r0, [sp, #4]79; CHECK-NEXT:    bl __gnu_f2h_ieee80; CHECK-NEXT:    add sp, #881; CHECK-NEXT:    pop {r7, pc}82;83; THUMB-LABEL: test_modf_f16_only_use_integral_part:84; THUMB:       @ %bb.0:85; THUMB-NEXT:    push {r7, lr}86; THUMB-NEXT:    sub sp, #887; THUMB-NEXT:    uxth r0, r088; THUMB-NEXT:    bl __gnu_h2f_ieee89; THUMB-NEXT:    add r1, sp, #490; THUMB-NEXT:    bl modff91; THUMB-NEXT:    ldr r0, [sp, #4]92; THUMB-NEXT:    bl __gnu_f2h_ieee93; THUMB-NEXT:    add sp, #894; THUMB-NEXT:    pop {r7, pc}95  %result = call { half, half } @llvm.modf.f16(half %a)96  %result.1 = extractvalue { half, half } %result, 197  ret half %result.198}99 100define { <2 x half>, <2 x half> } @test_modf_v2f16(<2 x half> %a) {101; CHECK-LABEL: test_modf_v2f16:102; CHECK:       @ %bb.0:103; CHECK-NEXT:    push {r4, lr}104; CHECK-NEXT:    vpush {d8}105; CHECK-NEXT:    sub sp, #16106; CHECK-NEXT:    mov r4, r0107; CHECK-NEXT:    mov r0, r1108; CHECK-NEXT:    bl __gnu_h2f_ieee109; CHECK-NEXT:    add r1, sp, #4110; CHECK-NEXT:    bl modff111; CHECK-NEXT:    bl __gnu_f2h_ieee112; CHECK-NEXT:    strh.w r0, [sp, #14]113; CHECK-NEXT:    mov r0, r4114; CHECK-NEXT:    bl __gnu_h2f_ieee115; CHECK-NEXT:    mov r1, sp116; CHECK-NEXT:    bl modff117; CHECK-NEXT:    bl __gnu_f2h_ieee118; CHECK-NEXT:    strh.w r0, [sp, #12]119; CHECK-NEXT:    add r0, sp, #12120; CHECK-NEXT:    vld1.32 {d8[0]}, [r0:32]121; CHECK-NEXT:    ldr r0, [sp, #4]122; CHECK-NEXT:    bl __gnu_f2h_ieee123; CHECK-NEXT:    ldr r1, [sp]124; CHECK-NEXT:    strh.w r0, [sp, #10]125; CHECK-NEXT:    mov r0, r1126; CHECK-NEXT:    bl __gnu_f2h_ieee127; CHECK-NEXT:    strh.w r0, [sp, #8]128; CHECK-NEXT:    add r0, sp, #8129; CHECK-NEXT:    vmovl.u16 q9, d8130; CHECK-NEXT:    vld1.32 {d16[0]}, [r0:32]131; CHECK-NEXT:    vmovl.u16 q8, d16132; CHECK-NEXT:    vmov.32 r0, d18[0]133; CHECK-NEXT:    vmov.32 r1, d18[1]134; CHECK-NEXT:    vmov.32 r2, d16[0]135; CHECK-NEXT:    vmov.32 r3, d16[1]136; CHECK-NEXT:    add sp, #16137; CHECK-NEXT:    vpop {d8}138; CHECK-NEXT:    pop {r4, pc}139;140; THUMB-LABEL: test_modf_v2f16:141; THUMB:       @ %bb.0:142; THUMB-NEXT:    push {r4, r5, r6, lr}143; THUMB-NEXT:    sub sp, #8144; THUMB-NEXT:    mov r5, r1145; THUMB-NEXT:    uxth r0, r0146; THUMB-NEXT:    bl __gnu_h2f_ieee147; THUMB-NEXT:    mov r1, sp148; THUMB-NEXT:    bl modff149; THUMB-NEXT:    bl __gnu_f2h_ieee150; THUMB-NEXT:    mov r4, r0151; THUMB-NEXT:    uxth r0, r5152; THUMB-NEXT:    bl __gnu_h2f_ieee153; THUMB-NEXT:    add r1, sp, #4154; THUMB-NEXT:    bl modff155; THUMB-NEXT:    bl __gnu_f2h_ieee156; THUMB-NEXT:    mov r5, r0157; THUMB-NEXT:    ldr r0, [sp]158; THUMB-NEXT:    bl __gnu_f2h_ieee159; THUMB-NEXT:    mov r6, r0160; THUMB-NEXT:    ldr r0, [sp, #4]161; THUMB-NEXT:    bl __gnu_f2h_ieee162; THUMB-NEXT:    mov r3, r0163; THUMB-NEXT:    mov r0, r4164; THUMB-NEXT:    mov r1, r5165; THUMB-NEXT:    mov r2, r6166; THUMB-NEXT:    add sp, #8167; THUMB-NEXT:    pop {r4, r5, r6, pc}168  %result = call { <2 x half>, <2 x half> } @llvm.modf.v2f16(<2 x half> %a)169  ret { <2 x half>, <2 x half> } %result170}171 172define { float, float } @test_modf_f32(float %a) {173; CHECK-LABEL: test_modf_f32:174; CHECK:       @ %bb.0:175; CHECK-NEXT:    push {r7, lr}176; CHECK-NEXT:    sub sp, #8177; CHECK-NEXT:    add r1, sp, #4178; CHECK-NEXT:    bl modff179; CHECK-NEXT:    ldr r1, [sp, #4]180; CHECK-NEXT:    add sp, #8181; CHECK-NEXT:    pop {r7, pc}182;183; THUMB-LABEL: test_modf_f32:184; THUMB:       @ %bb.0:185; THUMB-NEXT:    push {r7, lr}186; THUMB-NEXT:    sub sp, #8187; THUMB-NEXT:    add r1, sp, #4188; THUMB-NEXT:    bl modff189; THUMB-NEXT:    ldr r1, [sp, #4]190; THUMB-NEXT:    add sp, #8191; THUMB-NEXT:    pop {r7, pc}192  %result = call { float, float } @llvm.modf.f32(float %a)193  ret { float, float } %result194}195 196define { <3 x float>, <3 x float> } @test_modf_v3f32(<3 x float> %a) {197; CHECK-LABEL: test_modf_v3f32:198; CHECK:       @ %bb.0:199; CHECK-NEXT:    push {r4, r5, r6, lr}200; CHECK-NEXT:    vpush {d8, d9}201; CHECK-NEXT:    sub sp, #8202; CHECK-NEXT:    vldr d9, [sp, #40]203; CHECK-NEXT:    mov r4, r0204; CHECK-NEXT:    mov r1, sp205; CHECK-NEXT:    mov r0, r2206; CHECK-NEXT:    mov r5, r3207; CHECK-NEXT:    vmov d8, r2, r3208; CHECK-NEXT:    bl modff209; CHECK-NEXT:    add r1, sp, #4210; CHECK-NEXT:    mov r6, r0211; CHECK-NEXT:    mov r0, r5212; CHECK-NEXT:    bl modff213; CHECK-NEXT:    mov r5, r0214; CHECK-NEXT:    vmov r0, s18215; CHECK-NEXT:    vldmia sp, {s0, s1}216; CHECK-NEXT:    add.w r1, r4, #16217; CHECK-NEXT:    vst1.32 {d0}, [r1:64]!218; CHECK-NEXT:    bl modff219; CHECK-NEXT:    vmov s1, r5220; CHECK-NEXT:    vmov s0, r6221; CHECK-NEXT:    vst1.32 {d0}, [r4:64]!222; CHECK-NEXT:    str r0, [r4]223; CHECK-NEXT:    add sp, #8224; CHECK-NEXT:    vpop {d8, d9}225; CHECK-NEXT:    pop {r4, r5, r6, pc}226;227; THUMB-LABEL: test_modf_v3f32:228; THUMB:       @ %bb.0:229; THUMB-NEXT:    push {r4, r5, r6, r7, lr}230; THUMB-NEXT:    sub sp, #12231; THUMB-NEXT:    mov r7, r3232; THUMB-NEXT:    mov r5, r2233; THUMB-NEXT:    mov r4, r0234; THUMB-NEXT:    ldr r0, [sp, #32]235; THUMB-NEXT:    add r1, sp, #8236; THUMB-NEXT:    bl modff237; THUMB-NEXT:    mov r6, r0238; THUMB-NEXT:    ldr r0, [sp, #8]239; THUMB-NEXT:    str r0, [r4, #24]240; THUMB-NEXT:    add r1, sp, #4241; THUMB-NEXT:    mov r0, r7242; THUMB-NEXT:    bl modff243; THUMB-NEXT:    mov r7, r0244; THUMB-NEXT:    ldr r0, [sp, #4]245; THUMB-NEXT:    str r0, [r4, #20]246; THUMB-NEXT:    mov r1, sp247; THUMB-NEXT:    mov r0, r5248; THUMB-NEXT:    bl modff249; THUMB-NEXT:    ldr r1, [sp]250; THUMB-NEXT:    str r1, [r4, #16]251; THUMB-NEXT:    stm r4!, {r0, r7}252; THUMB-NEXT:    str r6, [r4]253; THUMB-NEXT:    add sp, #12254; THUMB-NEXT:    pop {r4, r5, r6, r7, pc}255  %result = call { <3 x float>, <3 x float> } @llvm.modf.v3f32(<3 x float> %a)256  ret { <3 x float>, <3 x float> } %result257}258 259define { <2 x float>, <2 x float> } @test_modf_v2f32(<2 x float> %a) {260; CHECK-LABEL: test_modf_v2f32:261; CHECK:       @ %bb.0:262; CHECK-NEXT:    push {r4, lr}263; CHECK-NEXT:    vpush {d8}264; CHECK-NEXT:    sub sp, #8265; CHECK-NEXT:    vmov d8, r0, r1266; CHECK-NEXT:    mov r1, sp267; CHECK-NEXT:    vmov r0, s17268; CHECK-NEXT:    bl modff269; CHECK-NEXT:    mov r4, r0270; CHECK-NEXT:    vmov r0, s16271; CHECK-NEXT:    add r1, sp, #4272; CHECK-NEXT:    bl modff273; CHECK-NEXT:    vldr s1, [sp]274; CHECK-NEXT:    mov r1, r4275; CHECK-NEXT:    vldr s0, [sp, #4]276; CHECK-NEXT:    vmov r2, r3, d0277; CHECK-NEXT:    add sp, #8278; CHECK-NEXT:    vpop {d8}279; CHECK-NEXT:    pop {r4, pc}280;281; THUMB-LABEL: test_modf_v2f32:282; THUMB:       @ %bb.0:283; THUMB-NEXT:    push {r4, r5, r7, lr}284; THUMB-NEXT:    sub sp, #8285; THUMB-NEXT:    mov r4, r1286; THUMB-NEXT:    mov r1, sp287; THUMB-NEXT:    bl modff288; THUMB-NEXT:    mov r5, r0289; THUMB-NEXT:    add r1, sp, #4290; THUMB-NEXT:    mov r0, r4291; THUMB-NEXT:    bl modff292; THUMB-NEXT:    mov r1, r0293; THUMB-NEXT:    ldr r2, [sp]294; THUMB-NEXT:    ldr r3, [sp, #4]295; THUMB-NEXT:    mov r0, r5296; THUMB-NEXT:    add sp, #8297; THUMB-NEXT:    pop {r4, r5, r7, pc}298  %result = call { <2 x float>, <2 x float> } @llvm.modf.v2f32(<2 x float> %a)299  ret { <2 x float>, <2 x float> } %result300}301 302define { <2 x double>, <2 x double> } @test_modf_v2f64(<2 x double> %a) {303; CHECK-LABEL: test_modf_v2f64:304; CHECK:       @ %bb.0:305; CHECK-NEXT:    push {r4, lr}306; CHECK-NEXT:    vpush {d8, d9}307; CHECK-NEXT:    sub sp, #16308; CHECK-NEXT:    mov r1, r3309; CHECK-NEXT:    mov r3, r2310; CHECK-NEXT:    add r2, sp, #8311; CHECK-NEXT:    mov r4, r0312; CHECK-NEXT:    mov r0, r3313; CHECK-NEXT:    bl modf314; CHECK-NEXT:    ldrd r12, r3, [sp, #40]315; CHECK-NEXT:    vmov d8, r0, r1316; CHECK-NEXT:    mov r2, sp317; CHECK-NEXT:    mov r1, r3318; CHECK-NEXT:    mov r0, r12319; CHECK-NEXT:    bl modf320; CHECK-NEXT:    vmov d9, r0, r1321; CHECK-NEXT:    vldr d17, [sp]322; CHECK-NEXT:    vldr d16, [sp, #8]323; CHECK-NEXT:    vst1.64 {d8, d9}, [r4]!324; CHECK-NEXT:    vst1.64 {d16, d17}, [r4]325; CHECK-NEXT:    add sp, #16326; CHECK-NEXT:    vpop {d8, d9}327; CHECK-NEXT:    pop {r4, pc}328;329; THUMB-LABEL: test_modf_v2f64:330; THUMB:       @ %bb.0:331; THUMB-NEXT:    push {r4, r5, r6, r7, lr}332; THUMB-NEXT:    sub sp, #28333; THUMB-NEXT:    str r3, [sp, #4] @ 4-byte Spill334; THUMB-NEXT:    mov r7, r2335; THUMB-NEXT:    mov r4, r0336; THUMB-NEXT:    ldr r0, [sp, #48]337; THUMB-NEXT:    ldr r1, [sp, #52]338; THUMB-NEXT:    add r2, sp, #16339; THUMB-NEXT:    bl modf340; THUMB-NEXT:    mov r6, r0341; THUMB-NEXT:    mov r5, r1342; THUMB-NEXT:    ldr r0, [sp, #20]343; THUMB-NEXT:    str r0, [r4, #28]344; THUMB-NEXT:    ldr r0, [sp, #16]345; THUMB-NEXT:    str r0, [r4, #24]346; THUMB-NEXT:    add r2, sp, #8347; THUMB-NEXT:    mov r0, r7348; THUMB-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload349; THUMB-NEXT:    bl modf350; THUMB-NEXT:    ldr r2, [sp, #12]351; THUMB-NEXT:    str r2, [r4, #20]352; THUMB-NEXT:    ldr r2, [sp, #8]353; THUMB-NEXT:    str r2, [r4, #16]354; THUMB-NEXT:    str r5, [r4, #12]355; THUMB-NEXT:    stm r4!, {r0, r1, r6}356; THUMB-NEXT:    add sp, #28357; THUMB-NEXT:    pop {r4, r5, r6, r7, pc}358  %result = call { <2 x double>, <2 x double> } @llvm.modf.v2f64(<2 x double> %a)359  ret { <2 x double>, <2 x double> } %result360}361 362define { double, double } @test_modf_f64(double %a) {363; CHECK-LABEL: test_modf_f64:364; CHECK:       @ %bb.0:365; CHECK-NEXT:    push {r7, lr}366; CHECK-NEXT:    sub sp, #8367; CHECK-NEXT:    mov r2, sp368; CHECK-NEXT:    bl modf369; CHECK-NEXT:    ldrd r2, r3, [sp], #8370; CHECK-NEXT:    pop {r7, pc}371;372; THUMB-LABEL: test_modf_f64:373; THUMB:       @ %bb.0:374; THUMB-NEXT:    push {r7, lr}375; THUMB-NEXT:    sub sp, #8376; THUMB-NEXT:    mov r2, sp377; THUMB-NEXT:    bl modf378; THUMB-NEXT:    ldr r2, [sp]379; THUMB-NEXT:    ldr r3, [sp, #4]380; THUMB-NEXT:    add sp, #8381; THUMB-NEXT:    pop {r7, pc}382  %result = call { double, double } @llvm.modf.f64(double %a)383  ret { double, double } %result384}385 386define double @test_modf_f64_only_use_intergral(double %a) {387; CHECK-LABEL: test_modf_f64_only_use_intergral:388; CHECK:       @ %bb.0:389; CHECK-NEXT:    push {r7, lr}390; CHECK-NEXT:    sub sp, #8391; CHECK-NEXT:    mov r2, sp392; CHECK-NEXT:    bl modf393; CHECK-NEXT:    ldrd r0, r1, [sp], #8394; CHECK-NEXT:    pop {r7, pc}395;396; THUMB-LABEL: test_modf_f64_only_use_intergral:397; THUMB:       @ %bb.0:398; THUMB-NEXT:    push {r7, lr}399; THUMB-NEXT:    sub sp, #8400; THUMB-NEXT:    mov r2, sp401; THUMB-NEXT:    bl modf402; THUMB-NEXT:    ldr r0, [sp]403; THUMB-NEXT:    ldr r1, [sp, #4]404; THUMB-NEXT:    add sp, #8405; THUMB-NEXT:    pop {r7, pc}406  %result = call { double, double } @llvm.modf.f64(double %a)407  %result.1 = extractvalue { double, double } %result, 1408  ret double %result.1409}410 411define double @test_modf_f64_only_use_fractional(double %a) {412; CHECK-LABEL: test_modf_f64_only_use_fractional:413; CHECK:       @ %bb.0:414; CHECK-NEXT:    push {r7, lr}415; CHECK-NEXT:    sub sp, #8416; CHECK-NEXT:    mov r2, sp417; CHECK-NEXT:    bl modf418; CHECK-NEXT:    add sp, #8419; CHECK-NEXT:    pop {r7, pc}420;421; THUMB-LABEL: test_modf_f64_only_use_fractional:422; THUMB:       @ %bb.0:423; THUMB-NEXT:    push {r7, lr}424; THUMB-NEXT:    sub sp, #8425; THUMB-NEXT:    mov r2, sp426; THUMB-NEXT:    bl modf427; THUMB-NEXT:    add sp, #8428; THUMB-NEXT:    pop {r7, pc}429  %result = call { double, double } @llvm.modf.f64(double %a)430  %result.1 = extractvalue { double, double } %result, 0431  ret double %result.1432}433 434define { double, double } @test_modf_f64_tail_call(double %a) {435; CHECK-LABEL: test_modf_f64_tail_call:436; CHECK:       @ %bb.0:437; CHECK-NEXT:    push {r7, lr}438; CHECK-NEXT:    sub sp, #8439; CHECK-NEXT:    mov r2, sp440; CHECK-NEXT:    bl modf441; CHECK-NEXT:    ldrd r2, r3, [sp], #8442; CHECK-NEXT:    pop {r7, pc}443;444; THUMB-LABEL: test_modf_f64_tail_call:445; THUMB:       @ %bb.0:446; THUMB-NEXT:    push {r7, lr}447; THUMB-NEXT:    sub sp, #8448; THUMB-NEXT:    mov r2, sp449; THUMB-NEXT:    bl modf450; THUMB-NEXT:    ldr r2, [sp]451; THUMB-NEXT:    ldr r3, [sp, #4]452; THUMB-NEXT:    add sp, #8453; THUMB-NEXT:    pop {r7, pc}454  %result = tail call { double, double } @llvm.modf.f64(double %a)455  ret { double, double } %result456}457 458define double @test_modf_f64_only_use_intergral_tail_call(double %a) {459; CHECK-LABEL: test_modf_f64_only_use_intergral_tail_call:460; CHECK:       @ %bb.0:461; CHECK-NEXT:    push {r7, lr}462; CHECK-NEXT:    sub sp, #8463; CHECK-NEXT:    mov r2, sp464; CHECK-NEXT:    bl modf465; CHECK-NEXT:    ldrd r0, r1, [sp], #8466; CHECK-NEXT:    pop {r7, pc}467;468; THUMB-LABEL: test_modf_f64_only_use_intergral_tail_call:469; THUMB:       @ %bb.0:470; THUMB-NEXT:    push {r7, lr}471; THUMB-NEXT:    sub sp, #8472; THUMB-NEXT:    mov r2, sp473; THUMB-NEXT:    bl modf474; THUMB-NEXT:    ldr r0, [sp]475; THUMB-NEXT:    ldr r1, [sp, #4]476; THUMB-NEXT:    add sp, #8477; THUMB-NEXT:    pop {r7, pc}478  %result = tail call { double, double } @llvm.modf.f64(double %a)479  %result.1 = extractvalue { double, double } %result, 1480  ret double %result.1481}482 483define double @test_modf_f64_only_use_fractional_tail_call(double %a) {484; CHECK-LABEL: test_modf_f64_only_use_fractional_tail_call:485; CHECK:       @ %bb.0:486; CHECK-NEXT:    push {r7, lr}487; CHECK-NEXT:    sub sp, #8488; CHECK-NEXT:    mov r2, sp489; CHECK-NEXT:    bl modf490; CHECK-NEXT:    add sp, #8491; CHECK-NEXT:    pop {r7, pc}492;493; THUMB-LABEL: test_modf_f64_only_use_fractional_tail_call:494; THUMB:       @ %bb.0:495; THUMB-NEXT:    push {r7, lr}496; THUMB-NEXT:    sub sp, #8497; THUMB-NEXT:    mov r2, sp498; THUMB-NEXT:    bl modf499; THUMB-NEXT:    add sp, #8500; THUMB-NEXT:    pop {r7, pc}501  %result = tail call { double, double } @llvm.modf.f64(double %a)502  %result.1 = extractvalue { double, double } %result, 0503  ret double %result.1504}505