[llvm] 0ba73fb - [llvm-c] Add LLVMConstFPFromBits() API (#164381)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 4 02:34:23 PST 2025
Author: peter mckinna
Date: 2025-12-04T11:34:19+01:00
New Revision: 0ba73fb0f0d2bc7d89b96d92a19f6a50ebd89c74
URL: https://github.com/llvm/llvm-project/commit/0ba73fb0f0d2bc7d89b96d92a19f6a50ebd89c74
DIFF: https://github.com/llvm/llvm-project/commit/0ba73fb0f0d2bc7d89b96d92a19f6a50ebd89c74.diff
LOG: [llvm-c] Add LLVMConstFPFromBits() API (#164381)
This change adds the ability to create a 128 bit floating point value
from 2 64 bit integer values.
Some language frontends have already parsed a floating point string into
a proper 128 bit quad value
and need to get the llvm value directly.
Added:
Modified:
llvm/docs/ReleaseNotes.md
llvm/include/llvm-c/Core.h
llvm/lib/IR/Core.cpp
llvm/unittests/IR/ConstantsTest.cpp
Removed:
################################################################################
diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md
index 2a1e88f1fd17f..dc0cec6122cdf 100644
--- a/llvm/docs/ReleaseNotes.md
+++ b/llvm/docs/ReleaseNotes.md
@@ -177,6 +177,7 @@ Changes to the C API
* Add `LLVMGetOrInsertFunction` to get or insert a function, replacing the combination of `LLVMGetNamedFunction` and `LLVMAddFunction`.
* Allow `LLVMGetVolatile` to work with any kind of Instruction.
+* Add `LLVMConstFPFromBits` to get a constant floating-point value from an array of 64 bit values.
Changes to the CodeGen infrastructure
-------------------------------------
diff --git a/llvm/include/llvm-c/Core.h b/llvm/include/llvm-c/Core.h
index 83dd1eba876e6..fc41b5835d6eb 100644
--- a/llvm/include/llvm-c/Core.h
+++ b/llvm/include/llvm-c/Core.h
@@ -2346,6 +2346,14 @@ LLVM_C_ABI LLVMValueRef LLVMConstRealOfStringAndSize(LLVMTypeRef RealTy,
const char *Text,
unsigned SLen);
+/**
+ * Obtain a constant for a floating point value from array of 64 bit values.
+ * The length of the array N must be ceildiv(bits, 64), where bits is the
+ * scalar size in bits of the floating-point type.
+ */
+
+LLVM_C_ABI LLVMValueRef LLVMConstFPFromBits(LLVMTypeRef Ty, const uint64_t N[]);
+
/**
* Obtain the zero extended value for an integer constant value.
*
diff --git a/llvm/lib/IR/Core.cpp b/llvm/lib/IR/Core.cpp
index 26c4f4ec784cd..bea30649947c7 100644
--- a/llvm/lib/IR/Core.cpp
+++ b/llvm/lib/IR/Core.cpp
@@ -1573,6 +1573,14 @@ LLVMValueRef LLVMConstRealOfStringAndSize(LLVMTypeRef RealTy, const char Str[],
return wrap(ConstantFP::get(unwrap(RealTy), StringRef(Str, SLen)));
}
+LLVMValueRef LLVMConstFPFromBits(LLVMTypeRef Ty, const uint64_t N[]) {
+ Type *T = unwrap(Ty);
+ unsigned SB = T->getScalarSizeInBits();
+ APInt AI(SB, ArrayRef<uint64_t>(N, divideCeil(SB, 64)));
+ APFloat Quad(T->getFltSemantics(), AI);
+ return wrap(ConstantFP::get(T, Quad));
+}
+
unsigned long long LLVMConstIntGetZExtValue(LLVMValueRef ConstantVal) {
return unwrap<ConstantInt>(ConstantVal)->getZExtValue();
}
diff --git a/llvm/unittests/IR/ConstantsTest.cpp b/llvm/unittests/IR/ConstantsTest.cpp
index 6376165cbe766..86fd6a398cc97 100644
--- a/llvm/unittests/IR/ConstantsTest.cpp
+++ b/llvm/unittests/IR/ConstantsTest.cpp
@@ -835,5 +835,35 @@ TEST(ConstantsTest, BlockAddressCAPITest) {
EXPECT_EQ(&BB, OutBB);
}
+TEST(ConstantsTest, Float128Test) {
+ LLVMContextRef C = LLVMContextCreate();
+ LLVMTypeRef Ty128 = LLVMFP128TypeInContext(C);
+ LLVMTypeRef TyPPC128 = LLVMPPCFP128TypeInContext(C);
+ LLVMTypeRef TyFloat = LLVMFloatTypeInContext(C);
+ LLVMTypeRef TyDouble = LLVMDoubleTypeInContext(C);
+ LLVMTypeRef TyHalf = LLVMHalfTypeInContext(C);
+ LLVMBuilderRef Builder = LLVMCreateBuilder();
+ uint64_t n[2] = {0x4000000000000000, 0x0}; //+2
+ uint64_t m[2] = {0xC000000000000000, 0x0}; //-2
+ LLVMValueRef val1 = LLVMConstFPFromBits(Ty128, n);
+ EXPECT_TRUE(val1 != nullptr);
+ LLVMValueRef val2 = LLVMConstFPFromBits(Ty128, m);
+ EXPECT_TRUE(val2 != nullptr);
+ LLVMValueRef val3 = LLVMBuildFAdd(Builder, val1, val2, "test");
+ EXPECT_TRUE(val3 != nullptr);
+ LLVMValueRef val4 = LLVMConstFPFromBits(TyPPC128, n);
+ EXPECT_TRUE(val4 != nullptr);
+ uint64_t p[1] = {0x0000000040000000}; //+2
+ LLVMValueRef val5 = LLVMConstFPFromBits(TyFloat, p);
+ EXPECT_EQ(APFloat(2.0f), unwrap<ConstantFP>(val5)->getValue());
+ uint64_t q[1] = {0x4000000000000000}; //+2
+ LLVMValueRef val6 = LLVMConstFPFromBits(TyDouble, q);
+ EXPECT_EQ(APFloat(2.0), unwrap<ConstantFP>(val6)->getValue());
+ uint64_t r[1] = {0x0000000000003c00}; //+1
+ LLVMValueRef val7 = LLVMConstFPFromBits(TyHalf, r);
+ EXPECT_TRUE(val7 != nullptr);
+ LLVMContextDispose(C);
+}
+
} // end anonymous namespace
} // end namespace llvm
More information about the llvm-commits
mailing list