xref: /llvm-project/clang/test/CodeGen/matrix-cast.c (revision a20874276be777bed4f34c52438efd66798c2ec5)
1 // RUN: %clang_cc1 -fenable-matrix -triple x86_64-apple-darwin %s -emit-llvm -disable-llvm-passes -o - | FileCheck %s
2 
3 typedef char cx5x5 __attribute__((matrix_type(5, 5)));
4 typedef int ix5x5 __attribute__((matrix_type(5, 5)));
5 typedef short sx5x5 __attribute__((matrix_type(5, 5)));
6 typedef float fx5x5 __attribute__((matrix_type(5, 5)));
7 typedef double dx5x5 __attribute__((matrix_type(5, 5)));
8 typedef unsigned short unsigned_short_int_5x5 __attribute__((matrix_type(5, 5)));
9 typedef unsigned int unsigned_int_5x5 __attribute__((matrix_type(5, 5)));
10 typedef unsigned long unsigned_long_int_5x5 __attribute__((matrix_type(5, 5)));
11 
cast_char_matrix_to_int(cx5x5 c,ix5x5 i)12 void cast_char_matrix_to_int(cx5x5 c, ix5x5 i) {
13   // CHECK-LABEL: define{{.*}} void @cast_char_matrix_to_int(<25 x i8> noundef %c, <25 x i32> noundef %i)
14   // CHECK:       [[C:%.*]] = load <25 x i8>, ptr {{.*}}, align 1
15   // CHECK-NEXT:  [[CONV:%.*]] = sext <25 x i8> [[C]] to <25 x i32>
16   // CHECK-NEXT:  store <25 x i32> [[CONV]], ptr {{.*}}, align 4
17   // CHECK-NEXT:  ret void
18 
19   i = (ix5x5)c;
20 }
21 
cast_char_matrix_to_unsigned_int(cx5x5 c,unsigned_int_5x5 u)22 void cast_char_matrix_to_unsigned_int(cx5x5 c, unsigned_int_5x5 u) {
23   // CHECK-LABEL: define{{.*}} void @cast_char_matrix_to_unsigned_int(<25 x i8> noundef %c, <25 x i32> noundef %u)
24   // CHECK:       [[C:%.*]] = load <25 x i8>, ptr {{.*}}, align 1
25   // CHECK-NEXT:  [[CONV:%.*]] = sext <25 x i8> [[C]] to <25 x i32>
26   // CHECK-NEXT:  store <25 x i32> [[CONV]], ptr {{.*}}, align 4
27   // CHECK-NEXT:  ret void
28 
29   u = (unsigned_int_5x5)c;
30 }
31 
cast_unsigned_long_int_matrix_to_short(unsigned_long_int_5x5 u,sx5x5 s)32 void cast_unsigned_long_int_matrix_to_short(unsigned_long_int_5x5 u, sx5x5 s) {
33   // CHECK-LABEL: define{{.*}} void @cast_unsigned_long_int_matrix_to_short(<25 x i64> noundef %u, <25 x i16> noundef %s)
34   // CHECK:       [[U:%.*]] = load <25 x i64>, ptr {{.*}}, align 8
35   // CHECK-NEXT:  [[CONV:%.*]] = trunc <25 x i64> [[U]] to <25 x i16>
36   // CHECK-NEXT:  store <25 x i16> [[CONV]], ptr {{.*}}, align 2
37   // CHECK-NEXT:  ret void
38 
39   s = (sx5x5)u;
40 }
41 
cast_int_matrix_to_short(ix5x5 i,sx5x5 s)42 void cast_int_matrix_to_short(ix5x5 i, sx5x5 s) {
43   // CHECK-LABEL: define{{.*}} void @cast_int_matrix_to_short(<25 x i32> noundef %i, <25 x i16> noundef %s)
44   // CHECK:       [[I:%.*]] = load <25 x i32>, ptr {{.*}}, align 4
45   // CHECK-NEXT:  [[CONV:%.*]] = trunc <25 x i32> [[I]] to <25 x i16>
46   // CHECK-NEXT:  store <25 x i16> [[CONV]], ptr {{.*}}, align 2
47   // CHECK-NEXT:  ret void
48 
49   s = (sx5x5)i;
50 }
51 
cast_int_matrix_to_float(ix5x5 i,fx5x5 f)52 void cast_int_matrix_to_float(ix5x5 i, fx5x5 f) {
53   // CHECK-LABEL: define{{.*}} void @cast_int_matrix_to_float(<25 x i32> noundef %i, <25 x float> noundef %f)
54   // CHECK:       [[I:%.*]] = load <25 x i32>, ptr {{.*}}, align 4
55   // CHECK-NEXT:  [[CONV:%.*]] = sitofp <25 x i32> [[I]] to <25 x float>
56   // CHECK-NEXT:  store <25 x float> [[CONV]], ptr {{.*}}, align 4
57   // CHECK-NEXT:  ret void
58 
59   f = (fx5x5)i;
60 }
61 
cast_unsigned_int_matrix_to_float(unsigned_short_int_5x5 u,fx5x5 f)62 void cast_unsigned_int_matrix_to_float(unsigned_short_int_5x5 u, fx5x5 f) {
63   // CHECK-LABEL: define{{.*}} void @cast_unsigned_int_matrix_to_float(<25 x i16> noundef %u, <25 x float> noundef %f)
64   // CHECK:       [[U:%.*]] = load <25 x i16>, ptr {{.*}}, align 2
65   // CHECK-NEXT:  [[CONV:%.*]] = uitofp <25 x i16> [[U]] to <25 x float>
66   // CHECK-NEXT:  store <25 x float> [[CONV]], ptr {{.*}}, align 4
67   // CHECK-NEXT:  ret void
68 
69   f = (fx5x5)u;
70 }
71 
cast_double_matrix_to_int(dx5x5 d,ix5x5 i)72 void cast_double_matrix_to_int(dx5x5 d, ix5x5 i) {
73   // CHECK-LABEL: define{{.*}} void @cast_double_matrix_to_int(<25 x double> noundef %d, <25 x i32> noundef %i)
74   // CHECK:       [[D:%.*]] = load <25 x double>, ptr {{.*}}, align 8
75   // CHECK-NEXT:  [[CONV:%.*]] = fptosi <25 x double> [[D]] to <25 x i32>
76   // CHECK-NEXT:  store <25 x i32> [[CONV]], ptr {{.*}}, align 4
77   // CHECK-NEXT:  ret void
78 
79   i = (ix5x5)d;
80 }
81 
cast_float_matrix_to_unsigned_short_int(fx5x5 f,unsigned_short_int_5x5 i)82 void cast_float_matrix_to_unsigned_short_int(fx5x5 f, unsigned_short_int_5x5 i) {
83   // CHECK-LABEL: define{{.*}} void @cast_float_matrix_to_unsigned_short_int(<25 x float> noundef %f, <25 x i16> noundef %i)
84   // CHECK:       [[F:%.*]] = load <25 x float>, ptr {{.*}}, align 4
85   // CHECK-NEXT:  [[CONV:%.*]] = fptoui <25 x float> [[F]] to <25 x i16>
86   // CHECK-NEXT:  store <25 x i16> [[CONV]], ptr %i.addr, align 2
87   // CHECK-NEXT:  ret void
88 
89   i = (unsigned_short_int_5x5)f;
90 }
91 
cast_double_matrix_to_float(dx5x5 d,fx5x5 f)92 void cast_double_matrix_to_float(dx5x5 d, fx5x5 f) {
93   // CHECK-LABEL: define{{.*}} void @cast_double_matrix_to_float(<25 x double> noundef %d, <25 x float> noundef %f)
94   // CHECK:       [[D:%.*]] = load <25 x double>, ptr {{.*}}, align 8
95   // CHECK-NEXT:  [[CONV:%.*]] = fptrunc <25 x double> [[D]] to <25 x float>
96   // CHECK-NEXT:  store <25 x float> [[CONV]], ptr {{.*}}, align 4
97   // CHECK-NEXT:  ret void
98 
99   f = (fx5x5)d;
100 }
101 
cast_unsigned_short_int_to_unsigned_int(unsigned_short_int_5x5 s,unsigned_int_5x5 i)102 void cast_unsigned_short_int_to_unsigned_int(unsigned_short_int_5x5 s, unsigned_int_5x5 i) {
103   // CHECK-LABEL: define{{.*}} void @cast_unsigned_short_int_to_unsigned_int(<25 x i16> noundef %s, <25 x i32> noundef %i)
104   // CHECK:       [[S:%.*]] = load <25 x i16>, ptr {{.*}}, align 2
105   // CHECK-NEXT:  [[CONV:%.*]] = zext <25 x i16> [[S]] to <25 x i32>
106   // CHECK-NEXT:  store <25 x i32> [[CONV]], ptr {{.*}}, align 4
107   // CHECK-NEXT:  ret void
108 
109   i = (unsigned_int_5x5)s;
110 }
111 
cast_unsigned_long_int_to_unsigned_short_int(unsigned_long_int_5x5 l,unsigned_short_int_5x5 s)112 void cast_unsigned_long_int_to_unsigned_short_int(unsigned_long_int_5x5 l, unsigned_short_int_5x5 s) {
113   // CHECK-LABEL: define{{.*}} void @cast_unsigned_long_int_to_unsigned_short_int(<25 x i64> noundef %l, <25 x i16> noundef %s)
114   // CHECK:       [[L:%.*]] = load <25 x i64>, ptr %l.addr, align 8
115   // CHECK-NEXT:  [[CONV:%.*]] = trunc <25 x i64> [[L]] to <25 x i16>
116   // CHECK-NEXT:  store <25 x i16> [[CONV]], ptr {{.*}}, align 2
117   // CHECK-NEXT:  ret void
118 
119   s = (unsigned_short_int_5x5)l;
120 }
121 
cast_unsigned_short_int_to_int(unsigned_short_int_5x5 u,ix5x5 i)122 void cast_unsigned_short_int_to_int(unsigned_short_int_5x5 u, ix5x5 i) {
123   // CHECK-LABEL: define{{.*}} void @cast_unsigned_short_int_to_int(<25 x i16> noundef %u, <25 x i32> noundef %i)
124   // CHECK:       [[U:%.*]] = load <25 x i16>, ptr %u.addr, align 2
125   // CHECK-NEXT:  [[CONV:%.*]] = zext <25 x i16> [[U]] to <25 x i32>
126   // CHECK-NEXT:  store <25 x i32> [[CONV]], ptr {{.*}}, align 4
127   // CHECK-NEXT:  ret void
128 
129   i = (ix5x5)u;
130 }
131 
cast_int_to_unsigned_long_int(ix5x5 i,unsigned_long_int_5x5 u)132 void cast_int_to_unsigned_long_int(ix5x5 i, unsigned_long_int_5x5 u) {
133   // CHECK-LABEL: define{{.*}} void @cast_int_to_unsigned_long_int(<25 x i32> noundef %i, <25 x i64> noundef %u)
134   // CHECK:       [[I:%.*]] = load <25 x i32>, ptr %i.addr, align 4
135   // CHECK-NEXT:  [[CONV:%.*]] = sext <25 x i32> [[I]] to <25 x i64>
136   // CHECK-NEXT:  store <25 x i64> [[CONV]], ptr {{.*}}, align 8
137   // CHECK-NEXT:  ret void
138 
139   u = (unsigned_long_int_5x5)i;
140 }
141