11#ifndef EIGEN_PACKET_MATH_BF16_RVV10_H
12#define EIGEN_PACKET_MATH_BF16_RVV10_H
15#include "../../InternalHeaderCheck.h"
20typedef eigen_packet_wrapper<vbfloat16m1_t __attribute__((riscv_rvv_vector_bits(EIGEN_RISCV64_RVV_VL))), 26> Packet1Xbf;
21typedef eigen_packet_wrapper<vbfloat16m2_t __attribute__((riscv_rvv_vector_bits(EIGEN_RISCV64_RVV_VL * 2))), 27>
25struct rvv_half_packet<Packet2Xbf> {
26 typedef Packet1Xbf type;
30struct unpacket_traits<Packet1Xbf> : rvv_default_unpacket_traits<bfloat16, Packet1Xbf, 1> {
31 typedef Packet1Xs integer_packet;
32 typedef PacketMask16 packet_mask;
36struct unpacket_traits<Packet2Xbf> : rvv_default_unpacket_traits<bfloat16, Packet2Xbf, 2> {
37 typedef Packet2Xs integer_packet;
38 typedef PacketMask8 packet_mask;
41#if EIGEN_RISCV64_DEFAULT_LMUL == 1
42typedef Packet1Xbf PacketXbf;
44typedef Packet2Xbf PacketXbf;
48struct packet_traits<bfloat16> : rvv_default_packet_traits<bfloat16, PacketXbf> {
82EIGEN_STRONG_INLINE Packet1Xbf __riscv_vreinterpret_v_u32m1_bf16m1(
const Packet1Xu& a) {
83 return __riscv_vreinterpret_v_u16m1_bf16m1(__riscv_vreinterpret_v_u32m1_u16m1(a));
86EIGEN_STRONG_INLINE Packet2Xf Bf16ToF32(
const Packet1Xbf& a) {
87 return __riscv_vfwcvtbf16_f_f_v_f32m2(a, unpacket_traits<Packet1Xbf>::size);
90EIGEN_STRONG_INLINE Packet1Xbf F32ToBf16(
const Packet2Xf& a) {
91 return __riscv_vfncvtbf16_f_f_w_bf16m1(a, unpacket_traits<Packet2Xf>::size);
95EIGEN_STRONG_INLINE Packet1Xbf ptrue<Packet1Xbf>(
const Packet1Xbf& ) {
96 Packet1Xbf r = __riscv_vreinterpret_bf16m1(
97 __riscv_vmv_v_x_u16m1(
static_cast<numext::uint16_t
>(0xffffu), unpacket_traits<Packet1Xbf>::size));
98 EIGEN_FAST_MATH_CONSTANT_BARRIER(r);
103EIGEN_STRONG_INLINE Packet1Xbf pzero<Packet1Xbf>(
const Packet1Xbf& ) {
104 return __riscv_vreinterpret_bf16m1(
105 __riscv_vmv_v_x_i16m1(numext::bit_cast<int16_t>(
static_cast<__bf16
>(0.0)), unpacket_traits<Packet1Xbf>::size));
109EIGEN_STRONG_INLINE Packet1Xbf pabs(
const Packet1Xbf& a) {
110 return __riscv_vreinterpret_v_u16m1_bf16m1(__riscv_vand_vx_u16m1(__riscv_vreinterpret_v_bf16m1_u16m1(a),
111 static_cast<numext::uint16_t
>(0x7fffu),
112 unpacket_traits<Packet1Xs>::size));
116EIGEN_STRONG_INLINE Packet1Xbf pset1<Packet1Xbf>(
const bfloat16& from) {
117 return __riscv_vreinterpret_bf16m1(
118 __riscv_vmv_v_x_i16m1(numext::bit_cast<int16_t>(from), unpacket_traits<Packet1Xbf>::size));
122EIGEN_STRONG_INLINE Packet1Xbf pset1frombits<Packet1Xbf>(numext::uint16_t from) {
123 return __riscv_vreinterpret_bf16m1(__riscv_vmv_v_x_u16m1(from, unpacket_traits<Packet1Xbf>::size));
127EIGEN_STRONG_INLINE Packet1Xbf plset<Packet1Xbf>(
const bfloat16& a) {
128 return F32ToBf16(plset<Packet2Xf>(
static_cast<float>(a)));
132EIGEN_STRONG_INLINE
void pbroadcast4<Packet1Xbf>(
const bfloat16* a, Packet1Xbf& a0, Packet1Xbf& a1, Packet1Xbf& a2,
134 vint16m1_t aa = __riscv_vle16_v_i16m1(
reinterpret_cast<const int16_t*
>(a), 4);
135 a0 = __riscv_vreinterpret_bf16m1(__riscv_vrgather_vx_i16m1(aa, 0, unpacket_traits<Packet1Xs>::size));
136 a1 = __riscv_vreinterpret_bf16m1(__riscv_vrgather_vx_i16m1(aa, 1, unpacket_traits<Packet1Xs>::size));
137 a2 = __riscv_vreinterpret_bf16m1(__riscv_vrgather_vx_i16m1(aa, 2, unpacket_traits<Packet1Xs>::size));
138 a3 = __riscv_vreinterpret_bf16m1(__riscv_vrgather_vx_i16m1(aa, 3, unpacket_traits<Packet1Xs>::size));
142EIGEN_STRONG_INLINE Packet1Xbf padd<Packet1Xbf>(
const Packet1Xbf& a,
const Packet1Xbf& b) {
144 return F32ToBf16(__riscv_vfwmaccbf16_vf_f32m2(Bf16ToF32(b),
145 numext::bit_cast<__bf16>(
static_cast<numext::int16_t
>(0x3f80u)), a,
146 unpacket_traits<Packet1Xbf>::size));
150EIGEN_STRONG_INLINE Packet1Xbf psub<Packet1Xbf>(
const Packet1Xbf& a,
const Packet1Xbf& b) {
152 return F32ToBf16(__riscv_vfwmaccbf16_vf_f32m2(Bf16ToF32(a),
153 numext::bit_cast<__bf16>(
static_cast<numext::int16_t
>(0xbf80u)), b,
154 unpacket_traits<Packet1Xbf>::size));
158EIGEN_STRONG_INLINE Packet1Xbf pabsdiff(
const Packet1Xbf& a,
const Packet1Xbf& b) {
159 return pabs<Packet1Xbf>(psub<Packet1Xbf>(a, b));
163EIGEN_STRONG_INLINE Packet1Xbf pnegate(
const Packet1Xbf& a) {
164 return __riscv_vreinterpret_v_u16m1_bf16m1(__riscv_vxor_vx_u16m1(__riscv_vreinterpret_v_bf16m1_u16m1(a),
165 static_cast<numext::uint16_t
>(0x8000u),
166 unpacket_traits<Packet1Xs>::size));
170EIGEN_STRONG_INLINE Packet1Xbf psignbit(
const Packet1Xbf& a) {
171 return __riscv_vreinterpret_v_i16m1_bf16m1(
172 __riscv_vsra_vx_i16m1(__riscv_vreinterpret_v_bf16m1_i16m1(a), 15, unpacket_traits<Packet1Xs>::size));
176EIGEN_STRONG_INLINE Packet1Xbf pmul<Packet1Xbf>(
const Packet1Xbf& a,
const Packet1Xbf& b) {
178 return F32ToBf16(__riscv_vfwmaccbf16_vv_f32m2(pzero<Packet2Xf>(c), a, b, unpacket_traits<Packet1Xbf>::size));
182EIGEN_STRONG_INLINE Packet1Xbf pdiv<Packet1Xbf>(
const Packet1Xbf& a,
const Packet1Xbf& b) {
183 return F32ToBf16(pdiv<Packet2Xf>(Bf16ToF32(a), Bf16ToF32(b)));
187EIGEN_STRONG_INLINE Packet1Xbf pmadd(
const Packet1Xbf& a,
const Packet1Xbf& b,
const Packet1Xbf& c) {
188 return F32ToBf16(__riscv_vfwmaccbf16_vv_f32m2(Bf16ToF32(c), a, b, unpacket_traits<Packet1Xbf>::size));
192EIGEN_STRONG_INLINE Packet1Xbf pmsub(
const Packet1Xbf& a,
const Packet1Xbf& b,
const Packet1Xbf& c) {
194 __riscv_vfwmaccbf16_vv_f32m2(Bf16ToF32(pnegate<Packet1Xbf>(c)), a, b, unpacket_traits<Packet1Xbf>::size));
198EIGEN_STRONG_INLINE Packet1Xbf pnmadd(
const Packet1Xbf& a,
const Packet1Xbf& b,
const Packet1Xbf& c) {
200 __riscv_vfwmaccbf16_vv_f32m2(Bf16ToF32(c), pnegate<Packet1Xbf>(a), b, unpacket_traits<Packet1Xbf>::size));
204EIGEN_STRONG_INLINE Packet1Xbf pnmsub(
const Packet1Xbf& a,
const Packet1Xbf& b,
const Packet1Xbf& c) {
205 return pnegate<Packet1Xbf>(
206 F32ToBf16(__riscv_vfwmaccbf16_vv_f32m2(Bf16ToF32(c), a, b, unpacket_traits<Packet1Xbf>::size)));
210EIGEN_STRONG_INLINE Packet1Xbf pmin<Packet1Xbf>(
const Packet1Xbf& a,
const Packet1Xbf& b) {
211 return F32ToBf16(pmin<Packet2Xf>(Bf16ToF32(a), Bf16ToF32(b)));
215EIGEN_STRONG_INLINE Packet1Xbf pmin<PropagateNaN, Packet1Xbf>(
const Packet1Xbf& a,
const Packet1Xbf& b) {
216 return F32ToBf16(pmin<PropagateNaN, Packet2Xf>(Bf16ToF32(a), Bf16ToF32(b)));
220EIGEN_STRONG_INLINE Packet1Xbf pmin<PropagateNumbers, Packet1Xbf>(
const Packet1Xbf& a,
const Packet1Xbf& b) {
221 return F32ToBf16(pmin<PropagateNumbers, Packet2Xf>(Bf16ToF32(a), Bf16ToF32(b)));
225EIGEN_STRONG_INLINE Packet1Xbf pmax<Packet1Xbf>(
const Packet1Xbf& a,
const Packet1Xbf& b) {
226 return F32ToBf16(pmax<Packet2Xf>(Bf16ToF32(a), Bf16ToF32(b)));
230EIGEN_STRONG_INLINE Packet1Xbf pmax<PropagateNaN, Packet1Xbf>(
const Packet1Xbf& a,
const Packet1Xbf& b) {
231 return F32ToBf16(pmax<PropagateNaN, Packet2Xf>(Bf16ToF32(a), Bf16ToF32(b)));
235EIGEN_STRONG_INLINE Packet1Xbf pmax<PropagateNumbers, Packet1Xbf>(
const Packet1Xbf& a,
const Packet1Xbf& b) {
236 return F32ToBf16(pmax<PropagateNumbers, Packet2Xf>(Bf16ToF32(a), Bf16ToF32(b)));
244EIGEN_STRONG_INLINE Packet1Xbf pcmp_le<Packet1Xbf>(
const Packet1Xbf& a,
const Packet1Xbf& b) {
245 PacketMask16 mask = __riscv_vmfle_vv_f32m2_b16(Bf16ToF32(a), Bf16ToF32(b), unpacket_traits<Packet1Xbf>::size);
246 return __riscv_vreinterpret_v_u16m1_bf16m1(__riscv_vmerge_vvm_u16m1(
247 __riscv_vreinterpret_v_bf16m1_u16m1(pzero<Packet1Xbf>(a)),
248 __riscv_vreinterpret_v_bf16m1_u16m1(ptrue<Packet1Xbf>(a)), mask, unpacket_traits<Packet1Xbf>::size));
252EIGEN_STRONG_INLINE Packet1Xbf pcmp_lt<Packet1Xbf>(
const Packet1Xbf& a,
const Packet1Xbf& b) {
253 PacketMask16 mask = __riscv_vmflt_vv_f32m2_b16(Bf16ToF32(a), Bf16ToF32(b), unpacket_traits<Packet1Xbf>::size);
254 return __riscv_vreinterpret_v_u16m1_bf16m1(__riscv_vmerge_vvm_u16m1(
255 __riscv_vreinterpret_v_bf16m1_u16m1(pzero<Packet1Xbf>(a)),
256 __riscv_vreinterpret_v_bf16m1_u16m1(ptrue<Packet1Xbf>(a)), mask, unpacket_traits<Packet1Xbf>::size));
260EIGEN_STRONG_INLINE Packet1Xbf pcmp_eq<Packet1Xbf>(
const Packet1Xbf& a,
const Packet1Xbf& b) {
261 PacketMask16 mask = __riscv_vmfeq_vv_f32m2_b16(Bf16ToF32(a), Bf16ToF32(b), unpacket_traits<Packet1Xbf>::size);
262 return __riscv_vreinterpret_v_u16m1_bf16m1(__riscv_vmerge_vvm_u16m1(
263 __riscv_vreinterpret_v_bf16m1_u16m1(pzero<Packet1Xbf>(a)),
264 __riscv_vreinterpret_v_bf16m1_u16m1(ptrue<Packet1Xbf>(a)), mask, unpacket_traits<Packet1Xbf>::size));
268EIGEN_STRONG_INLINE Packet1Xbf pcmp_lt_or_nan<Packet1Xbf>(
const Packet1Xbf& a,
const Packet1Xbf& b) {
269 PacketMask16 mask = __riscv_vmfge_vv_f32m2_b16(Bf16ToF32(a), Bf16ToF32(b), unpacket_traits<Packet1Xbf>::size);
270 return __riscv_vreinterpret_v_u16m1_bf16m1(
271 __riscv_vmerge_vxm_u16m1(__riscv_vreinterpret_v_bf16m1_u16m1(ptrue<Packet1Xbf>(a)),
272 static_cast<numext::uint16_t
>(0), mask, unpacket_traits<Packet1Xbf>::size));
278EIGEN_STRONG_INLINE Packet1Xbf pisinf<Packet1Xbf>(
const Packet1Xbf& a) {
279 const vuint16m1_t abs_bits =
280 __riscv_vand_vx_u16m1(__riscv_vreinterpret_v_bf16m1_u16m1(a), 0x7fffu, unpacket_traits<Packet1Xbf>::size);
281 const PacketMask16 mask = __riscv_vmseq_vx_u16m1_b16(abs_bits, 0x7f80u, unpacket_traits<Packet1Xbf>::size);
282 return __riscv_vreinterpret_v_i16m1_bf16m1(__riscv_vmerge_vxm_i16m1(
283 __riscv_vreinterpret_v_bf16m1_i16m1(pzero<Packet1Xbf>(a)), -1, mask, unpacket_traits<Packet1Xbf>::size));
287EIGEN_STRONG_INLINE Packet1Xbf pisnan<Packet1Xbf>(
const Packet1Xbf& a) {
288 const vuint16m1_t abs_bits =
289 __riscv_vand_vx_u16m1(__riscv_vreinterpret_v_bf16m1_u16m1(a), 0x7fffu, unpacket_traits<Packet1Xbf>::size);
290 const PacketMask16 mask = __riscv_vmsgtu_vx_u16m1_b16(abs_bits, 0x7f80u, unpacket_traits<Packet1Xbf>::size);
291 return __riscv_vreinterpret_v_i16m1_bf16m1(__riscv_vmerge_vxm_i16m1(
292 __riscv_vreinterpret_v_bf16m1_i16m1(pzero<Packet1Xbf>(a)), -1, mask, unpacket_traits<Packet1Xbf>::size));
296EIGEN_STRONG_INLINE Packet1Xbf pisfinite<Packet1Xbf>(
const Packet1Xbf& a) {
297 const vuint16m1_t abs_bits =
298 __riscv_vand_vx_u16m1(__riscv_vreinterpret_v_bf16m1_u16m1(a), 0x7fffu, unpacket_traits<Packet1Xbf>::size);
299 const PacketMask16 mask = __riscv_vmsltu_vx_u16m1_b16(abs_bits, 0x7f80u, unpacket_traits<Packet1Xbf>::size);
300 return __riscv_vreinterpret_v_i16m1_bf16m1(__riscv_vmerge_vxm_i16m1(
301 __riscv_vreinterpret_v_bf16m1_i16m1(pzero<Packet1Xbf>(a)), -1, mask, unpacket_traits<Packet1Xbf>::size));
304EIGEN_STRONG_INLINE Packet1Xbf pselect(
const PacketMask16& mask,
const Packet1Xbf& a,
const Packet1Xbf& b) {
305 return __riscv_vreinterpret_v_i16m1_bf16m1(__riscv_vmerge_vvm_i16m1(__riscv_vreinterpret_v_bf16m1_i16m1(b),
306 __riscv_vreinterpret_v_bf16m1_i16m1(a), mask,
307 unpacket_traits<Packet1Xbf>::size));
310EIGEN_STRONG_INLINE Packet1Xbf pselect(
const Packet1Xbf& mask,
const Packet1Xbf& a,
const Packet1Xbf& b) {
312 __riscv_vmsne_vx_i16m1_b16(__riscv_vreinterpret_v_bf16m1_i16m1(mask), 0, unpacket_traits<Packet1Xbf>::size);
313 return __riscv_vreinterpret_v_i16m1_bf16m1(__riscv_vmerge_vvm_i16m1(__riscv_vreinterpret_v_bf16m1_i16m1(b),
314 __riscv_vreinterpret_v_bf16m1_i16m1(a), mask2,
315 unpacket_traits<Packet1Xbf>::size));
320EIGEN_STRONG_INLINE Packet1Xbf pand<Packet1Xbf>(
const Packet1Xbf& a,
const Packet1Xbf& b) {
321 return __riscv_vreinterpret_v_u16m1_bf16m1(__riscv_vand_vv_u16m1(__riscv_vreinterpret_v_bf16m1_u16m1(a),
322 __riscv_vreinterpret_v_bf16m1_u16m1(b),
323 unpacket_traits<Packet1Xbf>::size));
327EIGEN_STRONG_INLINE Packet1Xbf por<Packet1Xbf>(
const Packet1Xbf& a,
const Packet1Xbf& b) {
328 return __riscv_vreinterpret_v_u16m1_bf16m1(__riscv_vor_vv_u16m1(__riscv_vreinterpret_v_bf16m1_u16m1(a),
329 __riscv_vreinterpret_v_bf16m1_u16m1(b),
330 unpacket_traits<Packet1Xbf>::size));
334EIGEN_STRONG_INLINE Packet1Xbf pxor<Packet1Xbf>(
const Packet1Xbf& a,
const Packet1Xbf& b) {
335 return __riscv_vreinterpret_v_u16m1_bf16m1(__riscv_vxor_vv_u16m1(__riscv_vreinterpret_v_bf16m1_u16m1(a),
336 __riscv_vreinterpret_v_bf16m1_u16m1(b),
337 unpacket_traits<Packet1Xbf>::size));
341EIGEN_STRONG_INLINE Packet1Xbf pandnot<Packet1Xbf>(
const Packet1Xbf& a,
const Packet1Xbf& b) {
342 return __riscv_vreinterpret_v_i16m1_bf16m1(
343 pandnot<Packet1Xs>(__riscv_vreinterpret_v_bf16m1_i16m1(a), __riscv_vreinterpret_v_bf16m1_i16m1(b)));
347EIGEN_STRONG_INLINE Packet1Xbf pnot<Packet1Xbf>(
const Packet1Xbf& a) {
348 return __riscv_vreinterpret_v_u16m1_bf16m1(
349 __riscv_vnot_v_u16m1(__riscv_vreinterpret_v_bf16m1_u16m1(a), unpacket_traits<Packet1Xbf>::size));
353EIGEN_STRONG_INLINE Packet1Xbf pload<Packet1Xbf>(
const bfloat16* from) {
354 EIGEN_DEBUG_ALIGNED_LOAD
return __riscv_vle16_v_bf16m1(
reinterpret_cast<const __bf16*
>(from),
355 unpacket_traits<Packet1Xbf>::size);
359EIGEN_STRONG_INLINE Packet1Xbf ploadu<Packet1Xbf>(
const bfloat16* from) {
360 EIGEN_DEBUG_UNALIGNED_LOAD
return __riscv_vle16_v_bf16m1(
reinterpret_cast<const __bf16*
>(from),
361 unpacket_traits<Packet1Xbf>::size);
365EIGEN_STRONG_INLINE Packet1Xbf ploaddup<Packet1Xbf>(
const bfloat16* from) {
366 return __riscv_vreinterpret_v_i16m1_bf16m1(ploaddup<Packet1Xs>(
reinterpret_cast<const numext::int16_t*
>(from)));
370EIGEN_STRONG_INLINE Packet1Xbf ploadquad<Packet1Xbf>(
const bfloat16* from) {
371 return __riscv_vreinterpret_v_i16m1_bf16m1(ploadquad<Packet1Xs>(
reinterpret_cast<const numext::int16_t*
>(from)));
375EIGEN_STRONG_INLINE
void pstore<bfloat16>(bfloat16* to,
const Packet1Xbf& from) {
376 EIGEN_DEBUG_ALIGNED_STORE __riscv_vse16_v_bf16m1(
reinterpret_cast<__bf16*
>(to), from,
377 unpacket_traits<Packet1Xbf>::size);
381EIGEN_STRONG_INLINE
void pstoreu<bfloat16>(bfloat16* to,
const Packet1Xbf& from) {
382 EIGEN_DEBUG_UNALIGNED_STORE __riscv_vse16_v_bf16m1(
reinterpret_cast<__bf16*
>(to), from,
383 unpacket_traits<Packet1Xbf>::size);
387EIGEN_DEVICE_FUNC
inline Packet1Xbf pgather<bfloat16, Packet1Xbf>(
const bfloat16* from, Index stride) {
388 return __riscv_vlse16_v_bf16m1(
reinterpret_cast<const __bf16*
>(from), stride *
sizeof(bfloat16),
389 unpacket_traits<Packet1Xbf>::size);
393EIGEN_DEVICE_FUNC
inline void pscatter<bfloat16, Packet1Xbf>(bfloat16* to,
const Packet1Xbf& from, Index stride) {
394 __riscv_vsse16(
reinterpret_cast<__bf16*
>(to), stride *
sizeof(bfloat16), from, unpacket_traits<Packet1Xbf>::size);
398EIGEN_STRONG_INLINE bfloat16 pfirst<Packet1Xbf>(
const Packet1Xbf& a) {
399 return numext::bit_cast<bfloat16>(__riscv_vmv_x_s_i16m1_i16(__riscv_vreinterpret_v_bf16m1_i16m1(a)));
403EIGEN_STRONG_INLINE Packet1Xbf psqrt(
const Packet1Xbf& a) {
404 return F32ToBf16(psqrt<Packet2Xf>(Bf16ToF32(a)));
408EIGEN_STRONG_INLINE Packet1Xbf print<Packet1Xbf>(
const Packet1Xbf& a) {
409 return F32ToBf16(print<Packet2Xf>(Bf16ToF32(a)));
413EIGEN_STRONG_INLINE Packet1Xbf pfloor<Packet1Xbf>(
const Packet1Xbf& a) {
414 return F32ToBf16(pfloor<Packet2Xf>(Bf16ToF32(a)));
418EIGEN_STRONG_INLINE Packet1Xbf preverse(
const Packet1Xbf& a) {
419 return __riscv_vreinterpret_v_i16m1_bf16m1(preverse<Packet1Xs>(__riscv_vreinterpret_v_bf16m1_i16m1(a)));
423EIGEN_STRONG_INLINE bfloat16 predux<Packet1Xbf>(
const Packet1Xbf& a) {
424 return static_cast<bfloat16
>(predux<Packet2Xf>(Bf16ToF32(a)));
428EIGEN_STRONG_INLINE
bool predux_any(
const Packet1Xbf& a) {
429 const PacketMask16 mask =
430 __riscv_vmsne_vx_u16m1_b16(__riscv_vreinterpret_v_bf16m1_u16m1(a), 0, unpacket_traits<Packet1Xbf>::size);
431 return __riscv_vcpop_m_b16(mask, unpacket_traits<Packet1Xbf>::size) != 0;
435EIGEN_STRONG_INLINE
bool predux_all(
const Packet1Xbf& a) {
436 const PacketMask16 mask = __riscv_vmfeq_vf_f32m2_b16(Bf16ToF32(a), 0.0f, unpacket_traits<Packet1Xbf>::size);
437 return __riscv_vcpop_m_b16(mask, unpacket_traits<Packet1Xbf>::size) == 0;
441EIGEN_STRONG_INLINE bfloat16 predux_mul<Packet1Xbf>(
const Packet1Xbf& a) {
442 return static_cast<bfloat16
>(predux_mul<Packet2Xf>(Bf16ToF32(a)));
446EIGEN_STRONG_INLINE bfloat16 predux_min<Packet1Xbf>(
const Packet1Xbf& a) {
447 return static_cast<bfloat16
>(predux_min<Packet2Xf>(Bf16ToF32(a)));
451EIGEN_STRONG_INLINE bfloat16 predux_max<Packet1Xbf>(
const Packet1Xbf& a) {
452 return static_cast<bfloat16
>(predux_max<Packet2Xf>(Bf16ToF32(a)));
456EIGEN_DEVICE_FUNC
inline void ptranspose(PacketBlock<Packet1Xbf, N>& kernel) {
457 bfloat16 buffer[unpacket_traits<Packet1Xbf>::size * N];
460 for (i = 0; i < N; i++) {
461 __riscv_vsse16(
reinterpret_cast<__bf16*
>(&buffer[i]), N *
sizeof(bfloat16), kernel.packet[i],
462 unpacket_traits<Packet1Xbf>::size);
465 for (i = 0; i < N; i++) {
466 kernel.packet[i] = __riscv_vle16_v_bf16m1(
reinterpret_cast<__bf16*
>(&buffer[i * unpacket_traits<Packet1Xbf>::size]),
467 unpacket_traits<Packet1Xbf>::size);
473EIGEN_STRONG_INLINE Packet2Xbf __riscv_vreinterpret_v_u32m2_bf16m2(
const Packet2Xu& a) {
474 return __riscv_vreinterpret_v_u16m2_bf16m2(__riscv_vreinterpret_v_u32m2_u16m2(a));
477EIGEN_STRONG_INLINE Packet4Xf Bf16ToF32(
const Packet2Xbf& a) {
478 return __riscv_vfwcvtbf16_f_f_v_f32m4(a, unpacket_traits<Packet2Xbf>::size);
481EIGEN_STRONG_INLINE Packet2Xbf F32ToBf16(
const Packet4Xf& a) {
482 return __riscv_vfncvtbf16_f_f_w_bf16m2(a, unpacket_traits<Packet4Xf>::size);
486EIGEN_STRONG_INLINE Packet2Xbf ptrue<Packet2Xbf>(
const Packet2Xbf& ) {
487 Packet2Xbf r = __riscv_vreinterpret_bf16m2(
488 __riscv_vmv_v_x_u16m2(
static_cast<numext::uint16_t
>(0xffffu), unpacket_traits<Packet2Xbf>::size));
489 EIGEN_FAST_MATH_CONSTANT_BARRIER(r);
494EIGEN_STRONG_INLINE Packet2Xbf pzero<Packet2Xbf>(
const Packet2Xbf& ) {
495 return __riscv_vreinterpret_bf16m2(
496 __riscv_vmv_v_x_i16m2(numext::bit_cast<int16_t>(
static_cast<__bf16
>(0.0)), unpacket_traits<Packet2Xbf>::size));
500EIGEN_STRONG_INLINE Packet2Xbf pabs(
const Packet2Xbf& a) {
501 return __riscv_vreinterpret_v_u16m2_bf16m2(__riscv_vand_vx_u16m2(__riscv_vreinterpret_v_bf16m2_u16m2(a),
502 static_cast<numext::uint16_t
>(0x7fffu),
503 unpacket_traits<Packet2Xs>::size));
507EIGEN_STRONG_INLINE Packet2Xbf pset1<Packet2Xbf>(
const bfloat16& from) {
508 return __riscv_vreinterpret_bf16m2(
509 __riscv_vmv_v_x_i16m2(numext::bit_cast<int16_t>(from), unpacket_traits<Packet2Xbf>::size));
513EIGEN_STRONG_INLINE Packet2Xbf pset1frombits<Packet2Xbf>(numext::uint16_t from) {
514 return __riscv_vreinterpret_bf16m2(__riscv_vmv_v_x_u16m2(from, unpacket_traits<Packet2Xbf>::size));
518EIGEN_STRONG_INLINE Packet2Xbf plset<Packet2Xbf>(
const bfloat16& a) {
519 return F32ToBf16(plset<Packet4Xf>(
static_cast<float>(a)));
523EIGEN_STRONG_INLINE
void pbroadcast4<Packet2Xbf>(
const bfloat16* a, Packet2Xbf& a0, Packet2Xbf& a1, Packet2Xbf& a2,
525 vint16m2_t aa = __riscv_vle16_v_i16m2(
reinterpret_cast<const int16_t*
>(a), 4);
526 a0 = __riscv_vreinterpret_bf16m2(__riscv_vrgather_vx_i16m2(aa, 0, unpacket_traits<Packet2Xs>::size));
527 a1 = __riscv_vreinterpret_bf16m2(__riscv_vrgather_vx_i16m2(aa, 1, unpacket_traits<Packet2Xs>::size));
528 a2 = __riscv_vreinterpret_bf16m2(__riscv_vrgather_vx_i16m2(aa, 2, unpacket_traits<Packet2Xs>::size));
529 a3 = __riscv_vreinterpret_bf16m2(__riscv_vrgather_vx_i16m2(aa, 3, unpacket_traits<Packet2Xs>::size));
533EIGEN_STRONG_INLINE Packet2Xbf padd<Packet2Xbf>(
const Packet2Xbf& a,
const Packet2Xbf& b) {
535 return F32ToBf16(__riscv_vfwmaccbf16_vf_f32m4(Bf16ToF32(b),
536 numext::bit_cast<__bf16>(
static_cast<numext::int16_t
>(0x3f80u)), a,
537 unpacket_traits<Packet2Xbf>::size));
541EIGEN_STRONG_INLINE Packet2Xbf psub<Packet2Xbf>(
const Packet2Xbf& a,
const Packet2Xbf& b) {
543 return F32ToBf16(__riscv_vfwmaccbf16_vf_f32m4(Bf16ToF32(a),
544 numext::bit_cast<__bf16>(
static_cast<numext::int16_t
>(0xbf80u)), b,
545 unpacket_traits<Packet2Xbf>::size));
549EIGEN_STRONG_INLINE Packet2Xbf pabsdiff(
const Packet2Xbf& a,
const Packet2Xbf& b) {
550 return pabs<Packet2Xbf>(psub<Packet2Xbf>(a, b));
554EIGEN_STRONG_INLINE Packet2Xbf pnegate(
const Packet2Xbf& a) {
555 return __riscv_vreinterpret_v_u16m2_bf16m2(__riscv_vxor_vx_u16m2(__riscv_vreinterpret_v_bf16m2_u16m2(a),
556 static_cast<numext::uint16_t
>(0x8000u),
557 unpacket_traits<Packet2Xs>::size));
561EIGEN_STRONG_INLINE Packet2Xbf psignbit(
const Packet2Xbf& a) {
562 return __riscv_vreinterpret_v_i16m2_bf16m2(
563 __riscv_vsra_vx_i16m2(__riscv_vreinterpret_v_bf16m2_i16m2(a), 15, unpacket_traits<Packet2Xs>::size));
567EIGEN_STRONG_INLINE Packet2Xbf pmul<Packet2Xbf>(
const Packet2Xbf& a,
const Packet2Xbf& b) {
569 return F32ToBf16(__riscv_vfwmaccbf16_vv_f32m4(pzero<Packet4Xf>(c), a, b, unpacket_traits<Packet2Xbf>::size));
573EIGEN_STRONG_INLINE Packet2Xbf pdiv<Packet2Xbf>(
const Packet2Xbf& a,
const Packet2Xbf& b) {
574 return F32ToBf16(pdiv<Packet4Xf>(Bf16ToF32(a), Bf16ToF32(b)));
578EIGEN_STRONG_INLINE Packet2Xbf pmadd(
const Packet2Xbf& a,
const Packet2Xbf& b,
const Packet2Xbf& c) {
579 return F32ToBf16(__riscv_vfwmaccbf16_vv_f32m4(Bf16ToF32(c), a, b, unpacket_traits<Packet2Xbf>::size));
583EIGEN_STRONG_INLINE Packet2Xbf pmsub(
const Packet2Xbf& a,
const Packet2Xbf& b,
const Packet2Xbf& c) {
585 __riscv_vfwmaccbf16_vv_f32m4(Bf16ToF32(pnegate<Packet2Xbf>(c)), a, b, unpacket_traits<Packet2Xbf>::size));
589EIGEN_STRONG_INLINE Packet2Xbf pnmadd(
const Packet2Xbf& a,
const Packet2Xbf& b,
const Packet2Xbf& c) {
591 __riscv_vfwmaccbf16_vv_f32m4(Bf16ToF32(c), pnegate<Packet2Xbf>(a), b, unpacket_traits<Packet2Xbf>::size));
595EIGEN_STRONG_INLINE Packet2Xbf pnmsub(
const Packet2Xbf& a,
const Packet2Xbf& b,
const Packet2Xbf& c) {
596 return pnegate<Packet2Xbf>(
597 F32ToBf16(__riscv_vfwmaccbf16_vv_f32m4(Bf16ToF32(c), a, b, unpacket_traits<Packet2Xbf>::size)));
601EIGEN_STRONG_INLINE Packet2Xbf pmin<Packet2Xbf>(
const Packet2Xbf& a,
const Packet2Xbf& b) {
602 return F32ToBf16(pmin<Packet4Xf>(Bf16ToF32(a), Bf16ToF32(b)));
606EIGEN_STRONG_INLINE Packet2Xbf pmin<PropagateNaN, Packet2Xbf>(
const Packet2Xbf& a,
const Packet2Xbf& b) {
607 return F32ToBf16(pmin<PropagateNaN, Packet4Xf>(Bf16ToF32(a), Bf16ToF32(b)));
611EIGEN_STRONG_INLINE Packet2Xbf pmin<PropagateNumbers, Packet2Xbf>(
const Packet2Xbf& a,
const Packet2Xbf& b) {
612 return F32ToBf16(pmin<PropagateNumbers, Packet4Xf>(Bf16ToF32(a), Bf16ToF32(b)));
616EIGEN_STRONG_INLINE Packet2Xbf pmax<Packet2Xbf>(
const Packet2Xbf& a,
const Packet2Xbf& b) {
617 return F32ToBf16(pmax<Packet4Xf>(Bf16ToF32(a), Bf16ToF32(b)));
621EIGEN_STRONG_INLINE Packet2Xbf pmax<PropagateNaN, Packet2Xbf>(
const Packet2Xbf& a,
const Packet2Xbf& b) {
622 return F32ToBf16(pmax<PropagateNaN, Packet4Xf>(Bf16ToF32(a), Bf16ToF32(b)));
626EIGEN_STRONG_INLINE Packet2Xbf pmax<PropagateNumbers, Packet2Xbf>(
const Packet2Xbf& a,
const Packet2Xbf& b) {
627 return F32ToBf16(pmax<PropagateNumbers, Packet4Xf>(Bf16ToF32(a), Bf16ToF32(b)));
634EIGEN_STRONG_INLINE Packet2Xbf pcmp_le<Packet2Xbf>(
const Packet2Xbf& a,
const Packet2Xbf& b) {
635 PacketMask8 mask = __riscv_vmfle_vv_f32m4_b8(Bf16ToF32(a), Bf16ToF32(b), unpacket_traits<Packet2Xbf>::size);
636 return __riscv_vreinterpret_v_u16m2_bf16m2(__riscv_vmerge_vvm_u16m2(
637 __riscv_vreinterpret_v_bf16m2_u16m2(pzero<Packet2Xbf>(a)),
638 __riscv_vreinterpret_v_bf16m2_u16m2(ptrue<Packet2Xbf>(a)), mask, unpacket_traits<Packet2Xbf>::size));
642EIGEN_STRONG_INLINE Packet2Xbf pcmp_lt<Packet2Xbf>(
const Packet2Xbf& a,
const Packet2Xbf& b) {
643 PacketMask8 mask = __riscv_vmflt_vv_f32m4_b8(Bf16ToF32(a), Bf16ToF32(b), unpacket_traits<Packet2Xbf>::size);
644 return __riscv_vreinterpret_v_u16m2_bf16m2(__riscv_vmerge_vvm_u16m2(
645 __riscv_vreinterpret_v_bf16m2_u16m2(pzero<Packet2Xbf>(a)),
646 __riscv_vreinterpret_v_bf16m2_u16m2(ptrue<Packet2Xbf>(a)), mask, unpacket_traits<Packet2Xbf>::size));
650EIGEN_STRONG_INLINE Packet2Xbf pcmp_eq<Packet2Xbf>(
const Packet2Xbf& a,
const Packet2Xbf& b) {
651 PacketMask8 mask = __riscv_vmfeq_vv_f32m4_b8(Bf16ToF32(a), Bf16ToF32(b), unpacket_traits<Packet2Xbf>::size);
652 return __riscv_vreinterpret_v_u16m2_bf16m2(__riscv_vmerge_vvm_u16m2(
653 __riscv_vreinterpret_v_bf16m2_u16m2(pzero<Packet2Xbf>(a)),
654 __riscv_vreinterpret_v_bf16m2_u16m2(ptrue<Packet2Xbf>(a)), mask, unpacket_traits<Packet2Xbf>::size));
658EIGEN_STRONG_INLINE Packet2Xbf pcmp_lt_or_nan<Packet2Xbf>(
const Packet2Xbf& a,
const Packet2Xbf& b) {
659 PacketMask8 mask = __riscv_vmfge_vv_f32m4_b8(Bf16ToF32(a), Bf16ToF32(b), unpacket_traits<Packet2Xbf>::size);
660 return __riscv_vreinterpret_v_u16m2_bf16m2(
661 __riscv_vmerge_vxm_u16m2(__riscv_vreinterpret_v_bf16m2_u16m2(ptrue<Packet2Xbf>(a)),
662 static_cast<numext::uint16_t
>(0), mask, unpacket_traits<Packet2Xbf>::size));
667EIGEN_STRONG_INLINE Packet2Xbf pisinf<Packet2Xbf>(
const Packet2Xbf& a) {
668 const vuint16m2_t abs_bits =
669 __riscv_vand_vx_u16m2(__riscv_vreinterpret_v_bf16m2_u16m2(a), 0x7fffu, unpacket_traits<Packet2Xbf>::size);
670 const PacketMask8 mask = __riscv_vmseq_vx_u16m2_b8(abs_bits, 0x7f80u, unpacket_traits<Packet2Xbf>::size);
671 return __riscv_vreinterpret_v_i16m2_bf16m2(__riscv_vmerge_vxm_i16m2(
672 __riscv_vreinterpret_v_bf16m2_i16m2(pzero<Packet2Xbf>(a)), -1, mask, unpacket_traits<Packet2Xbf>::size));
676EIGEN_STRONG_INLINE Packet2Xbf pisnan<Packet2Xbf>(
const Packet2Xbf& a) {
677 const vuint16m2_t abs_bits =
678 __riscv_vand_vx_u16m2(__riscv_vreinterpret_v_bf16m2_u16m2(a), 0x7fffu, unpacket_traits<Packet2Xbf>::size);
679 const PacketMask8 mask = __riscv_vmsgtu_vx_u16m2_b8(abs_bits, 0x7f80u, unpacket_traits<Packet2Xbf>::size);
680 return __riscv_vreinterpret_v_i16m2_bf16m2(__riscv_vmerge_vxm_i16m2(
681 __riscv_vreinterpret_v_bf16m2_i16m2(pzero<Packet2Xbf>(a)), -1, mask, unpacket_traits<Packet2Xbf>::size));
685EIGEN_STRONG_INLINE Packet2Xbf pisfinite<Packet2Xbf>(
const Packet2Xbf& a) {
686 const vuint16m2_t abs_bits =
687 __riscv_vand_vx_u16m2(__riscv_vreinterpret_v_bf16m2_u16m2(a), 0x7fffu, unpacket_traits<Packet2Xbf>::size);
688 const PacketMask8 mask = __riscv_vmsltu_vx_u16m2_b8(abs_bits, 0x7f80u, unpacket_traits<Packet2Xbf>::size);
689 return __riscv_vreinterpret_v_i16m2_bf16m2(__riscv_vmerge_vxm_i16m2(
690 __riscv_vreinterpret_v_bf16m2_i16m2(pzero<Packet2Xbf>(a)), -1, mask, unpacket_traits<Packet2Xbf>::size));
693EIGEN_STRONG_INLINE Packet2Xbf pselect(
const PacketMask8& mask,
const Packet2Xbf& a,
const Packet2Xbf& b) {
694 return __riscv_vreinterpret_v_i16m2_bf16m2(__riscv_vmerge_vvm_i16m2(__riscv_vreinterpret_v_bf16m2_i16m2(b),
695 __riscv_vreinterpret_v_bf16m2_i16m2(a), mask,
696 unpacket_traits<Packet2Xbf>::size));
699EIGEN_STRONG_INLINE Packet2Xbf pselect(
const Packet2Xbf& mask,
const Packet2Xbf& a,
const Packet2Xbf& b) {
701 __riscv_vmsne_vx_i16m2_b8(__riscv_vreinterpret_v_bf16m2_i16m2(mask), 0, unpacket_traits<Packet2Xbf>::size);
702 return __riscv_vreinterpret_v_i16m2_bf16m2(__riscv_vmerge_vvm_i16m2(__riscv_vreinterpret_v_bf16m2_i16m2(b),
703 __riscv_vreinterpret_v_bf16m2_i16m2(a), mask2,
704 unpacket_traits<Packet2Xbf>::size));
709EIGEN_STRONG_INLINE Packet2Xbf pand<Packet2Xbf>(
const Packet2Xbf& a,
const Packet2Xbf& b) {
710 return __riscv_vreinterpret_v_u16m2_bf16m2(__riscv_vand_vv_u16m2(__riscv_vreinterpret_v_bf16m2_u16m2(a),
711 __riscv_vreinterpret_v_bf16m2_u16m2(b),
712 unpacket_traits<Packet2Xbf>::size));
716EIGEN_STRONG_INLINE Packet2Xbf por<Packet2Xbf>(
const Packet2Xbf& a,
const Packet2Xbf& b) {
717 return __riscv_vreinterpret_v_u16m2_bf16m2(__riscv_vor_vv_u16m2(__riscv_vreinterpret_v_bf16m2_u16m2(a),
718 __riscv_vreinterpret_v_bf16m2_u16m2(b),
719 unpacket_traits<Packet2Xbf>::size));
723EIGEN_STRONG_INLINE Packet2Xbf pxor<Packet2Xbf>(
const Packet2Xbf& a,
const Packet2Xbf& b) {
724 return __riscv_vreinterpret_v_u16m2_bf16m2(__riscv_vxor_vv_u16m2(__riscv_vreinterpret_v_bf16m2_u16m2(a),
725 __riscv_vreinterpret_v_bf16m2_u16m2(b),
726 unpacket_traits<Packet2Xbf>::size));
730EIGEN_STRONG_INLINE Packet2Xbf pandnot<Packet2Xbf>(
const Packet2Xbf& a,
const Packet2Xbf& b) {
731 return __riscv_vreinterpret_v_i16m2_bf16m2(
732 pandnot<Packet2Xs>(__riscv_vreinterpret_v_bf16m2_i16m2(a), __riscv_vreinterpret_v_bf16m2_i16m2(b)));
736EIGEN_STRONG_INLINE Packet2Xbf pnot<Packet2Xbf>(
const Packet2Xbf& a) {
737 return __riscv_vreinterpret_v_u16m2_bf16m2(
738 __riscv_vnot_v_u16m2(__riscv_vreinterpret_v_bf16m2_u16m2(a), unpacket_traits<Packet2Xbf>::size));
742EIGEN_STRONG_INLINE Packet2Xbf pload<Packet2Xbf>(
const bfloat16* from) {
743 EIGEN_DEBUG_ALIGNED_LOAD
return __riscv_vle16_v_bf16m2(
reinterpret_cast<const __bf16*
>(from),
744 unpacket_traits<Packet2Xbf>::size);
748EIGEN_STRONG_INLINE Packet2Xbf ploadu<Packet2Xbf>(
const bfloat16* from) {
749 EIGEN_DEBUG_UNALIGNED_LOAD
return __riscv_vle16_v_bf16m2(
reinterpret_cast<const __bf16*
>(from),
750 unpacket_traits<Packet2Xbf>::size);
754EIGEN_STRONG_INLINE Packet2Xbf ploaddup<Packet2Xbf>(
const bfloat16* from) {
755 return __riscv_vreinterpret_v_i16m2_bf16m2(ploaddup<Packet2Xs>(
reinterpret_cast<const numext::int16_t*
>(from)));
759EIGEN_STRONG_INLINE Packet2Xbf ploadquad<Packet2Xbf>(
const bfloat16* from) {
760 return __riscv_vreinterpret_v_i16m2_bf16m2(ploadquad<Packet2Xs>(
reinterpret_cast<const numext::int16_t*
>(from)));
764EIGEN_STRONG_INLINE
void pstore<bfloat16>(bfloat16* to,
const Packet2Xbf& from) {
765 EIGEN_DEBUG_ALIGNED_STORE __riscv_vse16_v_bf16m2(
reinterpret_cast<__bf16*
>(to), from,
766 unpacket_traits<Packet2Xbf>::size);
770EIGEN_STRONG_INLINE
void pstoreu<bfloat16>(bfloat16* to,
const Packet2Xbf& from) {
771 EIGEN_DEBUG_UNALIGNED_STORE __riscv_vse16_v_bf16m2(
reinterpret_cast<__bf16*
>(to), from,
772 unpacket_traits<Packet2Xbf>::size);
776EIGEN_DEVICE_FUNC
inline Packet2Xbf pgather<bfloat16, Packet2Xbf>(
const bfloat16* from, Index stride) {
777 return __riscv_vlse16_v_bf16m2(
reinterpret_cast<const __bf16*
>(from), stride *
sizeof(bfloat16),
778 unpacket_traits<Packet2Xbf>::size);
782EIGEN_DEVICE_FUNC
inline void pscatter<bfloat16, Packet2Xbf>(bfloat16* to,
const Packet2Xbf& from, Index stride) {
783 __riscv_vsse16(
reinterpret_cast<__bf16*
>(to), stride *
sizeof(bfloat16), from, unpacket_traits<Packet2Xbf>::size);
787EIGEN_STRONG_INLINE bfloat16 pfirst<Packet2Xbf>(
const Packet2Xbf& a) {
788 return numext::bit_cast<bfloat16>(__riscv_vmv_x_s_i16m2_i16(__riscv_vreinterpret_v_bf16m2_i16m2(a)));
792EIGEN_STRONG_INLINE Packet2Xbf psqrt(
const Packet2Xbf& a) {
793 return F32ToBf16(psqrt<Packet4Xf>(Bf16ToF32(a)));
797EIGEN_STRONG_INLINE Packet2Xbf print<Packet2Xbf>(
const Packet2Xbf& a) {
798 return F32ToBf16(print<Packet4Xf>(Bf16ToF32(a)));
802EIGEN_STRONG_INLINE Packet2Xbf pfloor<Packet2Xbf>(
const Packet2Xbf& a) {
803 return F32ToBf16(pfloor<Packet4Xf>(Bf16ToF32(a)));
807EIGEN_STRONG_INLINE Packet2Xbf preverse(
const Packet2Xbf& a) {
808 return __riscv_vreinterpret_v_i16m2_bf16m2(preverse<Packet2Xs>(__riscv_vreinterpret_v_bf16m2_i16m2(a)));
812EIGEN_STRONG_INLINE bfloat16 predux<Packet2Xbf>(
const Packet2Xbf& a) {
813 return static_cast<bfloat16
>(predux<Packet4Xf>(Bf16ToF32(a)));
817EIGEN_STRONG_INLINE
bool predux_any(
const Packet2Xbf& a) {
818 const PacketMask8 mask =
819 __riscv_vmsne_vx_u16m2_b8(__riscv_vreinterpret_v_bf16m2_u16m2(a), 0, unpacket_traits<Packet2Xbf>::size);
820 return __riscv_vcpop_m_b8(mask, unpacket_traits<Packet2Xbf>::size) != 0;
824EIGEN_STRONG_INLINE
bool predux_all(
const Packet2Xbf& a) {
825 const PacketMask8 mask = __riscv_vmfeq_vf_f32m4_b8(Bf16ToF32(a), 0.0f, unpacket_traits<Packet2Xbf>::size);
826 return __riscv_vcpop_m_b8(mask, unpacket_traits<Packet2Xbf>::size) == 0;
830EIGEN_STRONG_INLINE bfloat16 predux_mul<Packet2Xbf>(
const Packet2Xbf& a) {
831 return static_cast<bfloat16
>(predux_mul<Packet4Xf>(Bf16ToF32(a)));
835EIGEN_STRONG_INLINE bfloat16 predux_min<Packet2Xbf>(
const Packet2Xbf& a) {
836 return static_cast<bfloat16
>(predux_min<Packet4Xf>(Bf16ToF32(a)));
840EIGEN_STRONG_INLINE bfloat16 predux_max<Packet2Xbf>(
const Packet2Xbf& a) {
841 return static_cast<bfloat16
>(predux_max<Packet4Xf>(Bf16ToF32(a)));
845EIGEN_DEVICE_FUNC
inline void ptranspose(PacketBlock<Packet2Xbf, N>& kernel) {
846 bfloat16 buffer[unpacket_traits<Packet2Xbf>::size * N];
849 for (i = 0; i < N; i++) {
850 __riscv_vsse16(
reinterpret_cast<__bf16*
>(&buffer[i]), N *
sizeof(bfloat16), kernel.packet[i],
851 unpacket_traits<Packet2Xbf>::size);
854 for (i = 0; i < N; i++) {
855 kernel.packet[i] = __riscv_vle16_v_bf16m2(
reinterpret_cast<__bf16*
>(&buffer[i * unpacket_traits<Packet2Xbf>::size]),
856 unpacket_traits<Packet2Xbf>::size);
860template <
typename Packet = Packet2Xbf>
861EIGEN_STRONG_INLINE std::enable_if_t<
862 std::is_same<Packet, Packet2Xbf>::value && (unpacket_traits<Packet2Xbf>::size % 8) == 0, Packet1Xbf>
863predux_half(
const Packet2Xbf& a) {
864 return padd<Packet1Xbf>(__riscv_vget_v_bf16m2_bf16m1(a, 0), __riscv_vget_v_bf16m2_bf16m1(a, 1));
868EIGEN_STRONG_INLINE Packet1Xbf pcast<Packet1Xs, Packet1Xbf>(
const Packet1Xs& a) {
869 return __riscv_vreinterpret_v_i16m1_bf16m1(a);
873EIGEN_STRONG_INLINE Packet2Xbf pcast<Packet2Xs, Packet2Xbf>(
const Packet2Xs& a) {
874 return __riscv_vreinterpret_v_i16m2_bf16m2(a);
878EIGEN_STRONG_INLINE Packet1Xs pcast<Packet1Xbf, Packet1Xs>(
const Packet1Xbf& a) {
879 return __riscv_vreinterpret_v_bf16m1_i16m1(a);
883EIGEN_STRONG_INLINE Packet2Xs pcast<Packet2Xbf, Packet2Xs>(
const Packet2Xbf& a) {
884 return __riscv_vreinterpret_v_bf16m2_i16m2(a);