| 164 | // ============================================================================ |
| 165 | |
| 166 | FL_OPTIMIZE_FUNCTION |
| 167 | void wave3Untranspose_2(const u8 (&FL_RESTRICT_PARAM transposed)[2 * sizeof(Wave3Byte)], |
| 168 | u8 (&FL_RESTRICT_PARAM output)[2 * sizeof(Wave3Byte)]) { |
| 169 | Wave3Byte lane_waves[2]; |
| 170 | |
| 171 | for (int symbol_idx = 0; symbol_idx < 3; symbol_idx++) { |
| 172 | u16 interleaved = ((u16)transposed[symbol_idx * 2] << 8) | |
| 173 | transposed[symbol_idx * 2 + 1]; |
| 174 | |
| 175 | u8 lane0_bits = 0; |
| 176 | u8 lane1_bits = 0; |
| 177 | |
| 178 | for (int bit = 0; bit < 8; bit++) { |
| 179 | if (interleaved & (1 << (bit * 2 + 1))) { |
| 180 | lane0_bits |= (1 << bit); |
| 181 | } |
| 182 | if (interleaved & (1 << (bit * 2))) { |
| 183 | lane1_bits |= (1 << bit); |
| 184 | } |
| 185 | } |
| 186 | |
| 187 | lane_waves[0].data[symbol_idx] = lane0_bits; |
| 188 | lane_waves[1].data[symbol_idx] = lane1_bits; |
| 189 | } |
| 190 | |
| 191 | fl::isr::memcpy(output, &lane_waves[0], sizeof(Wave3Byte)); |
| 192 | fl::isr::memcpy(output + sizeof(Wave3Byte), &lane_waves[1], sizeof(Wave3Byte)); |
| 193 | } |
| 194 | |
| 195 | FL_OPTIMIZE_FUNCTION |
| 196 | void wave3Untranspose_4(const u8 (&FL_RESTRICT_PARAM transposed)[4 * sizeof(Wave3Byte)], |
no test coverage detected