/*
 * Copyright 2023 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef SOFTRVV_INCLUDE_SOFTRVV_VNSRL_H_
#define SOFTRVV_INCLUDE_SOFTRVV_VNSRL_H_

#include <stddef.h>

#include <type_traits>

namespace softrvv {

template <typename T1, typename T2>
void vnsrl_vx(T1 *dest, T2 *src1, const T1 *src2, int32_t avl) {
  // Only low lg2(SEW*2) bits are used for shift
  static_assert(sizeof(T1) * 2 == sizeof(T2));
  const T1 low_bits_mask = sizeof(T2) * 8 - 1;
  const T1 shift = *src2 & low_bits_mask;
  for (int32_t idx = 0; idx < avl; idx++) {
    dest[idx] = static_cast<T1>(
        static_cast<typename std::make_unsigned<T2>::type>(src1[idx]) >> shift);
  }
}

template <typename T1, typename T2>
void vnsrl_vv(T1 *dest, T2 *src1, T1 *src2, int32_t avl) {
  // // Only low lg2(SEW*2) bits are used for shift
  static_assert(sizeof(T1) * 2 == sizeof(T2));
  const T1 low_bits_mask = sizeof(T2) * 8 - 1;
  for (int32_t idx = 0; idx < avl; idx++) {
    dest[idx] = static_cast<T1>(
        static_cast<typename std::make_unsigned<T2>::type>(src1[idx])
        >> (src2[idx] & low_bits_mask));
  }
}

}  // namespace softrvv

#endif  // SOFTRVV_INCLUDE_SOFTRVV_VNSRL_H_
