1353 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl -mattr=+avx512fp16 | FileCheck %s3 4define signext i16 @test_mm_cvtsi128_si16(<2 x i64> %A) local_unnamed_addr #0 {5; CHECK-LABEL: test_mm_cvtsi128_si16:6; CHECK: # %bb.0: # %entry7; CHECK-NEXT: vmovw %xmm0, %eax8; CHECK-NEXT: # kill: def $ax killed $ax killed $eax9; CHECK-NEXT: retq10entry:11 %0 = bitcast <2 x i64> %A to <8 x i16>12 %vecext.i = extractelement <8 x i16> %0, i32 013 ret i16 %vecext.i14}15 16define <2 x i64> @test_mm_cvtsi16_si128(i16 signext %A) local_unnamed_addr #0 {17; CHECK-LABEL: test_mm_cvtsi16_si128:18; CHECK: # %bb.0: # %entry19; CHECK-NEXT: vmovw %edi, %xmm020; CHECK-NEXT: retq21entry:22 %vecinit7.i = insertelement <8 x i16> <i16 undef, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, i16 %A, i32 023 %0 = bitcast <8 x i16> %vecinit7.i to <2 x i64>24 ret <2 x i64> %025}26 27define <8 x half> @test_int_x86_avx512_mask_cvt_dq2ph_256(<8 x i32> %x0, <8 x half> %x1, i8 %x2) {28; CHECK-LABEL: test_int_x86_avx512_mask_cvt_dq2ph_256:29; CHECK: # %bb.0:30; CHECK-NEXT: kmovd %edi, %k131; CHECK-NEXT: vcvtdq2ph %ymm0, %xmm1 {%k1}32; CHECK-NEXT: vmovaps %xmm1, %xmm033; CHECK-NEXT: vzeroupper34; CHECK-NEXT: retq35 %mask = bitcast i8 %x2 to <8 x i1>36 %res0 = sitofp <8 x i32> %x0 to <8 x half>37 %res = select <8 x i1> %mask, <8 x half> %res0, <8 x half> %x138 ret <8 x half> %res39}40 41define <8 x half> @test_int_x86_avx512_mask_cvt_dq2ph_256_z(<8 x i32> %x0, i8 %x2) {42; CHECK-LABEL: test_int_x86_avx512_mask_cvt_dq2ph_256_z:43; CHECK: # %bb.0:44; CHECK-NEXT: kmovd %edi, %k145; CHECK-NEXT: vcvtdq2ph %ymm0, %xmm0 {%k1} {z}46; CHECK-NEXT: vzeroupper47; CHECK-NEXT: retq48 %mask = bitcast i8 %x2 to <8 x i1>49 %res0 = sitofp <8 x i32> %x0 to <8 x half>50 %res = select <8 x i1> %mask, <8 x half> %res0, <8 x half> zeroinitializer51 ret <8 x half> %res52}53 54define <8 x half> @sint_to_fp_8i32_to_8f16(<8 x i32> %x) {55; CHECK-LABEL: sint_to_fp_8i32_to_8f16:56; CHECK: # %bb.0:57; CHECK-NEXT: vcvtdq2ph %ymm0, %xmm058; CHECK-NEXT: vzeroupper59; CHECK-NEXT: retq60 %res = sitofp <8 x i32> %x to <8 x half>61 ret <8 x half> %res62}63 64declare <8 x half> @llvm.x86.avx512fp16.mask.vcvtdq2ph.128(<4 x i32>, <8 x half>, i8)65 66define <8 x half> @test_int_x86_avx512_mask_cvt_dq2ph_128(<4 x i32> %x0, <8 x half> %x1, i8 %x2) {67; CHECK-LABEL: test_int_x86_avx512_mask_cvt_dq2ph_128:68; CHECK: # %bb.0:69; CHECK-NEXT: kmovd %edi, %k170; CHECK-NEXT: vcvtdq2ph %xmm0, %xmm1 {%k1}71; CHECK-NEXT: vmovaps %xmm1, %xmm072; CHECK-NEXT: retq73 %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtdq2ph.128(<4 x i32> %x0, <8 x half> %x1, i8 %x2)74 ret <8 x half> %res75}76 77define <8 x half> @test_int_x86_avx512_mask_cvt_dq2ph_128_nomask(<4 x i32> %x0, <8 x half> %x1) {78; CHECK-LABEL: test_int_x86_avx512_mask_cvt_dq2ph_128_nomask:79; CHECK: # %bb.0:80; CHECK-NEXT: vcvtdq2ph %xmm0, %xmm081; CHECK-NEXT: retq82 %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtdq2ph.128(<4 x i32> %x0, <8 x half> %x1, i8 -1)83 ret <8 x half> %res84}85 86define <8 x half> @test_int_x86_avx512_mask_cvt_dq2ph_128_z(<4 x i32> %x0, i8 %x2) {87; CHECK-LABEL: test_int_x86_avx512_mask_cvt_dq2ph_128_z:88; CHECK: # %bb.0:89; CHECK-NEXT: kmovd %edi, %k190; CHECK-NEXT: vcvtdq2ph %xmm0, %xmm0 {%k1} {z}91; CHECK-NEXT: retq92 %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtdq2ph.128(<4 x i32> %x0, <8 x half> zeroinitializer, i8 %x2)93 ret <8 x half> %res94}95 96define <4 x half> @sint_to_fp_4i32_to_4f16(<4 x i32> %x) {97; CHECK-LABEL: sint_to_fp_4i32_to_4f16:98; CHECK: # %bb.0:99; CHECK-NEXT: vcvtdq2ph %xmm0, %xmm0100; CHECK-NEXT: retq101 %res = sitofp <4 x i32> %x to <4 x half>102 ret <4 x half> %res103}104 105define <2 x half> @sint_to_fp_2i32_to_2f16(<2 x i32> %x) {106; CHECK-LABEL: sint_to_fp_2i32_to_2f16:107; CHECK: # %bb.0:108; CHECK-NEXT: vcvtdq2ph %xmm0, %xmm0109; CHECK-NEXT: retq110 %res = sitofp <2 x i32> %x to <2 x half>111 ret <2 x half> %res112}113 114define <4 x i32> @fp_to_sint_4f16_to_4i32(<4 x half> %x) {115; CHECK-LABEL: fp_to_sint_4f16_to_4i32:116; CHECK: # %bb.0:117; CHECK-NEXT: vcvttph2dq %xmm0, %xmm0118; CHECK-NEXT: retq119 %res = fptosi <4 x half> %x to <4 x i32>120 ret <4 x i32> %res121}122 123define <2 x i32> @fp_to_sint_2f16_to_2i32(<2 x half> %x) {124; CHECK-LABEL: fp_to_sint_2f16_to_2i32:125; CHECK: # %bb.0:126; CHECK-NEXT: vcvttph2dq %xmm0, %xmm0127; CHECK-NEXT: retq128 %res = fptosi <2 x half> %x to <2 x i32>129 ret <2 x i32> %res130}131 132define <2 x i16> @fp_to_sint_2f16_to_2i16(<2 x half> %x) {133; CHECK-LABEL: fp_to_sint_2f16_to_2i16:134; CHECK: # %bb.0:135; CHECK-NEXT: vcvttph2w %xmm0, %xmm0136; CHECK-NEXT: retq137 %res = fptosi <2 x half> %x to <2 x i16>138 ret <2 x i16> %res139}140 141define <8 x half> @test_int_x86_avx512_mask_cvt_udq2ph_256(<8 x i32> %x0, <8 x half> %x1, i8 %x2) {142; CHECK-LABEL: test_int_x86_avx512_mask_cvt_udq2ph_256:143; CHECK: # %bb.0:144; CHECK-NEXT: kmovd %edi, %k1145; CHECK-NEXT: vcvtudq2ph %ymm0, %xmm1 {%k1}146; CHECK-NEXT: vmovaps %xmm1, %xmm0147; CHECK-NEXT: vzeroupper148; CHECK-NEXT: retq149 %mask = bitcast i8 %x2 to <8 x i1>150 %res0 = uitofp <8 x i32> %x0 to <8 x half>151 %res = select <8 x i1> %mask, <8 x half> %res0, <8 x half> %x1152 ret <8 x half> %res153}154 155define <8 x half> @test_int_x86_avx512_mask_cvt_udq2ph_256_z(<8 x i32> %x0, i8 %x2) {156; CHECK-LABEL: test_int_x86_avx512_mask_cvt_udq2ph_256_z:157; CHECK: # %bb.0:158; CHECK-NEXT: kmovd %edi, %k1159; CHECK-NEXT: vcvtudq2ph %ymm0, %xmm0 {%k1} {z}160; CHECK-NEXT: vzeroupper161; CHECK-NEXT: retq162 %mask = bitcast i8 %x2 to <8 x i1>163 %res0 = uitofp <8 x i32> %x0 to <8 x half>164 %res = select <8 x i1> %mask, <8 x half> %res0, <8 x half> zeroinitializer165 ret <8 x half> %res166}167 168define <8 x half> @uint_to_fp_8i32_to_8f16(<8 x i32> %x) {169; CHECK-LABEL: uint_to_fp_8i32_to_8f16:170; CHECK: # %bb.0:171; CHECK-NEXT: vcvtudq2ph %ymm0, %xmm0172; CHECK-NEXT: vzeroupper173; CHECK-NEXT: retq174 %res = uitofp <8 x i32> %x to <8 x half>175 ret <8 x half> %res176}177 178define <8 x i32> @fp_to_uint_8f16_to_8i32(<8 x half> %x) {179; CHECK-LABEL: fp_to_uint_8f16_to_8i32:180; CHECK: # %bb.0:181; CHECK-NEXT: vcvttph2udq %xmm0, %ymm0182; CHECK-NEXT: retq183 %res = fptoui <8 x half> %x to <8 x i32>184 ret <8 x i32> %res185}186 187declare <8 x half> @llvm.x86.avx512fp16.mask.vcvtudq2ph.128(<4 x i32>, <8 x half>, i8)188 189define <8 x half> @test_int_x86_avx512_mask_cvt_udq2ph_128(<4 x i32> %x0, <8 x half> %x1, i8 %x2) {190; CHECK-LABEL: test_int_x86_avx512_mask_cvt_udq2ph_128:191; CHECK: # %bb.0:192; CHECK-NEXT: kmovd %edi, %k1193; CHECK-NEXT: vcvtudq2ph %xmm0, %xmm1 {%k1}194; CHECK-NEXT: vmovaps %xmm1, %xmm0195; CHECK-NEXT: retq196 %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtudq2ph.128(<4 x i32> %x0, <8 x half> %x1, i8 %x2)197 ret <8 x half> %res198}199 200define <8 x half> @test_int_x86_avx512_mask_cvt_udq2ph_128_nomask(<4 x i32> %x0, <8 x half> %x1) {201; CHECK-LABEL: test_int_x86_avx512_mask_cvt_udq2ph_128_nomask:202; CHECK: # %bb.0:203; CHECK-NEXT: vcvtudq2ph %xmm0, %xmm0204; CHECK-NEXT: retq205 %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtudq2ph.128(<4 x i32> %x0, <8 x half> %x1, i8 -1)206 ret <8 x half> %res207}208 209define <8 x half> @test_int_x86_avx512_mask_cvt_udq2ph_128_z(<4 x i32> %x0, i8 %x2) {210; CHECK-LABEL: test_int_x86_avx512_mask_cvt_udq2ph_128_z:211; CHECK: # %bb.0:212; CHECK-NEXT: kmovd %edi, %k1213; CHECK-NEXT: vcvtudq2ph %xmm0, %xmm0 {%k1} {z}214; CHECK-NEXT: retq215 %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtudq2ph.128(<4 x i32> %x0, <8 x half> zeroinitializer, i8 %x2)216 ret <8 x half> %res217}218 219define <4 x half> @uint_to_fp_4i32_to_4f16(<4 x i32> %x) {220; CHECK-LABEL: uint_to_fp_4i32_to_4f16:221; CHECK: # %bb.0:222; CHECK-NEXT: vcvtudq2ph %xmm0, %xmm0223; CHECK-NEXT: retq224 %res = uitofp <4 x i32> %x to <4 x half>225 ret <4 x half> %res226}227 228define <2 x half> @uint_to_fp_2i32_to_2f16(<2 x i32> %x) {229; CHECK-LABEL: uint_to_fp_2i32_to_2f16:230; CHECK: # %bb.0:231; CHECK-NEXT: vcvtudq2ph %xmm0, %xmm0232; CHECK-NEXT: retq233 %res = uitofp <2 x i32> %x to <2 x half>234 ret <2 x half> %res235}236 237define <4 x i32> @fp_to_uint_4f16_to_4i32(<4 x half> %x) {238; CHECK-LABEL: fp_to_uint_4f16_to_4i32:239; CHECK: # %bb.0:240; CHECK-NEXT: vcvttph2udq %xmm0, %xmm0241; CHECK-NEXT: retq242 %res = fptoui <4 x half> %x to <4 x i32>243 ret <4 x i32> %res244}245 246define <2 x i32> @fp_to_uint_2f16_to_2i32(<2 x half> %x) {247; CHECK-LABEL: fp_to_uint_2f16_to_2i32:248; CHECK: # %bb.0:249; CHECK-NEXT: vcvttph2udq %xmm0, %xmm0250; CHECK-NEXT: retq251 %res = fptoui <2 x half> %x to <2 x i32>252 ret <2 x i32> %res253}254 255define <2 x i16> @fp_to_uint_2f16_to_2i16(<2 x half> %x) {256; CHECK-LABEL: fp_to_uint_2f16_to_2i16:257; CHECK: # %bb.0:258; CHECK-NEXT: vcvttph2uw %xmm0, %xmm0259; CHECK-NEXT: retq260 %res = fptoui <2 x half> %x to <2 x i16>261 ret <2 x i16> %res262}263 264declare <4 x i32> @llvm.x86.avx512fp16.mask.vcvtph2dq.128(<8 x half>, <4 x i32>, i8)265 266define <4 x i32> @test_int_x86_avx512_cvt_ph2dq_128(<8 x half> %x0) {267; CHECK-LABEL: test_int_x86_avx512_cvt_ph2dq_128:268; CHECK: # %bb.0:269; CHECK-NEXT: vcvtph2dq %xmm0, %xmm0270; CHECK-NEXT: retq271 %res = call <4 x i32> @llvm.x86.avx512fp16.mask.vcvtph2dq.128(<8 x half> %x0, <4 x i32> undef, i8 -1)272 ret <4 x i32> %res273}274 275define <4 x i32> @test_int_x86_avx512_mask_cvt_ph2dq_128(<8 x half> %x0, <4 x i32> %x1, i8 %x2) {276; CHECK-LABEL: test_int_x86_avx512_mask_cvt_ph2dq_128:277; CHECK: # %bb.0:278; CHECK-NEXT: kmovd %edi, %k1279; CHECK-NEXT: vcvtph2dq %xmm0, %xmm1 {%k1}280; CHECK-NEXT: vmovaps %xmm1, %xmm0281; CHECK-NEXT: retq282 %res = call <4 x i32> @llvm.x86.avx512fp16.mask.vcvtph2dq.128(<8 x half> %x0, <4 x i32> %x1, i8 %x2)283 ret <4 x i32> %res284}285 286define <4 x i32> @test_int_x86_avx512_maskz_cvt_ph2dq_128(<8 x half> %x0, i8 %x2) {287; CHECK-LABEL: test_int_x86_avx512_maskz_cvt_ph2dq_128:288; CHECK: # %bb.0:289; CHECK-NEXT: kmovd %edi, %k1290; CHECK-NEXT: vcvtph2dq %xmm0, %xmm0 {%k1} {z}291; CHECK-NEXT: retq292 %res = call <4 x i32> @llvm.x86.avx512fp16.mask.vcvtph2dq.128(<8 x half> %x0, <4 x i32> zeroinitializer, i8 %x2)293 ret <4 x i32> %res294}295 296declare <8 x i32> @llvm.x86.avx512fp16.mask.vcvtph2dq.256(<8 x half>, <8 x i32>, i8)297 298define <8 x i32> @test_int_x86_avx512_cvt_ph2dq_256(<8 x half> %x0) {299; CHECK-LABEL: test_int_x86_avx512_cvt_ph2dq_256:300; CHECK: # %bb.0:301; CHECK-NEXT: vcvtph2dq %xmm0, %ymm0302; CHECK-NEXT: retq303 %res = call <8 x i32> @llvm.x86.avx512fp16.mask.vcvtph2dq.256(<8 x half> %x0, <8 x i32> undef, i8 -1)304 ret <8 x i32> %res305}306 307define <8 x i32> @test_int_x86_avx512_mask_cvt_ph2dq_256(<8 x half> %x0, <8 x i32> %x1, i8 %x2) {308; CHECK-LABEL: test_int_x86_avx512_mask_cvt_ph2dq_256:309; CHECK: # %bb.0:310; CHECK-NEXT: kmovd %edi, %k1311; CHECK-NEXT: vcvtph2dq %xmm0, %ymm1 {%k1}312; CHECK-NEXT: vmovaps %ymm1, %ymm0313; CHECK-NEXT: retq314 %res = call <8 x i32> @llvm.x86.avx512fp16.mask.vcvtph2dq.256(<8 x half> %x0, <8 x i32> %x1, i8 %x2)315 ret <8 x i32> %res316}317 318define <8 x i32> @test_int_x86_avx512_maskz_cvt_ph2dq_256(<8 x half> %x0, i8 %x2) {319; CHECK-LABEL: test_int_x86_avx512_maskz_cvt_ph2dq_256:320; CHECK: # %bb.0:321; CHECK-NEXT: kmovd %edi, %k1322; CHECK-NEXT: vcvtph2dq %xmm0, %ymm0 {%k1} {z}323; CHECK-NEXT: retq324 %res = call <8 x i32> @llvm.x86.avx512fp16.mask.vcvtph2dq.256(<8 x half> %x0, <8 x i32> zeroinitializer, i8 %x2)325 ret <8 x i32> %res326}327 328declare <4 x i32> @llvm.x86.avx512fp16.mask.vcvtph2udq.128(<8 x half>, <4 x i32>, i8)329 330define <4 x i32> @test_int_x86_avx512_cvt_ph2udq_128(<8 x half> %x0) {331; CHECK-LABEL: test_int_x86_avx512_cvt_ph2udq_128:332; CHECK: # %bb.0:333; CHECK-NEXT: vcvtph2udq %xmm0, %xmm0334; CHECK-NEXT: retq335 %res = call <4 x i32> @llvm.x86.avx512fp16.mask.vcvtph2udq.128(<8 x half> %x0, <4 x i32> undef, i8 -1)336 ret <4 x i32> %res337}338 339define <4 x i32> @test_int_x86_avx512_mask_cvt_ph2udq_128(<8 x half> %x0, <4 x i32> %x1, i8 %x2) {340; CHECK-LABEL: test_int_x86_avx512_mask_cvt_ph2udq_128:341; CHECK: # %bb.0:342; CHECK-NEXT: kmovd %edi, %k1343; CHECK-NEXT: vcvtph2udq %xmm0, %xmm1 {%k1}344; CHECK-NEXT: vmovaps %xmm1, %xmm0345; CHECK-NEXT: retq346 %res = call <4 x i32> @llvm.x86.avx512fp16.mask.vcvtph2udq.128(<8 x half> %x0, <4 x i32> %x1, i8 %x2)347 ret <4 x i32> %res348}349 350define <4 x i32> @test_int_x86_avx512_maskz_cvt_ph2udq_128(<8 x half> %x0, i8 %x2) {351; CHECK-LABEL: test_int_x86_avx512_maskz_cvt_ph2udq_128:352; CHECK: # %bb.0:353; CHECK-NEXT: kmovd %edi, %k1354; CHECK-NEXT: vcvtph2udq %xmm0, %xmm0 {%k1} {z}355; CHECK-NEXT: retq356 %res = call <4 x i32> @llvm.x86.avx512fp16.mask.vcvtph2udq.128(<8 x half> %x0, <4 x i32> zeroinitializer, i8 %x2)357 ret <4 x i32> %res358}359 360declare <8 x i32> @llvm.x86.avx512fp16.mask.vcvtph2udq.256(<8 x half>, <8 x i32>, i8)361 362define <8 x i32> @test_int_x86_avx512_cvt_ph2udq_256(<8 x half> %x0) {363; CHECK-LABEL: test_int_x86_avx512_cvt_ph2udq_256:364; CHECK: # %bb.0:365; CHECK-NEXT: vcvtph2udq %xmm0, %ymm0366; CHECK-NEXT: retq367 %res = call <8 x i32> @llvm.x86.avx512fp16.mask.vcvtph2udq.256(<8 x half> %x0, <8 x i32> undef, i8 -1)368 ret <8 x i32> %res369}370 371define <8 x i32> @test_int_x86_avx512_mask_cvt_ph2udq_256(<8 x half> %x0, <8 x i32> %x1, i8 %x2) {372; CHECK-LABEL: test_int_x86_avx512_mask_cvt_ph2udq_256:373; CHECK: # %bb.0:374; CHECK-NEXT: kmovd %edi, %k1375; CHECK-NEXT: vcvtph2udq %xmm0, %ymm1 {%k1}376; CHECK-NEXT: vmovaps %ymm1, %ymm0377; CHECK-NEXT: retq378 %res = call <8 x i32> @llvm.x86.avx512fp16.mask.vcvtph2udq.256(<8 x half> %x0, <8 x i32> %x1, i8 %x2)379 ret <8 x i32> %res380}381 382define <8 x i32> @test_int_x86_avx512_maskz_cvt_ph2udq_256(<8 x half> %x0, i8 %x2) {383; CHECK-LABEL: test_int_x86_avx512_maskz_cvt_ph2udq_256:384; CHECK: # %bb.0:385; CHECK-NEXT: kmovd %edi, %k1386; CHECK-NEXT: vcvtph2udq %xmm0, %ymm0 {%k1} {z}387; CHECK-NEXT: retq388 %res = call <8 x i32> @llvm.x86.avx512fp16.mask.vcvtph2udq.256(<8 x half> %x0, <8 x i32> zeroinitializer, i8 %x2)389 ret <8 x i32> %res390}391 392declare <4 x i32> @llvm.x86.avx512fp16.mask.vcvttph2dq.128(<8 x half>, <4 x i32>, i8)393 394define <4 x i32> @test_int_x86_avx512_cvtt_ph2dq_128(<8 x half> %x0) {395; CHECK-LABEL: test_int_x86_avx512_cvtt_ph2dq_128:396; CHECK: # %bb.0:397; CHECK-NEXT: vcvttph2dq %xmm0, %xmm0398; CHECK-NEXT: retq399 %res = call <4 x i32> @llvm.x86.avx512fp16.mask.vcvttph2dq.128(<8 x half> %x0, <4 x i32> undef, i8 -1)400 ret <4 x i32> %res401}402 403define <4 x i32> @test_int_x86_avx512_mask_cvtt_ph2dq_128(<8 x half> %x0, <4 x i32> %x1, i8 %x2) {404; CHECK-LABEL: test_int_x86_avx512_mask_cvtt_ph2dq_128:405; CHECK: # %bb.0:406; CHECK-NEXT: kmovd %edi, %k1407; CHECK-NEXT: vcvttph2dq %xmm0, %xmm1 {%k1}408; CHECK-NEXT: vmovaps %xmm1, %xmm0409; CHECK-NEXT: retq410 %res = call <4 x i32> @llvm.x86.avx512fp16.mask.vcvttph2dq.128(<8 x half> %x0, <4 x i32> %x1, i8 %x2)411 ret <4 x i32> %res412}413 414define <4 x i32> @test_int_x86_avx512_maskz_cvtt_ph2dq_128(<8 x half> %x0, i8 %x2) {415; CHECK-LABEL: test_int_x86_avx512_maskz_cvtt_ph2dq_128:416; CHECK: # %bb.0:417; CHECK-NEXT: kmovd %edi, %k1418; CHECK-NEXT: vcvttph2dq %xmm0, %xmm0 {%k1} {z}419; CHECK-NEXT: retq420 %res = call <4 x i32> @llvm.x86.avx512fp16.mask.vcvttph2dq.128(<8 x half> %x0, <4 x i32> zeroinitializer, i8 %x2)421 ret <4 x i32> %res422}423 424declare <8 x i32> @llvm.x86.avx512fp16.mask.vcvttph2dq.256(<8 x half>, <8 x i32>, i8)425 426define <8 x i32> @test_int_x86_avx512_cvtt_ph2dq_256(<8 x half> %x0) {427; CHECK-LABEL: test_int_x86_avx512_cvtt_ph2dq_256:428; CHECK: # %bb.0:429; CHECK-NEXT: vcvttph2dq %xmm0, %ymm0430; CHECK-NEXT: retq431 %res = call <8 x i32> @llvm.x86.avx512fp16.mask.vcvttph2dq.256(<8 x half> %x0, <8 x i32> undef, i8 -1)432 ret <8 x i32> %res433}434 435define <8 x i32> @test_int_x86_avx512_mask_cvtt_ph2dq_256(<8 x half> %x0, <8 x i32> %x1, i8 %x2) {436; CHECK-LABEL: test_int_x86_avx512_mask_cvtt_ph2dq_256:437; CHECK: # %bb.0:438; CHECK-NEXT: kmovd %edi, %k1439; CHECK-NEXT: vcvttph2dq %xmm0, %ymm1 {%k1}440; CHECK-NEXT: vmovaps %ymm1, %ymm0441; CHECK-NEXT: retq442 %res = call <8 x i32> @llvm.x86.avx512fp16.mask.vcvttph2dq.256(<8 x half> %x0, <8 x i32> %x1, i8 %x2)443 ret <8 x i32> %res444}445 446define <8 x i32> @test_int_x86_avx512_maskz_cvtt_ph2dq_256(<8 x half> %x0, i8 %x2) {447; CHECK-LABEL: test_int_x86_avx512_maskz_cvtt_ph2dq_256:448; CHECK: # %bb.0:449; CHECK-NEXT: kmovd %edi, %k1450; CHECK-NEXT: vcvttph2dq %xmm0, %ymm0 {%k1} {z}451; CHECK-NEXT: retq452 %res = call <8 x i32> @llvm.x86.avx512fp16.mask.vcvttph2dq.256(<8 x half> %x0, <8 x i32> zeroinitializer, i8 %x2)453 ret <8 x i32> %res454}455 456declare <4 x i32> @llvm.x86.avx512fp16.mask.vcvttph2udq.128(<8 x half>, <4 x i32>, i8)457 458define <4 x i32> @test_int_x86_avx512_cvtt_ph2udq_128(<8 x half> %x0) {459; CHECK-LABEL: test_int_x86_avx512_cvtt_ph2udq_128:460; CHECK: # %bb.0:461; CHECK-NEXT: vcvttph2udq %xmm0, %xmm0462; CHECK-NEXT: retq463 %res = call <4 x i32> @llvm.x86.avx512fp16.mask.vcvttph2udq.128(<8 x half> %x0, <4 x i32> undef, i8 -1)464 ret <4 x i32> %res465}466 467define <4 x i32> @test_int_x86_avx512_mask_cvtt_ph2udq_128(<8 x half> %x0, <4 x i32> %x1, i8 %x2) {468; CHECK-LABEL: test_int_x86_avx512_mask_cvtt_ph2udq_128:469; CHECK: # %bb.0:470; CHECK-NEXT: kmovd %edi, %k1471; CHECK-NEXT: vcvttph2udq %xmm0, %xmm1 {%k1}472; CHECK-NEXT: vmovaps %xmm1, %xmm0473; CHECK-NEXT: retq474 %res = call <4 x i32> @llvm.x86.avx512fp16.mask.vcvttph2udq.128(<8 x half> %x0, <4 x i32> %x1, i8 %x2)475 ret <4 x i32> %res476}477 478define <4 x i32> @test_int_x86_avx512_maskz_cvtt_ph2udq_128(<8 x half> %x0, i8 %x2) {479; CHECK-LABEL: test_int_x86_avx512_maskz_cvtt_ph2udq_128:480; CHECK: # %bb.0:481; CHECK-NEXT: kmovd %edi, %k1482; CHECK-NEXT: vcvttph2udq %xmm0, %xmm0 {%k1} {z}483; CHECK-NEXT: retq484 %res = call <4 x i32> @llvm.x86.avx512fp16.mask.vcvttph2udq.128(<8 x half> %x0, <4 x i32> zeroinitializer, i8 %x2)485 ret <4 x i32> %res486}487 488declare <8 x i32> @llvm.x86.avx512fp16.mask.vcvttph2udq.256(<8 x half>, <8 x i32>, i8)489 490define <8 x i32> @test_int_x86_avx512_cvtt_ph2udq_256(<8 x half> %x0) {491; CHECK-LABEL: test_int_x86_avx512_cvtt_ph2udq_256:492; CHECK: # %bb.0:493; CHECK-NEXT: vcvttph2udq %xmm0, %ymm0494; CHECK-NEXT: retq495 %res = call <8 x i32> @llvm.x86.avx512fp16.mask.vcvttph2udq.256(<8 x half> %x0, <8 x i32> undef, i8 -1)496 ret <8 x i32> %res497}498 499define <8 x i32> @test_int_x86_avx512_mask_cvtt_ph2udq_256(<8 x half> %x0, <8 x i32> %x1, i8 %x2) {500; CHECK-LABEL: test_int_x86_avx512_mask_cvtt_ph2udq_256:501; CHECK: # %bb.0:502; CHECK-NEXT: kmovd %edi, %k1503; CHECK-NEXT: vcvttph2udq %xmm0, %ymm1 {%k1}504; CHECK-NEXT: vmovaps %ymm1, %ymm0505; CHECK-NEXT: retq506 %res = call <8 x i32> @llvm.x86.avx512fp16.mask.vcvttph2udq.256(<8 x half> %x0, <8 x i32> %x1, i8 %x2)507 ret <8 x i32> %res508}509 510define <8 x i32> @test_int_x86_avx512_maskz_cvtt_ph2udq_256(<8 x half> %x0, i8 %x2) {511; CHECK-LABEL: test_int_x86_avx512_maskz_cvtt_ph2udq_256:512; CHECK: # %bb.0:513; CHECK-NEXT: kmovd %edi, %k1514; CHECK-NEXT: vcvttph2udq %xmm0, %ymm0 {%k1} {z}515; CHECK-NEXT: retq516 %res = call <8 x i32> @llvm.x86.avx512fp16.mask.vcvttph2udq.256(<8 x half> %x0, <8 x i32> zeroinitializer, i8 %x2)517 ret <8 x i32> %res518}519 520declare <4 x double> @llvm.x86.avx512fp16.mask.vcvtph2pd.256(<8 x half>, <4 x double>, i8)521 522define <4 x double> @test_int_x86_avx512_mask_cvt_ph2pd_256(<8 x half> %x0, <4 x double> %x1, i8 %x2) {523; CHECK-LABEL: test_int_x86_avx512_mask_cvt_ph2pd_256:524; CHECK: # %bb.0:525; CHECK-NEXT: kmovd %edi, %k1526; CHECK-NEXT: vcvtph2pd %xmm0, %ymm1 {%k1}527; CHECK-NEXT: vmovaps %ymm1, %ymm0528; CHECK-NEXT: retq529 %res = call <4 x double> @llvm.x86.avx512fp16.mask.vcvtph2pd.256(<8 x half> %x0, <4 x double> %x1, i8 %x2)530 ret <4 x double> %res531}532 533define <4 x double> @test_int_x86_avx512_mask_cvt_ph2pd_256_nomask(<8 x half> %x0, <4 x double> %x1) {534; CHECK-LABEL: test_int_x86_avx512_mask_cvt_ph2pd_256_nomask:535; CHECK: # %bb.0:536; CHECK-NEXT: vcvtph2pd %xmm0, %ymm0537; CHECK-NEXT: retq538 %res = call <4 x double> @llvm.x86.avx512fp16.mask.vcvtph2pd.256(<8 x half> %x0, <4 x double> %x1, i8 -1)539 ret <4 x double> %res540}541 542declare <2 x double> @llvm.x86.avx512fp16.mask.vcvtph2pd.128(<8 x half>, <2 x double>, i8)543 544define <2 x double> @test_int_x86_avx512_mask_cvt_ph2pd_128(<8 x half> %x0, <2 x double> %x1, i8 %x2) {545; CHECK-LABEL: test_int_x86_avx512_mask_cvt_ph2pd_128:546; CHECK: # %bb.0:547; CHECK-NEXT: kmovd %edi, %k1548; CHECK-NEXT: vcvtph2pd %xmm0, %xmm1 {%k1}549; CHECK-NEXT: vmovaps %xmm1, %xmm0550; CHECK-NEXT: retq551 %res = call <2 x double> @llvm.x86.avx512fp16.mask.vcvtph2pd.128(<8 x half> %x0, <2 x double> %x1, i8 %x2)552 ret <2 x double> %res553}554 555define <2 x double> @test_int_x86_avx512_mask_cvt_ph2pd_128_nomask(<8 x half> %x0, <2 x double> %x1) {556; CHECK-LABEL: test_int_x86_avx512_mask_cvt_ph2pd_128_nomask:557; CHECK: # %bb.0:558; CHECK-NEXT: vcvtph2pd %xmm0, %xmm0559; CHECK-NEXT: retq560 %res = call <2 x double> @llvm.x86.avx512fp16.mask.vcvtph2pd.128(<8 x half> %x0, <2 x double> %x1, i8 -1)561 ret <2 x double> %res562}563 564declare <8 x half> @llvm.x86.avx512fp16.mask.vcvtpd2ph.256(<4 x double>, <8 x half>, i8)565 566define <8 x half> @test_int_x86_avx512_mask_cvt_pd2ph_256(<4 x double> %x0, <8 x half> %x1, i8 %x2) {567; CHECK-LABEL: test_int_x86_avx512_mask_cvt_pd2ph_256:568; CHECK: # %bb.0:569; CHECK-NEXT: kmovd %edi, %k1570; CHECK-NEXT: vcvtpd2ph %ymm0, %xmm1 {%k1}571; CHECK-NEXT: vmovaps %xmm1, %xmm0572; CHECK-NEXT: vzeroupper573; CHECK-NEXT: retq574 %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtpd2ph.256(<4 x double> %x0, <8 x half> %x1, i8 %x2)575 ret <8 x half> %res576}577 578define <8 x half> @test_int_x86_avx512_mask_cvt_pd2ph_256_load(ptr %px0, <8 x half> %x1, i8 %x2) {579; CHECK-LABEL: test_int_x86_avx512_mask_cvt_pd2ph_256_load:580; CHECK: # %bb.0:581; CHECK-NEXT: kmovd %esi, %k1582; CHECK-NEXT: vcvtpd2phy (%rdi), %xmm0 {%k1}583; CHECK-NEXT: retq584 %x0 = load <4 x double>, ptr %px0, align 32585 %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtpd2ph.256(<4 x double> %x0, <8 x half> %x1, i8 %x2)586 ret <8 x half> %res587}588 589declare <8 x half> @llvm.x86.avx512fp16.mask.vcvtpd2ph.128(<2 x double>, <8 x half>, i8)590 591define <8 x half> @test_int_x86_avx512_mask_cvt_pd2ph_128(<2 x double> %x0, <8 x half> %x1, i8 %x2) {592; CHECK-LABEL: test_int_x86_avx512_mask_cvt_pd2ph_128:593; CHECK: # %bb.0:594; CHECK-NEXT: kmovd %edi, %k1595; CHECK-NEXT: vcvtpd2ph %xmm0, %xmm1 {%k1}596; CHECK-NEXT: vmovaps %xmm1, %xmm0597; CHECK-NEXT: retq598 %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtpd2ph.128(<2 x double> %x0, <8 x half> %x1, i8 %x2)599 ret <8 x half> %res600}601 602define <8 x half> @test_int_x86_avx512_mask_cvt_pd2ph_128_load(ptr %px0, <8 x half> %x1, i8 %x2) {603; CHECK-LABEL: test_int_x86_avx512_mask_cvt_pd2ph_128_load:604; CHECK: # %bb.0:605; CHECK-NEXT: kmovd %esi, %k1606; CHECK-NEXT: vcvtpd2phx (%rdi), %xmm0 {%k1}607; CHECK-NEXT: retq608 %x0 = load <2 x double>, ptr %px0, align 16609 %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtpd2ph.128(<2 x double> %x0, <8 x half> %x1, i8 %x2)610 ret <8 x half> %res611}612 613declare <8 x half> @llvm.x86.avx512fp16.mask.vcvtqq2ph.256(<4 x i64>, <8 x half>, i8)614 615define <8 x half> @test_int_x86_avx512_mask_cvt_qq2ph_256(<4 x i64> %x0, <8 x half> %x1, i8 %x2) {616; CHECK-LABEL: test_int_x86_avx512_mask_cvt_qq2ph_256:617; CHECK: # %bb.0:618; CHECK-NEXT: kmovd %edi, %k1619; CHECK-NEXT: vcvtqq2ph %ymm0, %xmm1 {%k1}620; CHECK-NEXT: vmovaps %xmm1, %xmm0621; CHECK-NEXT: vzeroupper622; CHECK-NEXT: retq623 %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtqq2ph.256(<4 x i64> %x0, <8 x half> %x1, i8 %x2)624 ret <8 x half> %res625}626 627define <8 x half> @test_int_x86_avx512_mask_cvt_qq2ph_256_nomask(<4 x i64> %x0, <8 x half> %x1) {628; CHECK-LABEL: test_int_x86_avx512_mask_cvt_qq2ph_256_nomask:629; CHECK: # %bb.0:630; CHECK-NEXT: vcvtqq2ph %ymm0, %xmm0631; CHECK-NEXT: vzeroupper632; CHECK-NEXT: retq633 %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtqq2ph.256(<4 x i64> %x0, <8 x half> %x1, i8 -1)634 ret <8 x half> %res635}636 637define <8 x half> @test_int_x86_avx512_mask_cvt_qq2ph_256_z(<4 x i64> %x0, i8 %x2) {638; CHECK-LABEL: test_int_x86_avx512_mask_cvt_qq2ph_256_z:639; CHECK: # %bb.0:640; CHECK-NEXT: kmovd %edi, %k1641; CHECK-NEXT: vcvtqq2ph %ymm0, %xmm0 {%k1} {z}642; CHECK-NEXT: vzeroupper643; CHECK-NEXT: retq644 %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtqq2ph.256(<4 x i64> %x0, <8 x half> zeroinitializer, i8 %x2)645 ret <8 x half> %res646}647 648define <4 x half> @sint_to_fp_4i64_to_4f16(<4 x i64> %x) {649; CHECK-LABEL: sint_to_fp_4i64_to_4f16:650; CHECK: # %bb.0:651; CHECK-NEXT: vcvtqq2ph %ymm0, %xmm0652; CHECK-NEXT: vzeroupper653; CHECK-NEXT: retq654 %res = sitofp <4 x i64> %x to <4 x half>655 ret <4 x half> %res656}657 658define <4 x i64> @fp_to_sint_4f16_to_4i64(<4 x half> %x) {659; CHECK-LABEL: fp_to_sint_4f16_to_4i64:660; CHECK: # %bb.0:661; CHECK-NEXT: vcvttph2qq %xmm0, %ymm0662; CHECK-NEXT: retq663 %res = fptosi <4 x half> %x to <4 x i64>664 ret <4 x i64> %res665}666 667declare <8 x half> @llvm.x86.avx512fp16.mask.vcvtqq2ph.128(<2 x i64>, <8 x half>, i8)668 669define <8 x half> @test_int_x86_avx512_mask_cvt_qq2ph_128(<2 x i64> %x0, <8 x half> %x1, i8 %x2) {670; CHECK-LABEL: test_int_x86_avx512_mask_cvt_qq2ph_128:671; CHECK: # %bb.0:672; CHECK-NEXT: kmovd %edi, %k1673; CHECK-NEXT: vcvtqq2ph %xmm0, %xmm1 {%k1}674; CHECK-NEXT: vmovaps %xmm1, %xmm0675; CHECK-NEXT: retq676 %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtqq2ph.128(<2 x i64> %x0, <8 x half> %x1, i8 %x2)677 ret <8 x half> %res678}679 680define <8 x half> @test_int_x86_avx512_mask_cvt_qq2ph_128_nomask(<2 x i64> %x0, <8 x half> %x1) {681; CHECK-LABEL: test_int_x86_avx512_mask_cvt_qq2ph_128_nomask:682; CHECK: # %bb.0:683; CHECK-NEXT: vcvtqq2ph %xmm0, %xmm0684; CHECK-NEXT: retq685 %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtqq2ph.128(<2 x i64> %x0, <8 x half> %x1, i8 -1)686 ret <8 x half> %res687}688 689define <8 x half> @test_int_x86_avx512_mask_cvt_qq2ph_128_z(<2 x i64> %x0, i8 %x2) {690; CHECK-LABEL: test_int_x86_avx512_mask_cvt_qq2ph_128_z:691; CHECK: # %bb.0:692; CHECK-NEXT: kmovd %edi, %k1693; CHECK-NEXT: vcvtqq2ph %xmm0, %xmm0 {%k1} {z}694; CHECK-NEXT: retq695 %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtqq2ph.128(<2 x i64> %x0, <8 x half> zeroinitializer, i8 %x2)696 ret <8 x half> %res697}698 699define <2 x half> @sint_to_fp_2i64_to_2f16(<2 x i64> %x) {700; CHECK-LABEL: sint_to_fp_2i64_to_2f16:701; CHECK: # %bb.0:702; CHECK-NEXT: vcvtqq2ph %xmm0, %xmm0703; CHECK-NEXT: retq704 %res = sitofp <2 x i64> %x to <2 x half>705 ret <2 x half> %res706}707 708define <2 x i64> @fp_to_sint_2f16_to_2i64(<2 x half> %x) {709; CHECK-LABEL: fp_to_sint_2f16_to_2i64:710; CHECK: # %bb.0:711; CHECK-NEXT: vcvttph2qq %xmm0, %xmm0712; CHECK-NEXT: retq713 %res = fptosi <2 x half> %x to <2 x i64>714 ret <2 x i64> %res715}716 717declare <8 x half> @llvm.x86.avx512fp16.mask.vcvtuqq2ph.256(<4 x i64>, <8 x half>, i8)718 719define <8 x half> @test_int_x86_avx512_mask_cvt_uqq2ph_256(<4 x i64> %x0, <8 x half> %x1, i8 %x2) {720; CHECK-LABEL: test_int_x86_avx512_mask_cvt_uqq2ph_256:721; CHECK: # %bb.0:722; CHECK-NEXT: kmovd %edi, %k1723; CHECK-NEXT: vcvtuqq2ph %ymm0, %xmm1 {%k1}724; CHECK-NEXT: vmovaps %xmm1, %xmm0725; CHECK-NEXT: vzeroupper726; CHECK-NEXT: retq727 %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtuqq2ph.256(<4 x i64> %x0, <8 x half> %x1, i8 %x2)728 ret <8 x half> %res729}730 731define <8 x half> @test_int_x86_avx512_mask_cvt_uqq2ph_256_nomask(<4 x i64> %x0, <8 x half> %x1) {732; CHECK-LABEL: test_int_x86_avx512_mask_cvt_uqq2ph_256_nomask:733; CHECK: # %bb.0:734; CHECK-NEXT: vcvtuqq2ph %ymm0, %xmm0735; CHECK-NEXT: vzeroupper736; CHECK-NEXT: retq737 %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtuqq2ph.256(<4 x i64> %x0, <8 x half> %x1, i8 -1)738 ret <8 x half> %res739}740 741define <8 x half> @test_int_x86_avx512_mask_cvt_uqq2ph_256_z(<4 x i64> %x0, i8 %x2) {742; CHECK-LABEL: test_int_x86_avx512_mask_cvt_uqq2ph_256_z:743; CHECK: # %bb.0:744; CHECK-NEXT: kmovd %edi, %k1745; CHECK-NEXT: vcvtuqq2ph %ymm0, %xmm0 {%k1} {z}746; CHECK-NEXT: vzeroupper747; CHECK-NEXT: retq748 %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtuqq2ph.256(<4 x i64> %x0, <8 x half> zeroinitializer, i8 %x2)749 ret <8 x half> %res750}751 752define <4 x half> @uint_to_fp_4i64_to_4f16(<4 x i64> %x) {753; CHECK-LABEL: uint_to_fp_4i64_to_4f16:754; CHECK: # %bb.0:755; CHECK-NEXT: vcvtuqq2ph %ymm0, %xmm0756; CHECK-NEXT: vzeroupper757; CHECK-NEXT: retq758 %res = uitofp <4 x i64> %x to <4 x half>759 ret <4 x half> %res760}761 762define <4 x i64> @fp_to_uint_4f16_to_4i64(<4 x half> %x) {763; CHECK-LABEL: fp_to_uint_4f16_to_4i64:764; CHECK: # %bb.0:765; CHECK-NEXT: vcvttph2uqq %xmm0, %ymm0766; CHECK-NEXT: retq767 %res = fptoui <4 x half> %x to <4 x i64>768 ret <4 x i64> %res769}770 771declare <8 x half> @llvm.x86.avx512fp16.mask.vcvtuqq2ph.128(<2 x i64>, <8 x half>, i8)772 773define <8 x half> @test_int_x86_avx512_mask_cvt_uqq2ph_128(<2 x i64> %x0, <8 x half> %x1, i8 %x2) {774; CHECK-LABEL: test_int_x86_avx512_mask_cvt_uqq2ph_128:775; CHECK: # %bb.0:776; CHECK-NEXT: kmovd %edi, %k1777; CHECK-NEXT: vcvtuqq2ph %xmm0, %xmm1 {%k1}778; CHECK-NEXT: vmovaps %xmm1, %xmm0779; CHECK-NEXT: retq780 %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtuqq2ph.128(<2 x i64> %x0, <8 x half> %x1, i8 %x2)781 ret <8 x half> %res782}783 784define <8 x half> @test_int_x86_avx512_mask_cvt_uqq2ph_128_nomask(<2 x i64> %x0, <8 x half> %x1) {785; CHECK-LABEL: test_int_x86_avx512_mask_cvt_uqq2ph_128_nomask:786; CHECK: # %bb.0:787; CHECK-NEXT: vcvtuqq2ph %xmm0, %xmm0788; CHECK-NEXT: retq789 %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtuqq2ph.128(<2 x i64> %x0, <8 x half> %x1, i8 -1)790 ret <8 x half> %res791}792 793define <8 x half> @test_int_x86_avx512_mask_cvt_uqq2ph_128_z(<2 x i64> %x0, i8 %x2) {794; CHECK-LABEL: test_int_x86_avx512_mask_cvt_uqq2ph_128_z:795; CHECK: # %bb.0:796; CHECK-NEXT: kmovd %edi, %k1797; CHECK-NEXT: vcvtuqq2ph %xmm0, %xmm0 {%k1} {z}798; CHECK-NEXT: retq799 %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtuqq2ph.128(<2 x i64> %x0, <8 x half> zeroinitializer, i8 %x2)800 ret <8 x half> %res801}802 803define <2 x half> @uint_to_fp_2i64_to_2f16(<2 x i64> %x) {804; CHECK-LABEL: uint_to_fp_2i64_to_2f16:805; CHECK: # %bb.0:806; CHECK-NEXT: vcvtuqq2ph %xmm0, %xmm0807; CHECK-NEXT: retq808 %res = uitofp <2 x i64> %x to <2 x half>809 ret <2 x half> %res810}811 812define <2 x i64> @fp_to_uint_2f16_to_2i64(<2 x half> %x) {813; CHECK-LABEL: fp_to_uint_2f16_to_2i64:814; CHECK: # %bb.0:815; CHECK-NEXT: vcvttph2uqq %xmm0, %xmm0816; CHECK-NEXT: retq817 %res = fptoui <2 x half> %x to <2 x i64>818 ret <2 x i64> %res819}820 821declare <2 x i64> @llvm.x86.avx512fp16.mask.vcvttph2qq.128(<8 x half>, <2 x i64>, i8)822 823define <2 x i64> @test_int_x86_avx512_cvtt_ph2qq_128(<8 x half> %x0) {824; CHECK-LABEL: test_int_x86_avx512_cvtt_ph2qq_128:825; CHECK: # %bb.0:826; CHECK-NEXT: vcvttph2qq %xmm0, %xmm0827; CHECK-NEXT: retq828 %res = call <2 x i64> @llvm.x86.avx512fp16.mask.vcvttph2qq.128(<8 x half> %x0, <2 x i64> undef, i8 -1)829 ret <2 x i64> %res830}831 832define <2 x i64> @test_int_x86_avx512_mask_cvtt_ph2qq_128(<8 x half> %x0, <2 x i64> %x1, i8 %x2) {833; CHECK-LABEL: test_int_x86_avx512_mask_cvtt_ph2qq_128:834; CHECK: # %bb.0:835; CHECK-NEXT: kmovd %edi, %k1836; CHECK-NEXT: vcvttph2qq %xmm0, %xmm1 {%k1}837; CHECK-NEXT: vmovaps %xmm1, %xmm0838; CHECK-NEXT: retq839 %res = call <2 x i64> @llvm.x86.avx512fp16.mask.vcvttph2qq.128(<8 x half> %x0, <2 x i64> %x1, i8 %x2)840 ret <2 x i64> %res841}842 843define <2 x i64> @test_int_x86_avx512_maskz_cvtt_ph2qq_128(<8 x half> %x0, i8 %x2) {844; CHECK-LABEL: test_int_x86_avx512_maskz_cvtt_ph2qq_128:845; CHECK: # %bb.0:846; CHECK-NEXT: kmovd %edi, %k1847; CHECK-NEXT: vcvttph2qq %xmm0, %xmm0 {%k1} {z}848; CHECK-NEXT: retq849 %res = call <2 x i64> @llvm.x86.avx512fp16.mask.vcvttph2qq.128(<8 x half> %x0, <2 x i64> zeroinitializer, i8 %x2)850 ret <2 x i64> %res851}852 853declare <4 x i64> @llvm.x86.avx512fp16.mask.vcvttph2qq.256(<8 x half>, <4 x i64>, i8)854 855define <4 x i64> @test_int_x86_avx512_cvtt_ph2qq_256(<8 x half> %x0) {856; CHECK-LABEL: test_int_x86_avx512_cvtt_ph2qq_256:857; CHECK: # %bb.0:858; CHECK-NEXT: vcvttph2qq %xmm0, %ymm0859; CHECK-NEXT: retq860 %res = call <4 x i64> @llvm.x86.avx512fp16.mask.vcvttph2qq.256(<8 x half> %x0, <4 x i64> undef, i8 -1)861 ret <4 x i64> %res862}863 864define <4 x i64> @test_int_x86_avx512_mask_cvtt_ph2qq_256(<8 x half> %x0, <4 x i64> %x1, i8 %x2) {865; CHECK-LABEL: test_int_x86_avx512_mask_cvtt_ph2qq_256:866; CHECK: # %bb.0:867; CHECK-NEXT: kmovd %edi, %k1868; CHECK-NEXT: vcvttph2qq %xmm0, %ymm1 {%k1}869; CHECK-NEXT: vmovaps %ymm1, %ymm0870; CHECK-NEXT: retq871 %res = call <4 x i64> @llvm.x86.avx512fp16.mask.vcvttph2qq.256(<8 x half> %x0, <4 x i64> %x1, i8 %x2)872 ret <4 x i64> %res873}874 875define <4 x i64> @test_int_x86_avx512_maskz_cvtt_ph2qq_256(<8 x half> %x0, i8 %x2) {876; CHECK-LABEL: test_int_x86_avx512_maskz_cvtt_ph2qq_256:877; CHECK: # %bb.0:878; CHECK-NEXT: kmovd %edi, %k1879; CHECK-NEXT: vcvttph2qq %xmm0, %ymm0 {%k1} {z}880; CHECK-NEXT: retq881 %res = call <4 x i64> @llvm.x86.avx512fp16.mask.vcvttph2qq.256(<8 x half> %x0, <4 x i64> zeroinitializer, i8 %x2)882 ret <4 x i64> %res883}884 885declare <2 x i64> @llvm.x86.avx512fp16.mask.vcvttph2uqq.128(<8 x half>, <2 x i64>, i8)886 887define <2 x i64> @test_int_x86_avx512_cvtt_ph2uqq_128(<8 x half> %x0) {888; CHECK-LABEL: test_int_x86_avx512_cvtt_ph2uqq_128:889; CHECK: # %bb.0:890; CHECK-NEXT: vcvttph2uqq %xmm0, %xmm0891; CHECK-NEXT: retq892 %res = call <2 x i64> @llvm.x86.avx512fp16.mask.vcvttph2uqq.128(<8 x half> %x0, <2 x i64> undef, i8 -1)893 ret <2 x i64> %res894}895 896define <2 x i64> @test_int_x86_avx512_mask_cvtt_ph2uqq_128(<8 x half> %x0, <2 x i64> %x1, i8 %x2) {897; CHECK-LABEL: test_int_x86_avx512_mask_cvtt_ph2uqq_128:898; CHECK: # %bb.0:899; CHECK-NEXT: kmovd %edi, %k1900; CHECK-NEXT: vcvttph2uqq %xmm0, %xmm1 {%k1}901; CHECK-NEXT: vmovaps %xmm1, %xmm0902; CHECK-NEXT: retq903 %res = call <2 x i64> @llvm.x86.avx512fp16.mask.vcvttph2uqq.128(<8 x half> %x0, <2 x i64> %x1, i8 %x2)904 ret <2 x i64> %res905}906 907define <2 x i64> @test_int_x86_avx512_maskz_cvtt_ph2uqq_128(<8 x half> %x0, i8 %x2) {908; CHECK-LABEL: test_int_x86_avx512_maskz_cvtt_ph2uqq_128:909; CHECK: # %bb.0:910; CHECK-NEXT: kmovd %edi, %k1911; CHECK-NEXT: vcvttph2uqq %xmm0, %xmm0 {%k1} {z}912; CHECK-NEXT: retq913 %res = call <2 x i64> @llvm.x86.avx512fp16.mask.vcvttph2uqq.128(<8 x half> %x0, <2 x i64> zeroinitializer, i8 %x2)914 ret <2 x i64> %res915}916 917declare <4 x i64> @llvm.x86.avx512fp16.mask.vcvttph2uqq.256(<8 x half>, <4 x i64>, i8)918 919define <4 x i64> @test_int_x86_avx512_cvtt_ph2uqq_256(<8 x half> %x0) {920; CHECK-LABEL: test_int_x86_avx512_cvtt_ph2uqq_256:921; CHECK: # %bb.0:922; CHECK-NEXT: vcvttph2uqq %xmm0, %ymm0923; CHECK-NEXT: retq924 %res = call <4 x i64> @llvm.x86.avx512fp16.mask.vcvttph2uqq.256(<8 x half> %x0, <4 x i64> undef, i8 -1)925 ret <4 x i64> %res926}927 928define <4 x i64> @test_int_x86_avx512_mask_cvtt_ph2uqq_256(<8 x half> %x0, <4 x i64> %x1, i8 %x2) {929; CHECK-LABEL: test_int_x86_avx512_mask_cvtt_ph2uqq_256:930; CHECK: # %bb.0:931; CHECK-NEXT: kmovd %edi, %k1932; CHECK-NEXT: vcvttph2uqq %xmm0, %ymm1 {%k1}933; CHECK-NEXT: vmovaps %ymm1, %ymm0934; CHECK-NEXT: retq935 %res = call <4 x i64> @llvm.x86.avx512fp16.mask.vcvttph2uqq.256(<8 x half> %x0, <4 x i64> %x1, i8 %x2)936 ret <4 x i64> %res937}938 939define <4 x i64> @test_int_x86_avx512_maskz_cvtt_ph2uqq_256(<8 x half> %x0, i8 %x2) {940; CHECK-LABEL: test_int_x86_avx512_maskz_cvtt_ph2uqq_256:941; CHECK: # %bb.0:942; CHECK-NEXT: kmovd %edi, %k1943; CHECK-NEXT: vcvttph2uqq %xmm0, %ymm0 {%k1} {z}944; CHECK-NEXT: retq945 %res = call <4 x i64> @llvm.x86.avx512fp16.mask.vcvttph2uqq.256(<8 x half> %x0, <4 x i64> zeroinitializer, i8 %x2)946 ret <4 x i64> %res947}948 949declare <8 x half> @llvm.sqrt.v8f16(<8 x half>)950declare <16 x half> @llvm.sqrt.v16f16(<16 x half>)951 952define <8 x half> @test_sqrt_ph_128(<8 x half> %a0) {953; CHECK-LABEL: test_sqrt_ph_128:954; CHECK: # %bb.0:955; CHECK-NEXT: vsqrtph %xmm0, %xmm0956; CHECK-NEXT: retq957 %1 = call <8 x half> @llvm.sqrt.v8f16(<8 x half> %a0)958 ret <8 x half> %1959}960 961define <8 x half> @test_sqrt_ph_128_fast(<8 x half> %a0, <8 x half> %a1) {962; CHECK-LABEL: test_sqrt_ph_128_fast:963; CHECK: # %bb.0:964; CHECK-NEXT: vrsqrtph %xmm0, %xmm0965; CHECK-NEXT: vmulph %xmm0, %xmm1, %xmm0966; CHECK-NEXT: retq967 %1 = call fast <8 x half> @llvm.sqrt.v8f16(<8 x half> %a0)968 %2 = fdiv fast <8 x half> %a1, %1969 ret <8 x half> %2970}971 972define <8 x half> @test_sqrt_ph_128_fast2(<8 x half> %a0, <8 x half> %a1) {973; CHECK-LABEL: test_sqrt_ph_128_fast2:974; CHECK: # %bb.0:975; CHECK-NEXT: vsqrtph %xmm0, %xmm0976; CHECK-NEXT: retq977 %1 = call fast <8 x half> @llvm.sqrt.v8f16(<8 x half> %a0)978 ret <8 x half> %1979}980 981define <8 x half> @test_mask_sqrt_ph_128(<8 x half> %a0, <8 x half> %passthru, i8 %mask) {982; CHECK-LABEL: test_mask_sqrt_ph_128:983; CHECK: # %bb.0:984; CHECK-NEXT: kmovd %edi, %k1985; CHECK-NEXT: vsqrtph %xmm0, %xmm1 {%k1}986; CHECK-NEXT: vmovaps %xmm1, %xmm0987; CHECK-NEXT: retq988 %1 = call <8 x half> @llvm.sqrt.v8f16(<8 x half> %a0)989 %2 = bitcast i8 %mask to <8 x i1>990 %3 = select <8 x i1> %2, <8 x half> %1, <8 x half> %passthru991 ret <8 x half> %3992}993 994define <8 x half> @test_maskz_sqrt_ph_128(<8 x half> %a0, i8 %mask) {995; CHECK-LABEL: test_maskz_sqrt_ph_128:996; CHECK: # %bb.0:997; CHECK-NEXT: kmovd %edi, %k1998; CHECK-NEXT: vsqrtph %xmm0, %xmm0 {%k1} {z}999; CHECK-NEXT: retq1000 %1 = call <8 x half> @llvm.sqrt.v8f16(<8 x half> %a0)1001 %2 = bitcast i8 %mask to <8 x i1>1002 %3 = select <8 x i1> %2, <8 x half> %1, <8 x half> zeroinitializer1003 ret <8 x half> %31004}1005 1006define <16 x half> @test_sqrt_ph_256(<16 x half> %a0) {1007; CHECK-LABEL: test_sqrt_ph_256:1008; CHECK: # %bb.0:1009; CHECK-NEXT: vsqrtph %ymm0, %ymm01010; CHECK-NEXT: retq1011 %1 = call <16 x half> @llvm.sqrt.v16f16(<16 x half> %a0)1012 ret <16 x half> %11013}1014 1015define <16 x half> @test_sqrt_ph_256_fast(<16 x half> %a0, <16 x half> %a1) {1016; CHECK-LABEL: test_sqrt_ph_256_fast:1017; CHECK: # %bb.0:1018; CHECK-NEXT: vrsqrtph %ymm0, %ymm01019; CHECK-NEXT: vmulph %ymm0, %ymm1, %ymm01020; CHECK-NEXT: retq1021 %1 = call fast <16 x half> @llvm.sqrt.v16f16(<16 x half> %a0)1022 %2 = fdiv fast <16 x half> %a1, %11023 ret <16 x half> %21024}1025 1026define <16 x half> @test_mask_sqrt_ph_256(<16 x half> %a0, <16 x half> %passthru, i16 %mask) {1027; CHECK-LABEL: test_mask_sqrt_ph_256:1028; CHECK: # %bb.0:1029; CHECK-NEXT: kmovd %edi, %k11030; CHECK-NEXT: vsqrtph %ymm0, %ymm1 {%k1}1031; CHECK-NEXT: vmovaps %ymm1, %ymm01032; CHECK-NEXT: retq1033 %1 = call <16 x half> @llvm.sqrt.v16f16(<16 x half> %a0)1034 %2 = bitcast i16 %mask to <16 x i1>1035 %3 = select <16 x i1> %2, <16 x half> %1, <16 x half> %passthru1036 ret <16 x half> %31037}1038 1039define <16 x half> @test_maskz_sqrt_ph_256(<16 x half> %a0, i16 %mask) {1040; CHECK-LABEL: test_maskz_sqrt_ph_256:1041; CHECK: # %bb.0:1042; CHECK-NEXT: kmovd %edi, %k11043; CHECK-NEXT: vsqrtph %ymm0, %ymm0 {%k1} {z}1044; CHECK-NEXT: retq1045 %1 = call <16 x half> @llvm.sqrt.v16f16(<16 x half> %a0)1046 %2 = bitcast i16 %mask to <16 x i1>1047 %3 = select <16 x i1> %2, <16 x half> %1, <16 x half> zeroinitializer1048 ret <16 x half> %31049}1050 1051declare <8 x half> @llvm.x86.avx512fp16.mask.rsqrt.ph.128(<8 x half>, <8 x half>, i8)1052declare <16 x half> @llvm.x86.avx512fp16.mask.rsqrt.ph.256(<16 x half>, <16 x half>, i16)1053 1054define <8 x half> @test_rsqrt_ph_128(<8 x half> %a0) {1055; CHECK-LABEL: test_rsqrt_ph_128:1056; CHECK: # %bb.0:1057; CHECK-NEXT: vrsqrtph %xmm0, %xmm01058; CHECK-NEXT: retq1059 %res = call <8 x half> @llvm.x86.avx512fp16.mask.rsqrt.ph.128(<8 x half> %a0, <8 x half> zeroinitializer, i8 -1)1060 ret <8 x half> %res1061}1062 1063define <16 x half> @test_rsqrt_ph_256(<16 x half> %a0) {1064; CHECK-LABEL: test_rsqrt_ph_256:1065; CHECK: # %bb.0:1066; CHECK-NEXT: vrsqrtph %ymm0, %ymm01067; CHECK-NEXT: retq1068 %res = call <16 x half> @llvm.x86.avx512fp16.mask.rsqrt.ph.256(<16 x half> %a0, <16 x half> zeroinitializer, i16 -1)1069 ret <16 x half> %res1070}1071 1072declare <8 x half> @llvm.x86.avx512fp16.mask.rcp.ph.128(<8 x half>, <8 x half>, i8)1073declare <16 x half> @llvm.x86.avx512fp16.mask.rcp.ph.256(<16 x half>, <16 x half>, i16)1074 1075define <8 x half> @test_rcp_ph_128(<8 x half> %a0, <8 x half> %a1, i8 %mask) {1076; CHECK-LABEL: test_rcp_ph_128:1077; CHECK: # %bb.0:1078; CHECK-NEXT: kmovd %edi, %k11079; CHECK-NEXT: vrcpph %xmm0, %xmm1 {%k1}1080; CHECK-NEXT: vmovaps %xmm1, %xmm01081; CHECK-NEXT: retq1082 %res = call <8 x half> @llvm.x86.avx512fp16.mask.rcp.ph.128(<8 x half> %a0, <8 x half> %a1, i8 %mask)1083 ret <8 x half> %res1084}1085 1086define <16 x half> @test_rcp_ph_256(<16 x half> %a0, <16 x half> %a1, i16 %mask) {1087; CHECK-LABEL: test_rcp_ph_256:1088; CHECK: # %bb.0:1089; CHECK-NEXT: kmovd %edi, %k11090; CHECK-NEXT: vrcpph %ymm0, %ymm1 {%k1}1091; CHECK-NEXT: vmovaps %ymm1, %ymm01092; CHECK-NEXT: retq1093 %res = call <16 x half> @llvm.x86.avx512fp16.mask.rcp.ph.256(<16 x half> %a0, <16 x half> %a1, i16 %mask)1094 ret <16 x half> %res1095}1096 1097declare <8 x half> @llvm.x86.avx512fp16.mask.reduce.ph.128(<8 x half>, i32, <8 x half>, i8)1098declare <16 x half> @llvm.x86.avx512fp16.mask.reduce.ph.256(<16 x half>, i32, <16 x half>, i16)1099 1100define <8 x half>@test_int_x86_avx512_mask_reduce_ph_128(<8 x half> %x0, <8 x half> %x2, i8 %x3) {1101; CHECK-LABEL: test_int_x86_avx512_mask_reduce_ph_128:1102; CHECK: # %bb.0:1103; CHECK-NEXT: kmovd %edi, %k11104; CHECK-NEXT: vreduceph $8, %xmm0, %xmm1 {%k1}1105; CHECK-NEXT: vreduceph $4, %xmm0, %xmm01106; CHECK-NEXT: vaddph %xmm0, %xmm1, %xmm01107; CHECK-NEXT: retq1108 %res = call <8 x half> @llvm.x86.avx512fp16.mask.reduce.ph.128(<8 x half> %x0, i32 8, <8 x half> %x2, i8 %x3)1109 %res1 = call <8 x half> @llvm.x86.avx512fp16.mask.reduce.ph.128(<8 x half> %x0, i32 4, <8 x half> %x2, i8 -1)1110 %res2 = fadd <8 x half> %res, %res11111 ret <8 x half> %res21112}1113 1114define <16 x half>@test_int_x86_avx512_mask_reduce_ph_256(<16 x half> %x0, <16 x half> %x2, i16 %x3) {1115; CHECK-LABEL: test_int_x86_avx512_mask_reduce_ph_256:1116; CHECK: # %bb.0:1117; CHECK-NEXT: kmovd %edi, %k11118; CHECK-NEXT: vreduceph $8, %ymm0, %ymm1 {%k1}1119; CHECK-NEXT: vreduceph $4, %ymm0, %ymm01120; CHECK-NEXT: vaddph %ymm0, %ymm1, %ymm01121; CHECK-NEXT: retq1122 %res = call <16 x half> @llvm.x86.avx512fp16.mask.reduce.ph.256(<16 x half> %x0, i32 8, <16 x half> %x2, i16 %x3)1123 %res1 = call <16 x half> @llvm.x86.avx512fp16.mask.reduce.ph.256(<16 x half> %x0, i32 4, <16 x half> %x2, i16 -1)1124 %res2 = fadd <16 x half> %res, %res11125 ret <16 x half> %res21126}1127 1128declare <8 x i1> @llvm.x86.avx512fp16.fpclass.ph.128(<8 x half>, i32)1129declare <16 x i1> @llvm.x86.avx512fp16.fpclass.ph.256(<16 x half>, i32)1130 1131define i8 @test_int_x86_avx512_fpclass_ph_128(<8 x half> %x0) {1132; CHECK-LABEL: test_int_x86_avx512_fpclass_ph_128:1133; CHECK: # %bb.0:1134; CHECK-NEXT: vfpclassph $2, %xmm0, %k1 # k1 = isPositiveZero(xmm0)1135; CHECK-NEXT: vfpclassph $4, %xmm0, %k0 {%k1}1136; CHECK-NEXT: kmovd %k0, %eax1137; CHECK-NEXT: # kill: def $al killed $al killed $eax1138; CHECK-NEXT: retq1139 %res = call <8 x i1> @llvm.x86.avx512fp16.fpclass.ph.128(<8 x half> %x0, i32 4)1140 %res1 = call <8 x i1> @llvm.x86.avx512fp16.fpclass.ph.128(<8 x half> %x0, i32 2)1141 %1 = and <8 x i1> %res1, %res1142 %2 = bitcast <8 x i1> %1 to i81143 ret i8 %21144}1145 1146define i16 @test_int_x86_avx512_fpclass_ph_256(<16 x half> %x0) {1147; CHECK-LABEL: test_int_x86_avx512_fpclass_ph_256:1148; CHECK: # %bb.0:1149; CHECK-NEXT: vfpclassph $2, %ymm0, %k1 # k1 = isPositiveZero(ymm0)1150; CHECK-NEXT: vfpclassph $4, %ymm0, %k0 {%k1}1151; CHECK-NEXT: kmovd %k0, %eax1152; CHECK-NEXT: # kill: def $ax killed $ax killed $eax1153; CHECK-NEXT: vzeroupper1154; CHECK-NEXT: retq1155 %res = call <16 x i1> @llvm.x86.avx512fp16.fpclass.ph.256(<16 x half> %x0, i32 4)1156 %res1 = call <16 x i1> @llvm.x86.avx512fp16.fpclass.ph.256(<16 x half> %x0, i32 2)1157 %1 = and <16 x i1> %res1, %res1158 %2 = bitcast <16 x i1> %1 to i161159 ret i16 %21160}1161 1162declare <8 x half> @llvm.x86.avx512fp16.mask.getexp.ph.128(<8 x half>, <8 x half>, i8)1163declare <16 x half> @llvm.x86.avx512fp16.mask.getexp.ph.256(<16 x half>, <16 x half>, i16)1164 1165define <8 x half>@test_int_x86_avx512_getexp_ph_128(<8 x half> %x0) {1166; CHECK-LABEL: test_int_x86_avx512_getexp_ph_128:1167; CHECK: # %bb.0:1168; CHECK-NEXT: vgetexpph %xmm0, %xmm01169; CHECK-NEXT: retq1170 %res = call <8 x half> @llvm.x86.avx512fp16.mask.getexp.ph.128(<8 x half> %x0, <8 x half> zeroinitializer, i8 -1)1171 ret <8 x half> %res1172}1173 1174define <8 x half>@test_int_x86_avx512_mask_getexp_ph_128(<8 x half> %x0, <8 x half> %x1, i8 %x2) {1175; CHECK-LABEL: test_int_x86_avx512_mask_getexp_ph_128:1176; CHECK: # %bb.0:1177; CHECK-NEXT: kmovd %edi, %k11178; CHECK-NEXT: vgetexpph %xmm0, %xmm1 {%k1}1179; CHECK-NEXT: vmovaps %xmm1, %xmm01180; CHECK-NEXT: retq1181 %res = call <8 x half> @llvm.x86.avx512fp16.mask.getexp.ph.128(<8 x half> %x0, <8 x half> %x1, i8 %x2)1182 ret <8 x half> %res1183}1184 1185define <8 x half>@test_int_x86_avx512_maskz_getexp_ph_128(<8 x half> %x0, i8 %x2) {1186; CHECK-LABEL: test_int_x86_avx512_maskz_getexp_ph_128:1187; CHECK: # %bb.0:1188; CHECK-NEXT: kmovd %edi, %k11189; CHECK-NEXT: vgetexpph %xmm0, %xmm0 {%k1} {z}1190; CHECK-NEXT: retq1191 %res = call <8 x half> @llvm.x86.avx512fp16.mask.getexp.ph.128(<8 x half> %x0, <8 x half> zeroinitializer, i8 %x2)1192 ret <8 x half> %res1193}1194 1195define <16 x half>@test_int_x86_avx512_getexp_ph_256(<16 x half> %x0) {1196; CHECK-LABEL: test_int_x86_avx512_getexp_ph_256:1197; CHECK: # %bb.0:1198; CHECK-NEXT: vgetexpph %ymm0, %ymm01199; CHECK-NEXT: retq1200 %res = call <16 x half> @llvm.x86.avx512fp16.mask.getexp.ph.256(<16 x half> %x0, <16 x half> zeroinitializer, i16 -1)1201 ret <16 x half> %res1202}1203 1204define <16 x half>@test_int_x86_avx512_mask_getexp_ph_256(<16 x half> %x0, <16 x half> %x1, i16 %x2) {1205; CHECK-LABEL: test_int_x86_avx512_mask_getexp_ph_256:1206; CHECK: # %bb.0:1207; CHECK-NEXT: kmovd %edi, %k11208; CHECK-NEXT: vgetexpph %ymm0, %ymm1 {%k1}1209; CHECK-NEXT: vmovaps %ymm1, %ymm01210; CHECK-NEXT: retq1211 %res = call <16 x half> @llvm.x86.avx512fp16.mask.getexp.ph.256(<16 x half> %x0, <16 x half> %x1, i16 %x2)1212 ret <16 x half> %res1213}1214 1215define <16 x half>@test_int_x86_avx512_maskz_getexp_ph_256(<16 x half> %x0, i16 %x2) {1216; CHECK-LABEL: test_int_x86_avx512_maskz_getexp_ph_256:1217; CHECK: # %bb.0:1218; CHECK-NEXT: kmovd %edi, %k11219; CHECK-NEXT: vgetexpph %ymm0, %ymm0 {%k1} {z}1220; CHECK-NEXT: retq1221 %res = call <16 x half> @llvm.x86.avx512fp16.mask.getexp.ph.256(<16 x half> %x0, <16 x half> zeroinitializer, i16 %x2)1222 ret <16 x half> %res1223}1224 1225declare <8 x half> @llvm.x86.avx512fp16.mask.getmant.ph.128(<8 x half>, i32, <8 x half>, i8)1226declare <16 x half> @llvm.x86.avx512fp16.mask.getmant.ph.256(<16 x half>, i32, <16 x half>, i16)1227 1228define <8 x half>@test_int_x86_avx512_mask_getmant_ph_128(<8 x half> %x0, <8 x half> %x2, i8 %x3) {1229; CHECK-LABEL: test_int_x86_avx512_mask_getmant_ph_128:1230; CHECK: # %bb.0:1231; CHECK-NEXT: kmovd %edi, %k11232; CHECK-NEXT: vgetmantph $8, %xmm0, %xmm1 {%k1}1233; CHECK-NEXT: vgetmantph $4, %xmm0, %xmm01234; CHECK-NEXT: vaddph %xmm0, %xmm1, %xmm01235; CHECK-NEXT: retq1236 %res = call <8 x half> @llvm.x86.avx512fp16.mask.getmant.ph.128(<8 x half> %x0, i32 8, <8 x half> %x2, i8 %x3)1237 %res1 = call <8 x half> @llvm.x86.avx512fp16.mask.getmant.ph.128(<8 x half> %x0, i32 4, <8 x half> %x2, i8 -1)1238 %res2 = fadd <8 x half> %res, %res11239 ret <8 x half> %res21240}1241 1242define <16 x half>@test_int_x86_avx512_mask_getmant_ph_256(<16 x half> %x0, <16 x half> %x2, i16 %x3) {1243; CHECK-LABEL: test_int_x86_avx512_mask_getmant_ph_256:1244; CHECK: # %bb.0:1245; CHECK-NEXT: kmovd %edi, %k11246; CHECK-NEXT: vgetmantph $8, %ymm0, %ymm1 {%k1}1247; CHECK-NEXT: vgetmantph $4, %ymm0, %ymm01248; CHECK-NEXT: vaddph %ymm0, %ymm1, %ymm01249; CHECK-NEXT: retq1250 %res = call <16 x half> @llvm.x86.avx512fp16.mask.getmant.ph.256(<16 x half> %x0, i32 8, <16 x half> %x2, i16 %x3)1251 %res1 = call <16 x half> @llvm.x86.avx512fp16.mask.getmant.ph.256(<16 x half> %x0, i32 4, <16 x half> %x2, i16 -1)1252 %res2 = fadd <16 x half> %res, %res11253 ret <16 x half> %res21254}1255 1256declare <8 x half> @llvm.x86.avx512fp16.mask.rndscale.ph.128(<8 x half>, i32, <8 x half>, i8)1257declare <16 x half> @llvm.x86.avx512fp16.mask.rndscale.ph.256(<16 x half>, i32, <16 x half>, i16)1258 1259define <8 x half>@test_int_x86_avx512_mask_rndscale_ph_128(<8 x half> %x0, <8 x half> %x2, i8 %x3) {1260; CHECK-LABEL: test_int_x86_avx512_mask_rndscale_ph_128:1261; CHECK: # %bb.0:1262; CHECK-NEXT: kmovd %edi, %k11263; CHECK-NEXT: vrndscaleph $8, %xmm0, %xmm1 {%k1}1264; CHECK-NEXT: vrndscaleph $4, %xmm0, %xmm01265; CHECK-NEXT: vaddph %xmm0, %xmm1, %xmm01266; CHECK-NEXT: retq1267 %res = call <8 x half> @llvm.x86.avx512fp16.mask.rndscale.ph.128(<8 x half> %x0, i32 8, <8 x half> %x2, i8 %x3)1268 %res1 = call <8 x half> @llvm.x86.avx512fp16.mask.rndscale.ph.128(<8 x half> %x0, i32 4, <8 x half> %x2, i8 -1)1269 %res2 = fadd <8 x half> %res, %res11270 ret <8 x half> %res21271}1272 1273define <16 x half>@test_int_x86_avx512_mask_rndscale_ph_256(<16 x half> %x0, <16 x half> %x2, i16 %x3) {1274; CHECK-LABEL: test_int_x86_avx512_mask_rndscale_ph_256:1275; CHECK: # %bb.0:1276; CHECK-NEXT: kmovd %edi, %k11277; CHECK-NEXT: vrndscaleph $8, %ymm0, %ymm1 {%k1}1278; CHECK-NEXT: vrndscaleph $4, %ymm0, %ymm01279; CHECK-NEXT: vaddph %ymm0, %ymm1, %ymm01280; CHECK-NEXT: retq1281 %res = call <16 x half> @llvm.x86.avx512fp16.mask.rndscale.ph.256(<16 x half> %x0, i32 8, <16 x half> %x2, i16 %x3)1282 %res1 = call <16 x half> @llvm.x86.avx512fp16.mask.rndscale.ph.256(<16 x half> %x0, i32 4, <16 x half> %x2, i16 -1)1283 %res2 = fadd <16 x half> %res, %res11284 ret <16 x half> %res21285}1286 1287declare <8 x half> @llvm.x86.avx512fp16.mask.scalef.ph.128(<8 x half>, <8 x half>, <8 x half>, i8)1288declare <16 x half> @llvm.x86.avx512fp16.mask.scalef.ph.256(<16 x half>, <16 x half>, <16 x half>, i16)1289 1290define <8 x half>@test_int_x86_avx512_scalef_ph_128(<8 x half> %x0, <8 x half> %x1) {1291; CHECK-LABEL: test_int_x86_avx512_scalef_ph_128:1292; CHECK: # %bb.0:1293; CHECK-NEXT: vscalefph %xmm1, %xmm0, %xmm01294; CHECK-NEXT: retq1295 %res = call <8 x half> @llvm.x86.avx512fp16.mask.scalef.ph.128(<8 x half> %x0, <8 x half> %x1, <8 x half> zeroinitializer, i8 -1)1296 ret <8 x half> %res1297}1298 1299define <8 x half>@test_int_x86_avx512_mask_scalef_ph_128(<8 x half> %x0, <8 x half> %x1, <8 x half> %x2, i8 %x3) {1300; CHECK-LABEL: test_int_x86_avx512_mask_scalef_ph_128:1301; CHECK: # %bb.0:1302; CHECK-NEXT: kmovd %edi, %k11303; CHECK-NEXT: vscalefph %xmm1, %xmm0, %xmm2 {%k1}1304; CHECK-NEXT: vmovaps %xmm2, %xmm01305; CHECK-NEXT: retq1306 %mask = bitcast i8 %x3 to <8 x i1>1307 %res = call <8 x half> @llvm.x86.avx512fp16.mask.scalef.ph.128(<8 x half> %x0, <8 x half> %x1, <8 x half> %x2, i8 %x3)1308 ret <8 x half> %res1309}1310 1311define <8 x half>@test_int_x86_avx512_maskz_scalef_ph_128(<8 x half> %x0, <8 x half> %x1, i8 %x3) {1312; CHECK-LABEL: test_int_x86_avx512_maskz_scalef_ph_128:1313; CHECK: # %bb.0:1314; CHECK-NEXT: kmovd %edi, %k11315; CHECK-NEXT: vscalefph %xmm1, %xmm0, %xmm0 {%k1} {z}1316; CHECK-NEXT: retq1317 %mask = bitcast i8 %x3 to <8 x i1>1318 %res = call <8 x half> @llvm.x86.avx512fp16.mask.scalef.ph.128(<8 x half> %x0, <8 x half> %x1, <8 x half> zeroinitializer, i8 %x3)1319 ret <8 x half> %res1320}1321 1322define <16 x half>@test_int_x86_avx512_scalef_ph_256(<16 x half> %x0, <16 x half> %x1) {1323; CHECK-LABEL: test_int_x86_avx512_scalef_ph_256:1324; CHECK: # %bb.0:1325; CHECK-NEXT: vscalefph %ymm1, %ymm0, %ymm01326; CHECK-NEXT: retq1327 %res = call <16 x half> @llvm.x86.avx512fp16.mask.scalef.ph.256(<16 x half> %x0, <16 x half> %x1, <16 x half> zeroinitializer, i16 -1)1328 ret <16 x half> %res1329}1330 1331define <16 x half>@test_int_x86_avx512_mask_scalef_ph_256(<16 x half> %x0, <16 x half> %x1, <16 x half> %x2, i16 %x3) {1332; CHECK-LABEL: test_int_x86_avx512_mask_scalef_ph_256:1333; CHECK: # %bb.0:1334; CHECK-NEXT: kmovd %edi, %k11335; CHECK-NEXT: vscalefph %ymm1, %ymm0, %ymm2 {%k1}1336; CHECK-NEXT: vmovaps %ymm2, %ymm01337; CHECK-NEXT: retq1338 %mask = bitcast i16 %x3 to <16 x i1>1339 %res = call <16 x half> @llvm.x86.avx512fp16.mask.scalef.ph.256(<16 x half> %x0, <16 x half> %x1, <16 x half> %x2, i16 %x3)1340 ret <16 x half> %res1341}1342 1343define <16 x half>@test_int_x86_avx512_maskz_scalef_ph_256(<16 x half> %x0, <16 x half> %x1, i16 %x3) {1344; CHECK-LABEL: test_int_x86_avx512_maskz_scalef_ph_256:1345; CHECK: # %bb.0:1346; CHECK-NEXT: kmovd %edi, %k11347; CHECK-NEXT: vscalefph %ymm1, %ymm0, %ymm0 {%k1} {z}1348; CHECK-NEXT: retq1349 %mask = bitcast i16 %x3 to <16 x i1>1350 %res = call <16 x half> @llvm.x86.avx512fp16.mask.scalef.ph.256(<16 x half> %x0, <16 x half> %x1, <16 x half> zeroinitializer, i16 %x3)1351 ret <16 x half> %res1352}1353