406 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-- | FileCheck %s3 4declare <4 x double> @llvm.sin.v4f64(<4 x double> %p)5declare <4 x double> @llvm.cos.v4f64(<4 x double> %p)6declare <4 x double> @llvm.pow.v4f64(<4 x double> %p, <4 x double> %q)7declare <4 x double> @llvm.powi.v4f64.i32(<4 x double> %p, i32)8 9define <4 x double> @foo(<4 x double> %p)10; CHECK-LABEL: foo:11; CHECK: # %bb.0:12; CHECK-NEXT: subq $56, %rsp13; CHECK-NEXT: .cfi_def_cfa_offset 6414; CHECK-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill15; CHECK-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill16; CHECK-NEXT: callq sin@PLT17; CHECK-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill18; CHECK-NEXT: movaps (%rsp), %xmm0 # 16-byte Reload19; CHECK-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]20; CHECK-NEXT: callq sin@PLT21; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload22; CHECK-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]23; CHECK-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill24; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload25; CHECK-NEXT: callq sin@PLT26; CHECK-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill27; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload28; CHECK-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]29; CHECK-NEXT: callq sin@PLT30; CHECK-NEXT: movaps (%rsp), %xmm1 # 16-byte Reload31; CHECK-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]32; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload33; CHECK-NEXT: addq $56, %rsp34; CHECK-NEXT: .cfi_def_cfa_offset 835; CHECK-NEXT: retq36{37 %t = call <4 x double> @llvm.sin.v4f64(<4 x double> %p)38 ret <4 x double> %t39}40define <4 x double> @goo(<4 x double> %p)41; CHECK-LABEL: goo:42; CHECK: # %bb.0:43; CHECK-NEXT: subq $56, %rsp44; CHECK-NEXT: .cfi_def_cfa_offset 6445; CHECK-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill46; CHECK-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill47; CHECK-NEXT: callq cos@PLT48; CHECK-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill49; CHECK-NEXT: movaps (%rsp), %xmm0 # 16-byte Reload50; CHECK-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]51; CHECK-NEXT: callq cos@PLT52; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload53; CHECK-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]54; CHECK-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill55; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload56; CHECK-NEXT: callq cos@PLT57; CHECK-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill58; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload59; CHECK-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]60; CHECK-NEXT: callq cos@PLT61; CHECK-NEXT: movaps (%rsp), %xmm1 # 16-byte Reload62; CHECK-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]63; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload64; CHECK-NEXT: addq $56, %rsp65; CHECK-NEXT: .cfi_def_cfa_offset 866; CHECK-NEXT: retq67{68 %t = call <4 x double> @llvm.cos.v4f64(<4 x double> %p)69 ret <4 x double> %t70}71define <4 x double> @moo(<4 x double> %p, <4 x double> %q)72; CHECK-LABEL: moo:73; CHECK: # %bb.0:74; CHECK-NEXT: subq $88, %rsp75; CHECK-NEXT: .cfi_def_cfa_offset 9676; CHECK-NEXT: movaps %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill77; CHECK-NEXT: movaps %xmm2, (%rsp) # 16-byte Spill78; CHECK-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill79; CHECK-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill80; CHECK-NEXT: movaps %xmm2, %xmm181; CHECK-NEXT: callq pow@PLT82; CHECK-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill83; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload84; CHECK-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]85; CHECK-NEXT: movaps (%rsp), %xmm1 # 16-byte Reload86; CHECK-NEXT: movhlps {{.*#+}} xmm1 = xmm1[1,1]87; CHECK-NEXT: callq pow@PLT88; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload89; CHECK-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]90; CHECK-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill91; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload92; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload93; CHECK-NEXT: callq pow@PLT94; CHECK-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill95; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload96; CHECK-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]97; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload98; CHECK-NEXT: movhlps {{.*#+}} xmm1 = xmm1[1,1]99; CHECK-NEXT: callq pow@PLT100; CHECK-NEXT: movaps (%rsp), %xmm1 # 16-byte Reload101; CHECK-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]102; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload103; CHECK-NEXT: addq $88, %rsp104; CHECK-NEXT: .cfi_def_cfa_offset 8105; CHECK-NEXT: retq106{107 %t = call <4 x double> @llvm.pow.v4f64(<4 x double> %p, <4 x double> %q)108 ret <4 x double> %t109}110define <4 x double> @zoo(<4 x double> %p, i32 %q)111; CHECK-LABEL: zoo:112; CHECK: # %bb.0:113; CHECK-NEXT: pushq %rbx114; CHECK-NEXT: .cfi_def_cfa_offset 16115; CHECK-NEXT: subq $48, %rsp116; CHECK-NEXT: .cfi_def_cfa_offset 64117; CHECK-NEXT: .cfi_offset %rbx, -16118; CHECK-NEXT: movl %edi, %ebx119; CHECK-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill120; CHECK-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill121; CHECK-NEXT: callq __powidf2@PLT122; CHECK-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill123; CHECK-NEXT: movaps (%rsp), %xmm0 # 16-byte Reload124; CHECK-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]125; CHECK-NEXT: movl %ebx, %edi126; CHECK-NEXT: callq __powidf2@PLT127; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload128; CHECK-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]129; CHECK-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill130; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload131; CHECK-NEXT: movl %ebx, %edi132; CHECK-NEXT: callq __powidf2@PLT133; CHECK-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill134; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload135; CHECK-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]136; CHECK-NEXT: movl %ebx, %edi137; CHECK-NEXT: callq __powidf2@PLT138; CHECK-NEXT: movaps (%rsp), %xmm1 # 16-byte Reload139; CHECK-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]140; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload141; CHECK-NEXT: addq $48, %rsp142; CHECK-NEXT: .cfi_def_cfa_offset 16143; CHECK-NEXT: popq %rbx144; CHECK-NEXT: .cfi_def_cfa_offset 8145; CHECK-NEXT: retq146{147 %t = call <4 x double> @llvm.powi.v4f64.i32(<4 x double> %p, i32 %q)148 ret <4 x double> %t149}150 151 152declare <9 x double> @llvm.exp.v9f64(<9 x double> %a)153declare <9 x double> @llvm.pow.v9f64(<9 x double> %a, <9 x double> %b)154declare <9 x double> @llvm.powi.v9f64.i32(<9 x double> %a, i32)155 156define void @a(ptr %p) nounwind {157; CHECK-LABEL: a:158; CHECK: # %bb.0:159; CHECK-NEXT: pushq %rbx160; CHECK-NEXT: subq $96, %rsp161; CHECK-NEXT: movq %rdi, %rbx162; CHECK-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero163; CHECK-NEXT: movsd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill164; CHECK-NEXT: movaps (%rdi), %xmm0165; CHECK-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill166; CHECK-NEXT: movaps 16(%rdi), %xmm0167; CHECK-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill168; CHECK-NEXT: movaps 32(%rdi), %xmm0169; CHECK-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill170; CHECK-NEXT: movaps 48(%rdi), %xmm0171; CHECK-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill172; CHECK-NEXT: callq exp@PLT173; CHECK-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill174; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload175; CHECK-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]176; CHECK-NEXT: callq exp@PLT177; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload178; CHECK-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]179; CHECK-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill180; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload181; CHECK-NEXT: callq exp@PLT182; CHECK-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill183; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload184; CHECK-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]185; CHECK-NEXT: callq exp@PLT186; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload187; CHECK-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]188; CHECK-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill189; CHECK-NEXT: movaps (%rsp), %xmm0 # 16-byte Reload190; CHECK-NEXT: callq exp@PLT191; CHECK-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill192; CHECK-NEXT: movaps (%rsp), %xmm0 # 16-byte Reload193; CHECK-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]194; CHECK-NEXT: callq exp@PLT195; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload196; CHECK-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]197; CHECK-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill198; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload199; CHECK-NEXT: callq exp@PLT200; CHECK-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill201; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload202; CHECK-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]203; CHECK-NEXT: callq exp@PLT204; CHECK-NEXT: movaps (%rsp), %xmm1 # 16-byte Reload205; CHECK-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]206; CHECK-NEXT: movaps %xmm1, (%rsp) # 16-byte Spill207; CHECK-NEXT: movsd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 8-byte Reload208; CHECK-NEXT: # xmm0 = mem[0],zero209; CHECK-NEXT: callq exp@PLT210; CHECK-NEXT: movsd %xmm0, 64(%rbx)211; CHECK-NEXT: movaps (%rsp), %xmm0 # 16-byte Reload212; CHECK-NEXT: movaps %xmm0, (%rbx)213; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload214; CHECK-NEXT: movaps %xmm0, 16(%rbx)215; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload216; CHECK-NEXT: movaps %xmm0, 32(%rbx)217; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload218; CHECK-NEXT: movaps %xmm0, 48(%rbx)219; CHECK-NEXT: addq $96, %rsp220; CHECK-NEXT: popq %rbx221; CHECK-NEXT: retq222 %a = load <9 x double>, ptr %p223 %r = call <9 x double> @llvm.exp.v9f64(<9 x double> %a)224 store <9 x double> %r, ptr %p225 ret void226}227define void @b(ptr %p, ptr %q) nounwind {228; CHECK-LABEL: b:229; CHECK: # %bb.0:230; CHECK-NEXT: pushq %rbx231; CHECK-NEXT: subq $160, %rsp232; CHECK-NEXT: movq %rdi, %rbx233; CHECK-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero234; CHECK-NEXT: movsd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill235; CHECK-NEXT: movaps (%rdi), %xmm0236; CHECK-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill237; CHECK-NEXT: movaps 16(%rdi), %xmm0238; CHECK-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill239; CHECK-NEXT: movaps 32(%rdi), %xmm0240; CHECK-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill241; CHECK-NEXT: movaps 48(%rdi), %xmm2242; CHECK-NEXT: movaps %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill243; CHECK-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero244; CHECK-NEXT: movsd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill245; CHECK-NEXT: movaps (%rsi), %xmm0246; CHECK-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill247; CHECK-NEXT: movaps 16(%rsi), %xmm0248; CHECK-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill249; CHECK-NEXT: movaps 32(%rsi), %xmm0250; CHECK-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill251; CHECK-NEXT: movaps 48(%rsi), %xmm1252; CHECK-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill253; CHECK-NEXT: movaps %xmm2, %xmm0254; CHECK-NEXT: callq pow@PLT255; CHECK-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill256; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload257; CHECK-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]258; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload259; CHECK-NEXT: movhlps {{.*#+}} xmm1 = xmm1[1,1]260; CHECK-NEXT: callq pow@PLT261; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload262; CHECK-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]263; CHECK-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill264; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload265; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload266; CHECK-NEXT: callq pow@PLT267; CHECK-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill268; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload269; CHECK-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]270; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload271; CHECK-NEXT: movhlps {{.*#+}} xmm1 = xmm1[1,1]272; CHECK-NEXT: callq pow@PLT273; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload274; CHECK-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]275; CHECK-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill276; CHECK-NEXT: movaps (%rsp), %xmm0 # 16-byte Reload277; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload278; CHECK-NEXT: callq pow@PLT279; CHECK-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill280; CHECK-NEXT: movaps (%rsp), %xmm0 # 16-byte Reload281; CHECK-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]282; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload283; CHECK-NEXT: movhlps {{.*#+}} xmm1 = xmm1[1,1]284; CHECK-NEXT: callq pow@PLT285; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload286; CHECK-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]287; CHECK-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill288; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload289; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload290; CHECK-NEXT: callq pow@PLT291; CHECK-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill292; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload293; CHECK-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]294; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload295; CHECK-NEXT: movhlps {{.*#+}} xmm1 = xmm1[1,1]296; CHECK-NEXT: callq pow@PLT297; CHECK-NEXT: movaps (%rsp), %xmm1 # 16-byte Reload298; CHECK-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]299; CHECK-NEXT: movaps %xmm1, (%rsp) # 16-byte Spill300; CHECK-NEXT: movsd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 8-byte Reload301; CHECK-NEXT: # xmm0 = mem[0],zero302; CHECK-NEXT: movsd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 8-byte Reload303; CHECK-NEXT: # xmm1 = mem[0],zero304; CHECK-NEXT: callq pow@PLT305; CHECK-NEXT: movsd %xmm0, 64(%rbx)306; CHECK-NEXT: movaps (%rsp), %xmm0 # 16-byte Reload307; CHECK-NEXT: movaps %xmm0, (%rbx)308; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload309; CHECK-NEXT: movaps %xmm0, 16(%rbx)310; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload311; CHECK-NEXT: movaps %xmm0, 32(%rbx)312; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload313; CHECK-NEXT: movaps %xmm0, 48(%rbx)314; CHECK-NEXT: addq $160, %rsp315; CHECK-NEXT: popq %rbx316; CHECK-NEXT: retq317 %a = load <9 x double>, ptr %p318 %b = load <9 x double>, ptr %q319 %r = call <9 x double> @llvm.pow.v9f64(<9 x double> %a, <9 x double> %b)320 store <9 x double> %r, ptr %p321 ret void322}323define void @c(ptr %p, i32 %n) nounwind {324; CHECK-LABEL: c:325; CHECK: # %bb.0:326; CHECK-NEXT: pushq %rbp327; CHECK-NEXT: pushq %rbx328; CHECK-NEXT: subq $104, %rsp329; CHECK-NEXT: movl %esi, %ebp330; CHECK-NEXT: movq %rdi, %rbx331; CHECK-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero332; CHECK-NEXT: movsd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill333; CHECK-NEXT: movaps (%rdi), %xmm0334; CHECK-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill335; CHECK-NEXT: movaps 16(%rdi), %xmm0336; CHECK-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill337; CHECK-NEXT: movaps 32(%rdi), %xmm0338; CHECK-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill339; CHECK-NEXT: movaps 48(%rdi), %xmm0340; CHECK-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill341; CHECK-NEXT: movl %esi, %edi342; CHECK-NEXT: callq __powidf2@PLT343; CHECK-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill344; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload345; CHECK-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]346; CHECK-NEXT: movl %ebp, %edi347; CHECK-NEXT: callq __powidf2@PLT348; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload349; CHECK-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]350; CHECK-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill351; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload352; CHECK-NEXT: movl %ebp, %edi353; CHECK-NEXT: callq __powidf2@PLT354; CHECK-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill355; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload356; CHECK-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]357; CHECK-NEXT: movl %ebp, %edi358; CHECK-NEXT: callq __powidf2@PLT359; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload360; CHECK-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]361; CHECK-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill362; CHECK-NEXT: movaps (%rsp), %xmm0 # 16-byte Reload363; CHECK-NEXT: movl %ebp, %edi364; CHECK-NEXT: callq __powidf2@PLT365; CHECK-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill366; CHECK-NEXT: movaps (%rsp), %xmm0 # 16-byte Reload367; CHECK-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]368; CHECK-NEXT: movl %ebp, %edi369; CHECK-NEXT: callq __powidf2@PLT370; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload371; CHECK-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]372; CHECK-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill373; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload374; CHECK-NEXT: movl %ebp, %edi375; CHECK-NEXT: callq __powidf2@PLT376; CHECK-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill377; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload378; CHECK-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]379; CHECK-NEXT: movl %ebp, %edi380; CHECK-NEXT: callq __powidf2@PLT381; CHECK-NEXT: movaps (%rsp), %xmm1 # 16-byte Reload382; CHECK-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]383; CHECK-NEXT: movaps %xmm1, (%rsp) # 16-byte Spill384; CHECK-NEXT: movsd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 8-byte Reload385; CHECK-NEXT: # xmm0 = mem[0],zero386; CHECK-NEXT: movl %ebp, %edi387; CHECK-NEXT: callq __powidf2@PLT388; CHECK-NEXT: movsd %xmm0, 64(%rbx)389; CHECK-NEXT: movaps (%rsp), %xmm0 # 16-byte Reload390; CHECK-NEXT: movaps %xmm0, (%rbx)391; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload392; CHECK-NEXT: movaps %xmm0, 16(%rbx)393; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload394; CHECK-NEXT: movaps %xmm0, 32(%rbx)395; CHECK-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload396; CHECK-NEXT: movaps %xmm0, 48(%rbx)397; CHECK-NEXT: addq $104, %rsp398; CHECK-NEXT: popq %rbx399; CHECK-NEXT: popq %rbp400; CHECK-NEXT: retq401 %a = load <9 x double>, ptr %p402 %r = call <9 x double> @llvm.powi.v9f64.i32(<9 x double> %a, i32 %n)403 store <9 x double> %r, ptr %p404 ret void405}406