- /// Re-order the next 4RB in input data into 3 registers
- /// Input SIMD vectors are:
- /// [A A A A A A A A A A A A B B B B]
- /// [B B B B B B B B C C C C C C C C]
- /// [C C C C D D D D D D D D D D D D]
- /// Re-ordered SIMD vectors are:
- /// [A A A A B B B B C C C C D D D D]
- /// [A A A A B B B B C C C C D D D D]
- /// [A A A A B B B B C C C C D D D D]
- static constexpr uint8_t k_msk1 = 0b11111100; // Copy first lane of src
- static constexpr int k_shuff1 = 0x41;
- const auto z_w1 = _mm512_mask_shuffle_i64x2(rawData[3 * n + 0], k_msk1, rawData[3 * n + 1], rawData[3 * n + 2], k_shuff1);
-
- static constexpr uint8_t k_msk2 = 0b11000011; // Copy middle two lanes of src
- static constexpr int k_shuff2 = 0xB1;
- const auto z_w2 = _mm512_mask_shuffle_i64x2(rawData[3 * n + 1], k_msk2, rawData[3 * n + 0], rawData[3 * n + 2], k_shuff2);
-
- static constexpr uint8_t k_msk3 = 0b00111111; // Copy last lane of src
- static constexpr int k_shuff3 = 0xBE;
- const auto z_w3 = _mm512_mask_shuffle_i64x2(rawData[3 * n + 2], k_msk3, rawData[3 * n + 0], rawData[3 * n + 1], k_shuff3);
-
- /// Perform max abs on these 3 registers
- const auto abs16_1 = _mm512_abs_epi16(z_w1);
- const auto abs16_2 = _mm512_abs_epi16(z_w2);
- const auto abs16_3 = _mm512_abs_epi16(z_w3);
- const auto maxAbs_12 = _mm512_max_epi16(abs16_1, abs16_2);
- const auto maxAbs_123 = _mm512_max_epi16(maxAbs_12, abs16_3);
-
- /// Perform horizontal max over each lane
- /// Swap 64b in each lane and compute max
- static const auto k_perm64b = _mm512_set_epi64(6, 7, 4, 5, 2, 3, 0, 1);
- auto maxAbsPerm = _mm512_permutexvar_epi64(k_perm64b, maxAbs_123);
- auto maxAbsHorz = _mm512_max_epi16(maxAbs_123, maxAbsPerm);
-
- /// Swap each pair of 32b in each lane and compute max
- static const auto k_perm32b = _mm512_set_epi32(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1);
- maxAbsPerm = _mm512_permutexvar_epi32(k_perm32b, maxAbsHorz);
- maxAbsHorz = _mm512_max_epi16(maxAbsHorz, maxAbsPerm);
-
- /// Swap each IQ pair in each lane (via 32b rotation) and compute max
- maxAbsPerm = _mm512_rol_epi32(maxAbsHorz, BlockFloatCompander::k_numBitsIQ);
- maxAbsHorz = _mm512_max_epi16(maxAbsHorz, maxAbsPerm);
-
- /// Insert values into maxAbs
- /// Use sliding mask to insert wanted values into maxAbs
- /// Pairs of values will be inserted and corrected outside of loop
- static const auto k_select4RB = _mm512_set_epi32(28, 24, 20, 16, 28, 24, 20, 16,
- 28, 24, 20, 16, 28, 24, 20, 16);
- static constexpr uint16_t k_expMsk[k_numInputLoopIts] = { 0x000F, 0x00F0, 0x0F00, 0xF000 };
- maxAbs = _mm512_mask_permutex2var_epi32(maxAbs, k_expMsk[n], k_select4RB, maxAbsHorz);
+ if (request->compMethod == XRAN_COMPMETHOD_MODULATION)
+ {
+ struct xranlib_5gnr_mod_compression_request mod_request;
+ struct xranlib_5gnr_mod_compression_response mod_response;
+ mod_request.data_in = request->data_in;
+ mod_request.unit = request->ScaleFactor;
+ mod_request.modulation = (enum xran_modulation_order)(request->iqWidth * 2);
+ mod_request.num_symbols = request->numRBs * XRAN_NUM_OF_SC_PER_RB;
+ mod_request.re_mask = request->reMask;
+ mod_response.data_out = response->data_out;
+ response->len = (request->numRBs * XRAN_NUM_OF_SC_PER_RB * request->iqWidth * 2) >> 3;
+
+ return xranlib_5gnr_mod_compression(&mod_request, &mod_response);
+ }
+ else{
+ if(_may_i_use_cpu_feature(_FEATURE_AVX512IFMA52)) {
+ return xranlib_compress_avxsnc(request,response);
+ } else {
+ return xranlib_compress_avx512(request,response);
+ }
+ }