225 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc < %s -mtriple=x86_64 -mattr=+avx512fp16 | FileCheck %s3 4define <2 x half> @vector_sint64ToHalf(<2 x i64> %int64) {5; CHECK-LABEL: vector_sint64ToHalf:6; CHECK: # %bb.0:7; CHECK-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm08; CHECK-NEXT: vcvtqq2ph %zmm0, %xmm09; CHECK-NEXT: vzeroupper10; CHECK-NEXT: retq11 %fp16 = sitofp <2 x i64> %int64 to <2 x half>12 ret <2 x half> %fp1613}14 15define <4 x half> @vector_sint32ToHalf(<4 x i32> %int32) {16; CHECK-LABEL: vector_sint32ToHalf:17; CHECK: # %bb.0:18; CHECK-NEXT: vextractps $3, %xmm0, %eax19; CHECK-NEXT: vcvtsi2sh %eax, %xmm31, %xmm120; CHECK-NEXT: vextractps $2, %xmm0, %eax21; CHECK-NEXT: vcvtsi2sh %eax, %xmm31, %xmm222; CHECK-NEXT: vpunpcklwd {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]23; CHECK-NEXT: vextractps $1, %xmm0, %eax24; CHECK-NEXT: vcvtsi2sh %eax, %xmm31, %xmm225; CHECK-NEXT: vmovd %xmm0, %eax26; CHECK-NEXT: vcvtsi2sh %eax, %xmm31, %xmm027; CHECK-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]28; CHECK-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero29; CHECK-NEXT: retq30 %fp16 = sitofp <4 x i32> %int32 to <4 x half>31 ret <4 x half> %fp1632}33 34define <8 x half> @vector_sint16ToHalf(<8 x i16> %int16) {35; CHECK-LABEL: vector_sint16ToHalf:36; CHECK: # %bb.0:37; CHECK-NEXT: vpextrw $7, %xmm0, %eax38; CHECK-NEXT: cwtl39; CHECK-NEXT: vcvtsi2sh %eax, %xmm31, %xmm140; CHECK-NEXT: vpextrw $6, %xmm0, %eax41; CHECK-NEXT: cwtl42; CHECK-NEXT: vcvtsi2sh %eax, %xmm31, %xmm243; CHECK-NEXT: vpunpcklwd {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]44; CHECK-NEXT: vpextrw $5, %xmm0, %eax45; CHECK-NEXT: cwtl46; CHECK-NEXT: vcvtsi2sh %eax, %xmm31, %xmm247; CHECK-NEXT: vpextrw $4, %xmm0, %eax48; CHECK-NEXT: cwtl49; CHECK-NEXT: vcvtsi2sh %eax, %xmm31, %xmm350; CHECK-NEXT: vpunpcklwd {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]51; CHECK-NEXT: vpunpckldq {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]52; CHECK-NEXT: vpextrw $3, %xmm0, %eax53; CHECK-NEXT: cwtl54; CHECK-NEXT: vcvtsi2sh %eax, %xmm31, %xmm255; CHECK-NEXT: vpextrw $2, %xmm0, %eax56; CHECK-NEXT: cwtl57; CHECK-NEXT: vcvtsi2sh %eax, %xmm31, %xmm358; CHECK-NEXT: vpunpcklwd {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]59; CHECK-NEXT: vpextrw $1, %xmm0, %eax60; CHECK-NEXT: cwtl61; CHECK-NEXT: vcvtsi2sh %eax, %xmm31, %xmm362; CHECK-NEXT: vmovw %xmm0, %eax63; CHECK-NEXT: cwtl64; CHECK-NEXT: vcvtsi2sh %eax, %xmm31, %xmm065; CHECK-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]66; CHECK-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]67; CHECK-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]68; CHECK-NEXT: retq69 %fp16 = sitofp <8 x i16> %int16 to <8 x half>70 ret <8 x half> %fp1671}72 73define <2 x half> @vector_uint64ToHalf(<2 x i64> %int64) {74; CHECK-LABEL: vector_uint64ToHalf:75; CHECK: # %bb.0:76; CHECK-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm077; CHECK-NEXT: vcvtuqq2ph %zmm0, %xmm078; CHECK-NEXT: vzeroupper79; CHECK-NEXT: retq80 %fp16 = uitofp <2 x i64> %int64 to <2 x half>81 ret <2 x half> %fp1682}83 84define <4 x half> @vector_uint32ToHalf(<4 x i32> %int32) {85; CHECK-LABEL: vector_uint32ToHalf:86; CHECK: # %bb.0:87; CHECK-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm088; CHECK-NEXT: vcvtudq2ph %zmm0, %ymm089; CHECK-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm090; CHECK-NEXT: vzeroupper91; CHECK-NEXT: retq92 %fp16 = uitofp <4 x i32> %int32 to <4 x half>93 ret <4 x half> %fp1694}95 96define <8 x half> @vector_uint16ToHalf(<8 x i16> %int16) {97; CHECK-LABEL: vector_uint16ToHalf:98; CHECK: # %bb.0:99; CHECK-NEXT: vpextrw $7, %xmm0, %eax100; CHECK-NEXT: vcvtsi2sh %eax, %xmm31, %xmm1101; CHECK-NEXT: vpextrw $6, %xmm0, %eax102; CHECK-NEXT: vcvtsi2sh %eax, %xmm31, %xmm2103; CHECK-NEXT: vpunpcklwd {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]104; CHECK-NEXT: vpextrw $5, %xmm0, %eax105; CHECK-NEXT: vcvtsi2sh %eax, %xmm31, %xmm2106; CHECK-NEXT: vpextrw $4, %xmm0, %eax107; CHECK-NEXT: vcvtsi2sh %eax, %xmm31, %xmm3108; CHECK-NEXT: vpunpcklwd {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]109; CHECK-NEXT: vpunpckldq {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]110; CHECK-NEXT: vpextrw $3, %xmm0, %eax111; CHECK-NEXT: vcvtsi2sh %eax, %xmm31, %xmm2112; CHECK-NEXT: vpextrw $2, %xmm0, %eax113; CHECK-NEXT: vcvtsi2sh %eax, %xmm31, %xmm3114; CHECK-NEXT: vpunpcklwd {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]115; CHECK-NEXT: vpextrw $1, %xmm0, %eax116; CHECK-NEXT: vcvtsi2sh %eax, %xmm31, %xmm3117; CHECK-NEXT: vpextrw $0, %xmm0, %eax118; CHECK-NEXT: vcvtsi2sh %eax, %xmm31, %xmm0119; CHECK-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]120; CHECK-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]121; CHECK-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]122; CHECK-NEXT: retq123 %fp16 = uitofp <8 x i16> %int16 to <8 x half>124 ret <8 x half> %fp16125}126 127define <8 x half> @select(<8 x half> %x) {128; CHECK-LABEL: select:129; CHECK: # %bb.0: # %entry130; CHECK-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0131; CHECK-NEXT: vmovsh {{.*#+}} xmm1 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0,0.0E+0,0.0E+0,0.0E+0,0.0E+0]132; CHECK-NEXT: vucomish %xmm1, %xmm0133; CHECK-NEXT: seta %al134; CHECK-NEXT: andl $1, %eax135; CHECK-NEXT: kmovw %eax, %k0136; CHECK-NEXT: vpsrld $16, %xmm0, %xmm2137; CHECK-NEXT: vucomish %xmm1, %xmm2138; CHECK-NEXT: seta %al139; CHECK-NEXT: kmovd %eax, %k1140; CHECK-NEXT: kshiftlw $15, %k1, %k1141; CHECK-NEXT: kshiftrw $14, %k1, %k1142; CHECK-NEXT: korw %k1, %k0, %k0143; CHECK-NEXT: movw $-5, %ax144; CHECK-NEXT: kmovd %eax, %k1145; CHECK-NEXT: kandw %k1, %k0, %k0146; CHECK-NEXT: vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]147; CHECK-NEXT: vucomish %xmm1, %xmm2148; CHECK-NEXT: seta %al149; CHECK-NEXT: kmovd %eax, %k1150; CHECK-NEXT: kshiftlw $15, %k1, %k1151; CHECK-NEXT: kshiftrw $13, %k1, %k1152; CHECK-NEXT: korw %k1, %k0, %k0153; CHECK-NEXT: movw $-9, %ax154; CHECK-NEXT: kmovd %eax, %k1155; CHECK-NEXT: kandw %k1, %k0, %k0156; CHECK-NEXT: vpsrlq $48, %xmm0, %xmm2157; CHECK-NEXT: vucomish %xmm1, %xmm2158; CHECK-NEXT: seta %al159; CHECK-NEXT: kmovd %eax, %k1160; CHECK-NEXT: kshiftlw $15, %k1, %k1161; CHECK-NEXT: kshiftrw $12, %k1, %k1162; CHECK-NEXT: korw %k1, %k0, %k0163; CHECK-NEXT: movw $-17, %ax164; CHECK-NEXT: kmovd %eax, %k1165; CHECK-NEXT: kandw %k1, %k0, %k0166; CHECK-NEXT: vshufpd {{.*#+}} xmm2 = xmm0[1,0]167; CHECK-NEXT: vucomish %xmm1, %xmm2168; CHECK-NEXT: seta %al169; CHECK-NEXT: kmovd %eax, %k1170; CHECK-NEXT: kshiftlw $15, %k1, %k1171; CHECK-NEXT: kshiftrw $11, %k1, %k1172; CHECK-NEXT: korw %k1, %k0, %k0173; CHECK-NEXT: movw $-33, %ax174; CHECK-NEXT: kmovd %eax, %k1175; CHECK-NEXT: kandw %k1, %k0, %k0176; CHECK-NEXT: vpsrldq {{.*#+}} xmm2 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero177; CHECK-NEXT: vucomish %xmm1, %xmm2178; CHECK-NEXT: seta %al179; CHECK-NEXT: kmovd %eax, %k1180; CHECK-NEXT: kshiftlw $15, %k1, %k1181; CHECK-NEXT: kshiftrw $10, %k1, %k1182; CHECK-NEXT: korw %k1, %k0, %k0183; CHECK-NEXT: movw $-65, %ax184; CHECK-NEXT: kmovd %eax, %k1185; CHECK-NEXT: kandw %k1, %k0, %k0186; CHECK-NEXT: vshufps {{.*#+}} xmm2 = xmm0[3,3,3,3]187; CHECK-NEXT: vucomish %xmm1, %xmm2188; CHECK-NEXT: seta %al189; CHECK-NEXT: kmovd %eax, %k1190; CHECK-NEXT: kshiftlw $6, %k1, %k1191; CHECK-NEXT: korw %k1, %k0, %k0192; CHECK-NEXT: kshiftlw $9, %k0, %k0193; CHECK-NEXT: kshiftrw $9, %k0, %k0194; CHECK-NEXT: vpsrldq {{.*#+}} xmm2 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero195; CHECK-NEXT: vucomish %xmm1, %xmm2196; CHECK-NEXT: seta %al197; CHECK-NEXT: kmovd %eax, %k1198; CHECK-NEXT: kshiftlw $7, %k1, %k1199; CHECK-NEXT: korw %k1, %k0, %k1200; CHECK-NEXT: vpbroadcastw {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]201; CHECK-NEXT: vmovdqu16 %zmm1, %zmm0 {%k1}202; CHECK-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0203; CHECK-NEXT: vzeroupper204; CHECK-NEXT: retq205entry:206 %c = fcmp ogt <8 x half> %x, splat (half 0xH3C00)207 %s = select <8 x i1> %c, <8 x half> splat (half 0xH3C00), <8 x half> %x208 ret <8 x half> %s209}210 211define <4 x half> @select2(<4 x i32> %0, <4 x half> %1) {212; CHECK-LABEL: select2:213; CHECK: # %bb.0: # %entry214; CHECK-NEXT: vpxor %xmm2, %xmm2, %xmm2215; CHECK-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm0216; CHECK-NEXT: vpackssdw %xmm0, %xmm0, %xmm0217; CHECK-NEXT: vmovq {{.*#+}} xmm2 = [9.6E+1,9.7E+1,9.8E+1,9.9E+1,0.0E+0,0.0E+0,0.0E+0,0.0E+0]218; CHECK-NEXT: vpblendvb %xmm0, %xmm1, %xmm2, %xmm0219; CHECK-NEXT: retq220entry:221 %2 = icmp eq <4 x i32> %0, zeroinitializer222 %3 = select <4 x i1> %2, <4 x half> %1, <4 x half> <half 0xH5600, half 0xH5610, half 0xH5620, half 0xH5630>223 ret <4 x half> %3224}225