Changeset View
Changeset View
Standalone View
Standalone View
test/Frontend/fixed_point_all_conversions.c
- This file was added.
// RUN: %clang_cc1 -Werror %s | |||||
// Test for conversions between fixed point types and all other valid types. | |||||
// Conversion from one type to another type | |||||
#define CONVERT(FROM_TYPE, FROM_ID, TO_TYPE, TO_ID) \ | |||||
TO_TYPE FROM_ID##_to_##TO_ID(FROM_TYPE x) { return x; } | |||||
// Conversion between 2 types | |||||
#define CONVERT_COMBINATION(TYPE1, ID1, TYPE2, ID2) \ | |||||
CONVERT(TYPE1, ID1, TYPE2, ID2) \ | |||||
CONVERT(TYPE2, ID2, TYPE1, ID1) | |||||
// Conversion between one type and floating point types | |||||
#define CONVERT_BETWEEN_FLOATS(TYPE, ID) \ | |||||
CONVERT_COMBINATION(TYPE, ID, float, Float) \ | |||||
CONVERT_COMBINATION(TYPE, ID, double, Double) | |||||
// Conversion between one type and an integral type with differant signage | |||||
#define CONVERT_BETWEEN_INTEGRALS_WITH_SIGN(TYPE, ID, INT_TYPE, INT_ID) \ | |||||
CONVERT_COMBINATION(TYPE, ID, INT_TYPE, INT_ID) \ | |||||
CONVERT_COMBINATION(TYPE, ID, signed INT_TYPE, Signed##INT_ID) \ | |||||
CONVERT_COMBINATION(TYPE, ID, unsigned INT_TYPE, Unsigned##INT_ID) | |||||
// Conversion between one type and all integral types | |||||
#define CONVERT_BETWEEN_INTEGRALS(TYPE, ID) \ | |||||
CONVERT_BETWEEN_INTEGRALS_WITH_SIGN(TYPE, ID, char, Char) \ | |||||
CONVERT_BETWEEN_INTEGRALS_WITH_SIGN(TYPE, ID, short, Short) \ | |||||
CONVERT_BETWEEN_INTEGRALS_WITH_SIGN(TYPE, ID, int, Int) \ | |||||
CONVERT_BETWEEN_INTEGRALS_WITH_SIGN(TYPE, ID, long, Long) \ | |||||
CONVERT_BETWEEN_INTEGRALS_WITH_SIGN(TYPE, ID, long long, LongLong) | |||||
// Conversion between one type and a fixed point type with different saturation | |||||
#define CONVERT_BETWEEN_FIXED_POINT_WITH_SAT(TYPE, ID, FIXED_TYPE, FIXED_ID) \ | |||||
CONVERT_COMBINATION(TYPE, ID, FIXED_TYPE, FIXED_ID) \ | |||||
CONVERT_COMBINATION(TYPE, ID, _Sat FIXED_TYPE, Sat##FIXED_ID) | |||||
// Conversion between one type and a fixed point type with different signage | |||||
#define CONVERT_BETWEEN_FIXED_POINT_WITH_SIGN(TYPE, ID, FIXED_TYPE, FIXED_ID) \ | |||||
CONVERT_BETWEEN_FIXED_POINT_WITH_SAT(TYPE, ID, FIXED_TYPE, FIXED_ID) \ | |||||
CONVERT_BETWEEN_FIXED_POINT_WITH_SAT(TYPE, ID, signed FIXED_TYPE, \ | |||||
Signed##FIXED_ID) \ | |||||
CONVERT_BETWEEN_FIXED_POINT_WITH_SAT(TYPE, ID, unsigned FIXED_TYPE, \ | |||||
Unsigned##FIXED_ID) | |||||
// Convert between one type and all fixed point types. | |||||
// Add "Type" to the end of the ID to avoid multiple definitions of a function | |||||
// if the Type is a fixed point type. | |||||
#define CONVERT_BETWEEN_FIXED_POINT(TYPE, ID) \ | |||||
CONVERT_BETWEEN_FIXED_POINT_WITH_SIGN(TYPE, ID, _Fract, FractType) \ | |||||
CONVERT_BETWEEN_FIXED_POINT_WITH_SIGN(TYPE, ID, _Accum, AccumType) | |||||
// Convert between one type and all other types | |||||
#define CONVERT_BETWEEN_ALL_TYPES(TYPE, ID) \ | |||||
CONVERT_BETWEEN_FLOATS(TYPE, ID) \ | |||||
CONVERT_BETWEEN_INTEGRALS(TYPE, ID) \ | |||||
CONVERT_BETWEEN_FIXED_POINT(TYPE, ID) | |||||
#define CONVERT_FIXED_POINT_TYPE_WITH_SAT(TYPE, ID) \ | |||||
CONVERT_BETWEEN_ALL_TYPES(TYPE, ID) \ | |||||
CONVERT_BETWEEN_ALL_TYPES(_Sat TYPE, Sat##ID) | |||||
#define CONVERT_FIXED_POINT_TYPE(TYPE, ID) \ | |||||
CONVERT_FIXED_POINT_TYPE_WITH_SAT(TYPE, ID) \ | |||||
CONVERT_FIXED_POINT_TYPE_WITH_SAT(signed TYPE, Signed##ID) \ | |||||
CONVERT_FIXED_POINT_TYPE_WITH_SAT(unsigned TYPE, Unsigned##ID) | |||||
CONVERT_FIXED_POINT_TYPE(short _Fract, ShortFract); | |||||
CONVERT_FIXED_POINT_TYPE(_Fract, Fract); | |||||
CONVERT_FIXED_POINT_TYPE(long _Fract, LongFract); | |||||
CONVERT_FIXED_POINT_TYPE(short _Accum, ShortAccum); | |||||
CONVERT_FIXED_POINT_TYPE(_Accum, Accum); | |||||
CONVERT_FIXED_POINT_TYPE(long _Accum, LongAccum); |