//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "llvm/IR/RuntimeLibcalls.h"
#include "llvm/ADT/STLExtras.h"
#include "gtest/gtest.h"
using namespace llvm;

namespace {

TEST(RuntimeLibcallsTest, LibcallImplByName) {
  EXPECT_TRUE(RTLIB::RuntimeLibcallsInfo::lookupLibcallImplName("").empty());
  EXPECT_TRUE(
      RTLIB::RuntimeLibcallsInfo::lookupLibcallImplName("unknown").empty());
  EXPECT_TRUE(
      RTLIB::RuntimeLibcallsInfo::lookupLibcallImplName("Unsupported").empty());
  EXPECT_TRUE(
      RTLIB::RuntimeLibcallsInfo::lookupLibcallImplName("unsupported").empty());

  for (RTLIB::LibcallImpl LC : RTLIB::libcall_impls()) {
    StringRef Name = RTLIB::RuntimeLibcallsInfo::getLibcallImplName(LC);
    EXPECT_TRUE(is_contained(
        RTLIB::RuntimeLibcallsInfo::lookupLibcallImplName(Name), LC));
  }

  // Test first libcall name
  EXPECT_EQ(
      RTLIB::impl_arm64ec__Unwind_Resume,
      *RTLIB::RuntimeLibcallsInfo::lookupLibcallImplName("#_Unwind_Resume")
           .begin());
  // Test longest libcall names
  EXPECT_EQ(RTLIB::impl___hexagon_memcpy_likely_aligned_min32bytes_mult8bytes,
            *RTLIB::RuntimeLibcallsInfo::lookupLibcallImplName(
                 "__hexagon_memcpy_likely_aligned_min32bytes_mult8bytes")
                 .begin());

  {
    auto SquirtleSquad =
        RTLIB::RuntimeLibcallsInfo::lookupLibcallImplName("sqrtl");
    ASSERT_EQ(size(SquirtleSquad), 3);
    auto I = SquirtleSquad.begin();
    EXPECT_EQ(*I++, RTLIB::impl_sqrtl_f128);
    EXPECT_EQ(*I++, RTLIB::impl_sqrtl_f80);
    EXPECT_EQ(*I++, RTLIB::impl_sqrtl_ppcf128);
  }

  // Last libcall
  {
    auto Truncs = RTLIB::RuntimeLibcallsInfo::lookupLibcallImplName("truncl");
    ASSERT_EQ(size(Truncs), 3);
    auto I = Truncs.begin();
    EXPECT_EQ(*I++, RTLIB::impl_truncl_f128);
    EXPECT_EQ(*I++, RTLIB::impl_truncl_f80);
    EXPECT_EQ(*I++, RTLIB::impl_truncl_ppcf128);
  }
}

} // namespace
