374 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7-avx -mattr=+avx | FileCheck %s3 4define <4 x double> @addpd256(<4 x double> %y, <4 x double> %x) nounwind uwtable readnone ssp {5; CHECK-LABEL: addpd256:6; CHECK: ## %bb.0: ## %entry7; CHECK-NEXT: vaddpd %ymm0, %ymm1, %ymm08; CHECK-NEXT: retq9entry:10 %add.i = fadd <4 x double> %x, %y11 ret <4 x double> %add.i12}13 14define <4 x double> @addpd256fold(<4 x double> %y) nounwind uwtable readnone ssp {15; CHECK-LABEL: addpd256fold:16; CHECK: ## %bb.0: ## %entry17; CHECK-NEXT: vaddpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm018; CHECK-NEXT: retq19entry:20 %add.i = fadd <4 x double> %y, <double 4.500000e+00, double 3.400000e+00, double 2.300000e+00, double 1.200000e+00>21 ret <4 x double> %add.i22}23 24define <8 x float> @addps256(<8 x float> %y, <8 x float> %x) nounwind uwtable readnone ssp {25; CHECK-LABEL: addps256:26; CHECK: ## %bb.0: ## %entry27; CHECK-NEXT: vaddps %ymm0, %ymm1, %ymm028; CHECK-NEXT: retq29entry:30 %add.i = fadd <8 x float> %x, %y31 ret <8 x float> %add.i32}33 34define <8 x float> @addps256fold(<8 x float> %y) nounwind uwtable readnone ssp {35; CHECK-LABEL: addps256fold:36; CHECK: ## %bb.0: ## %entry37; CHECK-NEXT: vaddps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm038; CHECK-NEXT: retq39entry:40 %add.i = fadd <8 x float> %y, <float 4.500000e+00, float 0x400B333340000000, float 0x4002666660000000, float 0x3FF3333340000000, float 4.500000e+00, float 0x400B333340000000, float 0x4002666660000000, float 0x3FF3333340000000>41 ret <8 x float> %add.i42}43 44define <4 x double> @subpd256(<4 x double> %y, <4 x double> %x) nounwind uwtable readnone ssp {45; CHECK-LABEL: subpd256:46; CHECK: ## %bb.0: ## %entry47; CHECK-NEXT: vsubpd %ymm0, %ymm1, %ymm048; CHECK-NEXT: retq49entry:50 %sub.i = fsub <4 x double> %x, %y51 ret <4 x double> %sub.i52}53 54define <4 x double> @subpd256fold(<4 x double> %y, ptr nocapture %x) nounwind uwtable readonly ssp {55; CHECK-LABEL: subpd256fold:56; CHECK: ## %bb.0: ## %entry57; CHECK-NEXT: vsubpd (%rdi), %ymm0, %ymm058; CHECK-NEXT: retq59entry:60 %tmp2 = load <4 x double>, ptr %x, align 3261 %sub.i = fsub <4 x double> %y, %tmp262 ret <4 x double> %sub.i63}64 65define <8 x float> @subps256(<8 x float> %y, <8 x float> %x) nounwind uwtable readnone ssp {66; CHECK-LABEL: subps256:67; CHECK: ## %bb.0: ## %entry68; CHECK-NEXT: vsubps %ymm0, %ymm1, %ymm069; CHECK-NEXT: retq70entry:71 %sub.i = fsub <8 x float> %x, %y72 ret <8 x float> %sub.i73}74 75define <8 x float> @subps256fold(<8 x float> %y, ptr nocapture %x) nounwind uwtable readonly ssp {76; CHECK-LABEL: subps256fold:77; CHECK: ## %bb.0: ## %entry78; CHECK-NEXT: vsubps (%rdi), %ymm0, %ymm079; CHECK-NEXT: retq80entry:81 %tmp2 = load <8 x float>, ptr %x, align 3282 %sub.i = fsub <8 x float> %y, %tmp283 ret <8 x float> %sub.i84}85 86define <4 x double> @mulpd256(<4 x double> %y, <4 x double> %x) nounwind uwtable readnone ssp {87; CHECK-LABEL: mulpd256:88; CHECK: ## %bb.0: ## %entry89; CHECK-NEXT: vmulpd %ymm0, %ymm1, %ymm090; CHECK-NEXT: retq91entry:92 %mul.i = fmul <4 x double> %x, %y93 ret <4 x double> %mul.i94}95 96define <4 x double> @mulpd256fold(<4 x double> %y) nounwind uwtable readnone ssp {97; CHECK-LABEL: mulpd256fold:98; CHECK: ## %bb.0: ## %entry99; CHECK-NEXT: vmulpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0100; CHECK-NEXT: retq101entry:102 %mul.i = fmul <4 x double> %y, <double 4.500000e+00, double 3.400000e+00, double 2.300000e+00, double 1.200000e+00>103 ret <4 x double> %mul.i104}105 106define <8 x float> @mulps256(<8 x float> %y, <8 x float> %x) nounwind uwtable readnone ssp {107; CHECK-LABEL: mulps256:108; CHECK: ## %bb.0: ## %entry109; CHECK-NEXT: vmulps %ymm0, %ymm1, %ymm0110; CHECK-NEXT: retq111entry:112 %mul.i = fmul <8 x float> %x, %y113 ret <8 x float> %mul.i114}115 116define <8 x float> @mulps256fold(<8 x float> %y) nounwind uwtable readnone ssp {117; CHECK-LABEL: mulps256fold:118; CHECK: ## %bb.0: ## %entry119; CHECK-NEXT: vmulps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0120; CHECK-NEXT: retq121entry:122 %mul.i = fmul <8 x float> %y, <float 4.500000e+00, float 0x400B333340000000, float 0x4002666660000000, float 0x3FF3333340000000, float 4.500000e+00, float 0x400B333340000000, float 0x4002666660000000, float 0x3FF3333340000000>123 ret <8 x float> %mul.i124}125 126define <4 x double> @divpd256(<4 x double> %y, <4 x double> %x) nounwind uwtable readnone ssp {127; CHECK-LABEL: divpd256:128; CHECK: ## %bb.0: ## %entry129; CHECK-NEXT: vdivpd %ymm0, %ymm1, %ymm0130; CHECK-NEXT: retq131entry:132 %div.i = fdiv <4 x double> %x, %y133 ret <4 x double> %div.i134}135 136define <4 x double> @divpd256fold(<4 x double> %y) nounwind uwtable readnone ssp {137; CHECK-LABEL: divpd256fold:138; CHECK: ## %bb.0: ## %entry139; CHECK-NEXT: vdivpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0140; CHECK-NEXT: retq141entry:142 %div.i = fdiv <4 x double> %y, <double 4.500000e+00, double 3.400000e+00, double 2.300000e+00, double 1.200000e+00>143 ret <4 x double> %div.i144}145 146define <8 x float> @divps256(<8 x float> %y, <8 x float> %x) nounwind uwtable readnone ssp {147; CHECK-LABEL: divps256:148; CHECK: ## %bb.0: ## %entry149; CHECK-NEXT: vdivps %ymm0, %ymm1, %ymm0150; CHECK-NEXT: retq151entry:152 %div.i = fdiv <8 x float> %x, %y153 ret <8 x float> %div.i154}155 156define <8 x float> @divps256fold(<8 x float> %y) nounwind uwtable readnone ssp {157; CHECK-LABEL: divps256fold:158; CHECK: ## %bb.0: ## %entry159; CHECK-NEXT: vdivps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0160; CHECK-NEXT: retq161entry:162 %div.i = fdiv <8 x float> %y, <float 4.500000e+00, float 0x400B333340000000, float 0x4002666660000000, float 0x3FF3333340000000, float 4.500000e+00, float 0x400B333340000000, float 0x4002666660000000, float 0x3FF3333340000000>163 ret <8 x float> %div.i164}165 166define float @sqrtA(float %a) nounwind uwtable readnone ssp {167; CHECK-LABEL: sqrtA:168; CHECK: ## %bb.0: ## %entry169; CHECK-NEXT: vsqrtss %xmm0, %xmm0, %xmm0170; CHECK-NEXT: retq171entry:172 %conv1 = tail call float @sqrtf(float %a) nounwind readnone173 ret float %conv1174}175 176declare double @sqrt(double) readnone177 178define double @sqrtB(double %a) nounwind uwtable readnone ssp {179; CHECK-LABEL: sqrtB:180; CHECK: ## %bb.0: ## %entry181; CHECK-NEXT: vsqrtsd %xmm0, %xmm0, %xmm0182; CHECK-NEXT: retq183entry:184 %call = tail call double @sqrt(double %a) nounwind readnone185 ret double %call186}187 188declare float @sqrtf(float) readnone189 190 191define <4 x i64> @vpaddq(<4 x i64> %i, <4 x i64> %j) nounwind readnone {192; CHECK-LABEL: vpaddq:193; CHECK: ## %bb.0:194; CHECK-NEXT: vextractf128 $1, %ymm1, %xmm2195; CHECK-NEXT: vextractf128 $1, %ymm0, %xmm3196; CHECK-NEXT: vpaddq %xmm2, %xmm3, %xmm2197; CHECK-NEXT: vpaddq %xmm1, %xmm0, %xmm0198; CHECK-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0199; CHECK-NEXT: retq200 %x = add <4 x i64> %i, %j201 ret <4 x i64> %x202}203 204define <8 x i32> @vpaddd(<8 x i32> %i, <8 x i32> %j) nounwind readnone {205; CHECK-LABEL: vpaddd:206; CHECK: ## %bb.0:207; CHECK-NEXT: vextractf128 $1, %ymm1, %xmm2208; CHECK-NEXT: vextractf128 $1, %ymm0, %xmm3209; CHECK-NEXT: vpaddd %xmm2, %xmm3, %xmm2210; CHECK-NEXT: vpaddd %xmm1, %xmm0, %xmm0211; CHECK-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0212; CHECK-NEXT: retq213 %x = add <8 x i32> %i, %j214 ret <8 x i32> %x215}216 217define <16 x i16> @vpaddw(<16 x i16> %i, <16 x i16> %j) nounwind readnone {218; CHECK-LABEL: vpaddw:219; CHECK: ## %bb.0:220; CHECK-NEXT: vextractf128 $1, %ymm1, %xmm2221; CHECK-NEXT: vextractf128 $1, %ymm0, %xmm3222; CHECK-NEXT: vpaddw %xmm2, %xmm3, %xmm2223; CHECK-NEXT: vpaddw %xmm1, %xmm0, %xmm0224; CHECK-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0225; CHECK-NEXT: retq226 %x = add <16 x i16> %i, %j227 ret <16 x i16> %x228}229 230define <32 x i8> @vpaddb(<32 x i8> %i, <32 x i8> %j) nounwind readnone {231; CHECK-LABEL: vpaddb:232; CHECK: ## %bb.0:233; CHECK-NEXT: vextractf128 $1, %ymm1, %xmm2234; CHECK-NEXT: vextractf128 $1, %ymm0, %xmm3235; CHECK-NEXT: vpaddb %xmm2, %xmm3, %xmm2236; CHECK-NEXT: vpaddb %xmm1, %xmm0, %xmm0237; CHECK-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0238; CHECK-NEXT: retq239 %x = add <32 x i8> %i, %j240 ret <32 x i8> %x241}242 243define <4 x i64> @vpsubq(<4 x i64> %i, <4 x i64> %j) nounwind readnone {244; CHECK-LABEL: vpsubq:245; CHECK: ## %bb.0:246; CHECK-NEXT: vextractf128 $1, %ymm1, %xmm2247; CHECK-NEXT: vextractf128 $1, %ymm0, %xmm3248; CHECK-NEXT: vpsubq %xmm2, %xmm3, %xmm2249; CHECK-NEXT: vpsubq %xmm1, %xmm0, %xmm0250; CHECK-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0251; CHECK-NEXT: retq252 %x = sub <4 x i64> %i, %j253 ret <4 x i64> %x254}255 256define <8 x i32> @vpsubd(<8 x i32> %i, <8 x i32> %j) nounwind readnone {257; CHECK-LABEL: vpsubd:258; CHECK: ## %bb.0:259; CHECK-NEXT: vextractf128 $1, %ymm1, %xmm2260; CHECK-NEXT: vextractf128 $1, %ymm0, %xmm3261; CHECK-NEXT: vpsubd %xmm2, %xmm3, %xmm2262; CHECK-NEXT: vpsubd %xmm1, %xmm0, %xmm0263; CHECK-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0264; CHECK-NEXT: retq265 %x = sub <8 x i32> %i, %j266 ret <8 x i32> %x267}268 269define <16 x i16> @vpsubw(<16 x i16> %i, <16 x i16> %j) nounwind readnone {270; CHECK-LABEL: vpsubw:271; CHECK: ## %bb.0:272; CHECK-NEXT: vextractf128 $1, %ymm1, %xmm2273; CHECK-NEXT: vextractf128 $1, %ymm0, %xmm3274; CHECK-NEXT: vpsubw %xmm2, %xmm3, %xmm2275; CHECK-NEXT: vpsubw %xmm1, %xmm0, %xmm0276; CHECK-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0277; CHECK-NEXT: retq278 %x = sub <16 x i16> %i, %j279 ret <16 x i16> %x280}281 282define <32 x i8> @vpsubb(<32 x i8> %i, <32 x i8> %j) nounwind readnone {283; CHECK-LABEL: vpsubb:284; CHECK: ## %bb.0:285; CHECK-NEXT: vextractf128 $1, %ymm1, %xmm2286; CHECK-NEXT: vextractf128 $1, %ymm0, %xmm3287; CHECK-NEXT: vpsubb %xmm2, %xmm3, %xmm2288; CHECK-NEXT: vpsubb %xmm1, %xmm0, %xmm0289; CHECK-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0290; CHECK-NEXT: retq291 %x = sub <32 x i8> %i, %j292 ret <32 x i8> %x293}294 295define <8 x i32> @vpmulld(<8 x i32> %i, <8 x i32> %j) nounwind readnone {296; CHECK-LABEL: vpmulld:297; CHECK: ## %bb.0:298; CHECK-NEXT: vextractf128 $1, %ymm1, %xmm2299; CHECK-NEXT: vextractf128 $1, %ymm0, %xmm3300; CHECK-NEXT: vpmulld %xmm2, %xmm3, %xmm2301; CHECK-NEXT: vpmulld %xmm1, %xmm0, %xmm0302; CHECK-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0303; CHECK-NEXT: retq304 %x = mul <8 x i32> %i, %j305 ret <8 x i32> %x306}307 308define <16 x i16> @vpmullw(<16 x i16> %i, <16 x i16> %j) nounwind readnone {309; CHECK-LABEL: vpmullw:310; CHECK: ## %bb.0:311; CHECK-NEXT: vextractf128 $1, %ymm1, %xmm2312; CHECK-NEXT: vextractf128 $1, %ymm0, %xmm3313; CHECK-NEXT: vpmullw %xmm2, %xmm3, %xmm2314; CHECK-NEXT: vpmullw %xmm1, %xmm0, %xmm0315; CHECK-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0316; CHECK-NEXT: retq317 %x = mul <16 x i16> %i, %j318 ret <16 x i16> %x319}320 321define <4 x i64> @mul_v4i64(<4 x i64> %i, <4 x i64> %j) nounwind readnone {322; CHECK-LABEL: mul_v4i64:323; CHECK: ## %bb.0:324; CHECK-NEXT: vextractf128 $1, %ymm1, %xmm2325; CHECK-NEXT: vextractf128 $1, %ymm0, %xmm3326; CHECK-NEXT: vpsrlq $32, %xmm3, %xmm4327; CHECK-NEXT: vpmuludq %xmm2, %xmm4, %xmm4328; CHECK-NEXT: vpsrlq $32, %xmm2, %xmm5329; CHECK-NEXT: vpmuludq %xmm5, %xmm3, %xmm5330; CHECK-NEXT: vpaddq %xmm4, %xmm5, %xmm4331; CHECK-NEXT: vpsllq $32, %xmm4, %xmm4332; CHECK-NEXT: vpmuludq %xmm2, %xmm3, %xmm2333; CHECK-NEXT: vpaddq %xmm4, %xmm2, %xmm2334; CHECK-NEXT: vpsrlq $32, %xmm0, %xmm3335; CHECK-NEXT: vpmuludq %xmm1, %xmm3, %xmm3336; CHECK-NEXT: vpsrlq $32, %xmm1, %xmm4337; CHECK-NEXT: vpmuludq %xmm4, %xmm0, %xmm4338; CHECK-NEXT: vpaddq %xmm3, %xmm4, %xmm3339; CHECK-NEXT: vpsllq $32, %xmm3, %xmm3340; CHECK-NEXT: vpmuludq %xmm1, %xmm0, %xmm0341; CHECK-NEXT: vpaddq %xmm3, %xmm0, %xmm0342; CHECK-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0343; CHECK-NEXT: retq344 %x = mul <4 x i64> %i, %j345 ret <4 x i64> %x346}347 348declare <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float>) nounwind readnone349 350define <4 x float> @int_sqrt_ss() {351; CHECK-LABEL: int_sqrt_ss:352; CHECK: ## %bb.0:353; CHECK-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero354; CHECK-NEXT: vsqrtss %xmm0, %xmm0, %xmm0355; CHECK-NEXT: retq356 %x0 = load float, ptr addrspace(1) undef, align 8357 %x1 = insertelement <4 x float> undef, float %x0, i32 0358 %x2 = call <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float> %x1) nounwind359 ret <4 x float> %x2360}361 362define <2 x double> @vector_sqrt_scalar_load(ptr %a0) optsize {363; CHECK-LABEL: vector_sqrt_scalar_load:364; CHECK: ## %bb.0:365; CHECK-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero366; CHECK-NEXT: vsqrtpd %xmm0, %xmm0367; CHECK-NEXT: retq368 %a1 = load double, ptr %a0369 %a2 = insertelement <2 x double> undef, double %a1, i32 0370 %res = call <2 x double> @llvm.sqrt.v2f64(<2 x double> %a2) ; <<2 x double>> [#uses=1]371 ret <2 x double> %res372}373declare <2 x double> @llvm.sqrt.v2f64(<2 x double>) nounwind readnone374