// 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
//
//     https://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.

#include "riscv/riscv_d_instructions.h"

#include <cmath>
#include <cstdint>
#include <tuple>

#include "googlemock/include/gmock/gmock.h"
#include "mpact/sim/generic/instruction.h"
#include "mpact/sim/generic/type_helpers.h"
#include "riscv/test/riscv_fp_test_base.h"

namespace {

using ::mpact::sim::riscv::FPExceptions;
using ::mpact::sim::riscv::test::FPTypeInfo;
using ::mpact::sim::riscv::test::RiscVFPInstructionTestBase;
using ::mpact::sim::generic::operator*;  // NOLINT: is used below.

using ::mpact::sim::riscv::RiscVDAdd;
using ::mpact::sim::riscv::RiscVDCvtDs;
using ::mpact::sim::riscv::RiscVDCvtDw;
using ::mpact::sim::riscv::RiscVDCvtDwu;
using ::mpact::sim::riscv::RiscVDCvtSd;
using ::mpact::sim::riscv::RiscVDDiv;
using ::mpact::sim::riscv::RiscVDMadd;
using ::mpact::sim::riscv::RiscVDMax;
using ::mpact::sim::riscv::RiscVDMin;
using ::mpact::sim::riscv::RiscVDMsub;
using ::mpact::sim::riscv::RiscVDMul;
using ::mpact::sim::riscv::RiscVDNmadd;
using ::mpact::sim::riscv::RiscVDNmsub;
using ::mpact::sim::riscv::RiscVDSgnj;
using ::mpact::sim::riscv::RiscVDSgnjn;
using ::mpact::sim::riscv::RiscVDSgnjx;
using ::mpact::sim::riscv::RiscVDSqrt;
using ::mpact::sim::riscv::RiscVDSub;
using ::mpact::sim::riscv::RV32::RiscVDClass;
using ::mpact::sim::riscv::RV32::RiscVDCmpeq;
using ::mpact::sim::riscv::RV32::RiscVDCmple;
using ::mpact::sim::riscv::RV32::RiscVDCmplt;
using ::mpact::sim::riscv::RV32::RiscVDCvtWd;
using ::mpact::sim::riscv::RV32::RiscVDCvtWud;

class RV32DInstructionTest : public RiscVFPInstructionTestBase {};

static bool is_snan(double a) {
  if (!std::isnan(a)) return false;
  auto ua = *reinterpret_cast<uint64_t *>(&a);
  if ((ua & (1ULL << (FPTypeInfo<double>::kSigSize - 1))) == 0) return true;
  return false;
}

// Test basic arithmetic instructions.
TEST_F(RV32DInstructionTest, RiscVDadd) {
  SetSemanticFunction(&RiscVDAdd);
  BinaryOpFPTestHelper<double, double, double>(
      "dadd", instruction_, {"d", "d", "d"}, 64,
      [](double lhs, double rhs) -> double { return lhs + rhs; });
}

TEST_F(RV32DInstructionTest, RiscVDsub) {
  SetSemanticFunction(&RiscVDSub);
  BinaryOpFPTestHelper<double, double, double>(
      "dsub", instruction_, {"d", "d", "d"}, 64,
      [](double lhs, double rhs) -> double { return lhs - rhs; });
}

TEST_F(RV32DInstructionTest, RiscVDmul) {
  SetSemanticFunction(&RiscVDMul);
  BinaryOpFPTestHelper<double, double, double>(
      "dmul", instruction_, {"d", "d", "d"}, 64,
      [](double lhs, double rhs) -> double { return lhs * rhs; });
}

TEST_F(RV32DInstructionTest, RiscVDdiv) {
  SetSemanticFunction(&RiscVDDiv);
  BinaryOpFPTestHelper<double, double, double>(
      "ddiv", instruction_, {"d", "d", "d"}, 64,
      [](double lhs, double rhs) -> double { return lhs / rhs; });
}

// Test square root.
TEST_F(RV32DInstructionTest, RiscVDsqrt) {
  SetSemanticFunction(&RiscVDSqrt);
  UnaryOpWithFflagsFPTestHelper<double, double>(
      "dsqrt", instruction_, {"d", "d"}, 64,
      [](double lhs, int rm) -> std::tuple<double, uint32_t> {
        uint32_t flags = 0;
        if (lhs == 0) return std::tie(lhs, flags);
        double res;
        if (lhs > 0) {
          res = sqrt(lhs);
          uint64_t dhls = *reinterpret_cast<uint64_t *>(&lhs);
          // Get exponent of source value.
          int exp = (dhls & FPTypeInfo<double>::kExpMask) >>
                    FPTypeInfo<double>::kSigSize;
          exp -= FPTypeInfo<double>::kExpBias;
          // Get significand of result.
          uint64_t dres = *reinterpret_cast<uint64_t *>(&res);
          uint64_t sig = dres & FPTypeInfo<double>::kSigMask;
          bool is_square;
          // Slightly different test based on whether the exponent of the source
          // is even or odd.
          if (exp & 0x1) {
            is_square = ((sig & 0x1ff'ffff) == 0) && (res * res == lhs);
          } else {
            is_square = (sig & 0x3ff'ffff) == 0;
          }
          if (!is_square) {
            flags = *FPExceptions::kInexact;
          }
          return std::tie(res, flags);
        }
        if (!FPTypeInfo<double>::IsQNaN(lhs)) {
          flags = *FPExceptions::kInvalidOp;
        }
        uint64_t val = FPTypeInfo<double>::kCanonicalNaN;
        res = *reinterpret_cast<const double *>(&val);
        return std::tie(res, flags);
      });
}

// Test Min/Max.
TEST_F(RV32DInstructionTest, RiscVDmin) {
  SetSemanticFunction(&RiscVDMin);
  BinaryOpWithFflagsFPTestHelper<double, double, double>(
      "dmin", instruction_, {"d", "d", "d"}, 64,
      [](double lhs, double rhs) -> std::tuple<double, uint32_t> {
        uint32_t flag = 0;
        if (is_snan(lhs) || is_snan(rhs)) {
          flag = static_cast<uint32_t>(FPExceptions::kInvalidOp);
        }
        if (std::isnan(lhs) && std::isnan(rhs)) {
          uint64_t val = FPTypeInfo<double>::kCanonicalNaN;
          return std::tie(*reinterpret_cast<const double *>(&val), flag);
        }
        if (std::isnan(lhs)) return std::tie(rhs, flag);
        if (std::isnan(rhs)) return std::tie(lhs, flag);
        if ((lhs == 0.0) && (rhs == 0.0)) {
          return std::tie(std::signbit(lhs) ? lhs : rhs, flag);
        }
        return std::tie(lhs > rhs ? rhs : lhs, flag);
      });
}

TEST_F(RV32DInstructionTest, RiscVDmax) {
  SetSemanticFunction(&RiscVDMax);
  BinaryOpWithFflagsFPTestHelper<double, double, double>(
      "dmax", instruction_, {"d", "d", "d"}, 64,
      [](double lhs, double rhs) -> std::tuple<double, uint32_t> {
        uint32_t flag = 0;
        if (is_snan(lhs) || is_snan(rhs)) {
          flag = static_cast<uint32_t>(FPExceptions::kInvalidOp);
        }
        if (std::isnan(lhs) && std::isnan(rhs)) {
          uint64_t val = FPTypeInfo<double>::kCanonicalNaN;
          return std::tie(*reinterpret_cast<const double *>(&val), flag);
        }
        if (std::isnan(lhs)) return std::tie(rhs, flag);
        if (std::isnan(rhs)) return std::tie(lhs, flag);
        if ((lhs == 0.0) && (rhs == 0.0)) {
          return std::tie(std::signbit(lhs) ? rhs : lhs, flag);
        }
        return std::tie(lhs < rhs ? rhs : lhs, flag);
      });
}

// Test MAC versions.
TEST_F(RV32DInstructionTest, RiscVDMadd) {
  SetSemanticFunction(&RiscVDMadd);
  TernaryOpFPTestHelper<double, double, double, double>(
      "dmadd", instruction_, {"d", "d", "d", "d"},
      FPTypeInfo<double>::kSigSize - 1,
      [](double lhs, double mhs, double rhs) -> double {
        return fma(lhs, mhs, rhs);
      });
}
TEST_F(RV32DInstructionTest, RiscVDMsub) {
  SetSemanticFunction(&RiscVDMsub);
  TernaryOpFPTestHelper<double, double, double, double>(
      "dmsub", instruction_, {"d", "d", "d", "d"},
      FPTypeInfo<double>::kSigSize - 1,
      [](double lhs, double mhs, double rhs) -> double {
        return fma(lhs, mhs, -rhs);
      });
}
TEST_F(RV32DInstructionTest, RiscVDNmadd) {
  SetSemanticFunction(&RiscVDNmadd);
  TernaryOpFPTestHelper<double, double, double, double>(
      "dnmadd", instruction_, {"d", "d", "d", "d"},
      FPTypeInfo<double>::kSigSize - 1,
      [](double lhs, double mhs, double rhs) -> double {
        return -fma(lhs, mhs, rhs);
      });
}
TEST_F(RV32DInstructionTest, RiscVDNmsub) {
  SetSemanticFunction(&RiscVDNmsub);
  TernaryOpFPTestHelper<double, double, double, double>(
      "dnmsub", instruction_, {"d", "d", "d", "d"},
      FPTypeInfo<double>::kSigSize - 1,
      [](double lhs, double mhs, double rhs) -> double {
        return -fma(lhs, mhs, -rhs);
      });
}

// Test conversion instructions.
// Double to signed 32 bit integer.
TEST_F(RV32DInstructionTest, RiscVDCvtWd) {
  SetSemanticFunction(&RiscVDCvtWd);
  UnaryOpWithFflagsFPTestHelper<int32_t, double>(
      "dcvt.w.d", instruction_, {"d", "x"}, 64,
      [&](double lhs, uint32_t rm) -> std::tuple<int32_t, uint32_t> {
        uint32_t flag = 0;
        const int32_t val = RoundToInteger<double, int32_t>(lhs, rm, flag);
        return std::make_tuple(val, flag);
      });
}

// Signed 32 bit integer to double.
TEST_F(RV32DInstructionTest, RiscVDCvtDw) {
  SetSemanticFunction(&RiscVDCvtDw);
  UnaryOpFPTestHelper<double, int32_t>(
      "dcvt.d.w", instruction_, {"x", "d"}, 64,
      [](int32_t lhs) -> double { return static_cast<double>(lhs); });
}

// Double to unsigned 32 bit integer.
TEST_F(RV32DInstructionTest, RiscVDCvtWud) {
  SetSemanticFunction(&RiscVDCvtWud);
  UnaryOpWithFflagsFPTestHelper<uint32_t, double>(
      "dcvt.wu.d", instruction_, {"d", "x"}, 64,
      [&](double lhs, uint32_t rm) -> std::tuple<uint32_t, uint32_t> {
        uint32_t flag = 0;
        const uint32_t val = RoundToInteger<double, uint32_t>(lhs, rm, flag);
        return std::make_tuple(val, flag);
      });
}

// Unsigned 32 bit integer to double.
TEST_F(RV32DInstructionTest, RiscVDCvtDwu) {
  SetSemanticFunction(&RiscVDCvtDwu);
  UnaryOpFPTestHelper<double, uint32_t>(
      "dcvt.d.w", instruction_, {"x", "d"}, 64,
      [](uint32_t lhs) -> double { return static_cast<double>(lhs); });
}

// Double to single precision.
TEST_F(RV32DInstructionTest, RiscVDCvtSd) {
  SetSemanticFunction(&RiscVDCvtSd);
  UnaryOpFPTestHelper<float, double>(
      "dcvt.s.d", instruction_, {"d", "x"}, 64,
      [](double lhs) -> float { return static_cast<float>(lhs); });
}

// Single precision to double.
TEST_F(RV32DInstructionTest, RiscVDCvtDs) {
  SetSemanticFunction(&RiscVDCvtDs);
  UnaryOpFPTestHelper<double, float>(
      "dcvt.d.s", instruction_, {"x", "d"}, 64,
      [](float lhs) -> double { return static_cast<double>(lhs); });
}

// Test sign manipulation instructions.
TEST_F(RV32DInstructionTest, RiscVDSgnj) {
  SetSemanticFunction(&RiscVDSgnj);
  BinaryOpFPTestHelper<double, double, double>(
      "dsgnj", instruction_, {"d", "d", "d"}, 64,
      [](double lhs, double rhs) -> double { return copysign(abs(lhs), rhs); });
}

TEST_F(RV32DInstructionTest, RiscVDSgnjn) {
  SetSemanticFunction(&RiscVDSgnjn);
  BinaryOpFPTestHelper<double, double, double>(
      "dsgnjn", instruction_, {"d", "d", "d"}, 64,
      [](double lhs, double rhs) -> double {
        return copysign(abs(lhs), -rhs);
      });
}

TEST_F(RV32DInstructionTest, RiscVDSgnjx) {
  SetSemanticFunction(&RiscVDSgnjx);
  BinaryOpFPTestHelper<double, double, double>(
      "dsgnjn", instruction_, {"d", "d", "d"}, 64,
      [](double lhs, double rhs) -> double {
        auto lhs_u = *reinterpret_cast<uint64_t *>(&lhs);
        auto rhs_u = *reinterpret_cast<uint64_t *>(&rhs);
        auto res_u = (lhs_u ^ rhs_u) & 0x8000'0000'0000'0000;
        auto res = *reinterpret_cast<double *>(&res_u);
        return copysign(abs(lhs), res);
      });
}

// Test compare instructions.
TEST_F(RV32DInstructionTest, RiscVDCmpeq) {
  SetSemanticFunction(&RiscVDCmpeq);
  BinaryOpWithFflagsFPTestHelper<uint32_t, double, double>(
      "dcmpeq", instruction_, {"d", "d", "x"}, 64,
      [](double lhs, double rhs) -> std::tuple<uint32_t, uint32_t> {
        int flag = 0;
        if (is_snan(lhs) || is_snan(rhs)) {
          flag = static_cast<uint32_t>(FPExceptions::kInvalidOp);
        }
        return std::make_tuple(lhs == rhs, flag);
      });
}

TEST_F(RV32DInstructionTest, RiscVDCmplt) {
  SetSemanticFunction(&RiscVDCmplt);
  BinaryOpWithFflagsFPTestHelper<uint32_t, double, double>(
      "dcmplt", instruction_, {"d", "d", "x"}, 64,
      [](double lhs, double rhs) -> std::tuple<uint32_t, uint32_t> {
        int flag = 0;
        if (std::isnan(lhs) || std::isnan(rhs)) {
          flag = static_cast<uint32_t>(FPExceptions::kInvalidOp);
        }
        return std::make_tuple(lhs < rhs, flag);
      });
}

TEST_F(RV32DInstructionTest, RiscVDCmple) {
  SetSemanticFunction(&RiscVDCmple);
  BinaryOpWithFflagsFPTestHelper<uint32_t, double, double>(
      "dcmple", instruction_, {"d", "d", "x"}, 64,
      [](double lhs, double rhs) -> std::tuple<uint32_t, uint32_t> {
        int flag = 0;
        if (std::isnan(lhs) || std::isnan(rhs)) {
          flag = static_cast<uint32_t>(FPExceptions::kInvalidOp);
        }
        return std::make_tuple(lhs <= rhs, flag);
      });
}

// Test class instruction.
TEST_F(RV32DInstructionTest, RiscVDClass) {
  SetSemanticFunction(&RiscVDClass);
  UnaryOpFPTestHelper<uint32_t, double>(
      "fclass.d", instruction_, {"d", "x"}, 64, [](double lhs) -> uint32_t {
        auto fp_class = std::fpclassify(lhs);
        switch (fp_class) {
          case FP_INFINITE:
            return std::signbit(lhs) ? 1 : 1 << 7;
          case FP_NAN: {
            auto uint_val =
                *reinterpret_cast<typename FPTypeInfo<double>::IntType *>(&lhs);
            bool quiet_nan =
                (uint_val >> (FPTypeInfo<double>::kSigSize - 1)) & 1;
            return quiet_nan ? 1 << 9 : 1 << 8;
          }
          case FP_ZERO:
            return std::signbit(lhs) ? 1 << 3 : 1 << 4;
          case FP_SUBNORMAL:
            return std::signbit(lhs) ? 1 << 2 : 1 << 5;
          case FP_NORMAL:
            return std::signbit(lhs) ? 1 << 1 : 1 << 6;
        }
        return 0;
      });
}

}  // namespace
