[libc-commits] [libc] [libc] Implement basic 'fenv.h' utilities on the AMD GPU (PR #83500)
Matt Arsenault via libc-commits
libc-commits at lists.llvm.org
Fri May 3 13:01:15 PDT 2024
================
@@ -26,19 +31,66 @@ TEST_F(LlvmLibcRoundingModeTest, SetAndGet) {
EXPECT_EQ(s, 0);
int rm = LIBC_NAMESPACE::fegetround();
EXPECT_EQ(rm, FE_TONEAREST);
+ EXPECT_TRUE(LIBC_NAMESPACE::fputil::fenv_is_round_to_nearest());
s = LIBC_NAMESPACE::fesetround(FE_UPWARD);
EXPECT_EQ(s, 0);
rm = LIBC_NAMESPACE::fegetround();
EXPECT_EQ(rm, FE_UPWARD);
+ EXPECT_TRUE(LIBC_NAMESPACE::fputil::fenv_is_round_up());
s = LIBC_NAMESPACE::fesetround(FE_DOWNWARD);
EXPECT_EQ(s, 0);
rm = LIBC_NAMESPACE::fegetround();
EXPECT_EQ(rm, FE_DOWNWARD);
+ EXPECT_TRUE(LIBC_NAMESPACE::fputil::fenv_is_round_down());
s = LIBC_NAMESPACE::fesetround(FE_TOWARDZERO);
EXPECT_EQ(s, 0);
rm = LIBC_NAMESPACE::fegetround();
EXPECT_EQ(rm, FE_TOWARDZERO);
+ EXPECT_TRUE(LIBC_NAMESPACE::fputil::fenv_is_round_to_zero());
}
+
+#ifdef LIBC_TARGET_ARCH_IS_AMDGPU
+
+// These values are extensions from the following documentation:
+// https://llvm.org/docs/AMDGPUUsage.html#amdgpu-rounding-mode-enumeration-values-table.
+// This will set the f64/f16 rounding mode to nearest while modifying f32 only.
+enum RoundingF32 : int {
+ ROUND_F32_TONEAREST = 1,
+ ROUND_F32_UPWARD = 11,
+ ROUND_F32_DOWNWARD = 14,
+ ROUND_F32_TOWARDZERO = 17,
+};
+
+TEST_F(LlvmLibcRoundingModeTest, AMDGPUExtensionF32) {
+ struct ResetDefaultRoundingMode {
+ int original = LIBC_NAMESPACE::fegetround();
+ ~ResetDefaultRoundingMode() { LIBC_NAMESPACE::fesetround(original); }
+ } reset;
+
+ int s = LIBC_NAMESPACE::fesetround(ROUND_F32_TONEAREST);
+ EXPECT_EQ(s, 0);
+ int rm = LIBC_NAMESPACE::fegetround();
+ EXPECT_TRUE(LIBC_NAMESPACE::fputil::fenv_is_round_to_nearest());
----------------
arsenm wrote:
This is the default so you should test this at the end to make sure it's restored
https://github.com/llvm/llvm-project/pull/83500
More information about the libc-commits
mailing list