22#include "llvm/ADT/APFloat.h"
23#include "llvm/ADT/APSInt.h"
26#ifndef MLIR_APFLOAT_WRAPPERS_EXPORT
27#ifdef mlir_apfloat_wrappers_EXPORTS
29#define MLIR_APFLOAT_WRAPPERS_EXPORT __declspec(dllexport)
32#define MLIR_APFLOAT_WRAPPERS_EXPORT __declspec(dllimport)
37#define MLIR_APFLOAT_WRAPPERS_EXPORT __attribute__((visibility("default")))
41#define APFLOAT_BINARY_OP(OP) \
42 MLIR_APFLOAT_WRAPPERS_EXPORT int64_t _mlir_apfloat_##OP( \
43 int32_t semantics, uint64_t a, uint64_t b) { \
44 const llvm::fltSemantics &sem = llvm::APFloatBase::EnumToSemantics( \
45 static_cast<llvm::APFloatBase::Semantics>(semantics)); \
46 unsigned bitWidth = llvm::APFloatBase::semanticsSizeInBits(sem); \
47 llvm::APFloat lhs(sem, llvm::APInt(bitWidth, a)); \
48 llvm::APFloat rhs(sem, llvm::APInt(bitWidth, b)); \
50 return lhs.bitcastToAPInt().getZExtValue(); \
54#define APFLOAT_BINARY_OP_ROUNDING_MODE(OP, ROUNDING_MODE) \
55 MLIR_APFLOAT_WRAPPERS_EXPORT uint64_t _mlir_apfloat_##OP( \
56 int32_t semantics, uint64_t a, uint64_t b) { \
57 const llvm::fltSemantics &sem = llvm::APFloatBase::EnumToSemantics( \
58 static_cast<llvm::APFloatBase::Semantics>(semantics)); \
59 unsigned bitWidth = llvm::APFloatBase::semanticsSizeInBits(sem); \
60 llvm::APFloat lhs(sem, llvm::APInt(bitWidth, a)); \
61 llvm::APFloat rhs(sem, llvm::APInt(bitWidth, b)); \
62 lhs.OP(rhs, ROUNDING_MODE); \
63 return lhs.bitcastToAPInt().getZExtValue(); \
68#define BIN_OPS_WITH_ROUNDING(X) \
69 X(add, llvm::RoundingMode::NearestTiesToEven) \
70 X(subtract, llvm::RoundingMode::NearestTiesToEven) \
71 X(multiply, llvm::RoundingMode::NearestTiesToEven) \
72 X(divide, llvm::RoundingMode::NearestTiesToEven)
75#undef BIN_OPS_WITH_ROUNDING
76#undef APFLOAT_BINARY_OP_ROUNDING_MODE
80#undef APFLOAT_BINARY_OP
83 const llvm::fltSemantics &sem = llvm::APFloatBase::EnumToSemantics(
84 static_cast<llvm::APFloatBase::Semantics
>(semantics));
85 unsigned bitWidth = llvm::APFloatBase::semanticsSizeInBits(sem);
86 llvm::APFloat x(sem, llvm::APInt(bitWidth, a));
87 double d = x.convertToDouble();
88 fprintf(stdout,
"%lg", d);
93 const llvm::fltSemantics &inSem = llvm::APFloatBase::EnumToSemantics(
94 static_cast<llvm::APFloatBase::Semantics
>(inSemantics));
95 const llvm::fltSemantics &outSem = llvm::APFloatBase::EnumToSemantics(
96 static_cast<llvm::APFloatBase::Semantics
>(outSemantics));
97 unsigned bitWidthIn = llvm::APFloatBase::semanticsSizeInBits(inSem);
98 llvm::APFloat val(inSem, llvm::APInt(bitWidthIn, a));
101 val.convert(outSem, llvm::RoundingMode::NearestTiesToEven, &losesInfo);
102 llvm::APInt
result = val.bitcastToAPInt();
103 return result.getZExtValue();
107 int32_t semantics, int32_t resultWidth,
bool isUnsigned, uint64_t a) {
108 const llvm::fltSemantics &sem = llvm::APFloatBase::EnumToSemantics(
109 static_cast<llvm::APFloatBase::Semantics
>(semantics));
110 unsigned inputWidth = llvm::APFloatBase::semanticsSizeInBits(sem);
111 llvm::APFloat val(sem, llvm::APInt(inputWidth, a));
112 llvm::APSInt
result(resultWidth, isUnsigned);
115 val.convertToInteger(
result, llvm::RoundingMode::NearestTiesToEven, &isExact);
120 return result.getZExtValue();
124 int32_t semantics, int32_t inputWidth,
bool isUnsigned, uint64_t a) {
125 llvm::APInt val(inputWidth, a, !isUnsigned);
126 const llvm::fltSemantics &sem = llvm::APFloatBase::EnumToSemantics(
127 static_cast<llvm::APFloatBase::Semantics
>(semantics));
128 llvm::APFloat
result(sem);
130 result.convertFromAPInt(val, !isUnsigned,
131 llvm::RoundingMode::NearestTiesToEven);
132 return result.bitcastToAPInt().getZExtValue();
138 const llvm::fltSemantics &sem = llvm::APFloatBase::EnumToSemantics(
139 static_cast<llvm::APFloatBase::Semantics
>(semantics));
140 unsigned bitWidth = llvm::APFloatBase::semanticsSizeInBits(sem);
141 llvm::APFloat x(sem, llvm::APInt(bitWidth, a));
142 llvm::APFloat y(sem, llvm::APInt(bitWidth,
b));
143 return static_cast<int8_t
>(x.compare(y));
147 const llvm::fltSemantics &sem = llvm::APFloatBase::EnumToSemantics(
148 static_cast<llvm::APFloatBase::Semantics
>(semantics));
149 unsigned bitWidth = llvm::APFloatBase::semanticsSizeInBits(sem);
150 llvm::APFloat x(sem, llvm::APInt(bitWidth, a));
152 return x.bitcastToAPInt().getZExtValue();
156#define APFLOAT_MIN_MAX_OP(OP) \
157 MLIR_APFLOAT_WRAPPERS_EXPORT uint64_t _mlir_apfloat_##OP( \
158 int32_t semantics, uint64_t a, uint64_t b) { \
159 const llvm::fltSemantics &sem = llvm::APFloatBase::EnumToSemantics( \
160 static_cast<llvm::APFloatBase::Semantics>(semantics)); \
161 unsigned bitWidth = llvm::APFloatBase::semanticsSizeInBits(sem); \
162 llvm::APFloat lhs(sem, llvm::APInt(bitWidth, a)); \
163 llvm::APFloat rhs(sem, llvm::APInt(bitWidth, b)); \
164 llvm::APFloat result = llvm::OP(lhs, rhs); \
165 return result.bitcastToAPInt().getZExtValue(); \
173#undef APFLOAT_MIN_MAX_OP
MLIR_APFLOAT_WRAPPERS_EXPORT void printApFloat(int32_t semantics, uint64_t a)
#define APFLOAT_MIN_MAX_OP(OP)
Min/max operations.
#define BIN_OPS_WITH_ROUNDING(X)
MLIR_APFLOAT_WRAPPERS_EXPORT uint64_t _mlir_apfloat_convert(int32_t inSemantics, int32_t outSemantics, uint64_t a)
#define APFLOAT_BINARY_OP(OP)
Binary operations without rounding mode.
MLIR_APFLOAT_WRAPPERS_EXPORT uint64_t _mlir_apfloat_convert_from_int(int32_t semantics, int32_t inputWidth, bool isUnsigned, uint64_t a)
MLIR_APFLOAT_WRAPPERS_EXPORT int8_t _mlir_apfloat_compare(int32_t semantics, uint64_t a, uint64_t b)
MLIR_APFLOAT_WRAPPERS_EXPORT uint64_t _mlir_apfloat_convert_to_int(int32_t semantics, int32_t resultWidth, bool isUnsigned, uint64_t a)
#define APFLOAT_BINARY_OP_ROUNDING_MODE(OP, ROUNDING_MODE)
Binary operations with rounding mode.
#define MLIR_APFLOAT_WRAPPERS_EXPORT
MLIR_APFLOAT_WRAPPERS_EXPORT uint64_t _mlir_apfloat_neg(int32_t semantics, uint64_t a)