blob: 36784be9b8fd9b6f704c22a4612a1471ad6bb6b0 [file] [log] [blame]
//===--- fformat.h - Descriptions of floating point formats -------*- C -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This header file contains some macro definitions useful for working with bit
// accurate floating point representations.
//
//===----------------------------------------------------------------------===//
#ifndef _FFORMAT_H_
#define _FFORMAT_H_
#define F32_SIGN_BIT 0x80000000U
#define F32_EXP_MASK 0x7F800000U
#define F32_MANTISSA_MASK 0x007FFFFFU
#define F32_MANTISSA_MSB 0x00400000U
#define F32_QNAN_BIT F32_MANTISSA_MSB
#define F32_PAYLOAD_MASK (F32_MANTISSA_MASK & ~F32_QNAN_BIT)
#define F32_SIGN_SHIFT 31
#define F32_EXP_SHIFT 23
#define F32_EXP_SIZE (F32_SIGN_SHIFT - F32_EXP_SHIFT)
#define F32_MANTISSA_SIZE F32_EXP_SHIFT
#define F32_EXP_BIAS 127
#define F32_EXP_MIN (-126)
#define F32_EXP_MAX 127
#define F32_EXP(e) (((e) + F32_EXP_BIAS) << F32_EXP_SHIFT)
#define F32_MANTISSA(b1, b2, b3) \
(((b1) ? F32_MANTISSA_MSB : 0) | \
((b2) ? (F32_MANTISSA_MSB >> 1) : 0) | \
((b3) ? (F32_MANTISSA_MSB >> 2) : 0))
#define F32_MAKE(s, e, m) \
(((s) ? F32_SIGN_BIT : 0) | \
((e) & F32_EXP_MASK) | \
((m) & F32_MANTISSA_MASK))
#define F32_NORMAL(s, e, m) F32_MAKE((s), F32_EXP(e), (m))
#define F64_SIGN_BIT 0x8000000000000000ULL
#define F64_EXP_MASK 0x7FF0000000000000ULL
#define F64_MANTISSA_MASK 0x000FFFFFFFFFFFFFULL
#define F64_MANTISSA_MSB 0x0008000000000000ULL
#define F64_QNAN_BIT F64_MANTISSA_MSB
#define F64_PAYLOAD_MASK (F64_MANTISSA_MASK & ~F64_QNAN_BIT)
#define F64_SIGN_SHIFT 63
#define F64_EXP_SHIFT 52
#define F64_EXP_SIZE (F64_SIGN_SHIFT - F64_EXP_SHIFT)
#define F64_MANTISSA_SIZE F64_EXP_SHIFT
#define F64_EXP_BIAS 1023
#define F64_EXP_MIN (-1022)
#define F64_EXP_MAX 1023
#define F64_EXP(e) (((uint64_t)(e) + F64_EXP_BIAS) << F64_EXP_SHIFT)
#define F64_MANTISSA(b1, b2, b3) \
(((b1) ? F64_MANTISSA_MSB : 0) | \
((b2) ? (F64_MANTISSA_MSB >> 1) : 0) | \
((b3) ? (F64_MANTISSA_MSB >> 2) : 0))
#define F64_MAKE(s, e, m) \
(((s) ? F64_SIGN_BIT : 0) | \
((e) & F64_EXP_MASK) | \
((m) & F64_MANTISSA_MASK))
#define F64_NORMAL(s, e, m) F64_MAKE((s), F64_EXP(e), (m))
#endif