[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