@@ -108,6 +108,89 @@ static __always_inline void fpu_stfpc(unsigned int *fpc)
108108 : "memory" );
109109}
110110
111+ static __always_inline void fpu_vcksm (u8 v1 , u8 v2 , u8 v3 )
112+ {
113+ asm volatile ("VCKSM %[v1],%[v2],%[v3]"
114+ :
115+ : [v1 ] "I" (v1 ), [v2 ] "I" (v2 ), [v3 ] "I" (v3 )
116+ : "memory" );
117+ }
118+
119+ #ifdef CONFIG_CC_IS_CLANG
120+
121+ static __always_inline void fpu_vl (u8 v1 , const void * vxr )
122+ {
123+ instrument_read (vxr , sizeof (__vector128 ));
124+ asm volatile ("\n"
125+ " la 1,%[vxr]\n"
126+ " VL %[v1],0,,1\n"
127+ :
128+ : [vxr ] "R" (* (__vector128 * )vxr ),
129+ [v1 ] "I" (v1 )
130+ : "memory" , "1" );
131+ }
132+
133+ #else /* CONFIG_CC_IS_CLANG */
134+
135+ static __always_inline void fpu_vl (u8 v1 , const void * vxr )
136+ {
137+ instrument_read (vxr , sizeof (__vector128 ));
138+ asm volatile ("VL %[v1],%O[vxr],,%R[vxr]\n"
139+ :
140+ : [vxr ] "Q" (* (__vector128 * )vxr ),
141+ [v1 ] "I" (v1 )
142+ : "memory" );
143+ }
144+
145+ #endif /* CONFIG_CC_IS_CLANG */
146+
147+ static __always_inline u64 fpu_vlgvf (u8 v , u16 index )
148+ {
149+ u64 val ;
150+
151+ asm volatile ("VLGVF %[val],%[v],%[index]"
152+ : [val ] "=d" (val )
153+ : [v ] "I" (v ), [index ] "L" (index )
154+ : "memory" );
155+ return val ;
156+ }
157+
158+ #ifdef CONFIG_CC_IS_CLANG
159+
160+ static __always_inline void fpu_vll (u8 v1 , u32 index , const void * vxr )
161+ {
162+ unsigned int size ;
163+
164+ size = min (index + 1 , sizeof (__vector128 ));
165+ instrument_read (vxr , size );
166+ asm volatile ("\n"
167+ " la 1,%[vxr]\n"
168+ " VLL %[v1],%[index],0,1\n"
169+ :
170+ : [vxr ] "R" (* (u8 * )vxr ),
171+ [index ] "d" (index ),
172+ [v1 ] "I" (v1 )
173+ : "memory" , "1" );
174+ }
175+
176+ #else /* CONFIG_CC_IS_CLANG */
177+
178+ static __always_inline void fpu_vll (u8 v1 , u32 index , const void * vxr )
179+ {
180+ unsigned int size ;
181+
182+ size = min (index + 1 , sizeof (__vector128 ));
183+ instrument_read (vxr , size );
184+ asm volatile ("VLL %[v1],%[index],%O[vxr],%R[vxr]\n"
185+ :
186+ : [vxr ] "Q" (* (u8 * )vxr ),
187+ [index ] "d" (index ),
188+ [v1 ] "I" (v1 )
189+ : "memory" );
190+ }
191+
192+ #endif /* CONFIG_CC_IS_CLANG */
193+
111194#ifdef CONFIG_CC_IS_CLANG
112195
113196#define fpu_vlm (_v1 , _v3 , _vxrs ) \
@@ -148,6 +231,14 @@ static __always_inline void fpu_stfpc(unsigned int *fpc)
148231
149232#endif /* CONFIG_CC_IS_CLANG */
150233
234+ static __always_inline void fpu_vlvgf (u8 v , u32 val , u16 index )
235+ {
236+ asm volatile ("VLVGF %[v],%[val],%[index]"
237+ :
238+ : [v ] "I" (v ), [val ] "d" (val ), [index ] "L" (index )
239+ : "memory" );
240+ }
241+
151242#ifdef CONFIG_CC_IS_CLANG
152243
153244#define fpu_vstm (_v1 , _v3 , _vxrs ) \
@@ -186,5 +277,13 @@ static __always_inline void fpu_stfpc(unsigned int *fpc)
186277
187278#endif /* CONFIG_CC_IS_CLANG */
188279
280+ static __always_inline void fpu_vzero (u8 v )
281+ {
282+ asm volatile ("VZERO %[v]"
283+ :
284+ : [v ] "I" (v )
285+ : "memory" );
286+ }
287+
189288#endif /* __ASSEMBLY__ */
190289#endif /* __ASM_S390_FPU_INSN_H */
0 commit comments