xref: /llvm-project/clang/test/CodeGen/X86/avx512bf16-builtins.c (revision bc1819389fb4701cdeba5e093278e32dd668d6d5)
1 //  RUN: %clang_cc1 -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin \
2 //  RUN:            -target-feature +avx512bf16 -emit-llvm -o - -Wall -Werror \
3 //  RUN:            | FileCheck %s
4 
5 #include <immintrin.h>
6 
test_mm_cvtsbh_ss(__bf16 A)7 float test_mm_cvtsbh_ss(__bf16 A) {
8   // CHECK-LABEL: @test_mm_cvtsbh_ss
9   // CHECK: fpext bfloat %{{.*}} to float
10   // CHECK: ret float %{{.*}}
11   return _mm_cvtsbh_ss(A);
12 }
13 
test_mm512_cvtne2ps_pbh(__m512 A,__m512 B)14 __m512bh test_mm512_cvtne2ps_pbh(__m512 A, __m512 B) {
15   // CHECK-LABEL: @test_mm512_cvtne2ps_pbh
16   // CHECK: @llvm.x86.avx512bf16.cvtne2ps2bf16.512
17   // CHECK: ret <32 x bfloat> %{{.*}}
18   return _mm512_cvtne2ps_pbh(A, B);
19 }
20 
test_mm512_maskz_cvtne2ps_pbh(__m512 A,__m512 B,__mmask32 U)21 __m512bh test_mm512_maskz_cvtne2ps_pbh(__m512 A, __m512 B, __mmask32 U) {
22   // CHECK-LABEL: @test_mm512_maskz_cvtne2ps_pbh
23   // CHECK: @llvm.x86.avx512bf16.cvtne2ps2bf16.512
24   // CHECK: select <32 x i1> %{{.*}}, <32 x bfloat> %{{.*}}, <32 x bfloat> %{{.*}}
25   // CHECK: ret <32 x bfloat> %{{.*}}
26   return _mm512_maskz_cvtne2ps_pbh(U, A, B);
27 }
28 
test_mm512_mask_cvtne2ps_pbh(__m512bh C,__mmask32 U,__m512 A,__m512 B)29 __m512bh test_mm512_mask_cvtne2ps_pbh(__m512bh C, __mmask32 U, __m512 A, __m512 B) {
30   // CHECK-LABEL: @test_mm512_mask_cvtne2ps_pbh
31   // CHECK: @llvm.x86.avx512bf16.cvtne2ps2bf16.512
32   // CHECK: select <32 x i1> %{{.*}}, <32 x bfloat> %{{.*}}, <32 x bfloat> %{{.*}}
33   // CHECK: ret <32 x bfloat> %{{.*}}
34   return _mm512_mask_cvtne2ps_pbh(C, U, A, B);
35 }
36 
test_mm512_cvtneps_pbh(__m512 A)37 __m256bh test_mm512_cvtneps_pbh(__m512 A) {
38   // CHECK-LABEL: @test_mm512_cvtneps_pbh
39   // CHECK: @llvm.x86.avx512bf16.cvtneps2bf16.512
40   // CHECK: ret <16 x bfloat> %{{.*}}
41   return _mm512_cvtneps_pbh(A);
42 }
43 
test_mm512_mask_cvtneps_pbh(__m256bh C,__mmask16 U,__m512 A)44 __m256bh test_mm512_mask_cvtneps_pbh(__m256bh C, __mmask16 U, __m512 A) {
45   // CHECK-LABEL: @test_mm512_mask_cvtneps_pbh
46   // CHECK: @llvm.x86.avx512bf16.cvtneps2bf16.512
47   // CHECK: select <16 x i1> %{{.*}}, <16 x bfloat> %{{.*}}, <16 x bfloat> %{{.*}}
48   // CHECK: ret <16 x bfloat> %{{.*}}
49   return _mm512_mask_cvtneps_pbh(C, U, A);
50 }
51 
test_mm512_maskz_cvtneps_pbh(__m512 A,__mmask16 U)52 __m256bh test_mm512_maskz_cvtneps_pbh(__m512 A, __mmask16 U) {
53   // CHECK-LABEL: @test_mm512_maskz_cvtneps_pbh
54   // CHECK: @llvm.x86.avx512bf16.cvtneps2bf16.512
55   // CHECK: select <16 x i1> %{{.*}}, <16 x bfloat> %{{.*}}, <16 x bfloat> %{{.*}}
56   // CHECK: ret <16 x bfloat> %{{.*}}
57   return _mm512_maskz_cvtneps_pbh(U, A);
58 }
59 
test_mm512_dpbf16_ps(__m512 D,__m512bh A,__m512bh B)60 __m512 test_mm512_dpbf16_ps(__m512 D, __m512bh A, __m512bh B) {
61   // CHECK-LABEL: @test_mm512_dpbf16_ps
62   // CHECK: @llvm.x86.avx512bf16.dpbf16ps.512
63   // CHECK: ret <16 x float> %{{.*}}
64   return _mm512_dpbf16_ps(D, A, B);
65 }
66 
test_mm512_maskz_dpbf16_ps(__m512 D,__m512bh A,__m512bh B,__mmask16 U)67 __m512 test_mm512_maskz_dpbf16_ps(__m512 D, __m512bh A, __m512bh B, __mmask16 U) {
68   // CHECK-LABEL: @test_mm512_maskz_dpbf16_ps
69   // CHECK: @llvm.x86.avx512bf16.dpbf16ps.512
70   // CHECK: select <16 x i1> %{{.*}}, <16 x float> %{{.*}}, <16 x float> %{{.*}}
71   // CHECK: ret <16 x float> %{{.*}}
72   return _mm512_maskz_dpbf16_ps(U, D, A, B);
73 }
74 
test_mm512_mask_dpbf16_ps(__m512 D,__m512bh A,__m512bh B,__mmask16 U)75 __m512 test_mm512_mask_dpbf16_ps(__m512 D, __m512bh A, __m512bh B, __mmask16 U) {
76   // CHECK-LABEL: @test_mm512_mask_dpbf16_ps
77   // CHECK: @llvm.x86.avx512bf16.dpbf16ps.512
78   // CHECK: select <16 x i1> %{{.*}}, <16 x float> %{{.*}}, <16 x float> %{{.*}}
79   // CHECK: ret <16 x float> %{{.*}}
80   return _mm512_mask_dpbf16_ps(D, U, A, B);
81 }
82 
test_mm512_cvtpbh_ps(__m256bh A)83 __m512 test_mm512_cvtpbh_ps(__m256bh A) {
84   // CHECK-LABEL: @test_mm512_cvtpbh_ps
85   // CHECK: sext <16 x i16> %{{.*}} to <16 x i32>
86   // CHECK: @llvm.x86.avx512.pslli.d.512
87   // CHECK: ret <16 x float> %{{.*}}
88   return _mm512_cvtpbh_ps(A);
89 }
90 
test_mm512_maskz_cvtpbh_ps(__mmask16 M,__m256bh A)91 __m512 test_mm512_maskz_cvtpbh_ps(__mmask16 M, __m256bh A) {
92   // CHECK-LABEL: @test_mm512_maskz_cvtpbh_ps
93   // CHECK: sext <16 x i16> %{{.*}} to <16 x i32>
94   // CHECK: select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}}
95   // CHECK: @llvm.x86.avx512.pslli.d.512
96   // CHECK: ret <16 x float> %{{.*}}
97   return _mm512_maskz_cvtpbh_ps(M, A);
98 }
99 
test_mm512_mask_cvtpbh_ps(__m512 S,__mmask16 M,__m256bh A)100 __m512 test_mm512_mask_cvtpbh_ps(__m512 S, __mmask16 M, __m256bh A) {
101   // CHECK-LABEL: @test_mm512_mask_cvtpbh_ps
102   // CHECK: sext <16 x i16> %{{.*}} to <16 x i32>
103   // CHECK: @llvm.x86.avx512.pslli.d.512
104   // CHECK: select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}}
105   // CHECK: ret <16 x float> %{{.*}}
106   return _mm512_mask_cvtpbh_ps(S, M, A);
107 }
108