27 0x14, 0x15, 0x40, 0x41, 0x44, 0x45,
28 0x50, 0x51, 0x54, 0x55};
45#define FL_WAVE8_SPREAD_TO_16(lane_u8_0, lane_u8_1, out_16) \
47 const ::fl::u8 _a = (::fl::u8)(lane_u8_0); \
48 const ::fl::u8 _b = (::fl::u8)(lane_u8_1); \
49 const ::fl::u16 _even = \
50 (::fl::u16)((::fl::u16)::fl::detail::kTranspose4_16_LUT[_b & 0x0Fu] | \
51 ((::fl::u16)::fl::detail::kTranspose4_16_LUT[_b >> 4] << 8)); \
52 const ::fl::u16 _odd = \
53 (::fl::u16)(((::fl::u16)::fl::detail::kTranspose4_16_LUT[_a & 0x0Fu] | \
54 ((::fl::u16)::fl::detail::kTranspose4_16_LUT[_a >> 4] << 8)) \
56 (out_16) |= (::fl::u16)(_even | _odd); \
67 const Wave8BitExpansionLut& lut,
71 const Wave8ByteExpansionLut& lut,
87 const Wave8Byte lane_waves_b[16],
88 u8 output_a[16 *
sizeof(Wave8Byte)],
92 const Wave8Byte lane_waves_b[16],
93 const Wave8Byte lane_waves_c[16],
94 const Wave8Byte lane_waves_d[16],
95 u8 output_a[16 *
sizeof(Wave8Byte)],
96 u8 output_b[16 *
sizeof(Wave8Byte)],
97 u8 output_c[16 *
sizeof(Wave8Byte)],
117 const u8 lanes_b[16],
118 const u8 lanes_c[16],
119 const u8 lanes_d[16],
121 u8 output_a[16 *
sizeof(Wave8Byte)],
122 u8 output_b[16 *
sizeof(Wave8Byte)],
123 u8 output_c[16 *
sizeof(Wave8Byte)],
132 const Wave8BitExpansionLut& lut,
#define FL_RESTRICT_PARAM
FL_IRAM FL_OPTIMIZE_FUNCTION void wave8_transpose_16_bf1(const u8 lanes[16], u8 W0, u8 W1, u8 output[16 *sizeof(Wave8Byte)]) FL_NO_EXCEPT
FL_IRAM FL_OPTIMIZE_FUNCTION void wave8_transpose_16x2_pipe2(const Wave8Byte lane_waves_a[16], const Wave8Byte lane_waves_b[16], u8 output_a[16 *sizeof(Wave8Byte)], u8 output_b[16 *sizeof(Wave8Byte)]) FL_NO_EXCEPT
FL_IRAM FL_OPTIMIZE_FUNCTION void wave8_transpose_4(const Wave8Byte lane_waves[4], u8 output[4 *sizeof(Wave8Byte)]) FL_NO_EXCEPT
constexpr u8 kTranspose2_4_LUT[4]
4-lane LUT: Spreads 2 bits into 4-lane interleaved positions (2-bit → byte).
FL_IRAM FL_OPTIMIZE_FUNCTION void wave8_transpose_16x4_pipe4(const Wave8Byte lane_waves_a[16], const Wave8Byte lane_waves_b[16], const Wave8Byte lane_waves_c[16], const Wave8Byte lane_waves_d[16], u8 output_a[16 *sizeof(Wave8Byte)], u8 output_b[16 *sizeof(Wave8Byte)], u8 output_c[16 *sizeof(Wave8Byte)], u8 output_d[16 *sizeof(Wave8Byte)]) FL_NO_EXCEPT
FL_IRAM FL_OPTIMIZE_FUNCTION void wave8_transpose_8(const Wave8Byte lane_waves[8], u8 output[8 *sizeof(Wave8Byte)]) FL_NO_EXCEPT
FL_IRAM FL_OPTIMIZE_FUNCTION void wave8_transpose_16(const Wave8Byte lane_waves[16], u8 output[16 *sizeof(Wave8Byte)]) FL_NO_EXCEPT
FL_IRAM FL_OPTIMIZE_FUNCTION void wave8_transpose_16x4_bf1_pipe4(const u8 lanes_a[16], const u8 lanes_b[16], const u8 lanes_c[16], const u8 lanes_d[16], u8 W0, u8 W1, u8 output_a[16 *sizeof(Wave8Byte)], u8 output_b[16 *sizeof(Wave8Byte)], u8 output_c[16 *sizeof(Wave8Byte)], u8 output_d[16 *sizeof(Wave8Byte)]) FL_NO_EXCEPT
FL_IRAM FL_OPTIMIZE_FUNCTION void wave8_transpose_4_bf1(const u8 lanes[4], u8 W0, u8 W1, u8 output[4 *sizeof(Wave8Byte)]) FL_NO_EXCEPT
FL_IRAM FL_OPTIMIZE_FUNCTION void wave8_transpose_8_bf1(const u8 lanes[8], u8 W0, u8 W1, u8 output[8 *sizeof(Wave8Byte)]) FL_NO_EXCEPT
FL_IRAM FL_OPTIMIZE_FUNCTION void wave8_transpose_2(const Wave8Byte lane_waves[2], u8 output[2 *sizeof(Wave8Byte)]) FL_NO_EXCEPT
FL_IRAM FL_OPTIMIZE_FUNCTION void wave8_convert_byte_to_wave8byte(u8 byte_value, const Wave8BitExpansionLut &lut, Wave8Byte *output) FL_NO_EXCEPT
FL_IRAM FL_OPTIMIZE_FUNCTION void wave8_transpose_2_bf1(const u8 lanes[2], u8 W0, u8 W1, u8 output[2 *sizeof(Wave8Byte)]) FL_NO_EXCEPT
FL_IRAM FL_OPTIMIZE_FUNCTION void wave8_expand_byte(u8 byte_value, const Wave8ByteExpansionLut &lut, Wave8Byte *output) FL_NO_EXCEPT
constexpr u8 kTranspose4_16_LUT[16]
2-lane LUT: Spreads 4 bits into 2-lane interleaved positions (nibble → byte).
Compile-time linker keep-alive hook for a single fl::Bus.
FL_IRAM FL_OPTIMIZE_FUNCTION void wave8(u8 lane, const Wave8BitExpansionLut &lut, u8(&FL_RESTRICT_PARAM output)[sizeof(Wave8Byte)]) FL_NO_EXCEPT
Public single-lane wave8 encoder.
Base definition for an LED controller.