772 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=X86,X86-SSE3; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=X86,X86-AVX,X86-AVX1OR2,X86-AVX14; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=X86,X86-AVX,X86-AVX1OR2,X86-AVX25; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx512vl | FileCheck %s --check-prefixes=X86,X86-AVX,X86-AVX512,X86-AVX512VL6; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx512fp16,+avx512vl | FileCheck %s --check-prefixes=X86,X86-AVX,X86-AVX512,X86-AVX512FP167; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx512dq,+avx512vl | FileCheck %s --check-prefixes=X86,X86-AVX,X86-AVX512,X86-AVX512VLDQ8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=X64,X64-SSE9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX1OR2,X64-AVX110; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX1OR2,X64-AVX211; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX512,X64-AVX512VL12; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512fp16,+avx512vl | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX512,X64-AVX512FP1613; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+avx512vl | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX512,X64-AVX512VLDQ14 15;16; 128-bit Vectors17;18 19define <2 x double> @fcopysign_v2f64(<2 x double> %a0, <2 x double> %a1) nounwind {20; X86-SSE-LABEL: fcopysign_v2f64:21; X86-SSE: # %bb.0:22; X86-SSE-NEXT: andps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm123; X86-SSE-NEXT: andps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm024; X86-SSE-NEXT: orps %xmm1, %xmm025; X86-SSE-NEXT: retl26;27; X86-AVX1OR2-LABEL: fcopysign_v2f64:28; X86-AVX1OR2: # %bb.0:29; X86-AVX1OR2-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm130; X86-AVX1OR2-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm031; X86-AVX1OR2-NEXT: vorps %xmm1, %xmm0, %xmm032; X86-AVX1OR2-NEXT: retl33;34; X86-AVX512-LABEL: fcopysign_v2f64:35; X86-AVX512: # %bb.0:36; X86-AVX512-NEXT: vpternlogq $228, {{\.?LCPI[0-9]+_[0-9]+}}{1to2}, %xmm1, %xmm037; X86-AVX512-NEXT: retl38;39; X64-SSE-LABEL: fcopysign_v2f64:40; X64-SSE: # %bb.0:41; X64-SSE-NEXT: andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm142; X64-SSE-NEXT: andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm043; X64-SSE-NEXT: orps %xmm1, %xmm044; X64-SSE-NEXT: retq45;46; X64-AVX1OR2-LABEL: fcopysign_v2f64:47; X64-AVX1OR2: # %bb.0:48; X64-AVX1OR2-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm149; X64-AVX1OR2-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm050; X64-AVX1OR2-NEXT: vorps %xmm1, %xmm0, %xmm051; X64-AVX1OR2-NEXT: retq52;53; X64-AVX512-LABEL: fcopysign_v2f64:54; X64-AVX512: # %bb.0:55; X64-AVX512-NEXT: vpternlogq $228, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm1, %xmm056; X64-AVX512-NEXT: retq57 %t = call <2 x double> @llvm.copysign.v2f64(<2 x double> %a0, <2 x double> %a1)58 ret <2 x double> %t59}60declare <2 x double> @llvm.copysign.v2f64(<2 x double>, <2 x double>)61 62define <4 x float> @fcopysign_v4f32(<4 x float> %a0, <4 x float> %a1) nounwind {63; X86-SSE-LABEL: fcopysign_v4f32:64; X86-SSE: # %bb.0:65; X86-SSE-NEXT: andps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm166; X86-SSE-NEXT: andps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm067; X86-SSE-NEXT: orps %xmm1, %xmm068; X86-SSE-NEXT: retl69;70; X86-AVX1-LABEL: fcopysign_v4f32:71; X86-AVX1: # %bb.0:72; X86-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm173; X86-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm074; X86-AVX1-NEXT: vorps %xmm1, %xmm0, %xmm075; X86-AVX1-NEXT: retl76;77; X86-AVX2-LABEL: fcopysign_v4f32:78; X86-AVX2: # %bb.0:79; X86-AVX2-NEXT: vbroadcastss {{.*#+}} xmm2 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]80; X86-AVX2-NEXT: vandps %xmm2, %xmm1, %xmm181; X86-AVX2-NEXT: vbroadcastss {{.*#+}} xmm2 = [NaN,NaN,NaN,NaN]82; X86-AVX2-NEXT: vandps %xmm2, %xmm0, %xmm083; X86-AVX2-NEXT: vorps %xmm1, %xmm0, %xmm084; X86-AVX2-NEXT: retl85;86; X86-AVX512-LABEL: fcopysign_v4f32:87; X86-AVX512: # %bb.0:88; X86-AVX512-NEXT: vpternlogd $228, {{\.?LCPI[0-9]+_[0-9]+}}{1to4}, %xmm1, %xmm089; X86-AVX512-NEXT: retl90;91; X64-SSE-LABEL: fcopysign_v4f32:92; X64-SSE: # %bb.0:93; X64-SSE-NEXT: andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm194; X64-SSE-NEXT: andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm095; X64-SSE-NEXT: orps %xmm1, %xmm096; X64-SSE-NEXT: retq97;98; X64-AVX1-LABEL: fcopysign_v4f32:99; X64-AVX1: # %bb.0:100; X64-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1101; X64-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0102; X64-AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0103; X64-AVX1-NEXT: retq104;105; X64-AVX2-LABEL: fcopysign_v4f32:106; X64-AVX2: # %bb.0:107; X64-AVX2-NEXT: vbroadcastss {{.*#+}} xmm2 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]108; X64-AVX2-NEXT: vandps %xmm2, %xmm1, %xmm1109; X64-AVX2-NEXT: vbroadcastss {{.*#+}} xmm2 = [NaN,NaN,NaN,NaN]110; X64-AVX2-NEXT: vandps %xmm2, %xmm0, %xmm0111; X64-AVX2-NEXT: vorps %xmm1, %xmm0, %xmm0112; X64-AVX2-NEXT: retq113;114; X64-AVX512-LABEL: fcopysign_v4f32:115; X64-AVX512: # %bb.0:116; X64-AVX512-NEXT: vpternlogd $228, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm0117; X64-AVX512-NEXT: retq118 %t = call <4 x float> @llvm.copysign.v4f32(<4 x float> %a0, <4 x float> %a1)119 ret <4 x float> %t120}121declare <4 x float> @llvm.copysign.v4f32(<4 x float>, <4 x float>)122 123define <8 x half> @fcopysign_v8f16(ptr %p0, ptr %p1) nounwind {124; X86-SSE-LABEL: fcopysign_v8f16:125; X86-SSE: # %bb.0:126; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax127; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx128; X86-SSE-NEXT: movaps (%ecx), %xmm0129; X86-SSE-NEXT: movaps (%eax), %xmm1130; X86-SSE-NEXT: andps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1131; X86-SSE-NEXT: andps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0132; X86-SSE-NEXT: orps %xmm1, %xmm0133; X86-SSE-NEXT: retl134;135; X86-AVX1-LABEL: fcopysign_v8f16:136; X86-AVX1: # %bb.0:137; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax138; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %ecx139; X86-AVX1-NEXT: vmovaps (%ecx), %xmm0140; X86-AVX1-NEXT: vmovaps (%eax), %xmm1141; X86-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1142; X86-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0143; X86-AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0144; X86-AVX1-NEXT: retl145;146; X86-AVX2-LABEL: fcopysign_v8f16:147; X86-AVX2: # %bb.0:148; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax149; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx150; X86-AVX2-NEXT: vpbroadcastw {{.*#+}} xmm0 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]151; X86-AVX2-NEXT: vpand (%ecx), %xmm0, %xmm0152; X86-AVX2-NEXT: vpbroadcastw {{.*#+}} xmm1 = [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]153; X86-AVX2-NEXT: vpand (%eax), %xmm1, %xmm1154; X86-AVX2-NEXT: vpor %xmm0, %xmm1, %xmm0155; X86-AVX2-NEXT: retl156;157; X86-AVX512-LABEL: fcopysign_v8f16:158; X86-AVX512: # %bb.0:159; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax160; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %ecx161; X86-AVX512-NEXT: vmovdqa (%ecx), %xmm1162; X86-AVX512-NEXT: vpbroadcastd {{.*#+}} xmm0 = [2147450879,2147450879,2147450879,2147450879]163; X86-AVX512-NEXT: vpternlogd $202, (%eax), %xmm1, %xmm0164; X86-AVX512-NEXT: retl165;166; X64-SSE-LABEL: fcopysign_v8f16:167; X64-SSE: # %bb.0:168; X64-SSE-NEXT: movaps (%rdi), %xmm0169; X64-SSE-NEXT: movaps (%rsi), %xmm1170; X64-SSE-NEXT: andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1171; X64-SSE-NEXT: andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0172; X64-SSE-NEXT: orps %xmm1, %xmm0173; X64-SSE-NEXT: retq174;175; X64-AVX1-LABEL: fcopysign_v8f16:176; X64-AVX1: # %bb.0:177; X64-AVX1-NEXT: vmovaps (%rdi), %xmm0178; X64-AVX1-NEXT: vmovaps (%rsi), %xmm1179; X64-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1180; X64-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0181; X64-AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0182; X64-AVX1-NEXT: retq183;184; X64-AVX2-LABEL: fcopysign_v8f16:185; X64-AVX2: # %bb.0:186; X64-AVX2-NEXT: vpbroadcastw {{.*#+}} xmm0 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]187; X64-AVX2-NEXT: vpand (%rsi), %xmm0, %xmm0188; X64-AVX2-NEXT: vpbroadcastw {{.*#+}} xmm1 = [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]189; X64-AVX2-NEXT: vpand (%rdi), %xmm1, %xmm1190; X64-AVX2-NEXT: vpor %xmm0, %xmm1, %xmm0191; X64-AVX2-NEXT: retq192;193; X64-AVX512-LABEL: fcopysign_v8f16:194; X64-AVX512: # %bb.0:195; X64-AVX512-NEXT: vmovdqa (%rdi), %xmm1196; X64-AVX512-NEXT: vpbroadcastd {{.*#+}} xmm0 = [2147450879,2147450879,2147450879,2147450879]197; X64-AVX512-NEXT: vpternlogd $202, (%rsi), %xmm1, %xmm0198; X64-AVX512-NEXT: retq199 %a0 = load <8 x half>, ptr %p0, align 16200 %a1 = load <8 x half>, ptr %p1, align 16201 %t = call <8 x half> @llvm.copysign.v8f16(<8 x half> %a0, <8 x half> %a1)202 ret <8 x half> %t203}204declare <8 x half> @llvm.copysign.v8f16(<8 x half>, <8 x half>)205 206;207; 256-bit Vectors208;209 210define <4 x double> @fcopysign_v4f64(<4 x double> %a0, <4 x double> %a1) nounwind {211; X86-SSE-LABEL: fcopysign_v4f64:212; X86-SSE: # %bb.0:213; X86-SSE-NEXT: pushl %ebp214; X86-SSE-NEXT: movl %esp, %ebp215; X86-SSE-NEXT: andl $-16, %esp216; X86-SSE-NEXT: subl $16, %esp217; X86-SSE-NEXT: movaps {{.*#+}} xmm3 = [NaN,NaN]218; X86-SSE-NEXT: movaps %xmm3, %xmm4219; X86-SSE-NEXT: andnps %xmm2, %xmm4220; X86-SSE-NEXT: andps %xmm3, %xmm0221; X86-SSE-NEXT: orps %xmm4, %xmm0222; X86-SSE-NEXT: andps %xmm3, %xmm1223; X86-SSE-NEXT: andnps 8(%ebp), %xmm3224; X86-SSE-NEXT: orps %xmm3, %xmm1225; X86-SSE-NEXT: movl %ebp, %esp226; X86-SSE-NEXT: popl %ebp227; X86-SSE-NEXT: retl228;229; X86-AVX1-LABEL: fcopysign_v4f64:230; X86-AVX1: # %bb.0:231; X86-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}, %ymm1, %ymm1232; X86-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm0233; X86-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0234; X86-AVX1-NEXT: retl235;236; X86-AVX2-LABEL: fcopysign_v4f64:237; X86-AVX2: # %bb.0:238; X86-AVX2-NEXT: vbroadcastsd {{.*#+}} ymm2 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]239; X86-AVX2-NEXT: vandps %ymm2, %ymm1, %ymm1240; X86-AVX2-NEXT: vbroadcastsd {{.*#+}} ymm2 = [NaN,NaN,NaN,NaN]241; X86-AVX2-NEXT: vandps %ymm2, %ymm0, %ymm0242; X86-AVX2-NEXT: vorps %ymm1, %ymm0, %ymm0243; X86-AVX2-NEXT: retl244;245; X86-AVX512-LABEL: fcopysign_v4f64:246; X86-AVX512: # %bb.0:247; X86-AVX512-NEXT: vpternlogq $228, {{\.?LCPI[0-9]+_[0-9]+}}{1to4}, %ymm1, %ymm0248; X86-AVX512-NEXT: retl249;250; X64-SSE-LABEL: fcopysign_v4f64:251; X64-SSE: # %bb.0:252; X64-SSE-NEXT: movaps {{.*#+}} xmm4 = [NaN,NaN]253; X64-SSE-NEXT: movaps %xmm4, %xmm5254; X64-SSE-NEXT: andnps %xmm2, %xmm5255; X64-SSE-NEXT: andps %xmm4, %xmm0256; X64-SSE-NEXT: orps %xmm5, %xmm0257; X64-SSE-NEXT: andps %xmm4, %xmm1258; X64-SSE-NEXT: andnps %xmm3, %xmm4259; X64-SSE-NEXT: orps %xmm4, %xmm1260; X64-SSE-NEXT: retq261;262; X64-AVX1-LABEL: fcopysign_v4f64:263; X64-AVX1: # %bb.0:264; X64-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1265; X64-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0266; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0267; X64-AVX1-NEXT: retq268;269; X64-AVX2-LABEL: fcopysign_v4f64:270; X64-AVX2: # %bb.0:271; X64-AVX2-NEXT: vbroadcastsd {{.*#+}} ymm2 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]272; X64-AVX2-NEXT: vandps %ymm2, %ymm1, %ymm1273; X64-AVX2-NEXT: vbroadcastsd {{.*#+}} ymm2 = [NaN,NaN,NaN,NaN]274; X64-AVX2-NEXT: vandps %ymm2, %ymm0, %ymm0275; X64-AVX2-NEXT: vorps %ymm1, %ymm0, %ymm0276; X64-AVX2-NEXT: retq277;278; X64-AVX512-LABEL: fcopysign_v4f64:279; X64-AVX512: # %bb.0:280; X64-AVX512-NEXT: vpternlogq $228, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm1, %ymm0281; X64-AVX512-NEXT: retq282 %t = call <4 x double> @llvm.copysign.v4f64(<4 x double> %a0, <4 x double> %a1)283 ret <4 x double> %t284}285declare <4 x double> @llvm.copysign.v4f64(<4 x double>, <4 x double>)286 287define <8 x float> @fcopysign_v8f32(<8 x float> %a0, <8 x float> %a1) nounwind {288; X86-SSE-LABEL: fcopysign_v8f32:289; X86-SSE: # %bb.0:290; X86-SSE-NEXT: pushl %ebp291; X86-SSE-NEXT: movl %esp, %ebp292; X86-SSE-NEXT: andl $-16, %esp293; X86-SSE-NEXT: subl $16, %esp294; X86-SSE-NEXT: movaps {{.*#+}} xmm3 = [NaN,NaN,NaN,NaN]295; X86-SSE-NEXT: movaps %xmm3, %xmm4296; X86-SSE-NEXT: andnps %xmm2, %xmm4297; X86-SSE-NEXT: andps %xmm3, %xmm0298; X86-SSE-NEXT: orps %xmm4, %xmm0299; X86-SSE-NEXT: andps %xmm3, %xmm1300; X86-SSE-NEXT: andnps 8(%ebp), %xmm3301; X86-SSE-NEXT: orps %xmm3, %xmm1302; X86-SSE-NEXT: movl %ebp, %esp303; X86-SSE-NEXT: popl %ebp304; X86-SSE-NEXT: retl305;306; X86-AVX1-LABEL: fcopysign_v8f32:307; X86-AVX1: # %bb.0:308; X86-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}, %ymm1, %ymm1309; X86-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm0310; X86-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0311; X86-AVX1-NEXT: retl312;313; X86-AVX2-LABEL: fcopysign_v8f32:314; X86-AVX2: # %bb.0:315; X86-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]316; X86-AVX2-NEXT: vandps %ymm2, %ymm1, %ymm1317; X86-AVX2-NEXT: vbroadcastss {{.*#+}} ymm2 = [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]318; X86-AVX2-NEXT: vandps %ymm2, %ymm0, %ymm0319; X86-AVX2-NEXT: vorps %ymm1, %ymm0, %ymm0320; X86-AVX2-NEXT: retl321;322; X86-AVX512-LABEL: fcopysign_v8f32:323; X86-AVX512: # %bb.0:324; X86-AVX512-NEXT: vpternlogd $228, {{\.?LCPI[0-9]+_[0-9]+}}{1to8}, %ymm1, %ymm0325; X86-AVX512-NEXT: retl326;327; X64-SSE-LABEL: fcopysign_v8f32:328; X64-SSE: # %bb.0:329; X64-SSE-NEXT: movaps {{.*#+}} xmm4 = [NaN,NaN,NaN,NaN]330; X64-SSE-NEXT: movaps %xmm4, %xmm5331; X64-SSE-NEXT: andnps %xmm2, %xmm5332; X64-SSE-NEXT: andps %xmm4, %xmm0333; X64-SSE-NEXT: orps %xmm5, %xmm0334; X64-SSE-NEXT: andps %xmm4, %xmm1335; X64-SSE-NEXT: andnps %xmm3, %xmm4336; X64-SSE-NEXT: orps %xmm4, %xmm1337; X64-SSE-NEXT: retq338;339; X64-AVX1-LABEL: fcopysign_v8f32:340; X64-AVX1: # %bb.0:341; X64-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1342; X64-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0343; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0344; X64-AVX1-NEXT: retq345;346; X64-AVX2-LABEL: fcopysign_v8f32:347; X64-AVX2: # %bb.0:348; X64-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]349; X64-AVX2-NEXT: vandps %ymm2, %ymm1, %ymm1350; X64-AVX2-NEXT: vbroadcastss {{.*#+}} ymm2 = [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]351; X64-AVX2-NEXT: vandps %ymm2, %ymm0, %ymm0352; X64-AVX2-NEXT: vorps %ymm1, %ymm0, %ymm0353; X64-AVX2-NEXT: retq354;355; X64-AVX512-LABEL: fcopysign_v8f32:356; X64-AVX512: # %bb.0:357; X64-AVX512-NEXT: vpternlogd $228, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm0358; X64-AVX512-NEXT: retq359 %t = call <8 x float> @llvm.copysign.v8f32(<8 x float> %a0, <8 x float> %a1)360 ret <8 x float> %t361}362declare <8 x float> @llvm.copysign.v8f32(<8 x float>, <8 x float>)363 364define <16 x half> @fcopysign_v16f16(ptr %p0, ptr %p1) nounwind {365; X86-SSE-LABEL: fcopysign_v16f16:366; X86-SSE: # %bb.0:367; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax368; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx369; X86-SSE-NEXT: movaps {{.*#+}} xmm1 = [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]370; X86-SSE-NEXT: movaps %xmm1, %xmm2371; X86-SSE-NEXT: andnps (%ecx), %xmm2372; X86-SSE-NEXT: movaps (%eax), %xmm0373; X86-SSE-NEXT: andps %xmm1, %xmm0374; X86-SSE-NEXT: orps %xmm2, %xmm0375; X86-SSE-NEXT: movaps %xmm1, %xmm2376; X86-SSE-NEXT: andnps 16(%ecx), %xmm2377; X86-SSE-NEXT: andps 16(%eax), %xmm1378; X86-SSE-NEXT: orps %xmm2, %xmm1379; X86-SSE-NEXT: retl380;381; X86-AVX1-LABEL: fcopysign_v16f16:382; X86-AVX1: # %bb.0:383; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax384; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %ecx385; X86-AVX1-NEXT: vmovups (%ecx), %ymm0386; X86-AVX1-NEXT: vmovups (%eax), %ymm1387; X86-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}, %ymm1, %ymm1388; X86-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm0389; X86-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0390; X86-AVX1-NEXT: retl391;392; X86-AVX2-LABEL: fcopysign_v16f16:393; X86-AVX2: # %bb.0:394; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax395; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx396; X86-AVX2-NEXT: vpbroadcastw {{.*#+}} ymm0 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]397; X86-AVX2-NEXT: vpand (%ecx), %ymm0, %ymm0398; X86-AVX2-NEXT: vpbroadcastw {{.*#+}} ymm1 = [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]399; X86-AVX2-NEXT: vpand (%eax), %ymm1, %ymm1400; X86-AVX2-NEXT: vpor %ymm0, %ymm1, %ymm0401; X86-AVX2-NEXT: retl402;403; X86-AVX512-LABEL: fcopysign_v16f16:404; X86-AVX512: # %bb.0:405; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax406; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %ecx407; X86-AVX512-NEXT: vmovdqu (%ecx), %ymm1408; X86-AVX512-NEXT: vpbroadcastd {{.*#+}} ymm0 = [2147450879,2147450879,2147450879,2147450879,2147450879,2147450879,2147450879,2147450879]409; X86-AVX512-NEXT: vpternlogd $202, (%eax), %ymm1, %ymm0410; X86-AVX512-NEXT: retl411;412; X64-SSE-LABEL: fcopysign_v16f16:413; X64-SSE: # %bb.0:414; X64-SSE-NEXT: movaps {{.*#+}} xmm1 = [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]415; X64-SSE-NEXT: movaps %xmm1, %xmm2416; X64-SSE-NEXT: andnps (%rsi), %xmm2417; X64-SSE-NEXT: movaps (%rdi), %xmm0418; X64-SSE-NEXT: andps %xmm1, %xmm0419; X64-SSE-NEXT: orps %xmm2, %xmm0420; X64-SSE-NEXT: movaps %xmm1, %xmm2421; X64-SSE-NEXT: andnps 16(%rsi), %xmm2422; X64-SSE-NEXT: andps 16(%rdi), %xmm1423; X64-SSE-NEXT: orps %xmm2, %xmm1424; X64-SSE-NEXT: retq425;426; X64-AVX1-LABEL: fcopysign_v16f16:427; X64-AVX1: # %bb.0:428; X64-AVX1-NEXT: vmovups (%rdi), %ymm0429; X64-AVX1-NEXT: vmovups (%rsi), %ymm1430; X64-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1431; X64-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0432; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0433; X64-AVX1-NEXT: retq434;435; X64-AVX2-LABEL: fcopysign_v16f16:436; X64-AVX2: # %bb.0:437; X64-AVX2-NEXT: vpbroadcastw {{.*#+}} ymm0 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]438; X64-AVX2-NEXT: vpand (%rsi), %ymm0, %ymm0439; X64-AVX2-NEXT: vpbroadcastw {{.*#+}} ymm1 = [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]440; X64-AVX2-NEXT: vpand (%rdi), %ymm1, %ymm1441; X64-AVX2-NEXT: vpor %ymm0, %ymm1, %ymm0442; X64-AVX2-NEXT: retq443;444; X64-AVX512-LABEL: fcopysign_v16f16:445; X64-AVX512: # %bb.0:446; X64-AVX512-NEXT: vmovdqu (%rdi), %ymm1447; X64-AVX512-NEXT: vpbroadcastd {{.*#+}} ymm0 = [2147450879,2147450879,2147450879,2147450879,2147450879,2147450879,2147450879,2147450879]448; X64-AVX512-NEXT: vpternlogd $202, (%rsi), %ymm1, %ymm0449; X64-AVX512-NEXT: retq450 %a0 = load <16 x half>, ptr %p0, align 16451 %a1 = load <16 x half>, ptr %p1, align 16452 %t = call <16 x half> @llvm.copysign.v16f16(<16 x half> %a0, <16 x half> %a1)453 ret <16 x half> %t454}455declare <16 x half> @llvm.copysign.v16f16(<16 x half>, <16 x half>)456 457;458; 512-bit Vectors459;460 461define <8 x double> @fcopysign_v8f64(<8 x double> %a0, <8 x double> %a1) nounwind {462; X86-SSE-LABEL: fcopysign_v8f64:463; X86-SSE: # %bb.0:464; X86-SSE-NEXT: pushl %ebp465; X86-SSE-NEXT: movl %esp, %ebp466; X86-SSE-NEXT: andl $-16, %esp467; X86-SSE-NEXT: subl $16, %esp468; X86-SSE-NEXT: movaps {{.*#+}} xmm3 = [NaN,NaN]469; X86-SSE-NEXT: andps %xmm3, %xmm0470; X86-SSE-NEXT: movaps %xmm3, %xmm4471; X86-SSE-NEXT: andnps 24(%ebp), %xmm4472; X86-SSE-NEXT: orps %xmm4, %xmm0473; X86-SSE-NEXT: andps %xmm3, %xmm1474; X86-SSE-NEXT: movaps %xmm3, %xmm4475; X86-SSE-NEXT: andnps 40(%ebp), %xmm4476; X86-SSE-NEXT: orps %xmm4, %xmm1477; X86-SSE-NEXT: andps %xmm3, %xmm2478; X86-SSE-NEXT: movaps %xmm3, %xmm4479; X86-SSE-NEXT: andnps 56(%ebp), %xmm4480; X86-SSE-NEXT: orps %xmm4, %xmm2481; X86-SSE-NEXT: movaps %xmm3, %xmm4482; X86-SSE-NEXT: andnps 72(%ebp), %xmm4483; X86-SSE-NEXT: andps 8(%ebp), %xmm3484; X86-SSE-NEXT: orps %xmm4, %xmm3485; X86-SSE-NEXT: movl %ebp, %esp486; X86-SSE-NEXT: popl %ebp487; X86-SSE-NEXT: retl488;489; X86-AVX1OR2-LABEL: fcopysign_v8f64:490; X86-AVX1OR2: # %bb.0:491; X86-AVX1OR2-NEXT: pushl %ebp492; X86-AVX1OR2-NEXT: movl %esp, %ebp493; X86-AVX1OR2-NEXT: andl $-32, %esp494; X86-AVX1OR2-NEXT: subl $32, %esp495; X86-AVX1OR2-NEXT: vbroadcastsd {{.*#+}} ymm3 = [NaN,NaN,NaN,NaN]496; X86-AVX1OR2-NEXT: vandnps %ymm2, %ymm3, %ymm2497; X86-AVX1OR2-NEXT: vandps %ymm3, %ymm0, %ymm0498; X86-AVX1OR2-NEXT: vorps %ymm2, %ymm0, %ymm0499; X86-AVX1OR2-NEXT: vandps %ymm3, %ymm1, %ymm1500; X86-AVX1OR2-NEXT: vandnps 8(%ebp), %ymm3, %ymm2501; X86-AVX1OR2-NEXT: vorps %ymm2, %ymm1, %ymm1502; X86-AVX1OR2-NEXT: movl %ebp, %esp503; X86-AVX1OR2-NEXT: popl %ebp504; X86-AVX1OR2-NEXT: retl505;506; X86-AVX512-LABEL: fcopysign_v8f64:507; X86-AVX512: # %bb.0:508; X86-AVX512-NEXT: vpternlogq $228, {{\.?LCPI[0-9]+_[0-9]+}}{1to8}, %zmm1, %zmm0509; X86-AVX512-NEXT: retl510;511; X64-SSE-LABEL: fcopysign_v8f64:512; X64-SSE: # %bb.0:513; X64-SSE-NEXT: movaps {{.*#+}} xmm8 = [NaN,NaN]514; X64-SSE-NEXT: movaps %xmm8, %xmm9515; X64-SSE-NEXT: andnps %xmm4, %xmm9516; X64-SSE-NEXT: andps %xmm8, %xmm0517; X64-SSE-NEXT: orps %xmm9, %xmm0518; X64-SSE-NEXT: movaps %xmm8, %xmm4519; X64-SSE-NEXT: andnps %xmm5, %xmm4520; X64-SSE-NEXT: andps %xmm8, %xmm1521; X64-SSE-NEXT: orps %xmm4, %xmm1522; X64-SSE-NEXT: movaps %xmm8, %xmm4523; X64-SSE-NEXT: andnps %xmm6, %xmm4524; X64-SSE-NEXT: andps %xmm8, %xmm2525; X64-SSE-NEXT: orps %xmm4, %xmm2526; X64-SSE-NEXT: andps %xmm8, %xmm3527; X64-SSE-NEXT: andnps %xmm7, %xmm8528; X64-SSE-NEXT: orps %xmm8, %xmm3529; X64-SSE-NEXT: retq530;531; X64-AVX1OR2-LABEL: fcopysign_v8f64:532; X64-AVX1OR2: # %bb.0:533; X64-AVX1OR2-NEXT: vbroadcastsd {{.*#+}} ymm4 = [NaN,NaN,NaN,NaN]534; X64-AVX1OR2-NEXT: vandnps %ymm2, %ymm4, %ymm2535; X64-AVX1OR2-NEXT: vandps %ymm4, %ymm0, %ymm0536; X64-AVX1OR2-NEXT: vorps %ymm2, %ymm0, %ymm0537; X64-AVX1OR2-NEXT: vandnps %ymm3, %ymm4, %ymm2538; X64-AVX1OR2-NEXT: vandps %ymm4, %ymm1, %ymm1539; X64-AVX1OR2-NEXT: vorps %ymm2, %ymm1, %ymm1540; X64-AVX1OR2-NEXT: retq541;542; X64-AVX512-LABEL: fcopysign_v8f64:543; X64-AVX512: # %bb.0:544; X64-AVX512-NEXT: vpternlogq $228, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm1, %zmm0545; X64-AVX512-NEXT: retq546 %t = call <8 x double> @llvm.copysign.v8f64(<8 x double> %a0, <8 x double> %a1)547 ret <8 x double> %t548}549declare <8 x double> @llvm.copysign.v8f64(<8 x double>, <8 x double>)550 551define <16 x float> @fcopysign_v16f32(<16 x float> %a0, <16 x float> %a1) nounwind {552; X86-SSE-LABEL: fcopysign_v16f32:553; X86-SSE: # %bb.0:554; X86-SSE-NEXT: pushl %ebp555; X86-SSE-NEXT: movl %esp, %ebp556; X86-SSE-NEXT: andl $-16, %esp557; X86-SSE-NEXT: subl $16, %esp558; X86-SSE-NEXT: movaps {{.*#+}} xmm3 = [NaN,NaN,NaN,NaN]559; X86-SSE-NEXT: andps %xmm3, %xmm0560; X86-SSE-NEXT: movaps %xmm3, %xmm4561; X86-SSE-NEXT: andnps 24(%ebp), %xmm4562; X86-SSE-NEXT: orps %xmm4, %xmm0563; X86-SSE-NEXT: andps %xmm3, %xmm1564; X86-SSE-NEXT: movaps %xmm3, %xmm4565; X86-SSE-NEXT: andnps 40(%ebp), %xmm4566; X86-SSE-NEXT: orps %xmm4, %xmm1567; X86-SSE-NEXT: andps %xmm3, %xmm2568; X86-SSE-NEXT: movaps %xmm3, %xmm4569; X86-SSE-NEXT: andnps 56(%ebp), %xmm4570; X86-SSE-NEXT: orps %xmm4, %xmm2571; X86-SSE-NEXT: movaps %xmm3, %xmm4572; X86-SSE-NEXT: andnps 72(%ebp), %xmm4573; X86-SSE-NEXT: andps 8(%ebp), %xmm3574; X86-SSE-NEXT: orps %xmm4, %xmm3575; X86-SSE-NEXT: movl %ebp, %esp576; X86-SSE-NEXT: popl %ebp577; X86-SSE-NEXT: retl578;579; X86-AVX1OR2-LABEL: fcopysign_v16f32:580; X86-AVX1OR2: # %bb.0:581; X86-AVX1OR2-NEXT: pushl %ebp582; X86-AVX1OR2-NEXT: movl %esp, %ebp583; X86-AVX1OR2-NEXT: andl $-32, %esp584; X86-AVX1OR2-NEXT: subl $32, %esp585; X86-AVX1OR2-NEXT: vbroadcastss {{.*#+}} ymm3 = [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]586; X86-AVX1OR2-NEXT: vandnps %ymm2, %ymm3, %ymm2587; X86-AVX1OR2-NEXT: vandps %ymm3, %ymm0, %ymm0588; X86-AVX1OR2-NEXT: vorps %ymm2, %ymm0, %ymm0589; X86-AVX1OR2-NEXT: vandps %ymm3, %ymm1, %ymm1590; X86-AVX1OR2-NEXT: vandnps 8(%ebp), %ymm3, %ymm2591; X86-AVX1OR2-NEXT: vorps %ymm2, %ymm1, %ymm1592; X86-AVX1OR2-NEXT: movl %ebp, %esp593; X86-AVX1OR2-NEXT: popl %ebp594; X86-AVX1OR2-NEXT: retl595;596; X86-AVX512-LABEL: fcopysign_v16f32:597; X86-AVX512: # %bb.0:598; X86-AVX512-NEXT: vpternlogd $228, {{\.?LCPI[0-9]+_[0-9]+}}{1to16}, %zmm1, %zmm0599; X86-AVX512-NEXT: retl600;601; X64-SSE-LABEL: fcopysign_v16f32:602; X64-SSE: # %bb.0:603; X64-SSE-NEXT: movaps {{.*#+}} xmm8 = [NaN,NaN,NaN,NaN]604; X64-SSE-NEXT: movaps %xmm8, %xmm9605; X64-SSE-NEXT: andnps %xmm4, %xmm9606; X64-SSE-NEXT: andps %xmm8, %xmm0607; X64-SSE-NEXT: orps %xmm9, %xmm0608; X64-SSE-NEXT: movaps %xmm8, %xmm4609; X64-SSE-NEXT: andnps %xmm5, %xmm4610; X64-SSE-NEXT: andps %xmm8, %xmm1611; X64-SSE-NEXT: orps %xmm4, %xmm1612; X64-SSE-NEXT: movaps %xmm8, %xmm4613; X64-SSE-NEXT: andnps %xmm6, %xmm4614; X64-SSE-NEXT: andps %xmm8, %xmm2615; X64-SSE-NEXT: orps %xmm4, %xmm2616; X64-SSE-NEXT: andps %xmm8, %xmm3617; X64-SSE-NEXT: andnps %xmm7, %xmm8618; X64-SSE-NEXT: orps %xmm8, %xmm3619; X64-SSE-NEXT: retq620;621; X64-AVX1OR2-LABEL: fcopysign_v16f32:622; X64-AVX1OR2: # %bb.0:623; X64-AVX1OR2-NEXT: vbroadcastss {{.*#+}} ymm4 = [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]624; X64-AVX1OR2-NEXT: vandnps %ymm2, %ymm4, %ymm2625; X64-AVX1OR2-NEXT: vandps %ymm4, %ymm0, %ymm0626; X64-AVX1OR2-NEXT: vorps %ymm2, %ymm0, %ymm0627; X64-AVX1OR2-NEXT: vandnps %ymm3, %ymm4, %ymm2628; X64-AVX1OR2-NEXT: vandps %ymm4, %ymm1, %ymm1629; X64-AVX1OR2-NEXT: vorps %ymm2, %ymm1, %ymm1630; X64-AVX1OR2-NEXT: retq631;632; X64-AVX512-LABEL: fcopysign_v16f32:633; X64-AVX512: # %bb.0:634; X64-AVX512-NEXT: vpternlogd $228, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm1, %zmm0635; X64-AVX512-NEXT: retq636 %t = call <16 x float> @llvm.copysign.v16f32(<16 x float> %a0, <16 x float> %a1)637 ret <16 x float> %t638}639declare <16 x float> @llvm.copysign.v16f32(<16 x float>, <16 x float>)640 641define <32 x half> @fcopysign_v32f16(ptr %p0, ptr %p1) nounwind {642; X86-SSE-LABEL: fcopysign_v32f16:643; X86-SSE: # %bb.0:644; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax645; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx646; X86-SSE-NEXT: movaps {{.*#+}} xmm3 = [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]647; X86-SSE-NEXT: movaps %xmm3, %xmm1648; X86-SSE-NEXT: andnps (%ecx), %xmm1649; X86-SSE-NEXT: movaps (%eax), %xmm0650; X86-SSE-NEXT: andps %xmm3, %xmm0651; X86-SSE-NEXT: orps %xmm1, %xmm0652; X86-SSE-NEXT: movaps %xmm3, %xmm2653; X86-SSE-NEXT: andnps 16(%ecx), %xmm2654; X86-SSE-NEXT: movaps 16(%eax), %xmm1655; X86-SSE-NEXT: andps %xmm3, %xmm1656; X86-SSE-NEXT: orps %xmm2, %xmm1657; X86-SSE-NEXT: movaps %xmm3, %xmm4658; X86-SSE-NEXT: andnps 32(%ecx), %xmm4659; X86-SSE-NEXT: movaps 32(%eax), %xmm2660; X86-SSE-NEXT: andps %xmm3, %xmm2661; X86-SSE-NEXT: orps %xmm4, %xmm2662; X86-SSE-NEXT: movaps %xmm3, %xmm4663; X86-SSE-NEXT: andnps 48(%ecx), %xmm4664; X86-SSE-NEXT: andps 48(%eax), %xmm3665; X86-SSE-NEXT: orps %xmm4, %xmm3666; X86-SSE-NEXT: retl667;668; X86-AVX1-LABEL: fcopysign_v32f16:669; X86-AVX1: # %bb.0:670; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax671; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %ecx672; X86-AVX1-NEXT: vbroadcastss {{.*#+}} ymm1 = [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]673; X86-AVX1-NEXT: vandnps (%ecx), %ymm1, %ymm0674; X86-AVX1-NEXT: vandps (%eax), %ymm1, %ymm2675; X86-AVX1-NEXT: vorps %ymm0, %ymm2, %ymm0676; X86-AVX1-NEXT: vandnps 32(%ecx), %ymm1, %ymm2677; X86-AVX1-NEXT: vandps 32(%eax), %ymm1, %ymm1678; X86-AVX1-NEXT: vorps %ymm2, %ymm1, %ymm1679; X86-AVX1-NEXT: retl680;681; X86-AVX2-LABEL: fcopysign_v32f16:682; X86-AVX2: # %bb.0:683; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax684; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx685; X86-AVX2-NEXT: vpbroadcastw {{.*#+}} ymm1 = [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]686; X86-AVX2-NEXT: vpandn (%ecx), %ymm1, %ymm0687; X86-AVX2-NEXT: vpand (%eax), %ymm1, %ymm2688; X86-AVX2-NEXT: vpor %ymm0, %ymm2, %ymm0689; X86-AVX2-NEXT: vpandn 32(%ecx), %ymm1, %ymm2690; X86-AVX2-NEXT: vpand 32(%eax), %ymm1, %ymm1691; X86-AVX2-NEXT: vpor %ymm2, %ymm1, %ymm1692; X86-AVX2-NEXT: retl693;694; X86-AVX512-LABEL: fcopysign_v32f16:695; X86-AVX512: # %bb.0:696; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax697; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %ecx698; X86-AVX512-NEXT: vmovdqu64 (%ecx), %zmm1699; X86-AVX512-NEXT: vpbroadcastd {{.*#+}} zmm0 = [2147450879,2147450879,2147450879,2147450879,2147450879,2147450879,2147450879,2147450879,2147450879,2147450879,2147450879,2147450879,2147450879,2147450879,2147450879,2147450879]700; X86-AVX512-NEXT: vpternlogd $202, (%eax), %zmm1, %zmm0701; X86-AVX512-NEXT: retl702;703; X64-SSE-LABEL: fcopysign_v32f16:704; X64-SSE: # %bb.0:705; X64-SSE-NEXT: movaps {{.*#+}} xmm3 = [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]706; X64-SSE-NEXT: movaps %xmm3, %xmm1707; X64-SSE-NEXT: andnps (%rsi), %xmm1708; X64-SSE-NEXT: movaps (%rdi), %xmm0709; X64-SSE-NEXT: andps %xmm3, %xmm0710; X64-SSE-NEXT: orps %xmm1, %xmm0711; X64-SSE-NEXT: movaps %xmm3, %xmm2712; X64-SSE-NEXT: andnps 16(%rsi), %xmm2713; X64-SSE-NEXT: movaps 16(%rdi), %xmm1714; X64-SSE-NEXT: andps %xmm3, %xmm1715; X64-SSE-NEXT: orps %xmm2, %xmm1716; X64-SSE-NEXT: movaps %xmm3, %xmm4717; X64-SSE-NEXT: andnps 32(%rsi), %xmm4718; X64-SSE-NEXT: movaps 32(%rdi), %xmm2719; X64-SSE-NEXT: andps %xmm3, %xmm2720; X64-SSE-NEXT: orps %xmm4, %xmm2721; X64-SSE-NEXT: movaps %xmm3, %xmm4722; X64-SSE-NEXT: andnps 48(%rsi), %xmm4723; X64-SSE-NEXT: andps 48(%rdi), %xmm3724; X64-SSE-NEXT: orps %xmm4, %xmm3725; X64-SSE-NEXT: retq726;727; X64-AVX1-LABEL: fcopysign_v32f16:728; X64-AVX1: # %bb.0:729; X64-AVX1-NEXT: vbroadcastss {{.*#+}} ymm1 = [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]730; X64-AVX1-NEXT: vandnps (%rsi), %ymm1, %ymm0731; X64-AVX1-NEXT: vandps (%rdi), %ymm1, %ymm2732; X64-AVX1-NEXT: vorps %ymm0, %ymm2, %ymm0733; X64-AVX1-NEXT: vandnps 32(%rsi), %ymm1, %ymm2734; X64-AVX1-NEXT: vandps 32(%rdi), %ymm1, %ymm1735; X64-AVX1-NEXT: vorps %ymm2, %ymm1, %ymm1736; X64-AVX1-NEXT: retq737;738; X64-AVX2-LABEL: fcopysign_v32f16:739; X64-AVX2: # %bb.0:740; X64-AVX2-NEXT: vpbroadcastw {{.*#+}} ymm1 = [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]741; X64-AVX2-NEXT: vpandn (%rsi), %ymm1, %ymm0742; X64-AVX2-NEXT: vpand (%rdi), %ymm1, %ymm2743; X64-AVX2-NEXT: vpor %ymm0, %ymm2, %ymm0744; X64-AVX2-NEXT: vpandn 32(%rsi), %ymm1, %ymm2745; X64-AVX2-NEXT: vpand 32(%rdi), %ymm1, %ymm1746; X64-AVX2-NEXT: vpor %ymm2, %ymm1, %ymm1747; X64-AVX2-NEXT: retq748;749; X64-AVX512-LABEL: fcopysign_v32f16:750; X64-AVX512: # %bb.0:751; X64-AVX512-NEXT: vmovdqu64 (%rdi), %zmm1752; X64-AVX512-NEXT: vpbroadcastd {{.*#+}} zmm0 = [2147450879,2147450879,2147450879,2147450879,2147450879,2147450879,2147450879,2147450879,2147450879,2147450879,2147450879,2147450879,2147450879,2147450879,2147450879,2147450879]753; X64-AVX512-NEXT: vpternlogd $202, (%rsi), %zmm1, %zmm0754; X64-AVX512-NEXT: retq755 %a0 = load <32 x half>, ptr %p0, align 16756 %a1 = load <32 x half>, ptr %p1, align 16757 %t = call <32 x half> @llvm.copysign.v32f16(<32 x half> %a0, <32 x half> %a1)758 ret <32 x half> %t759}760declare <32 x half> @llvm.copysign.v32f16(<32 x half>, <32 x half>)761;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:762; X64: {{.*}}763; X64-AVX: {{.*}}764; X64-AVX512FP16: {{.*}}765; X64-AVX512VL: {{.*}}766; X64-AVX512VLDQ: {{.*}}767; X86: {{.*}}768; X86-AVX: {{.*}}769; X86-AVX512FP16: {{.*}}770; X86-AVX512VL: {{.*}}771; X86-AVX512VLDQ: {{.*}}772