420 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64-v2 | FileCheck %s --check-prefixes=SSE3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=sandybridge | FileCheck %s --check-prefixes=AVX,AVX14; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64-v3 | FileCheck %s --check-prefixes=AVX,AVX25; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64-v4 | FileCheck %s --check-prefixes=AVX,AVX5126 7define <4 x double> @concat_round_v4f64_v2f64(<2 x double> %a0, <2 x double> %a1) {8; SSE-LABEL: concat_round_v4f64_v2f64:9; SSE: # %bb.0:10; SSE-NEXT: movapd {{.*#+}} xmm2 = [-0.0E+0,-0.0E+0]11; SSE-NEXT: movapd %xmm0, %xmm312; SSE-NEXT: andpd %xmm2, %xmm313; SSE-NEXT: movapd {{.*#+}} xmm4 = [4.9999999999999994E-1,4.9999999999999994E-1]14; SSE-NEXT: orpd %xmm4, %xmm315; SSE-NEXT: addpd %xmm0, %xmm316; SSE-NEXT: roundpd $11, %xmm3, %xmm017; SSE-NEXT: andpd %xmm1, %xmm218; SSE-NEXT: orpd %xmm4, %xmm219; SSE-NEXT: addpd %xmm1, %xmm220; SSE-NEXT: roundpd $11, %xmm2, %xmm121; SSE-NEXT: retq22;23; AVX1-LABEL: concat_round_v4f64_v2f64:24; AVX1: # %bb.0:25; AVX1-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm026; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm027; AVX1-NEXT: vandpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm128; AVX1-NEXT: vorpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm129; AVX1-NEXT: vaddpd %ymm1, %ymm0, %ymm030; AVX1-NEXT: vroundpd $11, %ymm0, %ymm031; AVX1-NEXT: retq32;33; AVX2-LABEL: concat_round_v4f64_v2f64:34; AVX2: # %bb.0:35; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm036; AVX2-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm037; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]38; AVX2-NEXT: vandpd %ymm1, %ymm0, %ymm139; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm2 = [4.9999999999999994E-1,4.9999999999999994E-1,4.9999999999999994E-1,4.9999999999999994E-1]40; AVX2-NEXT: vorpd %ymm2, %ymm1, %ymm141; AVX2-NEXT: vaddpd %ymm1, %ymm0, %ymm042; AVX2-NEXT: vroundpd $11, %ymm0, %ymm043; AVX2-NEXT: retq44;45; AVX512-LABEL: concat_round_v4f64_v2f64:46; AVX512: # %bb.0:47; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm048; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm2 = [4.9999999999999994E-1,4.9999999999999994E-1,4.9999999999999994E-1,4.9999999999999994E-1]49; AVX512-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm050; AVX512-NEXT: vpternlogq {{.*#+}} ymm2 = ymm2 | (ymm0 & m64bcst)51; AVX512-NEXT: vaddpd %ymm2, %ymm0, %ymm052; AVX512-NEXT: vroundpd $11, %ymm0, %ymm053; AVX512-NEXT: retq54 %v0 = call <2 x double> @llvm.round.v2f64(<2 x double> %a0)55 %v1 = call <2 x double> @llvm.round.v2f64(<2 x double> %a1)56 %res = shufflevector <2 x double> %v0, <2 x double> %v1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>57 ret <4 x double> %res58}59 60define <8 x float> @concat_round_v8f32_v4f32(<4 x float> %a0, <4 x float> %a1) {61; SSE-LABEL: concat_round_v8f32_v4f32:62; SSE: # %bb.0:63; SSE-NEXT: movaps {{.*#+}} xmm2 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]64; SSE-NEXT: movaps %xmm0, %xmm365; SSE-NEXT: andps %xmm2, %xmm366; SSE-NEXT: movaps {{.*#+}} xmm4 = [4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1]67; SSE-NEXT: orps %xmm4, %xmm368; SSE-NEXT: addps %xmm0, %xmm369; SSE-NEXT: roundps $11, %xmm3, %xmm070; SSE-NEXT: andps %xmm1, %xmm271; SSE-NEXT: orps %xmm4, %xmm272; SSE-NEXT: addps %xmm1, %xmm273; SSE-NEXT: roundps $11, %xmm2, %xmm174; SSE-NEXT: retq75;76; AVX1-LABEL: concat_round_v8f32_v4f32:77; AVX1: # %bb.0:78; AVX1-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm079; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm080; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm181; AVX1-NEXT: vorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm182; AVX1-NEXT: vaddps %ymm1, %ymm0, %ymm083; AVX1-NEXT: vroundps $11, %ymm0, %ymm084; AVX1-NEXT: retq85;86; AVX2-LABEL: concat_round_v8f32_v4f32:87; AVX2: # %bb.0:88; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm089; AVX2-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm090; AVX2-NEXT: vbroadcastss {{.*#+}} ymm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]91; AVX2-NEXT: vandps %ymm1, %ymm0, %ymm192; AVX2-NEXT: vbroadcastss {{.*#+}} ymm2 = [4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1]93; AVX2-NEXT: vorps %ymm2, %ymm1, %ymm194; AVX2-NEXT: vaddps %ymm1, %ymm0, %ymm095; AVX2-NEXT: vroundps $11, %ymm0, %ymm096; AVX2-NEXT: retq97;98; AVX512-LABEL: concat_round_v8f32_v4f32:99; AVX512: # %bb.0:100; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0101; AVX512-NEXT: vpbroadcastd {{.*#+}} ymm2 = [4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1]102; AVX512-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0103; AVX512-NEXT: vpternlogd {{.*#+}} ymm2 = ymm2 | (ymm0 & m32bcst)104; AVX512-NEXT: vaddps %ymm2, %ymm0, %ymm0105; AVX512-NEXT: vroundps $11, %ymm0, %ymm0106; AVX512-NEXT: retq107 %v0 = call <4 x float> @llvm.round.v4f32(<4 x float> %a0)108 %v1 = call <4 x float> @llvm.round.v4f32(<4 x float> %a1)109 %res = shufflevector <4 x float> %v0, <4 x float> %v1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>110 ret <8 x float> %res111}112 113define <8 x double> @concat_round_v8f64_v2f64(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2, <2 x double> %a3) {114; SSE-LABEL: concat_round_v8f64_v2f64:115; SSE: # %bb.0:116; SSE-NEXT: movapd {{.*#+}} xmm4 = [-0.0E+0,-0.0E+0]117; SSE-NEXT: movapd %xmm0, %xmm5118; SSE-NEXT: andpd %xmm4, %xmm5119; SSE-NEXT: movapd {{.*#+}} xmm6 = [4.9999999999999994E-1,4.9999999999999994E-1]120; SSE-NEXT: orpd %xmm6, %xmm5121; SSE-NEXT: addpd %xmm0, %xmm5122; SSE-NEXT: roundpd $11, %xmm5, %xmm0123; SSE-NEXT: movapd %xmm1, %xmm5124; SSE-NEXT: andpd %xmm4, %xmm5125; SSE-NEXT: orpd %xmm6, %xmm5126; SSE-NEXT: addpd %xmm1, %xmm5127; SSE-NEXT: roundpd $11, %xmm5, %xmm1128; SSE-NEXT: movapd %xmm2, %xmm5129; SSE-NEXT: andpd %xmm4, %xmm5130; SSE-NEXT: orpd %xmm6, %xmm5131; SSE-NEXT: addpd %xmm2, %xmm5132; SSE-NEXT: roundpd $11, %xmm5, %xmm2133; SSE-NEXT: andpd %xmm3, %xmm4134; SSE-NEXT: orpd %xmm6, %xmm4135; SSE-NEXT: addpd %xmm3, %xmm4136; SSE-NEXT: roundpd $11, %xmm4, %xmm3137; SSE-NEXT: retq138;139; AVX1-LABEL: concat_round_v8f64_v2f64:140; AVX1: # %bb.0:141; AVX1-NEXT: # kill: def $xmm2 killed $xmm2 def $ymm2142; AVX1-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0143; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0144; AVX1-NEXT: vmovapd {{.*#+}} ymm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]145; AVX1-NEXT: vandpd %ymm1, %ymm0, %ymm4146; AVX1-NEXT: vmovapd {{.*#+}} ymm5 = [4.9999999999999994E-1,4.9999999999999994E-1,4.9999999999999994E-1,4.9999999999999994E-1]147; AVX1-NEXT: vorpd %ymm5, %ymm4, %ymm4148; AVX1-NEXT: vaddpd %ymm4, %ymm0, %ymm0149; AVX1-NEXT: vroundpd $11, %ymm0, %ymm0150; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2151; AVX1-NEXT: vandpd %ymm1, %ymm2, %ymm1152; AVX1-NEXT: vorpd %ymm5, %ymm1, %ymm1153; AVX1-NEXT: vaddpd %ymm1, %ymm2, %ymm1154; AVX1-NEXT: vroundpd $11, %ymm1, %ymm1155; AVX1-NEXT: retq156;157; AVX2-LABEL: concat_round_v8f64_v2f64:158; AVX2: # %bb.0:159; AVX2-NEXT: # kill: def $xmm2 killed $xmm2 def $ymm2160; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0161; AVX2-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0162; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]163; AVX2-NEXT: vandpd %ymm1, %ymm0, %ymm4164; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm5 = [4.9999999999999994E-1,4.9999999999999994E-1,4.9999999999999994E-1,4.9999999999999994E-1]165; AVX2-NEXT: vorpd %ymm5, %ymm4, %ymm4166; AVX2-NEXT: vaddpd %ymm4, %ymm0, %ymm0167; AVX2-NEXT: vroundpd $11, %ymm0, %ymm0168; AVX2-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2169; AVX2-NEXT: vandpd %ymm1, %ymm2, %ymm1170; AVX2-NEXT: vorpd %ymm5, %ymm1, %ymm1171; AVX2-NEXT: vaddpd %ymm1, %ymm2, %ymm1172; AVX2-NEXT: vroundpd $11, %ymm1, %ymm1173; AVX2-NEXT: retq174;175; AVX512-LABEL: concat_round_v8f64_v2f64:176; AVX512: # %bb.0:177; AVX512-NEXT: # kill: def $xmm2 killed $xmm2 def $ymm2178; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0179; AVX512-NEXT: vinserti128 $1, %xmm3, %ymm2, %ymm2180; AVX512-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0181; AVX512-NEXT: vpbroadcastq {{.*#+}} zmm1 = [4.9999999999999994E-1,4.9999999999999994E-1,4.9999999999999994E-1,4.9999999999999994E-1,4.9999999999999994E-1,4.9999999999999994E-1,4.9999999999999994E-1,4.9999999999999994E-1]182; AVX512-NEXT: vinserti64x4 $1, %ymm2, %zmm0, %zmm0183; AVX512-NEXT: vpternlogq {{.*#+}} zmm1 = zmm1 | (zmm0 & m64bcst)184; AVX512-NEXT: vaddpd %zmm1, %zmm0, %zmm0185; AVX512-NEXT: vrndscalepd $11, %zmm0, %zmm0186; AVX512-NEXT: retq187 %v0 = call <2 x double> @llvm.round.v2f64(<2 x double> %a0)188 %v1 = call <2 x double> @llvm.round.v2f64(<2 x double> %a1)189 %v2 = call <2 x double> @llvm.round.v2f64(<2 x double> %a2)190 %v3 = call <2 x double> @llvm.round.v2f64(<2 x double> %a3)191 %r01 = shufflevector <2 x double> %v0, <2 x double> %v1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>192 %r23 = shufflevector <2 x double> %v2, <2 x double> %v3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>193 %res = shufflevector <4 x double> %r01, <4 x double> %r23, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>194 ret <8 x double> %res195}196 197define <16 x float> @concat_round_v16f32_v4f32(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2, <4 x float> %a3) {198; SSE-LABEL: concat_round_v16f32_v4f32:199; SSE: # %bb.0:200; SSE-NEXT: movaps {{.*#+}} xmm4 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]201; SSE-NEXT: movaps %xmm0, %xmm5202; SSE-NEXT: andps %xmm4, %xmm5203; SSE-NEXT: movaps {{.*#+}} xmm6 = [4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1]204; SSE-NEXT: orps %xmm6, %xmm5205; SSE-NEXT: addps %xmm0, %xmm5206; SSE-NEXT: roundps $11, %xmm5, %xmm0207; SSE-NEXT: movaps %xmm1, %xmm5208; SSE-NEXT: andps %xmm4, %xmm5209; SSE-NEXT: orps %xmm6, %xmm5210; SSE-NEXT: addps %xmm1, %xmm5211; SSE-NEXT: roundps $11, %xmm5, %xmm1212; SSE-NEXT: movaps %xmm2, %xmm5213; SSE-NEXT: andps %xmm4, %xmm5214; SSE-NEXT: orps %xmm6, %xmm5215; SSE-NEXT: addps %xmm2, %xmm5216; SSE-NEXT: roundps $11, %xmm5, %xmm2217; SSE-NEXT: andps %xmm3, %xmm4218; SSE-NEXT: orps %xmm6, %xmm4219; SSE-NEXT: addps %xmm3, %xmm4220; SSE-NEXT: roundps $11, %xmm4, %xmm3221; SSE-NEXT: retq222;223; AVX1-LABEL: concat_round_v16f32_v4f32:224; AVX1: # %bb.0:225; AVX1-NEXT: # kill: def $xmm2 killed $xmm2 def $ymm2226; AVX1-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0227; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0228; AVX1-NEXT: vmovaps {{.*#+}} ymm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]229; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm4230; AVX1-NEXT: vmovaps {{.*#+}} ymm5 = [4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1]231; AVX1-NEXT: vorps %ymm5, %ymm4, %ymm4232; AVX1-NEXT: vaddps %ymm4, %ymm0, %ymm0233; AVX1-NEXT: vroundps $11, %ymm0, %ymm0234; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2235; AVX1-NEXT: vandps %ymm1, %ymm2, %ymm1236; AVX1-NEXT: vorps %ymm5, %ymm1, %ymm1237; AVX1-NEXT: vaddps %ymm1, %ymm2, %ymm1238; AVX1-NEXT: vroundps $11, %ymm1, %ymm1239; AVX1-NEXT: retq240;241; AVX2-LABEL: concat_round_v16f32_v4f32:242; AVX2: # %bb.0:243; AVX2-NEXT: # kill: def $xmm2 killed $xmm2 def $ymm2244; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0245; AVX2-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0246; AVX2-NEXT: vbroadcastss {{.*#+}} ymm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]247; AVX2-NEXT: vandps %ymm1, %ymm0, %ymm4248; AVX2-NEXT: vbroadcastss {{.*#+}} ymm5 = [4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1]249; AVX2-NEXT: vorps %ymm5, %ymm4, %ymm4250; AVX2-NEXT: vaddps %ymm4, %ymm0, %ymm0251; AVX2-NEXT: vroundps $11, %ymm0, %ymm0252; AVX2-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2253; AVX2-NEXT: vandps %ymm1, %ymm2, %ymm1254; AVX2-NEXT: vorps %ymm5, %ymm1, %ymm1255; AVX2-NEXT: vaddps %ymm1, %ymm2, %ymm1256; AVX2-NEXT: vroundps $11, %ymm1, %ymm1257; AVX2-NEXT: retq258;259; AVX512-LABEL: concat_round_v16f32_v4f32:260; AVX512: # %bb.0:261; AVX512-NEXT: # kill: def $xmm2 killed $xmm2 def $ymm2262; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0263; AVX512-NEXT: vinserti128 $1, %xmm3, %ymm2, %ymm2264; AVX512-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0265; AVX512-NEXT: vpbroadcastd {{.*#+}} zmm1 = [4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1]266; AVX512-NEXT: vinserti64x4 $1, %ymm2, %zmm0, %zmm0267; AVX512-NEXT: vpternlogd {{.*#+}} zmm1 = zmm1 | (zmm0 & m32bcst)268; AVX512-NEXT: vaddps %zmm1, %zmm0, %zmm0269; AVX512-NEXT: vrndscaleps $11, %zmm0, %zmm0270; AVX512-NEXT: retq271 %v0 = call <4 x float> @llvm.round.v4f32(<4 x float> %a0)272 %v1 = call <4 x float> @llvm.round.v4f32(<4 x float> %a1)273 %v2 = call <4 x float> @llvm.round.v4f32(<4 x float> %a2)274 %v3 = call <4 x float> @llvm.round.v4f32(<4 x float> %a3)275 %r01 = shufflevector <4 x float> %v0, <4 x float> %v1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>276 %r23 = shufflevector <4 x float> %v2, <4 x float> %v3, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>277 %res = shufflevector <8 x float> %r01, <8 x float> %r23, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>278 ret <16 x float> %res279}280 281define <8 x double> @concat_round_v8f64_v4f64(<4 x double> %a0, <4 x double> %a1) {282; SSE-LABEL: concat_round_v8f64_v4f64:283; SSE: # %bb.0:284; SSE-NEXT: movapd {{.*#+}} xmm4 = [-0.0E+0,-0.0E+0]285; SSE-NEXT: movapd %xmm0, %xmm5286; SSE-NEXT: andpd %xmm4, %xmm5287; SSE-NEXT: movapd {{.*#+}} xmm6 = [4.9999999999999994E-1,4.9999999999999994E-1]288; SSE-NEXT: orpd %xmm6, %xmm5289; SSE-NEXT: addpd %xmm0, %xmm5290; SSE-NEXT: roundpd $11, %xmm5, %xmm0291; SSE-NEXT: movapd %xmm1, %xmm5292; SSE-NEXT: andpd %xmm4, %xmm5293; SSE-NEXT: orpd %xmm6, %xmm5294; SSE-NEXT: addpd %xmm1, %xmm5295; SSE-NEXT: roundpd $11, %xmm5, %xmm1296; SSE-NEXT: movapd %xmm2, %xmm5297; SSE-NEXT: andpd %xmm4, %xmm5298; SSE-NEXT: orpd %xmm6, %xmm5299; SSE-NEXT: addpd %xmm2, %xmm5300; SSE-NEXT: roundpd $11, %xmm5, %xmm2301; SSE-NEXT: andpd %xmm3, %xmm4302; SSE-NEXT: orpd %xmm6, %xmm4303; SSE-NEXT: addpd %xmm3, %xmm4304; SSE-NEXT: roundpd $11, %xmm4, %xmm3305; SSE-NEXT: retq306;307; AVX1-LABEL: concat_round_v8f64_v4f64:308; AVX1: # %bb.0:309; AVX1-NEXT: vmovapd {{.*#+}} ymm2 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]310; AVX1-NEXT: vandpd %ymm2, %ymm0, %ymm3311; AVX1-NEXT: vmovapd {{.*#+}} ymm4 = [4.9999999999999994E-1,4.9999999999999994E-1,4.9999999999999994E-1,4.9999999999999994E-1]312; AVX1-NEXT: vorpd %ymm4, %ymm3, %ymm3313; AVX1-NEXT: vaddpd %ymm3, %ymm0, %ymm0314; AVX1-NEXT: vroundpd $11, %ymm0, %ymm0315; AVX1-NEXT: vandpd %ymm2, %ymm1, %ymm2316; AVX1-NEXT: vorpd %ymm4, %ymm2, %ymm2317; AVX1-NEXT: vaddpd %ymm2, %ymm1, %ymm1318; AVX1-NEXT: vroundpd $11, %ymm1, %ymm1319; AVX1-NEXT: retq320;321; AVX2-LABEL: concat_round_v8f64_v4f64:322; AVX2: # %bb.0:323; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm2 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]324; AVX2-NEXT: vandpd %ymm2, %ymm0, %ymm3325; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm4 = [4.9999999999999994E-1,4.9999999999999994E-1,4.9999999999999994E-1,4.9999999999999994E-1]326; AVX2-NEXT: vorpd %ymm4, %ymm3, %ymm3327; AVX2-NEXT: vaddpd %ymm3, %ymm0, %ymm0328; AVX2-NEXT: vroundpd $11, %ymm0, %ymm0329; AVX2-NEXT: vandpd %ymm2, %ymm1, %ymm2330; AVX2-NEXT: vorpd %ymm4, %ymm2, %ymm2331; AVX2-NEXT: vaddpd %ymm2, %ymm1, %ymm1332; AVX2-NEXT: vroundpd $11, %ymm1, %ymm1333; AVX2-NEXT: retq334;335; AVX512-LABEL: concat_round_v8f64_v4f64:336; AVX512: # %bb.0:337; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0338; AVX512-NEXT: vpbroadcastq {{.*#+}} zmm2 = [4.9999999999999994E-1,4.9999999999999994E-1,4.9999999999999994E-1,4.9999999999999994E-1,4.9999999999999994E-1,4.9999999999999994E-1,4.9999999999999994E-1,4.9999999999999994E-1]339; AVX512-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0340; AVX512-NEXT: vpternlogq {{.*#+}} zmm2 = zmm2 | (zmm0 & m64bcst)341; AVX512-NEXT: vaddpd %zmm2, %zmm0, %zmm0342; AVX512-NEXT: vrndscalepd $11, %zmm0, %zmm0343; AVX512-NEXT: retq344 %v0 = call <4 x double> @llvm.round.v4f64(<4 x double> %a0)345 %v1 = call <4 x double> @llvm.round.v4f64(<4 x double> %a1)346 %res = shufflevector <4 x double> %v0, <4 x double> %v1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>347 ret <8 x double> %res348}349 350define <16 x float> @concat_round_v16f32_v8f32(<8 x float> %a0, <8 x float> %a1) {351; SSE-LABEL: concat_round_v16f32_v8f32:352; SSE: # %bb.0:353; SSE-NEXT: movaps {{.*#+}} xmm4 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]354; SSE-NEXT: movaps %xmm0, %xmm5355; SSE-NEXT: andps %xmm4, %xmm5356; SSE-NEXT: movaps {{.*#+}} xmm6 = [4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1]357; SSE-NEXT: orps %xmm6, %xmm5358; SSE-NEXT: addps %xmm0, %xmm5359; SSE-NEXT: roundps $11, %xmm5, %xmm0360; SSE-NEXT: movaps %xmm1, %xmm5361; SSE-NEXT: andps %xmm4, %xmm5362; SSE-NEXT: orps %xmm6, %xmm5363; SSE-NEXT: addps %xmm1, %xmm5364; SSE-NEXT: roundps $11, %xmm5, %xmm1365; SSE-NEXT: movaps %xmm2, %xmm5366; SSE-NEXT: andps %xmm4, %xmm5367; SSE-NEXT: orps %xmm6, %xmm5368; SSE-NEXT: addps %xmm2, %xmm5369; SSE-NEXT: roundps $11, %xmm5, %xmm2370; SSE-NEXT: andps %xmm3, %xmm4371; SSE-NEXT: orps %xmm6, %xmm4372; SSE-NEXT: addps %xmm3, %xmm4373; SSE-NEXT: roundps $11, %xmm4, %xmm3374; SSE-NEXT: retq375;376; AVX1-LABEL: concat_round_v16f32_v8f32:377; AVX1: # %bb.0:378; AVX1-NEXT: vmovaps {{.*#+}} ymm2 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]379; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm3380; AVX1-NEXT: vmovaps {{.*#+}} ymm4 = [4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1]381; AVX1-NEXT: vorps %ymm4, %ymm3, %ymm3382; AVX1-NEXT: vaddps %ymm3, %ymm0, %ymm0383; AVX1-NEXT: vroundps $11, %ymm0, %ymm0384; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm2385; AVX1-NEXT: vorps %ymm4, %ymm2, %ymm2386; AVX1-NEXT: vaddps %ymm2, %ymm1, %ymm1387; AVX1-NEXT: vroundps $11, %ymm1, %ymm1388; AVX1-NEXT: retq389;390; AVX2-LABEL: concat_round_v16f32_v8f32:391; AVX2: # %bb.0:392; AVX2-NEXT: vbroadcastss {{.*#+}} ymm2 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]393; AVX2-NEXT: vandps %ymm2, %ymm0, %ymm3394; AVX2-NEXT: vbroadcastss {{.*#+}} ymm4 = [4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1]395; AVX2-NEXT: vorps %ymm4, %ymm3, %ymm3396; AVX2-NEXT: vaddps %ymm3, %ymm0, %ymm0397; AVX2-NEXT: vroundps $11, %ymm0, %ymm0398; AVX2-NEXT: vandps %ymm2, %ymm1, %ymm2399; AVX2-NEXT: vorps %ymm4, %ymm2, %ymm2400; AVX2-NEXT: vaddps %ymm2, %ymm1, %ymm1401; AVX2-NEXT: vroundps $11, %ymm1, %ymm1402; AVX2-NEXT: retq403;404; AVX512-LABEL: concat_round_v16f32_v8f32:405; AVX512: # %bb.0:406; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0407; AVX512-NEXT: vpbroadcastd {{.*#+}} zmm2 = [4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1]408; AVX512-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0409; AVX512-NEXT: vpternlogd {{.*#+}} zmm2 = zmm2 | (zmm0 & m32bcst)410; AVX512-NEXT: vaddps %zmm2, %zmm0, %zmm0411; AVX512-NEXT: vrndscaleps $11, %zmm0, %zmm0412; AVX512-NEXT: retq413 %v0 = call <8 x float> @llvm.round.v8f32(<8 x float> %a0)414 %v1 = call <8 x float> @llvm.round.v8f32(<8 x float> %a1)415 %res = shufflevector <8 x float> %v0, <8 x float> %v1, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>416 ret <16 x float> %res417}418;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:419; AVX: {{.*}}420