1005 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-prefix=GNU %s3; RUN: llc -mtriple=armv7-linux-gnueabi -mcpu=cortex-a8 < %s | FileCheck -check-prefix=GNUEABI %s4; RUN: llc -mtriple=armv7-apple-ios6 -mcpu=cortex-a8 < %s | FileCheck -check-prefixes=IOS,IOS-NO-STRET %s5; RUN: llc -mtriple=armv7-apple-ios7 -mcpu=cortex-a8 < %s | FileCheck -check-prefixes=IOS,IOS-WITH-STRET %s6; RUN: llc -mtriple=thumbv7k-apple-watchos2.0 < %s | FileCheck -check-prefix=WATCHABI %s7 8define { half, half } @test_sincos_f16(half %a) {9; GNU-LABEL: test_sincos_f16:10; GNU: @ %bb.0:11; GNU-NEXT: push {r4, lr}12; GNU-NEXT: sub sp, #813; GNU-NEXT: bl __gnu_h2f_ieee14; GNU-NEXT: add r1, sp, #415; GNU-NEXT: mov r2, sp16; GNU-NEXT: bl sincosf17; GNU-NEXT: ldr r0, [sp, #4]18; GNU-NEXT: bl __gnu_f2h_ieee19; GNU-NEXT: mov r4, r020; GNU-NEXT: ldr r0, [sp]21; GNU-NEXT: bl __gnu_f2h_ieee22; GNU-NEXT: mov r1, r023; GNU-NEXT: mov r0, r424; GNU-NEXT: add sp, #825; GNU-NEXT: pop {r4, pc}26;27; GNUEABI-LABEL: test_sincos_f16:28; GNUEABI: @ %bb.0:29; GNUEABI-NEXT: .save {r4, lr}30; GNUEABI-NEXT: push {r4, lr}31; GNUEABI-NEXT: .pad #832; GNUEABI-NEXT: sub sp, sp, #833; GNUEABI-NEXT: bl __gnu_h2f_ieee34; GNUEABI-NEXT: add r1, sp, #435; GNUEABI-NEXT: mov r2, sp36; GNUEABI-NEXT: bl sincosf37; GNUEABI-NEXT: ldr r0, [sp, #4]38; GNUEABI-NEXT: bl __gnu_f2h_ieee39; GNUEABI-NEXT: mov r4, r040; GNUEABI-NEXT: ldr r0, [sp]41; GNUEABI-NEXT: bl __gnu_f2h_ieee42; GNUEABI-NEXT: mov r1, r043; GNUEABI-NEXT: mov r0, r444; GNUEABI-NEXT: add sp, sp, #845; GNUEABI-NEXT: pop {r4, pc}46;47; IOS-NO-STRET-LABEL: test_sincos_f16:48; IOS-NO-STRET: @ %bb.0:49; IOS-NO-STRET-NEXT: push {r4, r5, lr}50; IOS-NO-STRET-NEXT: bl ___extendhfsf251; IOS-NO-STRET-NEXT: mov r4, r052; IOS-NO-STRET-NEXT: bl _sinf53; IOS-NO-STRET-NEXT: bl ___truncsfhf254; IOS-NO-STRET-NEXT: mov r5, r055; IOS-NO-STRET-NEXT: mov r0, r456; IOS-NO-STRET-NEXT: bl _cosf57; IOS-NO-STRET-NEXT: bl ___truncsfhf258; IOS-NO-STRET-NEXT: mov r1, r059; IOS-NO-STRET-NEXT: mov r0, r560; IOS-NO-STRET-NEXT: pop {r4, r5, pc}61;62; IOS-WITH-STRET-LABEL: test_sincos_f16:63; IOS-WITH-STRET: @ %bb.0:64; IOS-WITH-STRET-NEXT: push {r4, r5, lr}65; IOS-WITH-STRET-NEXT: sub sp, sp, #866; IOS-WITH-STRET-NEXT: bl ___extendhfsf267; IOS-WITH-STRET-NEXT: mov r1, r068; IOS-WITH-STRET-NEXT: mov r0, sp69; IOS-WITH-STRET-NEXT: bl ___sincosf_stret70; IOS-WITH-STRET-NEXT: ldm sp, {r0, r4}71; IOS-WITH-STRET-NEXT: bl ___truncsfhf272; IOS-WITH-STRET-NEXT: mov r5, r073; IOS-WITH-STRET-NEXT: mov r0, r474; IOS-WITH-STRET-NEXT: bl ___truncsfhf275; IOS-WITH-STRET-NEXT: mov r1, r076; IOS-WITH-STRET-NEXT: mov r0, r577; IOS-WITH-STRET-NEXT: add sp, sp, #878; IOS-WITH-STRET-NEXT: pop {r4, r5, pc}79;80; WATCHABI-LABEL: test_sincos_f16:81; WATCHABI: .cfi_startproc82; WATCHABI-NEXT: @ %bb.0:83; WATCHABI-NEXT: push {r7, lr}84; WATCHABI-NEXT: .cfi_def_cfa_offset 885; WATCHABI-NEXT: .cfi_offset lr, -486; WATCHABI-NEXT: .cfi_offset r7, -887; WATCHABI-NEXT: sub sp, #888; WATCHABI-NEXT: .cfi_def_cfa_offset 1689; WATCHABI-NEXT: vcvtb.f32.f16 s0, s090; WATCHABI-NEXT: bl ___sincosf_stret91; WATCHABI-NEXT: vcvtb.f16.f32 s0, s092; WATCHABI-NEXT: vcvtb.f16.f32 s1, s193; WATCHABI-NEXT: add sp, #894; WATCHABI-NEXT: pop {r7, pc}95; WATCHABI-NEXT: .cfi_endproc96 %result = call { half, half } @llvm.sincos.f16(half %a)97 ret { half, half } %result98}99 100define half @test_sincos_f16_only_use_sin(half %a) {101; GNU-LABEL: test_sincos_f16_only_use_sin:102; GNU: @ %bb.0:103; GNU-NEXT: push {r7, lr}104; GNU-NEXT: sub sp, #8105; GNU-NEXT: bl __gnu_h2f_ieee106; GNU-NEXT: add r1, sp, #4107; GNU-NEXT: mov r2, sp108; GNU-NEXT: bl sincosf109; GNU-NEXT: ldr r0, [sp, #4]110; GNU-NEXT: bl __gnu_f2h_ieee111; GNU-NEXT: add sp, #8112; GNU-NEXT: pop {r7, pc}113;114; GNUEABI-LABEL: test_sincos_f16_only_use_sin:115; GNUEABI: @ %bb.0:116; GNUEABI-NEXT: .save {r11, lr}117; GNUEABI-NEXT: push {r11, lr}118; GNUEABI-NEXT: .pad #8119; GNUEABI-NEXT: sub sp, sp, #8120; GNUEABI-NEXT: bl __gnu_h2f_ieee121; GNUEABI-NEXT: add r1, sp, #4122; GNUEABI-NEXT: mov r2, sp123; GNUEABI-NEXT: bl sincosf124; GNUEABI-NEXT: ldr r0, [sp, #4]125; GNUEABI-NEXT: bl __gnu_f2h_ieee126; GNUEABI-NEXT: add sp, sp, #8127; GNUEABI-NEXT: pop {r11, pc}128;129; IOS-NO-STRET-LABEL: test_sincos_f16_only_use_sin:130; IOS-NO-STRET: @ %bb.0:131; IOS-NO-STRET-NEXT: push {lr}132; IOS-NO-STRET-NEXT: bl ___extendhfsf2133; IOS-NO-STRET-NEXT: bl _sinf134; IOS-NO-STRET-NEXT: bl ___truncsfhf2135; IOS-NO-STRET-NEXT: pop {lr}136; IOS-NO-STRET-NEXT: bx lr137;138; IOS-WITH-STRET-LABEL: test_sincos_f16_only_use_sin:139; IOS-WITH-STRET: @ %bb.0:140; IOS-WITH-STRET-NEXT: push {lr}141; IOS-WITH-STRET-NEXT: sub sp, sp, #8142; IOS-WITH-STRET-NEXT: bl ___extendhfsf2143; IOS-WITH-STRET-NEXT: mov r1, r0144; IOS-WITH-STRET-NEXT: mov r0, sp145; IOS-WITH-STRET-NEXT: bl ___sincosf_stret146; IOS-WITH-STRET-NEXT: ldr r0, [sp]147; IOS-WITH-STRET-NEXT: bl ___truncsfhf2148; IOS-WITH-STRET-NEXT: add sp, sp, #8149; IOS-WITH-STRET-NEXT: pop {lr}150; IOS-WITH-STRET-NEXT: bx lr151;152; WATCHABI-LABEL: test_sincos_f16_only_use_sin:153; WATCHABI: .cfi_startproc154; WATCHABI-NEXT: @ %bb.0:155; WATCHABI-NEXT: push {r7, lr}156; WATCHABI-NEXT: .cfi_def_cfa_offset 8157; WATCHABI-NEXT: .cfi_offset lr, -4158; WATCHABI-NEXT: .cfi_offset r7, -8159; WATCHABI-NEXT: sub sp, #8160; WATCHABI-NEXT: .cfi_def_cfa_offset 16161; WATCHABI-NEXT: vcvtb.f32.f16 s0, s0162; WATCHABI-NEXT: bl ___sincosf_stret163; WATCHABI-NEXT: vcvtb.f16.f32 s0, s0164; WATCHABI-NEXT: add sp, #8165; WATCHABI-NEXT: pop {r7, pc}166; WATCHABI-NEXT: .cfi_endproc167 %result = call { half, half } @llvm.sincos.f16(half %a)168 %result.0 = extractvalue { half, half } %result, 0169 ret half %result.0170}171 172define half @test_sincos_f16_only_use_cos(half %a) {173; GNU-LABEL: test_sincos_f16_only_use_cos:174; GNU: @ %bb.0:175; GNU-NEXT: push {r7, lr}176; GNU-NEXT: sub sp, #8177; GNU-NEXT: bl __gnu_h2f_ieee178; GNU-NEXT: add r1, sp, #4179; GNU-NEXT: mov r2, sp180; GNU-NEXT: bl sincosf181; GNU-NEXT: ldr r0, [sp]182; GNU-NEXT: bl __gnu_f2h_ieee183; GNU-NEXT: add sp, #8184; GNU-NEXT: pop {r7, pc}185;186; GNUEABI-LABEL: test_sincos_f16_only_use_cos:187; GNUEABI: @ %bb.0:188; GNUEABI-NEXT: .save {r11, lr}189; GNUEABI-NEXT: push {r11, lr}190; GNUEABI-NEXT: .pad #8191; GNUEABI-NEXT: sub sp, sp, #8192; GNUEABI-NEXT: bl __gnu_h2f_ieee193; GNUEABI-NEXT: add r1, sp, #4194; GNUEABI-NEXT: mov r2, sp195; GNUEABI-NEXT: bl sincosf196; GNUEABI-NEXT: ldr r0, [sp]197; GNUEABI-NEXT: bl __gnu_f2h_ieee198; GNUEABI-NEXT: add sp, sp, #8199; GNUEABI-NEXT: pop {r11, pc}200;201; IOS-NO-STRET-LABEL: test_sincos_f16_only_use_cos:202; IOS-NO-STRET: @ %bb.0:203; IOS-NO-STRET-NEXT: push {lr}204; IOS-NO-STRET-NEXT: bl ___extendhfsf2205; IOS-NO-STRET-NEXT: bl _cosf206; IOS-NO-STRET-NEXT: bl ___truncsfhf2207; IOS-NO-STRET-NEXT: pop {lr}208; IOS-NO-STRET-NEXT: bx lr209;210; IOS-WITH-STRET-LABEL: test_sincos_f16_only_use_cos:211; IOS-WITH-STRET: @ %bb.0:212; IOS-WITH-STRET-NEXT: push {lr}213; IOS-WITH-STRET-NEXT: sub sp, sp, #8214; IOS-WITH-STRET-NEXT: bl ___extendhfsf2215; IOS-WITH-STRET-NEXT: mov r1, r0216; IOS-WITH-STRET-NEXT: mov r0, sp217; IOS-WITH-STRET-NEXT: bl ___sincosf_stret218; IOS-WITH-STRET-NEXT: ldr r0, [sp, #4]219; IOS-WITH-STRET-NEXT: bl ___truncsfhf2220; IOS-WITH-STRET-NEXT: add sp, sp, #8221; IOS-WITH-STRET-NEXT: pop {lr}222; IOS-WITH-STRET-NEXT: bx lr223;224; WATCHABI-LABEL: test_sincos_f16_only_use_cos:225; WATCHABI: .cfi_startproc226; WATCHABI-NEXT: @ %bb.0:227; WATCHABI-NEXT: push {r7, lr}228; WATCHABI-NEXT: .cfi_def_cfa_offset 8229; WATCHABI-NEXT: .cfi_offset lr, -4230; WATCHABI-NEXT: .cfi_offset r7, -8231; WATCHABI-NEXT: sub sp, #8232; WATCHABI-NEXT: .cfi_def_cfa_offset 16233; WATCHABI-NEXT: vcvtb.f32.f16 s0, s0234; WATCHABI-NEXT: bl ___sincosf_stret235; WATCHABI-NEXT: vcvtb.f16.f32 s0, s1236; WATCHABI-NEXT: add sp, #8237; WATCHABI-NEXT: pop {r7, pc}238; WATCHABI-NEXT: .cfi_endproc239 %result = call { half, half } @llvm.sincos.f16(half %a)240 %result.1 = extractvalue { half, half } %result, 1241 ret half %result.1242}243 244define { <2 x half>, <2 x half> } @test_sincos_v2f16(<2 x half> %a) {245; GNU-LABEL: test_sincos_v2f16:246; GNU: @ %bb.0:247; GNU-NEXT: push {r4, lr}248; GNU-NEXT: vpush {d8}249; GNU-NEXT: sub sp, #24250; GNU-NEXT: mov r4, r0251; GNU-NEXT: mov r0, r1252; GNU-NEXT: bl __gnu_h2f_ieee253; GNU-NEXT: add r1, sp, #12254; GNU-NEXT: add r2, sp, #8255; GNU-NEXT: bl sincosf256; GNU-NEXT: mov r0, r4257; GNU-NEXT: bl __gnu_h2f_ieee258; GNU-NEXT: add r1, sp, #4259; GNU-NEXT: mov r2, sp260; GNU-NEXT: bl sincosf261; GNU-NEXT: ldr r0, [sp, #12]262; GNU-NEXT: bl __gnu_f2h_ieee263; GNU-NEXT: ldr r1, [sp, #4]264; GNU-NEXT: strh.w r0, [sp, #22]265; GNU-NEXT: mov r0, r1266; GNU-NEXT: bl __gnu_f2h_ieee267; GNU-NEXT: strh.w r0, [sp, #20]268; GNU-NEXT: add r0, sp, #20269; GNU-NEXT: vld1.32 {d8[0]}, [r0:32]270; GNU-NEXT: ldr r0, [sp, #8]271; GNU-NEXT: bl __gnu_f2h_ieee272; GNU-NEXT: ldr r1, [sp]273; GNU-NEXT: strh.w r0, [sp, #18]274; GNU-NEXT: mov r0, r1275; GNU-NEXT: bl __gnu_f2h_ieee276; GNU-NEXT: strh.w r0, [sp, #16]277; GNU-NEXT: add r0, sp, #16278; GNU-NEXT: vmovl.u16 q9, d8279; GNU-NEXT: vld1.32 {d16[0]}, [r0:32]280; GNU-NEXT: vmovl.u16 q8, d16281; GNU-NEXT: vmov.32 r0, d18[0]282; GNU-NEXT: vmov.32 r1, d18[1]283; GNU-NEXT: vmov.32 r2, d16[0]284; GNU-NEXT: vmov.32 r3, d16[1]285; GNU-NEXT: add sp, #24286; GNU-NEXT: vpop {d8}287; GNU-NEXT: pop {r4, pc}288;289; GNUEABI-LABEL: test_sincos_v2f16:290; GNUEABI: @ %bb.0:291; GNUEABI-NEXT: .save {r4, lr}292; GNUEABI-NEXT: push {r4, lr}293; GNUEABI-NEXT: .vsave {d8}294; GNUEABI-NEXT: vpush {d8}295; GNUEABI-NEXT: .pad #24296; GNUEABI-NEXT: sub sp, sp, #24297; GNUEABI-NEXT: mov r4, r0298; GNUEABI-NEXT: mov r0, r1299; GNUEABI-NEXT: bl __gnu_h2f_ieee300; GNUEABI-NEXT: add r1, sp, #12301; GNUEABI-NEXT: add r2, sp, #8302; GNUEABI-NEXT: bl sincosf303; GNUEABI-NEXT: mov r0, r4304; GNUEABI-NEXT: bl __gnu_h2f_ieee305; GNUEABI-NEXT: add r1, sp, #4306; GNUEABI-NEXT: mov r2, sp307; GNUEABI-NEXT: bl sincosf308; GNUEABI-NEXT: ldr r0, [sp, #12]309; GNUEABI-NEXT: bl __gnu_f2h_ieee310; GNUEABI-NEXT: ldr r1, [sp, #4]311; GNUEABI-NEXT: strh r0, [sp, #22]312; GNUEABI-NEXT: mov r0, r1313; GNUEABI-NEXT: bl __gnu_f2h_ieee314; GNUEABI-NEXT: strh r0, [sp, #20]315; GNUEABI-NEXT: add r0, sp, #20316; GNUEABI-NEXT: vld1.32 {d8[0]}, [r0:32]317; GNUEABI-NEXT: ldr r0, [sp, #8]318; GNUEABI-NEXT: bl __gnu_f2h_ieee319; GNUEABI-NEXT: ldr r1, [sp]320; GNUEABI-NEXT: strh r0, [sp, #18]321; GNUEABI-NEXT: mov r0, r1322; GNUEABI-NEXT: bl __gnu_f2h_ieee323; GNUEABI-NEXT: strh r0, [sp, #16]324; GNUEABI-NEXT: add r0, sp, #16325; GNUEABI-NEXT: vmovl.u16 q9, d8326; GNUEABI-NEXT: vld1.32 {d16[0]}, [r0:32]327; GNUEABI-NEXT: vmovl.u16 q8, d16328; GNUEABI-NEXT: vmov.32 r0, d18[0]329; GNUEABI-NEXT: vmov.32 r1, d18[1]330; GNUEABI-NEXT: vmov.32 r2, d16[0]331; GNUEABI-NEXT: vmov.32 r3, d16[1]332; GNUEABI-NEXT: add sp, sp, #24333; GNUEABI-NEXT: vpop {d8}334; GNUEABI-NEXT: pop {r4, pc}335;336; IOS-NO-STRET-LABEL: test_sincos_v2f16:337; IOS-NO-STRET: @ %bb.0:338; IOS-NO-STRET-NEXT: push {r4, r5, lr}339; IOS-NO-STRET-NEXT: vpush {d8}340; IOS-NO-STRET-NEXT: sub sp, sp, #8341; IOS-NO-STRET-NEXT: mov r5, r0342; IOS-NO-STRET-NEXT: mov r0, r1343; IOS-NO-STRET-NEXT: bl ___extendhfsf2344; IOS-NO-STRET-NEXT: mov r4, r0345; IOS-NO-STRET-NEXT: bl _sinf346; IOS-NO-STRET-NEXT: bl ___truncsfhf2347; IOS-NO-STRET-NEXT: strh r0, [sp, #6]348; IOS-NO-STRET-NEXT: mov r0, r5349; IOS-NO-STRET-NEXT: bl ___extendhfsf2350; IOS-NO-STRET-NEXT: mov r5, r0351; IOS-NO-STRET-NEXT: bl _sinf352; IOS-NO-STRET-NEXT: bl ___truncsfhf2353; IOS-NO-STRET-NEXT: strh r0, [sp, #4]354; IOS-NO-STRET-NEXT: add r0, sp, #4355; IOS-NO-STRET-NEXT: vld1.32 {d8[0]}, [r0:32]356; IOS-NO-STRET-NEXT: mov r0, r4357; IOS-NO-STRET-NEXT: bl _cosf358; IOS-NO-STRET-NEXT: bl ___truncsfhf2359; IOS-NO-STRET-NEXT: strh r0, [sp, #2]360; IOS-NO-STRET-NEXT: mov r0, r5361; IOS-NO-STRET-NEXT: bl _cosf362; IOS-NO-STRET-NEXT: bl ___truncsfhf2363; IOS-NO-STRET-NEXT: strh r0, [sp]364; IOS-NO-STRET-NEXT: mov r0, sp365; IOS-NO-STRET-NEXT: vld1.32 {d16[0]}, [r0:32]366; IOS-NO-STRET-NEXT: vmovl.u16 q9, d8367; IOS-NO-STRET-NEXT: vmovl.u16 q8, d16368; IOS-NO-STRET-NEXT: vmov.32 r0, d18[0]369; IOS-NO-STRET-NEXT: vmov.32 r1, d18[1]370; IOS-NO-STRET-NEXT: vmov.32 r2, d16[0]371; IOS-NO-STRET-NEXT: vmov.32 r3, d16[1]372; IOS-NO-STRET-NEXT: add sp, sp, #8373; IOS-NO-STRET-NEXT: vpop {d8}374; IOS-NO-STRET-NEXT: pop {r4, r5, pc}375;376; IOS-WITH-STRET-LABEL: test_sincos_v2f16:377; IOS-WITH-STRET: @ %bb.0:378; IOS-WITH-STRET-NEXT: push {r4, r5, lr}379; IOS-WITH-STRET-NEXT: vpush {d8}380; IOS-WITH-STRET-NEXT: sub sp, sp, #24381; IOS-WITH-STRET-NEXT: mov r4, r0382; IOS-WITH-STRET-NEXT: mov r0, r1383; IOS-WITH-STRET-NEXT: bl ___extendhfsf2384; IOS-WITH-STRET-NEXT: mov r1, r0385; IOS-WITH-STRET-NEXT: add r0, sp, #8386; IOS-WITH-STRET-NEXT: bl ___sincosf_stret387; IOS-WITH-STRET-NEXT: mov r0, r4388; IOS-WITH-STRET-NEXT: bl ___extendhfsf2389; IOS-WITH-STRET-NEXT: mov r1, r0390; IOS-WITH-STRET-NEXT: mov r0, sp391; IOS-WITH-STRET-NEXT: bl ___sincosf_stret392; IOS-WITH-STRET-NEXT: ldr r0, [sp, #8]393; IOS-WITH-STRET-NEXT: ldr r4, [sp, #12]394; IOS-WITH-STRET-NEXT: bl ___truncsfhf2395; IOS-WITH-STRET-NEXT: ldm sp, {r1, r5}396; IOS-WITH-STRET-NEXT: strh r0, [sp, #22]397; IOS-WITH-STRET-NEXT: mov r0, r1398; IOS-WITH-STRET-NEXT: bl ___truncsfhf2399; IOS-WITH-STRET-NEXT: strh r0, [sp, #20]400; IOS-WITH-STRET-NEXT: add r0, sp, #20401; IOS-WITH-STRET-NEXT: vld1.32 {d8[0]}, [r0:32]402; IOS-WITH-STRET-NEXT: mov r0, r4403; IOS-WITH-STRET-NEXT: bl ___truncsfhf2404; IOS-WITH-STRET-NEXT: strh r0, [sp, #18]405; IOS-WITH-STRET-NEXT: mov r0, r5406; IOS-WITH-STRET-NEXT: bl ___truncsfhf2407; IOS-WITH-STRET-NEXT: strh r0, [sp, #16]408; IOS-WITH-STRET-NEXT: add r0, sp, #16409; IOS-WITH-STRET-NEXT: vmovl.u16 q9, d8410; IOS-WITH-STRET-NEXT: vld1.32 {d16[0]}, [r0:32]411; IOS-WITH-STRET-NEXT: vmovl.u16 q8, d16412; IOS-WITH-STRET-NEXT: vmov.32 r0, d18[0]413; IOS-WITH-STRET-NEXT: vmov.32 r1, d18[1]414; IOS-WITH-STRET-NEXT: vmov.32 r2, d16[0]415; IOS-WITH-STRET-NEXT: vmov.32 r3, d16[1]416; IOS-WITH-STRET-NEXT: add sp, sp, #24417; IOS-WITH-STRET-NEXT: vpop {d8}418; IOS-WITH-STRET-NEXT: pop {r4, r5, pc}419;420; WATCHABI-LABEL: test_sincos_v2f16:421; WATCHABI: .cfi_startproc422; WATCHABI-NEXT: @ %bb.0:423; WATCHABI-NEXT: push {r7, lr}424; WATCHABI-NEXT: .cfi_def_cfa_offset 8425; WATCHABI-NEXT: .cfi_offset lr, -4426; WATCHABI-NEXT: .cfi_offset r7, -8427; WATCHABI-NEXT: vpush {d10}428; WATCHABI-NEXT: .cfi_def_cfa_offset 16429; WATCHABI-NEXT: vpush {d8}430; WATCHABI-NEXT: .cfi_def_cfa_offset 24431; WATCHABI-NEXT: .cfi_offset d10, -16432; WATCHABI-NEXT: .cfi_offset d8, -24433; WATCHABI-NEXT: sub sp, #8434; WATCHABI-NEXT: .cfi_def_cfa_offset 32435; WATCHABI-NEXT: vmov.f32 s16, s0436; WATCHABI-NEXT: vcvtb.f32.f16 s0, s1437; WATCHABI-NEXT: bl ___sincosf_stret438; WATCHABI-NEXT: vcvtb.f16.f32 s0, s0439; WATCHABI-NEXT: vcvtb.f32.f16 s4, s16440; WATCHABI-NEXT: vmov r0, s0441; WATCHABI-NEXT: vmov.f32 s0, s4442; WATCHABI-NEXT: vmov.f32 s20, s1443; WATCHABI-NEXT: strh.w r0, [sp, #6]444; WATCHABI-NEXT: bl ___sincosf_stret445; WATCHABI-NEXT: vcvtb.f16.f32 s0, s0446; WATCHABI-NEXT: vmov r0, s0447; WATCHABI-NEXT: vcvtb.f16.f32 s0, s20448; WATCHABI-NEXT: strh.w r0, [sp, #4]449; WATCHABI-NEXT: add r0, sp, #4450; WATCHABI-NEXT: vld1.32 {d16[0]}, [r0:32]451; WATCHABI-NEXT: vmov r0, s0452; WATCHABI-NEXT: vcvtb.f16.f32 s0, s1453; WATCHABI-NEXT: strh.w r0, [sp, #2]454; WATCHABI-NEXT: vmov r0, s0455; WATCHABI-NEXT: vmovl.u16 q0, d16456; WATCHABI-NEXT: strh.w r0, [sp]457; WATCHABI-NEXT: mov r0, sp458; WATCHABI-NEXT: vld1.32 {d18[0]}, [r0:32]459; WATCHABI-NEXT: vmovl.u16 q1, d18460; WATCHABI-NEXT: vmov.f32 s2, s4461; WATCHABI-NEXT: vmov.f32 s3, s5462; WATCHABI-NEXT: add sp, #8463; WATCHABI-NEXT: vpop {d8}464; WATCHABI-NEXT: vpop {d10}465; WATCHABI-NEXT: pop {r7, pc}466; WATCHABI-NEXT: .cfi_endproc467 %result = call { <2 x half>, <2 x half> } @llvm.sincos.v2f16(<2 x half> %a)468 ret { <2 x half>, <2 x half> } %result469}470 471define { float, float } @test_sincos_f32(float %a) {472; GNU-LABEL: test_sincos_f32:473; GNU: @ %bb.0:474; GNU-NEXT: push {r7, lr}475; GNU-NEXT: sub sp, #8476; GNU-NEXT: add r1, sp, #4477; GNU-NEXT: mov r2, sp478; GNU-NEXT: bl sincosf479; GNU-NEXT: ldrd r1, r0, [sp], #8480; GNU-NEXT: pop {r7, pc}481;482; GNUEABI-LABEL: test_sincos_f32:483; GNUEABI: @ %bb.0:484; GNUEABI-NEXT: .save {r11, lr}485; GNUEABI-NEXT: push {r11, lr}486; GNUEABI-NEXT: .pad #8487; GNUEABI-NEXT: sub sp, sp, #8488; GNUEABI-NEXT: add r1, sp, #4489; GNUEABI-NEXT: mov r2, sp490; GNUEABI-NEXT: bl sincosf491; GNUEABI-NEXT: ldr r0, [sp, #4]492; GNUEABI-NEXT: ldr r1, [sp], #8493; GNUEABI-NEXT: pop {r11, pc}494;495; IOS-NO-STRET-LABEL: test_sincos_f32:496; IOS-NO-STRET: @ %bb.0:497; IOS-NO-STRET-NEXT: push {r4, r5, lr}498; IOS-NO-STRET-NEXT: mov r4, r0499; IOS-NO-STRET-NEXT: bl _sinf500; IOS-NO-STRET-NEXT: mov r5, r0501; IOS-NO-STRET-NEXT: mov r0, r4502; IOS-NO-STRET-NEXT: bl _cosf503; IOS-NO-STRET-NEXT: mov r1, r0504; IOS-NO-STRET-NEXT: mov r0, r5505; IOS-NO-STRET-NEXT: pop {r4, r5, pc}506;507; IOS-WITH-STRET-LABEL: test_sincos_f32:508; IOS-WITH-STRET: @ %bb.0:509; IOS-WITH-STRET-NEXT: push {lr}510; IOS-WITH-STRET-NEXT: sub sp, sp, #8511; IOS-WITH-STRET-NEXT: mov r1, r0512; IOS-WITH-STRET-NEXT: mov r0, sp513; IOS-WITH-STRET-NEXT: bl ___sincosf_stret514; IOS-WITH-STRET-NEXT: pop {r0, r1}515; IOS-WITH-STRET-NEXT: pop {lr}516; IOS-WITH-STRET-NEXT: bx lr517;518; WATCHABI-LABEL: test_sincos_f32:519; WATCHABI: .cfi_startproc520; WATCHABI-NEXT: @ %bb.0:521; WATCHABI-NEXT: push {r7, lr}522; WATCHABI-NEXT: .cfi_def_cfa_offset 8523; WATCHABI-NEXT: .cfi_offset lr, -4524; WATCHABI-NEXT: .cfi_offset r7, -8525; WATCHABI-NEXT: sub sp, #8526; WATCHABI-NEXT: .cfi_def_cfa_offset 16527; WATCHABI-NEXT: bl ___sincosf_stret528; WATCHABI-NEXT: add sp, #8529; WATCHABI-NEXT: pop {r7, pc}530; WATCHABI-NEXT: .cfi_endproc531 %result = call { float, float } @llvm.sincos.f32(float %a)532 ret { float, float } %result533}534 535define { <2 x float>, <2 x float> } @test_sincos_v2f32(<2 x float> %a) {536; GNU-LABEL: test_sincos_v2f32:537; GNU: @ %bb.0:538; GNU-NEXT: push {r7, lr}539; GNU-NEXT: vpush {d8}540; GNU-NEXT: sub sp, #16541; GNU-NEXT: vmov d8, r0, r1542; GNU-NEXT: add r1, sp, #4543; GNU-NEXT: mov r2, sp544; GNU-NEXT: vmov r0, s17545; GNU-NEXT: bl sincosf546; GNU-NEXT: vmov r0, s16547; GNU-NEXT: add r1, sp, #12548; GNU-NEXT: add r2, sp, #8549; GNU-NEXT: bl sincosf550; GNU-NEXT: vldr s1, [sp, #4]551; GNU-NEXT: vldr s3, [sp]552; GNU-NEXT: vldr s0, [sp, #12]553; GNU-NEXT: vldr s2, [sp, #8]554; GNU-NEXT: vmov r0, r1, d0555; GNU-NEXT: vmov r2, r3, d1556; GNU-NEXT: add sp, #16557; GNU-NEXT: vpop {d8}558; GNU-NEXT: pop {r7, pc}559;560; GNUEABI-LABEL: test_sincos_v2f32:561; GNUEABI: @ %bb.0:562; GNUEABI-NEXT: .save {r11, lr}563; GNUEABI-NEXT: push {r11, lr}564; GNUEABI-NEXT: .vsave {d8}565; GNUEABI-NEXT: vpush {d8}566; GNUEABI-NEXT: .pad #16567; GNUEABI-NEXT: sub sp, sp, #16568; GNUEABI-NEXT: vmov d8, r0, r1569; GNUEABI-NEXT: add r1, sp, #4570; GNUEABI-NEXT: mov r2, sp571; GNUEABI-NEXT: vmov r0, s17572; GNUEABI-NEXT: bl sincosf573; GNUEABI-NEXT: vmov r0, s16574; GNUEABI-NEXT: add r1, sp, #12575; GNUEABI-NEXT: add r2, sp, #8576; GNUEABI-NEXT: bl sincosf577; GNUEABI-NEXT: vldr s1, [sp, #4]578; GNUEABI-NEXT: vldr s3, [sp]579; GNUEABI-NEXT: vldr s0, [sp, #12]580; GNUEABI-NEXT: vldr s2, [sp, #8]581; GNUEABI-NEXT: vmov r0, r1, d0582; GNUEABI-NEXT: vmov r2, r3, d1583; GNUEABI-NEXT: add sp, sp, #16584; GNUEABI-NEXT: vpop {d8}585; GNUEABI-NEXT: pop {r11, pc}586;587; IOS-NO-STRET-LABEL: test_sincos_v2f32:588; IOS-NO-STRET: @ %bb.0:589; IOS-NO-STRET-NEXT: push {r4, r5, r6, r7, lr}590; IOS-NO-STRET-NEXT: vpush {d8}591; IOS-NO-STRET-NEXT: vmov d8, r0, r1592; IOS-NO-STRET-NEXT: vmov r4, s17593; IOS-NO-STRET-NEXT: mov r0, r4594; IOS-NO-STRET-NEXT: bl _sinf595; IOS-NO-STRET-NEXT: mov r5, r0596; IOS-NO-STRET-NEXT: mov r0, r4597; IOS-NO-STRET-NEXT: bl _cosf598; IOS-NO-STRET-NEXT: vmov r6, s16599; IOS-NO-STRET-NEXT: mov r4, r0600; IOS-NO-STRET-NEXT: mov r0, r6601; IOS-NO-STRET-NEXT: bl _sinf602; IOS-NO-STRET-NEXT: mov r7, r0603; IOS-NO-STRET-NEXT: mov r0, r6604; IOS-NO-STRET-NEXT: bl _cosf605; IOS-NO-STRET-NEXT: mov r2, r0606; IOS-NO-STRET-NEXT: mov r0, r7607; IOS-NO-STRET-NEXT: mov r1, r5608; IOS-NO-STRET-NEXT: mov r3, r4609; IOS-NO-STRET-NEXT: vpop {d8}610; IOS-NO-STRET-NEXT: pop {r4, r5, r6, r7, pc}611;612; IOS-WITH-STRET-LABEL: test_sincos_v2f32:613; IOS-WITH-STRET: @ %bb.0:614; IOS-WITH-STRET-NEXT: push {lr}615; IOS-WITH-STRET-NEXT: vpush {d8}616; IOS-WITH-STRET-NEXT: sub sp, sp, #16617; IOS-WITH-STRET-NEXT: vmov d8, r0, r1618; IOS-WITH-STRET-NEXT: mov r0, sp619; IOS-WITH-STRET-NEXT: vmov r1, s17620; IOS-WITH-STRET-NEXT: bl ___sincosf_stret621; IOS-WITH-STRET-NEXT: vmov r1, s16622; IOS-WITH-STRET-NEXT: add r0, sp, #8623; IOS-WITH-STRET-NEXT: bl ___sincosf_stret624; IOS-WITH-STRET-NEXT: vldr s1, [sp]625; IOS-WITH-STRET-NEXT: vldr s3, [sp, #4]626; IOS-WITH-STRET-NEXT: vldr s0, [sp, #8]627; IOS-WITH-STRET-NEXT: vldr s2, [sp, #12]628; IOS-WITH-STRET-NEXT: vmov r0, r1, d0629; IOS-WITH-STRET-NEXT: vmov r2, r3, d1630; IOS-WITH-STRET-NEXT: add sp, sp, #16631; IOS-WITH-STRET-NEXT: vpop {d8}632; IOS-WITH-STRET-NEXT: pop {lr}633; IOS-WITH-STRET-NEXT: bx lr634;635; WATCHABI-LABEL: test_sincos_v2f32:636; WATCHABI: .cfi_startproc637; WATCHABI-NEXT: @ %bb.0:638; WATCHABI-NEXT: push {r7, lr}639; WATCHABI-NEXT: .cfi_def_cfa_offset 8640; WATCHABI-NEXT: .cfi_offset lr, -4641; WATCHABI-NEXT: .cfi_offset r7, -8642; WATCHABI-NEXT: vpush {d8, d9, d10}643; WATCHABI-NEXT: .cfi_def_cfa_offset 32644; WATCHABI-NEXT: .cfi_offset d10, -16645; WATCHABI-NEXT: .cfi_offset d9, -24646; WATCHABI-NEXT: .cfi_offset d8, -32647; WATCHABI-NEXT: vmov.f64 d8, d0648; WATCHABI-NEXT: vmov.f32 s0, s17649; WATCHABI-NEXT: bl ___sincosf_stret650; WATCHABI-NEXT: vmov.f32 s19, s0651; WATCHABI-NEXT: vmov.f32 s0, s16652; WATCHABI-NEXT: vmov.f32 s21, s1653; WATCHABI-NEXT: bl ___sincosf_stret654; WATCHABI-NEXT: vmov.f32 s20, s1655; WATCHABI-NEXT: vmov.f32 s18, s0656; WATCHABI-NEXT: vmov.f64 d1, d10657; WATCHABI-NEXT: vmov.f64 d0, d9658; WATCHABI-NEXT: vpop {d8, d9, d10}659; WATCHABI-NEXT: pop {r7, pc}660; WATCHABI-NEXT: .cfi_endproc661 %result = call { <2 x float>, <2 x float> } @llvm.sincos.v2f32(<2 x float> %a)662 ret { <2 x float>, <2 x float> } %result663}664 665define { double, double } @test_sincos_f64(double %a) {666; GNU-LABEL: test_sincos_f64:667; GNU: @ %bb.0:668; GNU-NEXT: push {r7, lr}669; GNU-NEXT: sub sp, #16670; GNU-NEXT: add r2, sp, #8671; GNU-NEXT: mov r3, sp672; GNU-NEXT: bl sincos673; GNU-NEXT: ldrd r0, r1, [sp, #8]674; GNU-NEXT: ldrd r2, r3, [sp], #16675; GNU-NEXT: pop {r7, pc}676;677; GNUEABI-LABEL: test_sincos_f64:678; GNUEABI: @ %bb.0:679; GNUEABI-NEXT: .save {r11, lr}680; GNUEABI-NEXT: push {r11, lr}681; GNUEABI-NEXT: .pad #16682; GNUEABI-NEXT: sub sp, sp, #16683; GNUEABI-NEXT: add r2, sp, #8684; GNUEABI-NEXT: mov r3, sp685; GNUEABI-NEXT: bl sincos686; GNUEABI-NEXT: ldm sp, {r2, r3}687; GNUEABI-NEXT: ldr r0, [sp, #8]688; GNUEABI-NEXT: ldr r1, [sp, #12]689; GNUEABI-NEXT: add sp, sp, #16690; GNUEABI-NEXT: pop {r11, pc}691;692; IOS-NO-STRET-LABEL: test_sincos_f64:693; IOS-NO-STRET: @ %bb.0:694; IOS-NO-STRET-NEXT: push {r4, r5, r6, r7, lr}695; IOS-NO-STRET-NEXT: mov r4, r1696; IOS-NO-STRET-NEXT: mov r5, r0697; IOS-NO-STRET-NEXT: bl _sin698; IOS-NO-STRET-NEXT: mov r6, r0699; IOS-NO-STRET-NEXT: mov r7, r1700; IOS-NO-STRET-NEXT: mov r0, r5701; IOS-NO-STRET-NEXT: mov r1, r4702; IOS-NO-STRET-NEXT: bl _cos703; IOS-NO-STRET-NEXT: mov r2, r0704; IOS-NO-STRET-NEXT: mov r3, r1705; IOS-NO-STRET-NEXT: mov r0, r6706; IOS-NO-STRET-NEXT: mov r1, r7707; IOS-NO-STRET-NEXT: pop {r4, r5, r6, r7, pc}708;709; IOS-WITH-STRET-LABEL: test_sincos_f64:710; IOS-WITH-STRET: @ %bb.0:711; IOS-WITH-STRET-NEXT: push {lr}712; IOS-WITH-STRET-NEXT: sub sp, sp, #16713; IOS-WITH-STRET-NEXT: mov r2, r1714; IOS-WITH-STRET-NEXT: mov r1, r0715; IOS-WITH-STRET-NEXT: mov r0, sp716; IOS-WITH-STRET-NEXT: bl ___sincos_stret717; IOS-WITH-STRET-NEXT: vldr d16, [sp, #8]718; IOS-WITH-STRET-NEXT: ldm sp, {r0, r1}719; IOS-WITH-STRET-NEXT: vmov r2, r3, d16720; IOS-WITH-STRET-NEXT: add sp, sp, #16721; IOS-WITH-STRET-NEXT: pop {lr}722; IOS-WITH-STRET-NEXT: bx lr723;724; WATCHABI-LABEL: test_sincos_f64:725; WATCHABI: .cfi_startproc726; WATCHABI-NEXT: @ %bb.0:727; WATCHABI-NEXT: push {r7, lr}728; WATCHABI-NEXT: .cfi_def_cfa_offset 8729; WATCHABI-NEXT: .cfi_offset lr, -4730; WATCHABI-NEXT: .cfi_offset r7, -8731; WATCHABI-NEXT: sub sp, #8732; WATCHABI-NEXT: .cfi_def_cfa_offset 16733; WATCHABI-NEXT: bl ___sincos_stret734; WATCHABI-NEXT: add sp, #8735; WATCHABI-NEXT: pop {r7, pc}736; WATCHABI-NEXT: .cfi_endproc737 %result = call { double, double } @llvm.sincos.f64(double %a)738 ret { double, double } %result739}740 741define { <2 x double>, <2 x double> } @test_sincos_v2f64(<2 x double> %a) {742; GNU-LABEL: test_sincos_v2f64:743; GNU: @ %bb.0:744; GNU-NEXT: push {r4, lr}745; GNU-NEXT: sub sp, #32746; GNU-NEXT: mov r1, r3747; GNU-NEXT: mov r12, r2748; GNU-NEXT: add r2, sp, #24749; GNU-NEXT: add r3, sp, #16750; GNU-NEXT: mov r4, r0751; GNU-NEXT: mov r0, r12752; GNU-NEXT: bl sincos753; GNU-NEXT: ldrd r0, r1, [sp, #40]754; GNU-NEXT: add r2, sp, #8755; GNU-NEXT: mov r3, sp756; GNU-NEXT: bl sincos757; GNU-NEXT: vldr d19, [sp, #8]758; GNU-NEXT: vldr d18, [sp, #24]759; GNU-NEXT: vldr d17, [sp]760; GNU-NEXT: vldr d16, [sp, #16]761; GNU-NEXT: vst1.64 {d18, d19}, [r4]!762; GNU-NEXT: vst1.64 {d16, d17}, [r4]763; GNU-NEXT: add sp, #32764; GNU-NEXT: pop {r4, pc}765;766; GNUEABI-LABEL: test_sincos_v2f64:767; GNUEABI: @ %bb.0:768; GNUEABI-NEXT: .save {r4, lr}769; GNUEABI-NEXT: push {r4, lr}770; GNUEABI-NEXT: .pad #32771; GNUEABI-NEXT: sub sp, sp, #32772; GNUEABI-NEXT: mov r1, r3773; GNUEABI-NEXT: mov r12, r2774; GNUEABI-NEXT: add r2, sp, #24775; GNUEABI-NEXT: add r3, sp, #16776; GNUEABI-NEXT: mov r4, r0777; GNUEABI-NEXT: mov r0, r12778; GNUEABI-NEXT: bl sincos779; GNUEABI-NEXT: ldr r0, [sp, #40]780; GNUEABI-NEXT: add r2, sp, #8781; GNUEABI-NEXT: ldr r1, [sp, #44]782; GNUEABI-NEXT: mov r3, sp783; GNUEABI-NEXT: bl sincos784; GNUEABI-NEXT: vldr d19, [sp, #8]785; GNUEABI-NEXT: vldr d18, [sp, #24]786; GNUEABI-NEXT: vldr d17, [sp]787; GNUEABI-NEXT: vldr d16, [sp, #16]788; GNUEABI-NEXT: vst1.64 {d18, d19}, [r4]!789; GNUEABI-NEXT: vst1.64 {d16, d17}, [r4]790; GNUEABI-NEXT: add sp, sp, #32791; GNUEABI-NEXT: pop {r4, pc}792;793; IOS-NO-STRET-LABEL: test_sincos_v2f64:794; IOS-NO-STRET: @ %bb.0:795; IOS-NO-STRET-NEXT: push {r4, r5, r6, r7, r8, r10, r11, lr}796; IOS-NO-STRET-NEXT: vpush {d8, d9, d10, d11}797; IOS-NO-STRET-NEXT: ldr r8, [sp, #64]798; IOS-NO-STRET-NEXT: mov r7, r1799; IOS-NO-STRET-NEXT: mov r4, r0800; IOS-NO-STRET-NEXT: mov r0, r3801; IOS-NO-STRET-NEXT: mov r6, r3802; IOS-NO-STRET-NEXT: mov r10, r2803; IOS-NO-STRET-NEXT: mov r1, r8804; IOS-NO-STRET-NEXT: bl _sin805; IOS-NO-STRET-NEXT: mov r11, r0806; IOS-NO-STRET-NEXT: mov r5, r1807; IOS-NO-STRET-NEXT: mov r0, r6808; IOS-NO-STRET-NEXT: mov r1, r8809; IOS-NO-STRET-NEXT: bl _cos810; IOS-NO-STRET-NEXT: vmov d9, r0, r1811; IOS-NO-STRET-NEXT: mov r0, r7812; IOS-NO-STRET-NEXT: mov r1, r10813; IOS-NO-STRET-NEXT: vmov d11, r11, r5814; IOS-NO-STRET-NEXT: bl _sin815; IOS-NO-STRET-NEXT: vmov d10, r0, r1816; IOS-NO-STRET-NEXT: mov r0, r7817; IOS-NO-STRET-NEXT: mov r1, r10818; IOS-NO-STRET-NEXT: bl _cos819; IOS-NO-STRET-NEXT: vmov d8, r0, r1820; IOS-NO-STRET-NEXT: vst1.32 {d10, d11}, [r4]!821; IOS-NO-STRET-NEXT: vst1.32 {d8, d9}, [r4]822; IOS-NO-STRET-NEXT: vpop {d8, d9, d10, d11}823; IOS-NO-STRET-NEXT: pop {r4, r5, r6, r7, r8, r10, r11, pc}824;825; IOS-WITH-STRET-LABEL: test_sincos_v2f64:826; IOS-WITH-STRET: @ %bb.0:827; IOS-WITH-STRET-NEXT: push {r4, r5, r6, lr}828; IOS-WITH-STRET-NEXT: sub sp, sp, #32829; IOS-WITH-STRET-NEXT: mov r4, r2830; IOS-WITH-STRET-NEXT: ldr r2, [sp, #48]831; IOS-WITH-STRET-NEXT: mov r6, r0832; IOS-WITH-STRET-NEXT: add r0, sp, #16833; IOS-WITH-STRET-NEXT: mov r5, r1834; IOS-WITH-STRET-NEXT: mov r1, r3835; IOS-WITH-STRET-NEXT: bl ___sincos_stret836; IOS-WITH-STRET-NEXT: mov r0, sp837; IOS-WITH-STRET-NEXT: mov r1, r5838; IOS-WITH-STRET-NEXT: mov r2, r4839; IOS-WITH-STRET-NEXT: bl ___sincos_stret840; IOS-WITH-STRET-NEXT: vldr d17, [sp, #16]841; IOS-WITH-STRET-NEXT: vldr d16, [sp]842; IOS-WITH-STRET-NEXT: vldr d19, [sp, #24]843; IOS-WITH-STRET-NEXT: vldr d18, [sp, #8]844; IOS-WITH-STRET-NEXT: vst1.32 {d16, d17}, [r6]!845; IOS-WITH-STRET-NEXT: vst1.32 {d18, d19}, [r6]846; IOS-WITH-STRET-NEXT: add sp, sp, #32847; IOS-WITH-STRET-NEXT: pop {r4, r5, r6, pc}848;849; WATCHABI-LABEL: test_sincos_v2f64:850; WATCHABI: .cfi_startproc851; WATCHABI-NEXT: @ %bb.0:852; WATCHABI-NEXT: push {r7, lr}853; WATCHABI-NEXT: .cfi_def_cfa_offset 8854; WATCHABI-NEXT: .cfi_offset lr, -4855; WATCHABI-NEXT: .cfi_offset r7, -8856; WATCHABI-NEXT: vpush {d8, d9, d10, d11, d12, d13}857; WATCHABI-NEXT: .cfi_def_cfa_offset 56858; WATCHABI-NEXT: .cfi_offset d13, -16859; WATCHABI-NEXT: .cfi_offset d12, -24860; WATCHABI-NEXT: .cfi_offset d11, -32861; WATCHABI-NEXT: .cfi_offset d10, -40862; WATCHABI-NEXT: .cfi_offset d9, -48863; WATCHABI-NEXT: .cfi_offset d8, -56864; WATCHABI-NEXT: sub sp, #8865; WATCHABI-NEXT: .cfi_def_cfa_offset 64866; WATCHABI-NEXT: vorr q4, q0, q0867; WATCHABI-NEXT: vorr d0, d9, d9868; WATCHABI-NEXT: bl ___sincos_stret869; WATCHABI-NEXT: vorr d11, d0, d0870; WATCHABI-NEXT: vorr d0, d8, d8871; WATCHABI-NEXT: vorr d13, d1, d1872; WATCHABI-NEXT: bl ___sincos_stret873; WATCHABI-NEXT: vorr d12, d1, d1874; WATCHABI-NEXT: vorr d10, d0, d0875; WATCHABI-NEXT: vorr q1, q6, q6876; WATCHABI-NEXT: vorr q0, q5, q5877; WATCHABI-NEXT: add sp, #8878; WATCHABI-NEXT: vpop {d8, d9, d10, d11, d12, d13}879; WATCHABI-NEXT: pop {r7, pc}880; WATCHABI-NEXT: .cfi_endproc881 %result = call { <2 x double>, <2 x double> } @llvm.sincos.v2f64(<2 x double> %a)882 ret { <2 x double>, <2 x double> } %result883}884 885define { fp128, fp128 } @test_sincos_f128(fp128 %a) {886; GNU-LABEL: test_sincos_f128:887; GNU: @ %bb.0:888; GNU-NEXT: push {r4, r5, r7, lr}889; GNU-NEXT: sub sp, #40890; GNU-NEXT: mov r12, r3891; GNU-NEXT: ldr r3, [sp, #56]892; GNU-NEXT: add.w lr, sp, #8893; GNU-NEXT: mov r4, r0894; GNU-NEXT: add r0, sp, #24895; GNU-NEXT: strd r0, lr, [sp]896; GNU-NEXT: mov r0, r1897; GNU-NEXT: mov r1, r2898; GNU-NEXT: mov r2, r12899; GNU-NEXT: bl sincosl900; GNU-NEXT: ldrd r2, r3, [sp, #16]901; GNU-NEXT: ldrd r12, r1, [sp, #8]902; GNU-NEXT: str r3, [r4, #28]903; GNU-NEXT: ldrd r3, r5, [sp, #32]904; GNU-NEXT: ldrd lr, r0, [sp, #24]905; GNU-NEXT: strd r1, r2, [r4, #20]906; GNU-NEXT: add.w r1, r4, #8907; GNU-NEXT: stm.w r1, {r3, r5, r12}908; GNU-NEXT: strd lr, r0, [r4]909; GNU-NEXT: add sp, #40910; GNU-NEXT: pop {r4, r5, r7, pc}911;912; GNUEABI-LABEL: test_sincos_f128:913; GNUEABI: @ %bb.0:914; GNUEABI-NEXT: .save {r4, r5, r11, lr}915; GNUEABI-NEXT: push {r4, r5, r11, lr}916; GNUEABI-NEXT: .pad #40917; GNUEABI-NEXT: sub sp, sp, #40918; GNUEABI-NEXT: mov r12, r3919; GNUEABI-NEXT: ldr r3, [sp, #56]920; GNUEABI-NEXT: mov r4, r0921; GNUEABI-NEXT: add r0, sp, #24922; GNUEABI-NEXT: add r5, sp, #8923; GNUEABI-NEXT: stm sp, {r0, r5}924; GNUEABI-NEXT: mov r0, r1925; GNUEABI-NEXT: mov r1, r2926; GNUEABI-NEXT: mov r2, r12927; GNUEABI-NEXT: bl sincosl928; GNUEABI-NEXT: add r3, sp, #12929; GNUEABI-NEXT: ldr r12, [sp, #8]930; GNUEABI-NEXT: ldm r3, {r1, r2, r3}931; GNUEABI-NEXT: str r3, [r4, #28]932; GNUEABI-NEXT: ldr r0, [sp, #32]933; GNUEABI-NEXT: ldr lr, [sp, #24]934; GNUEABI-NEXT: ldr r5, [sp, #28]935; GNUEABI-NEXT: ldr r3, [sp, #36]936; GNUEABI-NEXT: str r2, [r4, #24]937; GNUEABI-NEXT: str r1, [r4, #20]938; GNUEABI-NEXT: add r1, r4, #8939; GNUEABI-NEXT: stm r1, {r0, r3, r12}940; GNUEABI-NEXT: str r5, [r4, #4]941; GNUEABI-NEXT: str lr, [r4]942; GNUEABI-NEXT: add sp, sp, #40943; GNUEABI-NEXT: pop {r4, r5, r11, pc}944;945; IOS-LABEL: test_sincos_f128:946; IOS: @ %bb.0:947; IOS-NEXT: push {r4, r5, r6, r7, r8, lr}948; IOS-NEXT: ldr r8, [sp, #24]949; IOS-NEXT: mov r4, r0950; IOS-NEXT: mov r5, r3951; IOS-NEXT: mov r6, r2952; IOS-NEXT: mov r7, r1953; IOS-NEXT: mov r0, r1954; IOS-NEXT: mov r1, r2955; IOS-NEXT: mov r2, r3956; IOS-NEXT: mov r3, r8957; IOS-NEXT: bl _cosl958; IOS-NEXT: add r9, r4, #16959; IOS-NEXT: stm r9, {r0, r1, r2, r3}960; IOS-NEXT: mov r0, r7961; IOS-NEXT: mov r1, r6962; IOS-NEXT: mov r2, r5963; IOS-NEXT: mov r3, r8964; IOS-NEXT: bl _sinl965; IOS-NEXT: stm r4, {r0, r1, r2, r3}966; IOS-NEXT: pop {r4, r5, r6, r7, r8, pc}967;968; WATCHABI-LABEL: test_sincos_f128:969; WATCHABI: .cfi_startproc970; WATCHABI-NEXT: @ %bb.0:971; WATCHABI-NEXT: push.w {r4, r5, r6, r7, r8, lr}972; WATCHABI-NEXT: .cfi_def_cfa_offset 24973; WATCHABI-NEXT: .cfi_offset lr, -4974; WATCHABI-NEXT: .cfi_offset r7, -8975; WATCHABI-NEXT: .cfi_offset r6, -12976; WATCHABI-NEXT: .cfi_offset r5, -16977; WATCHABI-NEXT: .cfi_offset r4, -20978; WATCHABI-NEXT: .cfi_offset r8, -24979; WATCHABI-NEXT: sub sp, #8980; WATCHABI-NEXT: .cfi_def_cfa_offset 32981; WATCHABI-NEXT: ldr.w r8, [sp, #32]982; WATCHABI-NEXT: mov r4, r0983; WATCHABI-NEXT: mov r5, r3984; WATCHABI-NEXT: mov r6, r2985; WATCHABI-NEXT: mov r7, r1986; WATCHABI-NEXT: mov r0, r1987; WATCHABI-NEXT: mov r1, r2988; WATCHABI-NEXT: mov r2, r3989; WATCHABI-NEXT: mov r3, r8990; WATCHABI-NEXT: bl _cosl991; WATCHABI-NEXT: add.w r9, r4, #16992; WATCHABI-NEXT: stm.w r9, {r0, r1, r2, r3}993; WATCHABI-NEXT: mov r0, r7994; WATCHABI-NEXT: mov r1, r6995; WATCHABI-NEXT: mov r2, r5996; WATCHABI-NEXT: mov r3, r8997; WATCHABI-NEXT: bl _sinl998; WATCHABI-NEXT: stm r4!, {r0, r1, r2, r3}999; WATCHABI-NEXT: add sp, #81000; WATCHABI-NEXT: pop.w {r4, r5, r6, r7, r8, pc}1001; WATCHABI-NEXT: .cfi_endproc1002 %result = call { fp128, fp128 } @llvm.sincos.f16(fp128 %a)1003 ret { fp128, fp128 } %result1004}1005