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#include <llvm/ADT/StringRef.h>
23
24#include <algorithm>
25#include <initializer_list>
26
27namespace llzk {
28
36llvm::APSInt expandingAdd(llvm::APSInt lhs, llvm::APSInt rhs);
37
45llvm::APSInt expandingSub(llvm::APSInt lhs, llvm::APSInt rhs);
46
54llvm::APSInt expandingMul(llvm::APSInt lhs, llvm::APSInt rhs);
55
58std::strong_ordering safeCmp(llvm::APSInt lhs, llvm::APSInt rhs);
59
62llvm::APSInt safeToSigned(llvm::APSInt i);
63inline llvm::APSInt safeToSigned(llvm::APInt i) { return safeToSigned(llvm::APSInt(i)); }
64inline llvm::APSInt safeToSigned(llvm::StringRef s) { return safeToSigned(llvm::APSInt(s)); }
65
66inline bool safeLt(const llvm::APSInt &lhs, const llvm::APSInt &rhs) {
67 return std::is_lt(safeCmp(lhs, rhs));
68}
69
70inline bool safeLe(const llvm::APSInt &lhs, const llvm::APSInt &rhs) {
71 return std::is_lteq(safeCmp(lhs, rhs));
72}
73
74inline bool safeEq(const llvm::APSInt &lhs, const llvm::APSInt &rhs) {
75 return std::is_eq(safeCmp(lhs, rhs));
76}
77
78inline bool safeNe(const llvm::APSInt &lhs, const llvm::APSInt &rhs) {
79 return std::is_neq(safeCmp(lhs, rhs));
80}
81
82inline bool safeGt(const llvm::APSInt &lhs, const llvm::APSInt &rhs) {
83 return std::is_gt(safeCmp(lhs, rhs));
84}
85
86inline bool safeGe(const llvm::APSInt &lhs, const llvm::APSInt &rhs) {
87 return std::is_gteq(safeCmp(lhs, rhs));
88}
89
90inline llvm::APSInt safeMin(const llvm::APSInt &lhs, const llvm::APSInt &rhs) {
91 return std::min(lhs, rhs, safeLt);
92}
93
94inline llvm::APSInt safeMin(std::initializer_list<llvm::APSInt> ilist) {
95 return std::min(ilist, safeLt);
96}
97
98inline llvm::APSInt safeMax(const llvm::APSInt &lhs, const llvm::APSInt &rhs) {
99 return std::max(lhs, rhs, safeLt);
100}
101
102inline llvm::APSInt safeMax(std::initializer_list<llvm::APSInt> ilist) {
103 return std::max(ilist, safeLt);
104}
105
106} // namespace llzk
llvm::APSInt safeToSigned(llvm::APSInt i)
Safely converts the given int to a signed int if it is an unsigned int by adding an extra bit for the...
std::strong_ordering safeCmp(llvm::APSInt lhs, llvm::APSInt rhs)
Compares lhs and rhs, regardless of the bitwidth of lhs and rhs.
llvm::APSInt safeMax(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
Definition APIntHelper.h:98
llvm::APSInt expandingAdd(llvm::APSInt lhs, llvm::APSInt rhs)
Safely add lhs and rhs, expanding the width of the result as necessary.
llvm::APSInt expandingSub(llvm::APSInt lhs, llvm::APSInt rhs)
Safely subtract lhs and rhs, expanding the width of the result as necessary.
bool safeGt(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
Definition APIntHelper.h:82
bool safeEq(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
Definition APIntHelper.h:74
bool safeLt(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
Definition APIntHelper.h:66
llvm::APSInt expandingMul(llvm::APSInt lhs, llvm::APSInt rhs)
Safely multiple lhs and rhs, expanding the width of the result as necessary.
bool safeLe(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
Definition APIntHelper.h:70
bool safeNe(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
Definition APIntHelper.h:78
bool safeGe(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
Definition APIntHelper.h:86
llvm::APSInt safeMin(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
Definition APIntHelper.h:90