aboutsummaryrefslogtreecommitdiff
path: root/backend/lib/CodeGen/MachineIRTypes.cpp
diff options
context:
space:
mode:
authorRichard-Qin-X <richard.qin.001@gmail.com>2026-08-01 05:01:57 +0800
committerRichard-Qin-X <richard.qin.001@gmail.com>2026-08-01 05:01:57 +0800
commite2505772ab260c79d0075728082c907a90dab7ca (patch)
treed84c7d00611039dbcc0e8c303f3f7b2e34b88cd1 /backend/lib/CodeGen/MachineIRTypes.cpp
parent916b05ee8d79b22147c098cf52bba7fe86858f3f (diff)
downloadrcc-project-e2505772ab260c79d0075728082c907a90dab7ca.tar.gz
rcc-project-e2505772ab260c79d0075728082c907a90dab7ca.tar.xz
[CodeGen] Add machine IR value semantics
Add strongly typed machine indices, lane masks, instruction flags, fixed-point branch probabilities, and preserved-register masks. Model immutable machine memory operands with explicit base identity, size, alignment, address space, alias information, and validated atomic operation and ordering rules. Cover normal, boundary, and invalid combinations in standalone tests.
Diffstat (limited to 'backend/lib/CodeGen/MachineIRTypes.cpp')
-rw-r--r--backend/lib/CodeGen/MachineIRTypes.cpp29
1 files changed, 29 insertions, 0 deletions
diff --git a/backend/lib/CodeGen/MachineIRTypes.cpp b/backend/lib/CodeGen/MachineIRTypes.cpp
new file mode 100644
index 0000000..7f97e98
--- /dev/null
+++ b/backend/lib/CodeGen/MachineIRTypes.cpp
@@ -0,0 +1,29 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "rcc/CodeGen/MachineIRTypes.h"
+
+namespace rcc {
+
+Expected<BranchProbability> BranchProbability::fromFraction(std::uint32_t Numerator,
+ std::uint32_t Denominator) {
+ if (Denominator == 0) {
+ return makeUnexpected(ErrorCode::InvalidArgument,
+ "branch probability denominator must be nonzero");
+ }
+ if (Numerator > Denominator) {
+ return makeUnexpected(ErrorCode::InvalidArgument,
+ "branch probability numerator cannot exceed its denominator");
+ }
+
+ const std::uint64_t ScaledNumerator = static_cast<std::uint64_t>(Numerator) * MaxRawValue;
+ const std::uint64_t Rounded =
+ (ScaledNumerator + static_cast<std::uint64_t>(Denominator / 2)) / Denominator;
+ return BranchProbability(static_cast<std::uint32_t>(Rounded));
+}
+
+MachineInstrFlags::MachineInstrFlags(std::initializer_list<MachineInstrFlag> Flags) noexcept {
+ for (const MachineInstrFlag Flag : Flags)
+ set(Flag);
+}
+
+} // namespace rcc