Skip to content

[flang][runtime] Enable PRINT of integer32 for device. #85182

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions flang/include/flang/Common/real.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
// The various representations are distinguished by their binary precisions
// (number of explicit significand bits and any implicit MSB in the fraction).

#include "flang/Runtime/api-attrs.h"
#include <cinttypes>

namespace Fortran::common {
Expand Down Expand Up @@ -119,6 +120,7 @@ template <int BINARY_PRECISION> class RealDetails {
}

public:
RT_OFFLOAD_VAR_GROUP_BEGIN
static constexpr int binaryPrecision{BINARY_PRECISION};
static constexpr int bits{BitsForBinaryPrecision(binaryPrecision)};
static constexpr bool isImplicitMSB{binaryPrecision != 64 /*x87*/};
Expand All @@ -138,6 +140,7 @@ template <int BINARY_PRECISION> class RealDetails {

static constexpr int maxHexadecimalConversionDigits{
MaxHexadecimalConversionDigits(binaryPrecision)};
RT_OFFLOAD_VAR_GROUP_END

static_assert(binaryPrecision > 0);
static_assert(exponentBits > 1);
Expand Down
3 changes: 3 additions & 0 deletions flang/include/flang/Common/uint128.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#endif

#include "leading-zero-bit-count.h"
#include "flang/Runtime/api-attrs.h"
#include <cstdint>
#include <type_traits>

Expand Down Expand Up @@ -260,7 +261,9 @@ template <bool IS_SIGNED = false> class Int128 {
return LeadingZeroBitCount(high_);
}
}
RT_VAR_GROUP_BEGIN
static constexpr std::uint64_t topBit{std::uint64_t{1} << 63};
RT_VAR_GROUP_END
#if FLANG_LITTLE_ENDIAN
std::uint64_t low_{0}, high_{0};
#elif FLANG_BIG_ENDIAN
Expand Down
51 changes: 31 additions & 20 deletions flang/include/flang/Decimal/binary-floating-point.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

#include "flang/Common/real.h"
#include "flang/Common/uint128.h"
#include "flang/Runtime/api-attrs.h"
#include <cinttypes>
#include <climits>
#include <cstring>
Expand Down Expand Up @@ -47,9 +48,11 @@ class BinaryFloatingPointNumber : public common::RealDetails<BINARY_PRECISION> {

using RawType = common::HostUnsignedIntType<bits>;
static_assert(CHAR_BIT * sizeof(RawType) >= bits);
RT_OFFLOAD_VAR_GROUP_BEGIN
static constexpr RawType significandMask{(RawType{1} << significandBits) - 1};

constexpr BinaryFloatingPointNumber() {} // zero
constexpr RT_API_ATTRS BinaryFloatingPointNumber() {} // zero
RT_OFFLOAD_VAR_GROUP_END
constexpr BinaryFloatingPointNumber(
const BinaryFloatingPointNumber &that) = default;
constexpr BinaryFloatingPointNumber(
Expand All @@ -58,37 +61,41 @@ class BinaryFloatingPointNumber : public common::RealDetails<BINARY_PRECISION> {
const BinaryFloatingPointNumber &that) = default;
constexpr BinaryFloatingPointNumber &operator=(
BinaryFloatingPointNumber &&that) = default;
constexpr explicit BinaryFloatingPointNumber(RawType raw) : raw_{raw} {}
constexpr explicit RT_API_ATTRS BinaryFloatingPointNumber(RawType raw)
: raw_{raw} {}

RawType raw() const { return raw_; }
RT_API_ATTRS RawType raw() const { return raw_; }

template <typename A> explicit constexpr BinaryFloatingPointNumber(A x) {
template <typename A>
explicit constexpr RT_API_ATTRS BinaryFloatingPointNumber(A x) {
static_assert(sizeof raw_ <= sizeof x);
std::memcpy(reinterpret_cast<void *>(&raw_),
reinterpret_cast<const void *>(&x), sizeof raw_);
}

constexpr int BiasedExponent() const {
constexpr RT_API_ATTRS int BiasedExponent() const {
return static_cast<int>(
(raw_ >> significandBits) & ((1 << exponentBits) - 1));
}
constexpr int UnbiasedExponent() const {
constexpr RT_API_ATTRS int UnbiasedExponent() const {
int biased{BiasedExponent()};
return biased - exponentBias + (biased == 0);
}
constexpr RawType Significand() const { return raw_ & significandMask; }
constexpr RawType Fraction() const {
constexpr RT_API_ATTRS RawType Significand() const {
return raw_ & significandMask;
}
constexpr RT_API_ATTRS RawType Fraction() const {
RawType sig{Significand()};
if (isImplicitMSB && BiasedExponent() > 0) {
sig |= RawType{1} << significandBits;
}
return sig;
}

constexpr bool IsZero() const {
constexpr RT_API_ATTRS bool IsZero() const {
return (raw_ & ((RawType{1} << (bits - 1)) - 1)) == 0;
}
constexpr bool IsNaN() const {
constexpr RT_API_ATTRS bool IsNaN() const {
auto expo{BiasedExponent()};
auto sig{Significand()};
if constexpr (bits == 80) { // x87
Expand All @@ -102,35 +109,38 @@ class BinaryFloatingPointNumber : public common::RealDetails<BINARY_PRECISION> {
return expo == maxExponent && sig != 0;
}
}
constexpr bool IsInfinite() const {
constexpr RT_API_ATTRS bool IsInfinite() const {
if constexpr (bits == 80) { // x87
return BiasedExponent() == maxExponent &&
Significand() == ((significandMask >> 1) + 1);
} else {
return BiasedExponent() == maxExponent && Significand() == 0;
}
}
constexpr bool IsMaximalFiniteMagnitude() const {
constexpr RT_API_ATTRS bool IsMaximalFiniteMagnitude() const {
return BiasedExponent() == maxExponent - 1 &&
Significand() == significandMask;
}
constexpr bool IsNegative() const { return ((raw_ >> (bits - 1)) & 1) != 0; }
constexpr RT_API_ATTRS bool IsNegative() const {
return ((raw_ >> (bits - 1)) & 1) != 0;
}

constexpr void Negate() { raw_ ^= RawType{1} << (bits - 1); }
constexpr RT_API_ATTRS void Negate() { raw_ ^= RawType{1} << (bits - 1); }

// For calculating the nearest neighbors of a floating-point value
constexpr void Previous() {
constexpr RT_API_ATTRS void Previous() {
RemoveExplicitMSB();
--raw_;
InsertExplicitMSB();
}
constexpr void Next() {
constexpr RT_API_ATTRS void Next() {
RemoveExplicitMSB();
++raw_;
InsertExplicitMSB();
}

static constexpr BinaryFloatingPointNumber Infinity(bool isNegative) {
static constexpr RT_API_ATTRS BinaryFloatingPointNumber Infinity(
bool isNegative) {
RawType result{RawType{maxExponent} << significandBits};
if (isNegative) {
result |= RawType{1} << (bits - 1);
Expand All @@ -139,7 +149,8 @@ class BinaryFloatingPointNumber : public common::RealDetails<BINARY_PRECISION> {
}

// Returns true when the result is exact
constexpr bool RoundToBits(int keepBits, enum FortranRounding mode) {
constexpr RT_API_ATTRS bool RoundToBits(
int keepBits, enum FortranRounding mode) {
if (IsNaN() || IsInfinite() || keepBits >= binaryPrecision) {
return true;
}
Expand Down Expand Up @@ -180,12 +191,12 @@ class BinaryFloatingPointNumber : public common::RealDetails<BINARY_PRECISION> {
}

private:
constexpr void RemoveExplicitMSB() {
constexpr RT_API_ATTRS void RemoveExplicitMSB() {
if constexpr (!isImplicitMSB) {
raw_ = (raw_ & (significandMask >> 1)) | ((raw_ & ~significandMask) >> 1);
}
}
constexpr void InsertExplicitMSB() {
constexpr RT_API_ATTRS void InsertExplicitMSB() {
if constexpr (!isImplicitMSB) {
constexpr RawType mask{significandMask >> 1};
raw_ = (raw_ & mask) | ((raw_ & ~mask) << 1);
Expand Down
53 changes: 27 additions & 26 deletions flang/include/flang/Decimal/decimal.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#ifndef FORTRAN_DECIMAL_DECIMAL_H_
#define FORTRAN_DECIMAL_DECIMAL_H_

#include "flang/Runtime/api-attrs.h"
#include <stddef.h>

#ifdef __cplusplus
Expand Down Expand Up @@ -65,27 +66,27 @@ enum DecimalConversionFlags {

#ifdef __cplusplus
template <int PREC>
ConversionToDecimalResult ConvertToDecimal(char *, size_t,
RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal(char *, size_t,
DecimalConversionFlags, int digits, enum FortranRounding rounding,
BinaryFloatingPointNumber<PREC> x);

extern template ConversionToDecimalResult ConvertToDecimal<8>(char *, size_t,
enum DecimalConversionFlags, int, enum FortranRounding,
extern template RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal<8>(
char *, size_t, enum DecimalConversionFlags, int, enum FortranRounding,
BinaryFloatingPointNumber<8>);
extern template ConversionToDecimalResult ConvertToDecimal<11>(char *, size_t,
enum DecimalConversionFlags, int, enum FortranRounding,
extern template RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal<11>(
char *, size_t, enum DecimalConversionFlags, int, enum FortranRounding,
BinaryFloatingPointNumber<11>);
extern template ConversionToDecimalResult ConvertToDecimal<24>(char *, size_t,
enum DecimalConversionFlags, int, enum FortranRounding,
extern template RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal<24>(
char *, size_t, enum DecimalConversionFlags, int, enum FortranRounding,
BinaryFloatingPointNumber<24>);
extern template ConversionToDecimalResult ConvertToDecimal<53>(char *, size_t,
enum DecimalConversionFlags, int, enum FortranRounding,
extern template RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal<53>(
char *, size_t, enum DecimalConversionFlags, int, enum FortranRounding,
BinaryFloatingPointNumber<53>);
extern template ConversionToDecimalResult ConvertToDecimal<64>(char *, size_t,
enum DecimalConversionFlags, int, enum FortranRounding,
extern template RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal<64>(
char *, size_t, enum DecimalConversionFlags, int, enum FortranRounding,
BinaryFloatingPointNumber<64>);
extern template ConversionToDecimalResult ConvertToDecimal<113>(char *, size_t,
enum DecimalConversionFlags, int, enum FortranRounding,
extern template RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal<113>(
char *, size_t, enum DecimalConversionFlags, int, enum FortranRounding,
BinaryFloatingPointNumber<113>);

template <int PREC> struct ConversionToBinaryResult {
Expand All @@ -94,20 +95,20 @@ template <int PREC> struct ConversionToBinaryResult {
};

template <int PREC>
ConversionToBinaryResult<PREC> ConvertToBinary(const char *&,
RT_API_ATTRS ConversionToBinaryResult<PREC> ConvertToBinary(const char *&,
enum FortranRounding = RoundNearest, const char *end = nullptr);

extern template ConversionToBinaryResult<8> ConvertToBinary<8>(
extern template RT_API_ATTRS ConversionToBinaryResult<8> ConvertToBinary<8>(
const char *&, enum FortranRounding, const char *end);
extern template ConversionToBinaryResult<11> ConvertToBinary<11>(
extern template RT_API_ATTRS ConversionToBinaryResult<11> ConvertToBinary<11>(
const char *&, enum FortranRounding, const char *end);
extern template ConversionToBinaryResult<24> ConvertToBinary<24>(
extern template RT_API_ATTRS ConversionToBinaryResult<24> ConvertToBinary<24>(
const char *&, enum FortranRounding, const char *end);
extern template ConversionToBinaryResult<53> ConvertToBinary<53>(
extern template RT_API_ATTRS ConversionToBinaryResult<53> ConvertToBinary<53>(
const char *&, enum FortranRounding, const char *end);
extern template ConversionToBinaryResult<64> ConvertToBinary<64>(
extern template RT_API_ATTRS ConversionToBinaryResult<64> ConvertToBinary<64>(
const char *&, enum FortranRounding, const char *end);
extern template ConversionToBinaryResult<113> ConvertToBinary<113>(
extern template RT_API_ATTRS ConversionToBinaryResult<113> ConvertToBinary<113>(
const char *&, enum FortranRounding, const char *end);
} // namespace Fortran::decimal
extern "C" {
Expand All @@ -116,21 +117,21 @@ extern "C" {
#define NS(x) x
#endif /* C++ */

struct NS(ConversionToDecimalResult)
RT_API_ATTRS struct NS(ConversionToDecimalResult)
ConvertFloatToDecimal(char *, size_t, enum NS(DecimalConversionFlags),
int digits, enum NS(FortranRounding), float);
struct NS(ConversionToDecimalResult)
RT_API_ATTRS struct NS(ConversionToDecimalResult)
ConvertDoubleToDecimal(char *, size_t, enum NS(DecimalConversionFlags),
int digits, enum NS(FortranRounding), double);
struct NS(ConversionToDecimalResult)
RT_API_ATTRS struct NS(ConversionToDecimalResult)
ConvertLongDoubleToDecimal(char *, size_t, enum NS(DecimalConversionFlags),
int digits, enum NS(FortranRounding), long double);

enum NS(ConversionResultFlags)
RT_API_ATTRS enum NS(ConversionResultFlags)
ConvertDecimalToFloat(const char **, float *, enum NS(FortranRounding));
enum NS(ConversionResultFlags)
RT_API_ATTRS enum NS(ConversionResultFlags)
ConvertDecimalToDouble(const char **, double *, enum NS(FortranRounding));
enum NS(ConversionResultFlags) ConvertDecimalToLongDouble(
RT_API_ATTRS enum NS(ConversionResultFlags) ConvertDecimalToLongDouble(
const char **, long double *, enum NS(FortranRounding));
#undef NS
#ifdef __cplusplus
Expand Down
2 changes: 1 addition & 1 deletion flang/include/flang/Runtime/api-attrs.h
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@
* to appear as part of a C++ decl-specifier.
*/
#ifndef RT_CONST_VAR_ATTRS
#if defined(__CUDACC__) || defined(__CUDA__)
#if (defined(__CUDACC__) || defined(__CUDA__)) && defined(__CUDA_ARCH__)
#define RT_CONST_VAR_ATTRS __constant__
#else
#define RT_CONST_VAR_ATTRS
Expand Down
14 changes: 11 additions & 3 deletions flang/include/flang/Runtime/io-api.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,14 @@ extern "C" {

#define IONAME(name) RTNAME(io##name)

#ifndef IODECL
#define IODECL(name) RT_API_ATTRS IONAME(name)
#endif

#ifndef IODEF
#define IODEF(name) RT_API_ATTRS IONAME(name)
#endif

// These functions initiate data transfer statements (READ, WRITE, PRINT).
// Example: PRINT *, 666 is implemented as the series of calls:
// Cookie cookie{BeginExternalListOutput(DefaultOutputUnit,
Expand Down Expand Up @@ -139,7 +147,7 @@ enum Iostat IONAME(CheckUnitNumberInRange128)(common::int128_t unit,
const char *sourceFile = nullptr, int sourceLine = 0);

// External synchronous I/O initiation
Cookie IONAME(BeginExternalListOutput)(ExternalUnit = DefaultOutputUnit,
Cookie IODECL(BeginExternalListOutput)(ExternalUnit = DefaultOutputUnit,
const char *sourceFile = nullptr, int sourceLine = 0);
Cookie IONAME(BeginExternalListInput)(ExternalUnit = DefaultInputUnit,
const char *sourceFile = nullptr, int sourceLine = 0);
Expand Down Expand Up @@ -253,7 +261,7 @@ bool IONAME(InputDescriptor)(Cookie, const Descriptor &);
// Formatted (including list directed) I/O data items
bool IONAME(OutputInteger8)(Cookie, std::int8_t);
bool IONAME(OutputInteger16)(Cookie, std::int16_t);
bool IONAME(OutputInteger32)(Cookie, std::int32_t);
bool IODECL(OutputInteger32)(Cookie, std::int32_t);
bool IONAME(OutputInteger64)(Cookie, std::int64_t);
bool IONAME(OutputInteger128)(Cookie, common::int128_t);
bool IONAME(InputInteger)(Cookie, std::int64_t &, int kind = 8);
Expand Down Expand Up @@ -357,7 +365,7 @@ bool IONAME(InquireInteger64)(
// returned is guaranteed to only be one of the problems that the
// EnableHandlers() call has indicated should be handled in compiled code
// rather than by terminating the image.
enum Iostat IONAME(EndIoStatement)(Cookie);
enum Iostat IODECL(EndIoStatement)(Cookie);

} // extern "C"
} // namespace Fortran::runtime::io
Expand Down
3 changes: 2 additions & 1 deletion flang/include/flang/Runtime/iostat.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

#ifndef FORTRAN_RUNTIME_IOSTAT_H_
#define FORTRAN_RUNTIME_IOSTAT_H_
#include "flang/Runtime/api-attrs.h"
#include "flang/Runtime/magic-numbers.h"
namespace Fortran::runtime::io {

Expand Down Expand Up @@ -88,7 +89,7 @@ enum Iostat {
IostatNonExternalDefinedUnformattedIo,
};

const char *IostatErrorString(int);
const RT_API_ATTRS char *IostatErrorString(int);

} // namespace Fortran::runtime::io
#endif // FORTRAN_RUNTIME_IOSTAT_H_
16 changes: 13 additions & 3 deletions flang/include/flang/Runtime/memory.h
Original file line number Diff line number Diff line change
Expand Up @@ -128,20 +128,30 @@ inline RT_API_ATTRS bool operator!=(std::nullptr_t, const OwningPtr<X> &x) {

template <typename A> class SizedNew {
public:
explicit SizedNew(const Terminator &terminator) : terminator_{terminator} {}
explicit RT_API_ATTRS SizedNew(const Terminator &terminator)
: terminator_{terminator} {}

// Disable warnings about calling constructors for host-only
// classes (those thare are not supposed to be constructed)
// on the device.
RT_DIAG_PUSH
RT_DIAG_DISABLE_CALL_HOST_FROM_DEVICE_WARN
template <typename... X>
[[nodiscard]] OwningPtr<A> operator()(std::size_t bytes, X &&...x) {
[[nodiscard]] RT_API_ATTRS OwningPtr<A> operator()(
std::size_t bytes, X &&...x) {
return OwningPtr<A>{new (AllocateMemoryOrCrash(terminator_, bytes))
A{std::forward<X>(x)...}};
}
RT_DIAG_POP

private:
const Terminator &terminator_;
};

template <typename A> struct New : public SizedNew<A> {
using SizedNew<A>::SizedNew;
template <typename... X> [[nodiscard]] OwningPtr<A> operator()(X &&...x) {
template <typename... X>
[[nodiscard]] RT_API_ATTRS OwningPtr<A> operator()(X &&...x) {
return SizedNew<A>::operator()(sizeof(A), std::forward<X>(x)...);
}
};
Expand Down
1 change: 0 additions & 1 deletion flang/include/flang/Runtime/type-code.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
#include "flang/Common/Fortran.h"
#include "flang/Common/optional.h"
#include "flang/ISO_Fortran_binding_wrapper.h"
#include <optional>
#include <utility>

namespace Fortran::runtime {
Expand Down
Loading