691 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc -mtriple=aarch64-gnu-linux < %s | FileCheck -check-prefixes=CHECK %s3; RUN: llc -mtriple=aarch64-none-linux < %s | FileCheck -check-prefixes=NO-LIBCALL %s4 5define { half, half } @test_sincos_f16(half %a) nounwind {6; CHECK-LABEL: test_sincos_f16:7; CHECK: // %bb.0:8; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill9; CHECK-NEXT: fcvt s0, h010; CHECK-NEXT: add x0, sp, #1211; CHECK-NEXT: add x1, sp, #812; CHECK-NEXT: bl sincosf13; CHECK-NEXT: ldp s1, s0, [sp, #8]14; CHECK-NEXT: fcvt h0, s015; CHECK-NEXT: fcvt h1, s116; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload17; CHECK-NEXT: ret18;19; NO-LIBCALL-LABEL: test_sincos_f16:20; NO-LIBCALL: // %bb.0:21; NO-LIBCALL-NEXT: stp d9, d8, [sp, #-32]! // 16-byte Folded Spill22; NO-LIBCALL-NEXT: fcvt s8, h023; NO-LIBCALL-NEXT: str x30, [sp, #16] // 8-byte Spill24; NO-LIBCALL-NEXT: fmov s0, s825; NO-LIBCALL-NEXT: bl sinf26; NO-LIBCALL-NEXT: fcvt h9, s027; NO-LIBCALL-NEXT: fmov s0, s828; NO-LIBCALL-NEXT: bl cosf29; NO-LIBCALL-NEXT: fmov s1, s030; NO-LIBCALL-NEXT: ldr x30, [sp, #16] // 8-byte Reload31; NO-LIBCALL-NEXT: fmov s0, s932; NO-LIBCALL-NEXT: fcvt h1, s133; NO-LIBCALL-NEXT: ldp d9, d8, [sp], #32 // 16-byte Folded Reload34; NO-LIBCALL-NEXT: ret35 %result = call { half, half } @llvm.sincos.f16(half %a)36 ret { half, half } %result37}38 39define half @test_sincos_f16_only_use_sin(half %a) nounwind {40; CHECK-LABEL: test_sincos_f16_only_use_sin:41; CHECK: // %bb.0:42; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill43; CHECK-NEXT: fcvt s0, h044; CHECK-NEXT: add x0, sp, #1245; CHECK-NEXT: add x1, sp, #846; CHECK-NEXT: bl sincosf47; CHECK-NEXT: ldr s0, [sp, #12]48; CHECK-NEXT: fcvt h0, s049; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload50; CHECK-NEXT: ret51;52; NO-LIBCALL-LABEL: test_sincos_f16_only_use_sin:53; NO-LIBCALL: // %bb.0:54; NO-LIBCALL-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill55; NO-LIBCALL-NEXT: fcvt s0, h056; NO-LIBCALL-NEXT: bl sinf57; NO-LIBCALL-NEXT: fcvt h0, s058; NO-LIBCALL-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload59; NO-LIBCALL-NEXT: ret60 %result = call { half, half } @llvm.sincos.f16(half %a)61 %result.0 = extractvalue { half, half } %result, 062 ret half %result.063}64 65define half @test_sincos_f16_only_use_cos(half %a) nounwind {66; CHECK-LABEL: test_sincos_f16_only_use_cos:67; CHECK: // %bb.0:68; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill69; CHECK-NEXT: fcvt s0, h070; CHECK-NEXT: add x0, sp, #1271; CHECK-NEXT: add x1, sp, #872; CHECK-NEXT: bl sincosf73; CHECK-NEXT: ldr s0, [sp, #8]74; CHECK-NEXT: fcvt h0, s075; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload76; CHECK-NEXT: ret77;78; NO-LIBCALL-LABEL: test_sincos_f16_only_use_cos:79; NO-LIBCALL: // %bb.0:80; NO-LIBCALL-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill81; NO-LIBCALL-NEXT: fcvt s0, h082; NO-LIBCALL-NEXT: bl cosf83; NO-LIBCALL-NEXT: fcvt h0, s084; NO-LIBCALL-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload85; NO-LIBCALL-NEXT: ret86 %result = call { half, half } @llvm.sincos.f16(half %a)87 %result.1 = extractvalue { half, half } %result, 188 ret half %result.189}90 91define { <2 x half>, <2 x half> } @test_sincos_v2f16(<2 x half> %a) nounwind {92; CHECK-LABEL: test_sincos_v2f16:93; CHECK: // %bb.0:94; CHECK-NEXT: sub sp, sp, #6495; CHECK-NEXT: // kill: def $d0 killed $d0 def $q096; CHECK-NEXT: mov h1, v0.h[1]97; CHECK-NEXT: str q0, [sp] // 16-byte Spill98; CHECK-NEXT: add x0, sp, #3699; CHECK-NEXT: add x1, sp, #32100; CHECK-NEXT: str x30, [sp, #48] // 8-byte Spill101; CHECK-NEXT: fcvt s0, h1102; CHECK-NEXT: bl sincosf103; CHECK-NEXT: ldr q0, [sp] // 16-byte Reload104; CHECK-NEXT: add x0, sp, #28105; CHECK-NEXT: add x1, sp, #24106; CHECK-NEXT: fcvt s0, h0107; CHECK-NEXT: bl sincosf108; CHECK-NEXT: ldr q0, [sp] // 16-byte Reload109; CHECK-NEXT: add x0, sp, #44110; CHECK-NEXT: add x1, sp, #40111; CHECK-NEXT: mov h0, v0.h[2]112; CHECK-NEXT: fcvt s0, h0113; CHECK-NEXT: bl sincosf114; CHECK-NEXT: ldr q0, [sp] // 16-byte Reload115; CHECK-NEXT: add x0, sp, #60116; CHECK-NEXT: add x1, sp, #56117; CHECK-NEXT: mov h0, v0.h[3]118; CHECK-NEXT: fcvt s0, h0119; CHECK-NEXT: bl sincosf120; CHECK-NEXT: ldp s2, s0, [sp, #32]121; CHECK-NEXT: ldr x30, [sp, #48] // 8-byte Reload122; CHECK-NEXT: ldp s3, s1, [sp, #24]123; CHECK-NEXT: fcvt h4, s0124; CHECK-NEXT: fcvt h2, s2125; CHECK-NEXT: fcvt h0, s1126; CHECK-NEXT: fcvt h1, s3127; CHECK-NEXT: ldp s5, s3, [sp, #40]128; CHECK-NEXT: fcvt h3, s3129; CHECK-NEXT: mov v0.h[1], v4.h[0]130; CHECK-NEXT: fcvt h4, s5131; CHECK-NEXT: mov v1.h[1], v2.h[0]132; CHECK-NEXT: ldp s5, s2, [sp, #56]133; CHECK-NEXT: mov v0.h[2], v3.h[0]134; CHECK-NEXT: fcvt h2, s2135; CHECK-NEXT: fcvt h3, s5136; CHECK-NEXT: mov v1.h[2], v4.h[0]137; CHECK-NEXT: mov v0.h[3], v2.h[0]138; CHECK-NEXT: mov v1.h[3], v3.h[0]139; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0140; CHECK-NEXT: // kill: def $d1 killed $d1 killed $q1141; CHECK-NEXT: add sp, sp, #64142; CHECK-NEXT: ret143;144; NO-LIBCALL-LABEL: test_sincos_v2f16:145; NO-LIBCALL: // %bb.0:146; NO-LIBCALL-NEXT: sub sp, sp, #80147; NO-LIBCALL-NEXT: // kill: def $d0 killed $d0 def $q0148; NO-LIBCALL-NEXT: mov h1, v0.h[1]149; NO-LIBCALL-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill150; NO-LIBCALL-NEXT: str q0, [sp] // 16-byte Spill151; NO-LIBCALL-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill152; NO-LIBCALL-NEXT: str x30, [sp, #64] // 8-byte Spill153; NO-LIBCALL-NEXT: fcvt s8, h1154; NO-LIBCALL-NEXT: fmov s0, s8155; NO-LIBCALL-NEXT: bl sinf156; NO-LIBCALL-NEXT: ldr q1, [sp] // 16-byte Reload157; NO-LIBCALL-NEXT: fcvt h0, s0158; NO-LIBCALL-NEXT: fcvt s9, h1159; NO-LIBCALL-NEXT: str q0, [sp, #16] // 16-byte Spill160; NO-LIBCALL-NEXT: fmov s0, s9161; NO-LIBCALL-NEXT: bl sinf162; NO-LIBCALL-NEXT: ldr q1, [sp] // 16-byte Reload163; NO-LIBCALL-NEXT: fcvt h0, s0164; NO-LIBCALL-NEXT: mov h1, v1.h[2]165; NO-LIBCALL-NEXT: fcvt s10, h1166; NO-LIBCALL-NEXT: ldr q1, [sp, #16] // 16-byte Reload167; NO-LIBCALL-NEXT: mov v0.h[1], v1.h[0]168; NO-LIBCALL-NEXT: str q0, [sp, #16] // 16-byte Spill169; NO-LIBCALL-NEXT: fmov s0, s10170; NO-LIBCALL-NEXT: bl sinf171; NO-LIBCALL-NEXT: ldr q1, [sp] // 16-byte Reload172; NO-LIBCALL-NEXT: fcvt h0, s0173; NO-LIBCALL-NEXT: mov h1, v1.h[3]174; NO-LIBCALL-NEXT: fcvt s11, h1175; NO-LIBCALL-NEXT: ldr q1, [sp, #16] // 16-byte Reload176; NO-LIBCALL-NEXT: mov v1.h[2], v0.h[0]177; NO-LIBCALL-NEXT: fmov s0, s11178; NO-LIBCALL-NEXT: str q1, [sp, #16] // 16-byte Spill179; NO-LIBCALL-NEXT: bl sinf180; NO-LIBCALL-NEXT: fcvt h0, s0181; NO-LIBCALL-NEXT: ldr q1, [sp, #16] // 16-byte Reload182; NO-LIBCALL-NEXT: mov v1.h[3], v0.h[0]183; NO-LIBCALL-NEXT: fmov s0, s8184; NO-LIBCALL-NEXT: str q1, [sp, #16] // 16-byte Spill185; NO-LIBCALL-NEXT: bl cosf186; NO-LIBCALL-NEXT: fcvt h0, s0187; NO-LIBCALL-NEXT: str q0, [sp] // 16-byte Spill188; NO-LIBCALL-NEXT: fmov s0, s9189; NO-LIBCALL-NEXT: bl cosf190; NO-LIBCALL-NEXT: fcvt h0, s0191; NO-LIBCALL-NEXT: ldr q1, [sp] // 16-byte Reload192; NO-LIBCALL-NEXT: mov v0.h[1], v1.h[0]193; NO-LIBCALL-NEXT: str q0, [sp] // 16-byte Spill194; NO-LIBCALL-NEXT: fmov s0, s10195; NO-LIBCALL-NEXT: bl cosf196; NO-LIBCALL-NEXT: fcvt h0, s0197; NO-LIBCALL-NEXT: ldr q1, [sp] // 16-byte Reload198; NO-LIBCALL-NEXT: mov v1.h[2], v0.h[0]199; NO-LIBCALL-NEXT: fmov s0, s11200; NO-LIBCALL-NEXT: str q1, [sp] // 16-byte Spill201; NO-LIBCALL-NEXT: bl cosf202; NO-LIBCALL-NEXT: fmov s1, s0203; NO-LIBCALL-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload204; NO-LIBCALL-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload205; NO-LIBCALL-NEXT: ldr q0, [sp, #16] // 16-byte Reload206; NO-LIBCALL-NEXT: ldr x30, [sp, #64] // 8-byte Reload207; NO-LIBCALL-NEXT: // kill: def $d0 killed $d0 killed $q0208; NO-LIBCALL-NEXT: fcvt h2, s1209; NO-LIBCALL-NEXT: ldr q1, [sp] // 16-byte Reload210; NO-LIBCALL-NEXT: mov v1.h[3], v2.h[0]211; NO-LIBCALL-NEXT: // kill: def $d1 killed $d1 killed $q1212; NO-LIBCALL-NEXT: add sp, sp, #80213; NO-LIBCALL-NEXT: ret214 %result = call { <2 x half>, <2 x half> } @llvm.sincos.v2f16(<2 x half> %a)215 ret { <2 x half>, <2 x half> } %result216}217 218define { <3 x half>, <3 x half> } @test_sincos_v3f16(<3 x half> %a) nounwind {219; CHECK-LABEL: test_sincos_v3f16:220; CHECK: // %bb.0:221; CHECK-NEXT: sub sp, sp, #64222; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0223; CHECK-NEXT: mov h1, v0.h[1]224; CHECK-NEXT: str q0, [sp] // 16-byte Spill225; CHECK-NEXT: add x0, sp, #36226; CHECK-NEXT: add x1, sp, #32227; CHECK-NEXT: str x30, [sp, #48] // 8-byte Spill228; CHECK-NEXT: fcvt s0, h1229; CHECK-NEXT: bl sincosf230; CHECK-NEXT: ldr q0, [sp] // 16-byte Reload231; CHECK-NEXT: add x0, sp, #28232; CHECK-NEXT: add x1, sp, #24233; CHECK-NEXT: fcvt s0, h0234; CHECK-NEXT: bl sincosf235; CHECK-NEXT: ldr q0, [sp] // 16-byte Reload236; CHECK-NEXT: add x0, sp, #44237; CHECK-NEXT: add x1, sp, #40238; CHECK-NEXT: mov h0, v0.h[2]239; CHECK-NEXT: fcvt s0, h0240; CHECK-NEXT: bl sincosf241; CHECK-NEXT: ldr q0, [sp] // 16-byte Reload242; CHECK-NEXT: add x0, sp, #60243; CHECK-NEXT: add x1, sp, #56244; CHECK-NEXT: mov h0, v0.h[3]245; CHECK-NEXT: fcvt s0, h0246; CHECK-NEXT: bl sincosf247; CHECK-NEXT: ldp s2, s0, [sp, #32]248; CHECK-NEXT: ldr x30, [sp, #48] // 8-byte Reload249; CHECK-NEXT: ldp s3, s1, [sp, #24]250; CHECK-NEXT: fcvt h4, s0251; CHECK-NEXT: fcvt h2, s2252; CHECK-NEXT: fcvt h0, s1253; CHECK-NEXT: fcvt h1, s3254; CHECK-NEXT: ldp s5, s3, [sp, #40]255; CHECK-NEXT: fcvt h3, s3256; CHECK-NEXT: mov v0.h[1], v4.h[0]257; CHECK-NEXT: fcvt h4, s5258; CHECK-NEXT: mov v1.h[1], v2.h[0]259; CHECK-NEXT: ldp s5, s2, [sp, #56]260; CHECK-NEXT: mov v0.h[2], v3.h[0]261; CHECK-NEXT: fcvt h2, s2262; CHECK-NEXT: fcvt h3, s5263; CHECK-NEXT: mov v1.h[2], v4.h[0]264; CHECK-NEXT: mov v0.h[3], v2.h[0]265; CHECK-NEXT: mov v1.h[3], v3.h[0]266; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0267; CHECK-NEXT: // kill: def $d1 killed $d1 killed $q1268; CHECK-NEXT: add sp, sp, #64269; CHECK-NEXT: ret270;271; NO-LIBCALL-LABEL: test_sincos_v3f16:272; NO-LIBCALL: // %bb.0:273; NO-LIBCALL-NEXT: sub sp, sp, #80274; NO-LIBCALL-NEXT: // kill: def $d0 killed $d0 def $q0275; NO-LIBCALL-NEXT: mov h1, v0.h[1]276; NO-LIBCALL-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill277; NO-LIBCALL-NEXT: str q0, [sp] // 16-byte Spill278; NO-LIBCALL-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill279; NO-LIBCALL-NEXT: str x30, [sp, #64] // 8-byte Spill280; NO-LIBCALL-NEXT: fcvt s8, h1281; NO-LIBCALL-NEXT: fmov s0, s8282; NO-LIBCALL-NEXT: bl sinf283; NO-LIBCALL-NEXT: ldr q1, [sp] // 16-byte Reload284; NO-LIBCALL-NEXT: fcvt h0, s0285; NO-LIBCALL-NEXT: fcvt s9, h1286; NO-LIBCALL-NEXT: str q0, [sp, #16] // 16-byte Spill287; NO-LIBCALL-NEXT: fmov s0, s9288; NO-LIBCALL-NEXT: bl sinf289; NO-LIBCALL-NEXT: ldr q1, [sp] // 16-byte Reload290; NO-LIBCALL-NEXT: fcvt h0, s0291; NO-LIBCALL-NEXT: mov h1, v1.h[2]292; NO-LIBCALL-NEXT: fcvt s10, h1293; NO-LIBCALL-NEXT: ldr q1, [sp, #16] // 16-byte Reload294; NO-LIBCALL-NEXT: mov v0.h[1], v1.h[0]295; NO-LIBCALL-NEXT: str q0, [sp, #16] // 16-byte Spill296; NO-LIBCALL-NEXT: fmov s0, s10297; NO-LIBCALL-NEXT: bl sinf298; NO-LIBCALL-NEXT: ldr q1, [sp] // 16-byte Reload299; NO-LIBCALL-NEXT: fcvt h0, s0300; NO-LIBCALL-NEXT: mov h1, v1.h[3]301; NO-LIBCALL-NEXT: fcvt s11, h1302; NO-LIBCALL-NEXT: ldr q1, [sp, #16] // 16-byte Reload303; NO-LIBCALL-NEXT: mov v1.h[2], v0.h[0]304; NO-LIBCALL-NEXT: fmov s0, s11305; NO-LIBCALL-NEXT: str q1, [sp, #16] // 16-byte Spill306; NO-LIBCALL-NEXT: bl sinf307; NO-LIBCALL-NEXT: fcvt h0, s0308; NO-LIBCALL-NEXT: ldr q1, [sp, #16] // 16-byte Reload309; NO-LIBCALL-NEXT: mov v1.h[3], v0.h[0]310; NO-LIBCALL-NEXT: fmov s0, s8311; NO-LIBCALL-NEXT: str q1, [sp, #16] // 16-byte Spill312; NO-LIBCALL-NEXT: bl cosf313; NO-LIBCALL-NEXT: fcvt h0, s0314; NO-LIBCALL-NEXT: str q0, [sp] // 16-byte Spill315; NO-LIBCALL-NEXT: fmov s0, s9316; NO-LIBCALL-NEXT: bl cosf317; NO-LIBCALL-NEXT: fcvt h0, s0318; NO-LIBCALL-NEXT: ldr q1, [sp] // 16-byte Reload319; NO-LIBCALL-NEXT: mov v0.h[1], v1.h[0]320; NO-LIBCALL-NEXT: str q0, [sp] // 16-byte Spill321; NO-LIBCALL-NEXT: fmov s0, s10322; NO-LIBCALL-NEXT: bl cosf323; NO-LIBCALL-NEXT: fcvt h0, s0324; NO-LIBCALL-NEXT: ldr q1, [sp] // 16-byte Reload325; NO-LIBCALL-NEXT: mov v1.h[2], v0.h[0]326; NO-LIBCALL-NEXT: fmov s0, s11327; NO-LIBCALL-NEXT: str q1, [sp] // 16-byte Spill328; NO-LIBCALL-NEXT: bl cosf329; NO-LIBCALL-NEXT: fmov s1, s0330; NO-LIBCALL-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload331; NO-LIBCALL-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload332; NO-LIBCALL-NEXT: ldr q0, [sp, #16] // 16-byte Reload333; NO-LIBCALL-NEXT: ldr x30, [sp, #64] // 8-byte Reload334; NO-LIBCALL-NEXT: // kill: def $d0 killed $d0 killed $q0335; NO-LIBCALL-NEXT: fcvt h2, s1336; NO-LIBCALL-NEXT: ldr q1, [sp] // 16-byte Reload337; NO-LIBCALL-NEXT: mov v1.h[3], v2.h[0]338; NO-LIBCALL-NEXT: // kill: def $d1 killed $d1 killed $q1339; NO-LIBCALL-NEXT: add sp, sp, #80340; NO-LIBCALL-NEXT: ret341 %result = call { <3 x half>, <3 x half> } @llvm.sincos.v3f16(<3 x half> %a)342 ret { <3 x half>, <3 x half> } %result343}344 345define { float, float } @test_sincos_f32(float %a) nounwind {346; CHECK-LABEL: test_sincos_f32:347; CHECK: // %bb.0:348; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill349; CHECK-NEXT: add x0, sp, #12350; CHECK-NEXT: add x1, sp, #8351; CHECK-NEXT: bl sincosf352; CHECK-NEXT: ldp s1, s0, [sp, #8]353; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload354; CHECK-NEXT: ret355;356; NO-LIBCALL-LABEL: test_sincos_f32:357; NO-LIBCALL: // %bb.0:358; NO-LIBCALL-NEXT: stp d9, d8, [sp, #-32]! // 16-byte Folded Spill359; NO-LIBCALL-NEXT: str x30, [sp, #16] // 8-byte Spill360; NO-LIBCALL-NEXT: fmov s8, s0361; NO-LIBCALL-NEXT: bl sinf362; NO-LIBCALL-NEXT: fmov s9, s0363; NO-LIBCALL-NEXT: fmov s0, s8364; NO-LIBCALL-NEXT: bl cosf365; NO-LIBCALL-NEXT: ldr x30, [sp, #16] // 8-byte Reload366; NO-LIBCALL-NEXT: fmov s1, s0367; NO-LIBCALL-NEXT: fmov s0, s9368; NO-LIBCALL-NEXT: ldp d9, d8, [sp], #32 // 16-byte Folded Reload369; NO-LIBCALL-NEXT: ret370 %result = call { float, float } @llvm.sincos.f32(float %a)371 ret { float, float } %result372}373 374define { <3 x float>, <3 x float> } @test_sincos_v3f32(<3 x float> %a) nounwind {375; CHECK-LABEL: test_sincos_v3f32:376; CHECK: // %bb.0:377; CHECK-NEXT: sub sp, sp, #80378; CHECK-NEXT: add x0, sp, #20379; CHECK-NEXT: add x1, sp, #16380; CHECK-NEXT: str x30, [sp, #32] // 8-byte Spill381; CHECK-NEXT: stp x22, x21, [sp, #48] // 16-byte Folded Spill382; CHECK-NEXT: stp x20, x19, [sp, #64] // 16-byte Folded Spill383; CHECK-NEXT: str q0, [sp] // 16-byte Spill384; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0385; CHECK-NEXT: bl sincosf386; CHECK-NEXT: ldr q0, [sp] // 16-byte Reload387; CHECK-NEXT: add x0, sp, #28388; CHECK-NEXT: add x1, sp, #24389; CHECK-NEXT: add x19, sp, #28390; CHECK-NEXT: add x20, sp, #24391; CHECK-NEXT: mov s0, v0.s[1]392; CHECK-NEXT: bl sincosf393; CHECK-NEXT: ldr q0, [sp] // 16-byte Reload394; CHECK-NEXT: add x0, sp, #44395; CHECK-NEXT: add x1, sp, #40396; CHECK-NEXT: add x21, sp, #44397; CHECK-NEXT: add x22, sp, #40398; CHECK-NEXT: mov s0, v0.s[2]399; CHECK-NEXT: bl sincosf400; CHECK-NEXT: ldp s1, s0, [sp, #16]401; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Reload402; CHECK-NEXT: ld1 { v0.s }[1], [x19]403; CHECK-NEXT: ld1 { v1.s }[1], [x20]404; CHECK-NEXT: ldp x20, x19, [sp, #64] // 16-byte Folded Reload405; CHECK-NEXT: ld1 { v0.s }[2], [x21]406; CHECK-NEXT: ld1 { v1.s }[2], [x22]407; CHECK-NEXT: ldp x22, x21, [sp, #48] // 16-byte Folded Reload408; CHECK-NEXT: add sp, sp, #80409; CHECK-NEXT: ret410;411; NO-LIBCALL-LABEL: test_sincos_v3f32:412; NO-LIBCALL: // %bb.0:413; NO-LIBCALL-NEXT: sub sp, sp, #80414; NO-LIBCALL-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill415; NO-LIBCALL-NEXT: mov s8, v0.s[1]416; NO-LIBCALL-NEXT: str q0, [sp, #32] // 16-byte Spill417; NO-LIBCALL-NEXT: str x30, [sp, #64] // 8-byte Spill418; NO-LIBCALL-NEXT: fmov s0, s8419; NO-LIBCALL-NEXT: bl sinf420; NO-LIBCALL-NEXT: // kill: def $s0 killed $s0 def $q0421; NO-LIBCALL-NEXT: str q0, [sp, #16] // 16-byte Spill422; NO-LIBCALL-NEXT: ldr q0, [sp, #32] // 16-byte Reload423; NO-LIBCALL-NEXT: // kill: def $s0 killed $s0 killed $q0424; NO-LIBCALL-NEXT: bl sinf425; NO-LIBCALL-NEXT: ldr q1, [sp, #16] // 16-byte Reload426; NO-LIBCALL-NEXT: // kill: def $s0 killed $s0 def $q0427; NO-LIBCALL-NEXT: mov v0.s[1], v1.s[0]428; NO-LIBCALL-NEXT: str q0, [sp, #16] // 16-byte Spill429; NO-LIBCALL-NEXT: ldr q0, [sp, #32] // 16-byte Reload430; NO-LIBCALL-NEXT: mov s9, v0.s[2]431; NO-LIBCALL-NEXT: fmov s0, s9432; NO-LIBCALL-NEXT: bl sinf433; NO-LIBCALL-NEXT: ldr q1, [sp, #16] // 16-byte Reload434; NO-LIBCALL-NEXT: // kill: def $s0 killed $s0 def $q0435; NO-LIBCALL-NEXT: mov v1.s[2], v0.s[0]436; NO-LIBCALL-NEXT: fmov s0, s8437; NO-LIBCALL-NEXT: str q1, [sp, #16] // 16-byte Spill438; NO-LIBCALL-NEXT: bl cosf439; NO-LIBCALL-NEXT: // kill: def $s0 killed $s0 def $q0440; NO-LIBCALL-NEXT: str q0, [sp] // 16-byte Spill441; NO-LIBCALL-NEXT: ldr q0, [sp, #32] // 16-byte Reload442; NO-LIBCALL-NEXT: // kill: def $s0 killed $s0 killed $q0443; NO-LIBCALL-NEXT: bl cosf444; NO-LIBCALL-NEXT: ldr q1, [sp] // 16-byte Reload445; NO-LIBCALL-NEXT: // kill: def $s0 killed $s0 def $q0446; NO-LIBCALL-NEXT: mov v0.s[1], v1.s[0]447; NO-LIBCALL-NEXT: str q0, [sp, #32] // 16-byte Spill448; NO-LIBCALL-NEXT: fmov s0, s9449; NO-LIBCALL-NEXT: bl cosf450; NO-LIBCALL-NEXT: fmov s2, s0451; NO-LIBCALL-NEXT: ldp q0, q1, [sp, #16] // 32-byte Folded Reload452; NO-LIBCALL-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload453; NO-LIBCALL-NEXT: ldr x30, [sp, #64] // 8-byte Reload454; NO-LIBCALL-NEXT: mov v1.s[2], v2.s[0]455; NO-LIBCALL-NEXT: add sp, sp, #80456; NO-LIBCALL-NEXT: ret457 %result = call { <3 x float>, <3 x float> } @llvm.sincos.v3f32(<3 x float> %a)458 ret { <3 x float>, <3 x float> } %result459}460 461define { <2 x float>, <2 x float> } @test_sincos_v2f32(<2 x float> %a) nounwind {462; CHECK-LABEL: test_sincos_v2f32:463; CHECK: // %bb.0:464; CHECK-NEXT: sub sp, sp, #64465; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0466; CHECK-NEXT: add x0, sp, #44467; CHECK-NEXT: add x1, sp, #40468; CHECK-NEXT: str x30, [sp, #32] // 8-byte Spill469; CHECK-NEXT: stp x20, x19, [sp, #48] // 16-byte Folded Spill470; CHECK-NEXT: str q0, [sp] // 16-byte Spill471; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0472; CHECK-NEXT: bl sincosf473; CHECK-NEXT: ldr q0, [sp] // 16-byte Reload474; CHECK-NEXT: add x0, sp, #28475; CHECK-NEXT: add x1, sp, #24476; CHECK-NEXT: add x19, sp, #28477; CHECK-NEXT: add x20, sp, #24478; CHECK-NEXT: mov s0, v0.s[1]479; CHECK-NEXT: bl sincosf480; CHECK-NEXT: ldp s1, s0, [sp, #40]481; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Reload482; CHECK-NEXT: ld1 { v0.s }[1], [x19]483; CHECK-NEXT: ld1 { v1.s }[1], [x20]484; CHECK-NEXT: ldp x20, x19, [sp, #48] // 16-byte Folded Reload485; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0486; CHECK-NEXT: // kill: def $d1 killed $d1 killed $q1487; CHECK-NEXT: add sp, sp, #64488; CHECK-NEXT: ret489;490; NO-LIBCALL-LABEL: test_sincos_v2f32:491; NO-LIBCALL: // %bb.0:492; NO-LIBCALL-NEXT: sub sp, sp, #64493; NO-LIBCALL-NEXT: str d8, [sp, #48] // 8-byte Spill494; NO-LIBCALL-NEXT: // kill: def $d0 killed $d0 def $q0495; NO-LIBCALL-NEXT: mov s8, v0.s[1]496; NO-LIBCALL-NEXT: str q0, [sp, #32] // 16-byte Spill497; NO-LIBCALL-NEXT: str x30, [sp, #56] // 8-byte Spill498; NO-LIBCALL-NEXT: fmov s0, s8499; NO-LIBCALL-NEXT: bl sinf500; NO-LIBCALL-NEXT: // kill: def $s0 killed $s0 def $q0501; NO-LIBCALL-NEXT: str q0, [sp, #16] // 16-byte Spill502; NO-LIBCALL-NEXT: ldr q0, [sp, #32] // 16-byte Reload503; NO-LIBCALL-NEXT: // kill: def $s0 killed $s0 killed $q0504; NO-LIBCALL-NEXT: bl sinf505; NO-LIBCALL-NEXT: ldr q1, [sp, #16] // 16-byte Reload506; NO-LIBCALL-NEXT: // kill: def $s0 killed $s0 def $q0507; NO-LIBCALL-NEXT: mov v0.s[1], v1.s[0]508; NO-LIBCALL-NEXT: str q0, [sp, #16] // 16-byte Spill509; NO-LIBCALL-NEXT: fmov s0, s8510; NO-LIBCALL-NEXT: bl cosf511; NO-LIBCALL-NEXT: // kill: def $s0 killed $s0 def $q0512; NO-LIBCALL-NEXT: str q0, [sp] // 16-byte Spill513; NO-LIBCALL-NEXT: ldr q0, [sp, #32] // 16-byte Reload514; NO-LIBCALL-NEXT: // kill: def $s0 killed $s0 killed $q0515; NO-LIBCALL-NEXT: bl cosf516; NO-LIBCALL-NEXT: fmov s1, s0517; NO-LIBCALL-NEXT: ldp q2, q0, [sp] // 32-byte Folded Reload518; NO-LIBCALL-NEXT: ldr x30, [sp, #56] // 8-byte Reload519; NO-LIBCALL-NEXT: ldr d8, [sp, #48] // 8-byte Reload520; NO-LIBCALL-NEXT: // kill: def $d0 killed $d0 killed $q0521; NO-LIBCALL-NEXT: mov v1.s[1], v2.s[0]522; NO-LIBCALL-NEXT: // kill: def $d1 killed $d1 killed $q1523; NO-LIBCALL-NEXT: add sp, sp, #64524; NO-LIBCALL-NEXT: ret525 %result = call { <2 x float>, <2 x float> } @llvm.sincos.v2f32(<2 x float> %a)526 ret { <2 x float>, <2 x float> } %result527}528 529define { double, double } @test_sincos_f64(double %a) nounwind {530; CHECK-LABEL: test_sincos_f64:531; CHECK: // %bb.0:532; CHECK-NEXT: sub sp, sp, #32533; CHECK-NEXT: add x0, sp, #24534; CHECK-NEXT: add x1, sp, #8535; CHECK-NEXT: str x30, [sp, #16] // 8-byte Spill536; CHECK-NEXT: bl sincos537; CHECK-NEXT: ldr d0, [sp, #24]538; CHECK-NEXT: ldr d1, [sp, #8]539; CHECK-NEXT: ldr x30, [sp, #16] // 8-byte Reload540; CHECK-NEXT: add sp, sp, #32541; CHECK-NEXT: ret542;543; NO-LIBCALL-LABEL: test_sincos_f64:544; NO-LIBCALL: // %bb.0:545; NO-LIBCALL-NEXT: stp d9, d8, [sp, #-32]! // 16-byte Folded Spill546; NO-LIBCALL-NEXT: str x30, [sp, #16] // 8-byte Spill547; NO-LIBCALL-NEXT: fmov d8, d0548; NO-LIBCALL-NEXT: bl sin549; NO-LIBCALL-NEXT: fmov d9, d0550; NO-LIBCALL-NEXT: fmov d0, d8551; NO-LIBCALL-NEXT: bl cos552; NO-LIBCALL-NEXT: ldr x30, [sp, #16] // 8-byte Reload553; NO-LIBCALL-NEXT: fmov d1, d0554; NO-LIBCALL-NEXT: fmov d0, d9555; NO-LIBCALL-NEXT: ldp d9, d8, [sp], #32 // 16-byte Folded Reload556; NO-LIBCALL-NEXT: ret557 %result = call { double, double } @llvm.sincos.f64(double %a)558 ret { double, double } %result559}560 561define { <2 x double>, <2 x double> } @test_sincos_v2f64(<2 x double> %a) nounwind {562; CHECK-LABEL: test_sincos_v2f64:563; CHECK: // %bb.0:564; CHECK-NEXT: sub sp, sp, #80565; CHECK-NEXT: add x0, sp, #56566; CHECK-NEXT: add x1, sp, #40567; CHECK-NEXT: str x30, [sp, #48] // 8-byte Spill568; CHECK-NEXT: stp x20, x19, [sp, #64] // 16-byte Folded Spill569; CHECK-NEXT: str q0, [sp] // 16-byte Spill570; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0571; CHECK-NEXT: bl sincos572; CHECK-NEXT: ldr q0, [sp] // 16-byte Reload573; CHECK-NEXT: add x0, sp, #32574; CHECK-NEXT: add x1, sp, #24575; CHECK-NEXT: add x19, sp, #32576; CHECK-NEXT: add x20, sp, #24577; CHECK-NEXT: mov d0, v0.d[1]578; CHECK-NEXT: bl sincos579; CHECK-NEXT: ldr d0, [sp, #56]580; CHECK-NEXT: ldr d1, [sp, #40]581; CHECK-NEXT: ldr x30, [sp, #48] // 8-byte Reload582; CHECK-NEXT: ld1 { v0.d }[1], [x19]583; CHECK-NEXT: ld1 { v1.d }[1], [x20]584; CHECK-NEXT: ldp x20, x19, [sp, #64] // 16-byte Folded Reload585; CHECK-NEXT: add sp, sp, #80586; CHECK-NEXT: ret587;588; NO-LIBCALL-LABEL: test_sincos_v2f64:589; NO-LIBCALL: // %bb.0:590; NO-LIBCALL-NEXT: sub sp, sp, #64591; NO-LIBCALL-NEXT: str d8, [sp, #48] // 8-byte Spill592; NO-LIBCALL-NEXT: mov d8, v0.d[1]593; NO-LIBCALL-NEXT: str q0, [sp, #32] // 16-byte Spill594; NO-LIBCALL-NEXT: str x30, [sp, #56] // 8-byte Spill595; NO-LIBCALL-NEXT: fmov d0, d8596; NO-LIBCALL-NEXT: bl sin597; NO-LIBCALL-NEXT: // kill: def $d0 killed $d0 def $q0598; NO-LIBCALL-NEXT: str q0, [sp, #16] // 16-byte Spill599; NO-LIBCALL-NEXT: ldr q0, [sp, #32] // 16-byte Reload600; NO-LIBCALL-NEXT: // kill: def $d0 killed $d0 killed $q0601; NO-LIBCALL-NEXT: bl sin602; NO-LIBCALL-NEXT: ldr q1, [sp, #16] // 16-byte Reload603; NO-LIBCALL-NEXT: // kill: def $d0 killed $d0 def $q0604; NO-LIBCALL-NEXT: mov v0.d[1], v1.d[0]605; NO-LIBCALL-NEXT: str q0, [sp, #16] // 16-byte Spill606; NO-LIBCALL-NEXT: fmov d0, d8607; NO-LIBCALL-NEXT: bl cos608; NO-LIBCALL-NEXT: // kill: def $d0 killed $d0 def $q0609; NO-LIBCALL-NEXT: str q0, [sp] // 16-byte Spill610; NO-LIBCALL-NEXT: ldr q0, [sp, #32] // 16-byte Reload611; NO-LIBCALL-NEXT: // kill: def $d0 killed $d0 killed $q0612; NO-LIBCALL-NEXT: bl cos613; NO-LIBCALL-NEXT: fmov d1, d0614; NO-LIBCALL-NEXT: ldp q2, q0, [sp] // 32-byte Folded Reload615; NO-LIBCALL-NEXT: ldr x30, [sp, #56] // 8-byte Reload616; NO-LIBCALL-NEXT: ldr d8, [sp, #48] // 8-byte Reload617; NO-LIBCALL-NEXT: mov v1.d[1], v2.d[0]618; NO-LIBCALL-NEXT: add sp, sp, #64619; NO-LIBCALL-NEXT: ret620 %result = call { <2 x double>, <2 x double> } @llvm.sincos.v2f64(<2 x double> %a)621 ret { <2 x double>, <2 x double> } %result622}623 624define { <3 x double>, <3 x double> } @test_sincos_v3f64(<3 x double> %a) nounwind {625; CHECK-LABEL: test_sincos_v3f64:626; CHECK: // %bb.0:627; CHECK-NEXT: sub sp, sp, #80628; CHECK-NEXT: add x0, sp, #16629; CHECK-NEXT: add x1, sp, #8630; CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill631; CHECK-NEXT: str x30, [sp, #64] // 8-byte Spill632; CHECK-NEXT: fmov d8, d2633; CHECK-NEXT: fmov d9, d1634; CHECK-NEXT: bl sincos635; CHECK-NEXT: fmov d0, d9636; CHECK-NEXT: add x0, sp, #32637; CHECK-NEXT: add x1, sp, #24638; CHECK-NEXT: bl sincos639; CHECK-NEXT: fmov d0, d8640; CHECK-NEXT: add x0, sp, #72641; CHECK-NEXT: add x1, sp, #40642; CHECK-NEXT: bl sincos643; CHECK-NEXT: ldp d3, d0, [sp, #8]644; CHECK-NEXT: ldr d2, [sp, #72]645; CHECK-NEXT: ldp d4, d1, [sp, #24]646; CHECK-NEXT: ldr d5, [sp, #40]647; CHECK-NEXT: ldr x30, [sp, #64] // 8-byte Reload648; CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload649; CHECK-NEXT: add sp, sp, #80650; CHECK-NEXT: ret651;652; NO-LIBCALL-LABEL: test_sincos_v3f64:653; NO-LIBCALL: // %bb.0:654; NO-LIBCALL-NEXT: stp d13, d12, [sp, #-64]! // 16-byte Folded Spill655; NO-LIBCALL-NEXT: stp d11, d10, [sp, #16] // 16-byte Folded Spill656; NO-LIBCALL-NEXT: fmov d10, d0657; NO-LIBCALL-NEXT: stp d9, d8, [sp, #32] // 16-byte Folded Spill658; NO-LIBCALL-NEXT: fmov d8, d2659; NO-LIBCALL-NEXT: fmov d9, d1660; NO-LIBCALL-NEXT: str x30, [sp, #48] // 8-byte Spill661; NO-LIBCALL-NEXT: bl sin662; NO-LIBCALL-NEXT: fmov d11, d0663; NO-LIBCALL-NEXT: fmov d0, d9664; NO-LIBCALL-NEXT: bl sin665; NO-LIBCALL-NEXT: fmov d12, d0666; NO-LIBCALL-NEXT: fmov d0, d8667; NO-LIBCALL-NEXT: bl sin668; NO-LIBCALL-NEXT: fmov d13, d0669; NO-LIBCALL-NEXT: fmov d0, d10670; NO-LIBCALL-NEXT: bl cos671; NO-LIBCALL-NEXT: fmov d10, d0672; NO-LIBCALL-NEXT: fmov d0, d9673; NO-LIBCALL-NEXT: bl cos674; NO-LIBCALL-NEXT: fmov d9, d0675; NO-LIBCALL-NEXT: fmov d0, d8676; NO-LIBCALL-NEXT: bl cos677; NO-LIBCALL-NEXT: fmov d5, d0678; NO-LIBCALL-NEXT: fmov d0, d11679; NO-LIBCALL-NEXT: ldr x30, [sp, #48] // 8-byte Reload680; NO-LIBCALL-NEXT: fmov d3, d10681; NO-LIBCALL-NEXT: fmov d4, d9682; NO-LIBCALL-NEXT: fmov d1, d12683; NO-LIBCALL-NEXT: ldp d9, d8, [sp, #32] // 16-byte Folded Reload684; NO-LIBCALL-NEXT: fmov d2, d13685; NO-LIBCALL-NEXT: ldp d11, d10, [sp, #16] // 16-byte Folded Reload686; NO-LIBCALL-NEXT: ldp d13, d12, [sp], #64 // 16-byte Folded Reload687; NO-LIBCALL-NEXT: ret688 %result = call { <3 x double>, <3 x double> } @llvm.sincos.v3f64(<3 x double> %a)689 ret { <3 x double>, <3 x double> } %result690}691