LLZK 0.1.0
Veridise's ZK Language IR
Loading...
Searching...
No Matches
APIntHelper.h
Go to the documentation of this file.
1//===-- APIntHelper.h ------------------------------------------*- C++ -*-===//
2//
3// Part of the LLZK Project, under the Apache License v2.0.
4// See LICENSE.txt for license information.
5// Copyright 2025 Veridise Inc.
6// SPDX-License-Identifier: Apache-2.0
7//
8//===----------------------------------------------------------------------===//
16//
17//===----------------------------------------------------------------------===//
18
19#pragma once
20
21#include <llvm/ADT/APSInt.h>
22
23#include <algorithm>
24#include <initializer_list>
25
26namespace llzk {
27
35llvm::APSInt expandingAdd(const llvm::APSInt &lhs, const llvm::APSInt &rhs);
36
44llvm::APSInt expandingSub(const llvm::APSInt &lhs, const llvm::APSInt &rhs);
45
52llvm::APSInt expandingMul(const llvm::APSInt &lhs, const llvm::APSInt &rhs);
53
56std::strong_ordering safeCmp(const llvm::APSInt &lhs, const llvm::APSInt &rhs);
57
58inline bool safeLt(const llvm::APSInt &lhs, const llvm::APSInt &rhs) {
59 return std::is_lt(safeCmp(lhs, rhs));
60}
61
62inline bool safeLe(const llvm::APSInt &lhs, const llvm::APSInt &rhs) {
63 return std::is_lteq(safeCmp(lhs, rhs));
64}
65
66inline bool safeEq(const llvm::APSInt &lhs, const llvm::APSInt &rhs) {
67 return std::is_eq(safeCmp(lhs, rhs));
68}
69
70inline bool safeNe(const llvm::APSInt &lhs, const llvm::APSInt &rhs) {
71 return std::is_neq(safeCmp(lhs, rhs));
72}
73
74inline bool safeGt(const llvm::APSInt &lhs, const llvm::APSInt &rhs) {
75 return std::is_gt(safeCmp(lhs, rhs));
76}
77
78inline bool safeGe(const llvm::APSInt &lhs, const llvm::APSInt &rhs) {
79 return std::is_gteq(safeCmp(lhs, rhs));
80}
81
82inline llvm::APSInt safeMin(const llvm::APSInt &lhs, const llvm::APSInt &rhs) {
83 return std::min(lhs, rhs, safeLt);
84}
85
86inline llvm::APSInt safeMin(std::initializer_list<llvm::APSInt> ilist) {
87 return std::min(ilist, safeLt);
88}
89
90inline llvm::APSInt safeMax(const llvm::APSInt &lhs, const llvm::APSInt &rhs) {
91 return std::max(lhs, rhs, safeLt);
92}
93
94inline llvm::APSInt safeMax(std::initializer_list<llvm::APSInt> ilist) {
95 return std::max(ilist, safeLt);
96}
97
98} // namespace llzk
llvm::APSInt expandingSub(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
Safely subtract lhs and rhs, expanding the width of the result as necessary.
std::strong_ordering safeCmp(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
Compares lhs and rhs, regardless of the bitwidth of lhs and rhs.
llvm::APSInt expandingAdd(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
Safely add lhs and rhs, expanding the width of the result as necessary.
llvm::APSInt safeMax(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
Definition APIntHelper.h:90
llvm::APSInt expandingMul(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
Safely multiple lhs and rhs, expanding the width of the result as necessary.
bool safeGt(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
Definition APIntHelper.h:74
bool safeEq(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
Definition APIntHelper.h:66
bool safeLt(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
Definition APIntHelper.h:58
bool safeLe(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
Definition APIntHelper.h:62
bool safeNe(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
Definition APIntHelper.h:70
bool safeGe(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
Definition APIntHelper.h:78
llvm::APSInt safeMin(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
Definition APIntHelper.h:82