Commit fca8ed94 by Chao-ying Fu Committed by Chao-ying Fu

target-supports.exp (check_effective_target_fixed_point): New to check if…

target-supports.exp (check_effective_target_fixed_point): New to check if targets have fixed-point supports.

	* lib/target-supports.exp (check_effective_target_fixed_point): New to
	check if targets have fixed-point supports.
	* gcc.dg/fixed-point/fixed-point.exp: New file.
	* gcc.dg/fixed-point/addsub.c, gcc.dg/fixed-point/allconv.c,
	* gcc.dg/fixed-point/allop.c, gcc.dg/fixed-point/call-by-value.c,
	* gcc.dg/fixed-point/cast-bad.c, gcc.dg/fixed-point/composite-type.c,
	* gcc.dg/fixed-point/const-1.c, gcc.dg/fixed-point/constant.c,
	* gcc.dg/fixed-point/constants-pedantic.c,
	* gcc.dg/fixed-point/convert.c, gcc.dg/fixed-point/define.c,
	* gcc.dg/fixed-point/keywords-c89.c, gcc.dg/fixed-point/keywords-c99.c,
	* gcc.dg/fixed-point/keywords-ignored-c99.c,
	* gcc.dg/fixed-point/keywords-pedantic.c,
	* gcc.dg/fixed-point/keywords-reserved.c, gcc.dg/fixed-point/binary.c,
	* gcc.dg/fixed-point/modes.c, gcc.dg/fixed-point/noassoc.c,
	* gcc.dg/fixed-point/types.c, gcc.dg/fixed-point/typespec.c,
	* gcc.dg/fixed-point/unary.c, gcc.dg/fixed-point/func-array.c,
	* gcc.dg/fixed-point/func-scalar.c, gcc.dg/fixed-point/func-struct.c,
	* gcc.dg/fixed-point/func-vararg-mixed.c,
	* gcc.dg/fixed-point/operator-logical.c,
	* gcc.dg/fixed-point/struct-union.c,
	* gcc.dg/fixed-point/bit-complement.c,
	* gcc.dg/fixed-point/operator-bitwise.c,
	* gcc.dg/fixed-point/operator-comma.c,
	* gcc.dg/fixed-point/struct-layout-1.c,
	* gcc.dg/fixed-point/union-init.c,
	* gcc.dg/fixed-point/Wbad-function-cast-1.c,
	* gcc.dg/fixed-point/func-mixed.c,
	* gcc.dg/fixed-point/func-vararg-size0.c,
	* gcc.dg/fixed-point/func-vararg.c, gcc.dg/fixed-point/int-warning.c,
	* gcc.dg/fixed-point/loop-index.c, gcc.dg/fixed-point/operator-cond.c,
	* gcc.dg/fixed-point/operator-unary.c,
	* gcc.dg/fixed-point/allop-const.c,
	* gcc.dg/fixed-point/muldiv-warning.c,
	* gcc.dg/nofixed-point-1.c,
	* gcc.target/mips/dpaq_sa_l_w.c, gcc.target/mips/dpsq_sa_l_w.c,
	* gcc.target/mips/fixed-vector-type.c,
	* gcc.target/mips/fixed-scalar-type.c: New tests.

From-SVN: r128661
parent fca1a50f
2007-09-21 Chao-ying Fu <fu@mips.com>
* lib/target-supports.exp (check_effective_target_fixed_point): New to
check if targets have fixed-point supports.
* gcc.dg/fixed-point/fixed-point.exp: New file.
* gcc.dg/fixed-point/addsub.c, gcc.dg/fixed-point/allconv.c,
* gcc.dg/fixed-point/allop.c, gcc.dg/fixed-point/call-by-value.c,
* gcc.dg/fixed-point/cast-bad.c, gcc.dg/fixed-point/composite-type.c,
* gcc.dg/fixed-point/const-1.c, gcc.dg/fixed-point/constant.c,
* gcc.dg/fixed-point/constants-pedantic.c,
* gcc.dg/fixed-point/convert.c, gcc.dg/fixed-point/define.c,
* gcc.dg/fixed-point/keywords-c89.c, gcc.dg/fixed-point/keywords-c99.c,
* gcc.dg/fixed-point/keywords-ignored-c99.c,
* gcc.dg/fixed-point/keywords-pedantic.c,
* gcc.dg/fixed-point/keywords-reserved.c, gcc.dg/fixed-point/binary.c,
* gcc.dg/fixed-point/modes.c, gcc.dg/fixed-point/noassoc.c,
* gcc.dg/fixed-point/types.c, gcc.dg/fixed-point/typespec.c,
* gcc.dg/fixed-point/unary.c, gcc.dg/fixed-point/func-array.c,
* gcc.dg/fixed-point/func-scalar.c, gcc.dg/fixed-point/func-struct.c,
* gcc.dg/fixed-point/func-vararg-mixed.c,
* gcc.dg/fixed-point/operator-logical.c,
* gcc.dg/fixed-point/struct-union.c,
* gcc.dg/fixed-point/bit-complement.c,
* gcc.dg/fixed-point/operator-bitwise.c,
* gcc.dg/fixed-point/operator-comma.c,
* gcc.dg/fixed-point/struct-layout-1.c,
* gcc.dg/fixed-point/union-init.c,
* gcc.dg/fixed-point/Wbad-function-cast-1.c,
* gcc.dg/fixed-point/func-mixed.c,
* gcc.dg/fixed-point/func-vararg-size0.c,
* gcc.dg/fixed-point/func-vararg.c, gcc.dg/fixed-point/int-warning.c,
* gcc.dg/fixed-point/loop-index.c, gcc.dg/fixed-point/operator-cond.c,
* gcc.dg/fixed-point/operator-unary.c,
* gcc.dg/fixed-point/allop-const.c,
* gcc.dg/fixed-point/muldiv-warning.c,
* gcc.dg/nofixed-point-1.c,
* gcc.target/mips/dpaq_sa_l_w.c, gcc.target/mips/dpsq_sa_l_w.c,
* gcc.target/mips/fixed-vector-type.c,
* gcc.target/mips/fixed-scalar-type.c: New tests.
2007-09-21 Olivier Hainque <hainque@adacore.com>
* gnat.dg/nested_subtype_byref.ad[bs]: Part of new test.
/* { dg-do compile } */
/* { dg-options "-std=gnu99" } */
/* Check if GCC generates warnings when overflows. */
_Fract a0 = 0.5r + 0.5r; /* { dg-warning "overflow" } */
_Fract a1 = 0.5r + 0.6r; /* { dg-warning "overflow" } */
_Fract a2 = 0.5r + -0.6r;
_Fract a3 = -0.5r + 0.6r;
_Fract a4 = -0.5r + -0.5r;
_Fract a5 = -0.5r + -0.6r; /* { dg-warning "overflow" } */
_Fract a6 = 0.0r + __FRACT_MIN__;
_Fract a7 = 0.1r + __FRACT_MIN__;
_Fract a8 = -0.1r + __FRACT_MIN__; /* { dg-warning "overflow" } */
_Fract a9 = 0.0r + __FRACT_MAX__;
_Fract a10 = 0.1r + __FRACT_MAX__; /* { dg-warning "overflow" } */
_Fract a11 = -0.1r + __FRACT_MAX__;
_Fract b0 = 0.5r - 0.5r;
_Fract b1 = 0.5r - 0.6r;
_Fract b2 = 0.5r - -0.6r; /* { dg-warning "overflow" } */
_Fract b3 = -0.5r - 0.6r; /* { dg-warning "overflow" } */
_Fract b4 = -0.5r - -0.5r;
_Fract b5 = -0.5r - -0.6r;
_Fract b6 = 0.0r - __FRACT_MIN__; /* { dg-warning "overflow" } */
_Fract b7 = 0.1r - __FRACT_MIN__; /* { dg-warning "overflow" } */
_Fract b8 = -0.1r - __FRACT_MIN__;
_Fract b9 = 0.0r - __FRACT_MAX__;
_Fract b10 = 0.1r - __FRACT_MAX__;
_Fract b11 = -0.1r - __FRACT_MAX__; /* { dg-warning "overflow" } */
/* { dg-do compile } */
/* { dg-options "-std=gnu99" } */
/* C99 6.3 Conversions.
Check if all conversions are ok. */
#define CONV(TYPE, NAME) \
float NAME ## _to_SF (TYPE a) { return a; } \
float Sat ## NAME ## _to_SF (_Sat TYPE a) { return a; } \
double NAME ## _to_DF (TYPE a) { return a; } \
double Sat ## NAME ## _to_DF (_Sat TYPE a) { return a; } \
TYPE SF_to_ ## NAME (float a) { return a; } \
_Sat TYPE SF_to_Sat ## NAME (float a) { return a; } \
TYPE DF_to_ ## NAME (double a) { return a; } \
_Sat TYPE DF_to_Sat ## NAME (double a) { return a; } \
signed char NAME ## _to_schar (TYPE a) { return a; } \
signed char Sat ## NAME ## _to_schar (_Sat TYPE a) { return a; } \
unsigned char NAME ## _to_uchar (TYPE a) { return a; } \
unsigned char Sat ## NAME ## _to_uchar (_Sat TYPE a) { return a; } \
short NAME ## _to_short (TYPE a) { return a; } \
short _Sat ## NAME ## _to_short (_Sat TYPE a) { return a; } \
unsigned short NAME ## _to_ushort (TYPE a) { return a; } \
unsigned short _Sat ## NAME ## _to_ushort (_Sat TYPE a) { return a; } \
int NAME ## _to_int (TYPE a) { return a; } \
int _Sat ## NAME ## _to_int (_Sat TYPE a) { return a; } \
unsigned int NAME ## _to_uint (TYPE a) { return a; } \
unsigned int _Sat ## NAME ## _to_uint (_Sat TYPE a) { return a; } \
long NAME ## _to_long (TYPE a) { return a; } \
unsigned long NAME ## _to_ulong (TYPE a) { return a; } \
long _Sat ## NAME ## _to_long (TYPE a) { return a; } \
unsigned long _Sat ## NAME ## _to_ulong (TYPE a) { return a; } \
long long NAME ## _to_longlong (TYPE a) { return a; } \
long long _Sat ## NAME ## _to_longlong (TYPE a) { return a; } \
unsigned long long NAME ## _to_ulonglong (TYPE a) { return a; } \
unsigned long long _Sat ## NAME ## _to_ulonglong (TYPE a) { return a; } \
TYPE schar_to_ ## NAME (signed char a) { return a; } \
_Sat TYPE schar_to_Sat ## NAME (signed char a) { return a; } \
TYPE uchar_to_ ## NAME (unsigned char a) { return a; } \
_Sat TYPE uchar_to_Sat ## NAME (unsigned char a) { return a; } \
TYPE short_to_ ## NAME (short a) { return a; } \
TYPE ushort_to_ ## NAME (unsigned short a) { return a; } \
TYPE int_to_ ## NAME (int a) { return a; } \
TYPE uint_to_ ## NAME (unsigned int a) { return a; } \
TYPE long_to_ ## NAME (long a) { return a; } \
TYPE ulong_to_ ## NAME (unsigned long a) { return a; } \
TYPE longlong_to_ ## NAME (long long a) { return a; } \
TYPE ulonglong_to_ ## NAME (unsigned long long a) { return a; } \
_Sat TYPE short_to_Sat ## NAME (short a) { return a; } \
_Sat TYPE ushort_to_Sat ## NAME (unsigned short a) { return a; } \
_Sat TYPE int_to_Sat ## NAME (int a) { return a; } \
_Sat TYPE uint_to_Sat ## NAME (unsigned int a) { return a; } \
_Sat TYPE long_to_Sat ## NAME (long a) { return a; } \
_Sat TYPE ulong_to_Sat ## NAME (unsigned long a) { return a; } \
_Sat TYPE longlong_to_Sat ## NAME (long long a) { return a; } \
_Sat TYPE ulonglong_to_Sat ## NAME (unsigned long long a) { return a; } \
TYPE SFR_to ## NAME (short _Fract a) { return a; } \
TYPE FR_to ## NAME (_Fract a) { return a; } \
TYPE LFR_to ## NAME (long _Fract a) { return a; } \
TYPE LLFR_to ## NAME (long long _Fract a) { return a; } \
TYPE USFR_to ## NAME (unsigned short _Fract a) { return a; } \
TYPE UFR_to ## NAME (unsigned _Fract a) { return a; } \
TYPE ULFR_to ## NAME (unsigned long _Fract a) { return a; } \
TYPE ULLFR_to ## NAME (unsigned long long _Fract a) { return a; } \
TYPE SAC_to ## NAME (short _Accum a) { return a; } \
TYPE AC_to ## NAME (_Accum a) { return a; } \
TYPE LAC_to ## NAME (long _Accum a) { return a; } \
TYPE LLAC_to ## NAME (long long _Accum a) { return a; } \
TYPE USAC_to ## NAME (unsigned short _Accum a) { return a; } \
TYPE UAC_to ## NAME (unsigned _Accum a) { return a; } \
TYPE ULAC_to ## NAME (unsigned long _Accum a) { return a; } \
TYPE ULLAC_to ## NAME (unsigned long long _Accum a) { return a; } \
TYPE SATSFR_to ## NAME (_Sat short _Fract a) { return a; } \
TYPE SATFR_to ## NAME (_Sat _Fract a) { return a; } \
TYPE SATLFR_to ## NAME (_Sat long _Fract a) { return a; } \
TYPE SATLLFR_to ## NAME (_Sat long long _Fract a) { return a; } \
TYPE SATUSFR_to ## NAME (_Sat unsigned short _Fract a) { return a; } \
TYPE SATUFR_to ## NAME (_Sat unsigned _Fract a) { return a; } \
TYPE SATULFR_to ## NAME (_Sat unsigned long _Fract a) { return a; } \
TYPE SATULLFR_to ## NAME (_Sat unsigned long long _Fract a) { return a; } \
TYPE SATSAC_to ## NAME (_Sat short _Accum a) { return a; } \
TYPE SATAC_to ## NAME (_Sat _Accum a) { return a; } \
TYPE SATLAC_to ## NAME (_Sat long _Accum a) { return a; } \
TYPE SATLLAC_to ## NAME (_Sat long long _Accum a) { return a; } \
TYPE SATUSAC_to ## NAME (_Sat unsigned short _Accum a) { return a; } \
TYPE SATUAC_to ## NAME (_Sat unsigned _Accum a) { return a; } \
TYPE SATULAC_to ## NAME (_Sat unsigned long _Accum a) { return a; } \
TYPE SATULLAC_to ## NAME (_Sat unsigned long long _Accum a) { return a; } \
_Sat TYPE SFR_to_SAT ## NAME (short _Fract a) { return a; } \
_Sat TYPE FR_to_SAT ## NAME (_Fract a) { return a; } \
_Sat TYPE LFR_to_SAT ## NAME (long _Fract a) { return a; } \
_Sat TYPE LLFR_to_SAT ## NAME (long long _Fract a) { return a; } \
_Sat TYPE USFR_to_SAT ## NAME (unsigned short _Fract a) { return a; } \
_Sat TYPE UFR_to_SAT ## NAME (unsigned _Fract a) { return a; } \
_Sat TYPE ULFR_to_SAT ## NAME (unsigned long _Fract a) { return a; } \
_Sat TYPE ULLFR_to_SAT ## NAME (unsigned long long _Fract a) { return a; } \
_Sat TYPE SAC_to_SAT ## NAME (short _Accum a) { return a; } \
_Sat TYPE AC_to_SAT ## NAME (_Accum a) { return a; } \
_Sat TYPE LAC_to_SAT ## NAME (long _Accum a) { return a; } \
_Sat TYPE LLAC_to_SAT ## NAME (long long _Accum a) { return a; } \
_Sat TYPE USAC_to_SAT ## NAME (unsigned short _Accum a) { return a; } \
_Sat TYPE UAC_to_SAT ## NAME (unsigned _Accum a) { return a; } \
_Sat TYPE ULAC_to_SAT ## NAME (unsigned long _Accum a) { return a; } \
_Sat TYPE ULLAC_to_SAT ## NAME (unsigned long long _Accum a) { return a; } \
_Sat TYPE SATSFR_to_SAT ## NAME (_Sat short _Fract a) { return a; } \
_Sat TYPE SATFR_to_SAT ## NAME (_Sat _Fract a) { return a; } \
_Sat TYPE SATLFR_to_SAT ## NAME (_Sat long _Fract a) { return a; } \
_Sat TYPE SATLLFR_to_SAT ## NAME (_Sat long long _Fract a) { return a; } \
_Sat TYPE SATUSFR_to_SAT ## NAME (_Sat unsigned short _Fract a) { return a; } \
_Sat TYPE SATUFR_to_SAT ## NAME (_Sat unsigned _Fract a) { return a; } \
_Sat TYPE SATULFR_to_SAT ## NAME (_Sat unsigned long _Fract a) { return a; } \
_Sat TYPE SATULLFR_to_SAT ## NAME (_Sat unsigned long long _Fract a) { return a; } \
_Sat TYPE SATSAC_to_SAT ## NAME (_Sat short _Accum a) { return a; } \
_Sat TYPE SATAC_to_SAT ## NAME (_Sat _Accum a) { return a; } \
_Sat TYPE SATLAC_to_SAT ## NAME (_Sat long _Accum a) { return a; } \
_Sat TYPE SATLLAC_to_SAT ## NAME (_Sat long long _Accum a) { return a; } \
_Sat TYPE SATUSAC_to_SAT ## NAME (_Sat unsigned short _Accum a) { return a; } \
_Sat TYPE SATUAC_to_SAT ## NAME (_Sat unsigned _Accum a) { return a; } \
_Sat TYPE SATULAC_to_SAT ## NAME (_Sat unsigned long _Accum a) { return a; } \
_Sat TYPE SATULLAC_to_SAT ## NAME (_Sat unsigned long long _Accum a) { return a; } \
_Complex int NAME ## _to_CI (TYPE a) { return a; } \
_Complex unsigned int NAME ## _to_CUI (TYPE a) { return a; } \
_Complex float NAME ## _to_CF (TYPE a) { return a; } \
_Complex double NAME ## _to_CD (TYPE a) { return a; } \
TYPE CI_to_ ## NAME (_Complex int a) { return a; } \
TYPE CUI_to_ ## NAME (_Complex unsigned int a) { return a; } \
TYPE CF_to_ ## NAME (_Complex float a) { return a; } \
TYPE CD_to_ ## NAME (_Complex double a) { return a; } \
_Sat TYPE CI_to_SAT ## NAME (_Complex int a) { return a; } \
_Sat TYPE CUI_to_SAT ## NAME (_Complex unsigned int a) { return a; } \
_Sat TYPE CF_to_SAT ## NAME (_Complex float a) { return a; } \
_Sat TYPE CD_to_SAT ## NAME (_Complex double a) { return a; }
CONV(short _Fract, sf);
CONV(_Fract, f);
CONV(long _Fract, lf);
CONV(long long _Fract, llf);
CONV(unsigned short _Fract, usf);
CONV(unsigned _Fract, uf);
CONV(unsigned long _Fract, ulf);
CONV(unsigned long long _Fract, ullf);
CONV(short _Accum, sk);
CONV(_Accum, k);
CONV(long _Accum, lk);
CONV(long long _Accum, llk);
CONV(unsigned short _Accum, usk);
CONV(unsigned _Accum, uk);
CONV(unsigned long _Accum, ulk);
CONV(unsigned long long _Accum, ullk);
/* { dg-do compile } */
/* { dg-options "-std=gnu99" } */
/* N1169 6.5.7 - Bitwise shift operands.
C99 6.5.3 Unary operators.
C99 6.5.5 Multiplicative operators.
C99 6.5.6 Additive operators.
C99 6.5.7 Bitwise shift operators.
C99 6.5.8 Relational operators.
C99 6.5.9 Equality operators.
C99 6.5.16 Assignment operators.
Check if all operations on constants are ok. */
#define ALLOPCONST(TYPE,NAME,POSTFIX) \
TYPE NAME ## plus = +0.1 ## POSTFIX; \
unsigned TYPE NAME ## u_plus = +0.1u ## POSTFIX; \
_Sat TYPE NAME ## sat_plus = +(_Sat TYPE)0.1 ## POSTFIX; \
_Sat unsigned TYPE NAME ## sat_u_plus = +(_Sat unsigned TYPE)0.1u ## POSTFIX; \
TYPE NAME ## neg = -0.1 ## POSTFIX; \
_Sat TYPE NAME ## sat_neg = -(_Sat TYPE)0.1 ## POSTFIX; \
_Sat unsigned TYPE NAME ## sat_u_neg = -(_Sat unsigned TYPE)0.1u ## POSTFIX; \
int NAME ## logneg1 = !0.1 ## POSTFIX; \
int NAME ## logneg1u = !0.1u ## POSTFIX; \
int NAME ## logneg2 = !0.0 ## POSTFIX; \
int NAME ## logneg2u = !0.0u ## POSTFIX; \
TYPE NAME ## add = 0.1 ## POSTFIX + 0.2 ## POSTFIX; \
unsigned TYPE NAME ## u_add = 0.1u ## POSTFIX + 0.2u ## POSTFIX; \
_Sat TYPE NAME ## sat_add = (_Sat TYPE)0.8 ## POSTFIX + 0.3 ## POSTFIX; \
_Sat unsigned TYPE NAME ## sat_u_add = (_Sat unsigned TYPE)0.8u ## POSTFIX + 0.3u ## POSTFIX; \
TYPE NAME ## sub = 0.1 ## POSTFIX - 0.2 ## POSTFIX; \
unsigned TYPE NAME ## u_sub = 0.2u ## POSTFIX - 0.1u ## POSTFIX; \
_Sat TYPE NAME ## sat_sub = (_Sat TYPE)0.1 ## POSTFIX - 0.2 ## POSTFIX; \
_Sat unsigned TYPE NAME ## sat_u_sub = (_Sat unsigned TYPE)0.1u ## POSTFIX - 0.2u ## POSTFIX; \
TYPE NAME ## mul = 0.1 ## POSTFIX * 0.2 ## POSTFIX; \
unsigned TYPE NAME ## u_mul = 0.1u ## POSTFIX * 0.2u ## POSTFIX; \
_Sat TYPE NAME ## sat_mul = (_Sat TYPE)0.1 ## POSTFIX * 0.2 ## POSTFIX; \
_Sat unsigned TYPE NAME ## sat_u_mul = (_Sat unsigned TYPE)0.1u ## POSTFIX * 0.2u ## POSTFIX; \
TYPE NAME ## div = 0.1 ## POSTFIX / 0.3 ## POSTFIX; \
unsigned TYPE NAME ## u_div = 0.1u ## POSTFIX / 0.3u ## POSTFIX; \
_Sat TYPE NAME ## sat_div = (_Sat TYPE)0.3 ## POSTFIX / 0.1 ## POSTFIX; \
_Sat unsigned TYPE NAME ## sat_u_div = (_Sat unsigned TYPE)0.3u ## POSTFIX / 0.1u ## POSTFIX; \
TYPE NAME ## shl = 0.1 ## POSTFIX << 3; \
unsigned TYPE NAME ## u_shl = 0.1u ## POSTFIX << 3; \
_Sat TYPE NAME ## sat_shl = (_Sat TYPE)0.8 ## POSTFIX << 3; \
_Sat unsigned TYPE NAME ## sat_u_shl = (_Sat unsigned TYPE)0.8u ## POSTFIX << 3; \
TYPE NAME ## shr = 0.1 ## POSTFIX >> 5; \
unsigned TYPE NAME ## u_shr = 0.1u ## POSTFIX >> 5; \
_Sat TYPE NAME ## sat_shr = (_Sat TYPE)0.1 ## POSTFIX >> 5; \
_Sat unsigned TYPE NAME ## sat_u_shr = (_Sat unsigned TYPE)0.1 ## POSTFIX >> 5; \
int NAME ## ne = 0.1 ## POSTFIX != 0.2 ## POSTFIX; \
int NAME ## u_ne = 0.1u ## POSTFIX != 0.2u ## POSTFIX; \
int NAME ## eq = 0.1 ## POSTFIX == 0.2 ## POSTFIX; \
int NAME ## u_eq = 0.1u ## POSTFIX == 0.2u ## POSTFIX; \
int NAME ## gt = 0.1 ## POSTFIX > 0.2 ## POSTFIX; \
int NAME ## u_gt = 0.1u ## POSTFIX > 0.2u ## POSTFIX; \
int NAME ## ge = 0.1 ## POSTFIX >= 0.2 ## POSTFIX; \
int NAME ## u_ge = 0.1u ## POSTFIX >= 0.2 ## POSTFIX; \
int NAME ## lt = 0.1 ## POSTFIX < 0.2 ## POSTFIX; \
int NAME ## u_lt = 0.1u ## POSTFIX < 0.2 ## POSTFIX; \
int NAME ## le = 0.1 ## POSTFIX <= 0.2 ## POSTFIX; \
int NAME ## u_le = 0.1u ## POSTFIX <= 0.2 ## POSTFIX; \
int NAME ## ne2 = 0.2 ## POSTFIX != 0.2 ## POSTFIX; \
int NAME ## u_ne2 = 0.2u ## POSTFIX != 0.2u ## POSTFIX; \
int NAME ## eq2 = 0.2 ## POSTFIX == 0.2 ## POSTFIX; \
int NAME ## u_eq2 = 0.2u ## POSTFIX == 0.2u ## POSTFIX; \
int NAME ## gt2 = 0.2 ## POSTFIX > 0.2 ## POSTFIX; \
int NAME ## u_gt2 = 0.2u ## POSTFIX > 0.2u ## POSTFIX; \
int NAME ## ge2 = 0.2 ## POSTFIX >= 0.2 ## POSTFIX; \
int NAME ## u_ge2 = 0.2u ## POSTFIX >= 0.2 ## POSTFIX; \
int NAME ## lt2 = 0.2 ## POSTFIX < 0.2 ## POSTFIX; \
int NAME ## u_lt2 = 0.2u ## POSTFIX < 0.2 ## POSTFIX; \
int NAME ## le2 = 0.2 ## POSTFIX <= 0.2 ## POSTFIX; \
int NAME ## u_le2 = 0.2u ## POSTFIX <= 0.2 ## POSTFIX; \
TYPE NAME ## hr_signed = 0.1hr; \
unsigned TYPE NAME ## hr_unsigned = 0.1hr; \
_Sat TYPE NAME ## hr_sat_signed = 0.1hr; \
_Sat unsigned TYPE NAME ## hr_sat_unsigned = 0.1hr; \
TYPE NAME ## r_signed = 0.1r; \
unsigned TYPE NAME ## r_unsigned = 0.1r; \
_Sat TYPE NAME ## r_sat_signed = 0.1r; \
_Sat unsigned TYPE NAME ## r_sat_unsigned = 0.1r; \
TYPE NAME ## lr_signed = 0.1lr; \
unsigned TYPE NAME ## lr_unsigned = 0.1lr; \
_Sat TYPE NAME ## lr_sat_signed = 0.1lr; \
_Sat unsigned TYPE NAME ## lr_sat_unsigned = 0.1lr; \
TYPE NAME ## llr_signed = 0.1llr; \
unsigned TYPE NAME ## llr_unsigned = 0.1llr; \
_Sat TYPE NAME ## llr_sat_signed = 0.1llr; \
_Sat unsigned TYPE NAME ## llr_sat_unsigned = 0.1llr; \
TYPE NAME ## uhr_signed = 0.1uhr; \
unsigned TYPE NAME ## uhr_unsigned = 0.1uhr; \
_Sat TYPE NAME ## uhr_sat_signed = 0.1uhr; \
_Sat unsigned TYPE NAME ## uhr_sat_unsigned = 0.1uhr; \
TYPE NAME ## ur_signed = 0.1ur; \
unsigned TYPE NAME ## ur_unsigned = 0.1ur; \
_Sat TYPE NAME ## ur_sat_signed = 0.1ur; \
_Sat unsigned TYPE NAME ## ur_sat_unsigned = 0.1ur; \
TYPE NAME ## ulr_signed = 0.1ulr; \
unsigned TYPE NAME ## ulr_unsigned = 0.1ulr; \
_Sat TYPE NAME ## ulr_sat_signed = 0.1ulr; \
_Sat unsigned TYPE NAME ## ulr_sat_unsigned = 0.1ulr; \
TYPE NAME ## ullr_signed = 0.1ullr; \
unsigned TYPE NAME ## ullr_unsigned = 0.1ullr; \
_Sat TYPE NAME ## ullr_sat_signed = 0.1ullr; \
_Sat unsigned TYPE NAME ## ullr_sat_unsigned = 0.1ullr; \
TYPE NAME ## hk_signed = 0.1hk; \
unsigned TYPE NAME ## hk_unsigned = 0.1hk; \
_Sat TYPE NAME ## hk_sat_signed = 5.1hk; \
_Sat unsigned TYPE NAME ## hk_sat_unsigned = 5.1hk; \
TYPE NAME ## k_signed = 0.1k; \
unsigned TYPE NAME ## k_unsigned = 0.1k; \
_Sat TYPE NAME ## k_sat_signed = 5.1k; \
_Sat unsigned TYPE NAME ## k_sat_unsigned = 5.1k; \
TYPE NAME ## lk_signed = 0.1lk; \
unsigned TYPE NAME ## lk_unsigned = 0.1lk; \
_Sat TYPE NAME ## lk_sat_signed = 5.1lk; \
_Sat unsigned TYPE NAME ## lk_sat_unsigned = 5.1lk; \
TYPE NAME ## llk_signed = 0.1llk; \
unsigned TYPE NAME ## llk_unsigned = 0.1llk; \
_Sat TYPE NAME ## llk_sat_signed = 5.1llk; \
_Sat unsigned TYPE NAME ## llk_sat_unsigned = 5.1llk; \
TYPE NAME ## uhk_signed = 0.1uhk; \
unsigned TYPE NAME ## uhk_unsigned = 0.1uhk; \
_Sat TYPE NAME ## uhk_sat_signed = 5.1uhk; \
_Sat unsigned TYPE NAME ## uhk_sat_unsigned = 5.1uhk; \
TYPE NAME ## uk_signed = 0.1uk; \
unsigned TYPE NAME ## uk_unsigned = 0.1uk; \
_Sat TYPE NAME ## uk_sat_signed = 5.1uk; \
_Sat unsigned TYPE NAME ## uk_sat_unsigned = 5.1uk; \
TYPE NAME ## ulk_signed = 0.1ulk; \
unsigned TYPE NAME ## ulk_unsigned = 0.1ulk; \
_Sat TYPE NAME ## ulk_sat_signed = 5.1ulk; \
_Sat unsigned TYPE NAME ## ulk_sat_unsigned = 5.1ulk; \
TYPE NAME ## ullk_signed = 0.1ullk; \
unsigned TYPE NAME ## ullk_unsigned = 0.1ullk; \
_Sat TYPE NAME ## ullk_sat_signed = 5.1ullk; \
_Sat unsigned TYPE NAME ## ullk_sat_unsigned = 5.1ullk; \
ALLOPCONST(short _Fract, sf, hr);
ALLOPCONST(_Fract, f, r);
ALLOPCONST(long _Fract, lf, lr);
ALLOPCONST(long long _Fract, llf, llr);
ALLOPCONST(short _Accum, sa, hk);
ALLOPCONST(_Accum, a, k);
ALLOPCONST(long _Accum, la, lk);
ALLOPCONST(long long _Accum, lla, llk);
/* { dg-do compile } */
/* { dg-options "-std=gnu99" } */
/* N1169 6.5.7 - Bitwise shift operands.
C99 6.5.3 Unary operators.
C99 6.5.5 Multiplicative operators.
C99 6.5.6 Additive operators.
C99 6.5.7 Bitwise shift operators.
C99 6.5.8 Relational operators.
C99 6.5.9 Equality operators.
C99 6.5.16 Assignment operators.
Check if all operations are ok. */
void true();
void false();
#define ALLOP(TYPE,NAME) \
TYPE test1 ## NAME (TYPE a) { return +a; } \
TYPE test2 ## NAME (TYPE a) { return -a; } \
int test3 ## NAME (TYPE a) { return !a; } \
TYPE test4 ## NAME (TYPE a, TYPE b) { return a + b; } \
TYPE test5 ## NAME (TYPE a, TYPE b) { return a - b; } \
TYPE test6 ## NAME (TYPE a, TYPE b) { return a * b; } \
TYPE test7 ## NAME (TYPE a, TYPE b) { return a / b; } \
TYPE test8 ## NAME (TYPE a, TYPE b) { a += b; return a; } \
TYPE test9 ## NAME (TYPE a, TYPE b) { a -= b; return a; } \
TYPE test10 ## NAME (TYPE a, TYPE b) { a *= b; return a; } \
TYPE test11 ## NAME (TYPE a, TYPE b) { a /= b; return a; } \
TYPE test12 ## NAME (TYPE a, int b) { return a << b; } \
TYPE test13 ## NAME (TYPE a, int b) { return a >> b; } \
TYPE test14 ## NAME (TYPE a, int b) { a <<= b; return a; } \
TYPE test15 ## NAME (TYPE a, int b) { a >>= b; return a; } \
int test16 ## NAME (TYPE a, TYPE b) { return a == b; } \
int test17 ## NAME (TYPE a, TYPE b) { return a != b; } \
int test18 ## NAME (TYPE a, TYPE b) { return a < b; } \
int test19 ## NAME (TYPE a, TYPE b) { return a <= b; } \
int test20 ## NAME (TYPE a, TYPE b) { return a >= b; } \
int test21 ## NAME (TYPE a, TYPE b) { return a > b; } \
void test22 ## NAME (TYPE a, TYPE b) { if(a == b)true(); else false(); } \
void test23 ## NAME (TYPE a, TYPE b) { if(a != b)true(); else false(); } \
void test24 ## NAME (TYPE a, TYPE b) { if(a < b)true(); else false(); } \
void test25 ## NAME (TYPE a, TYPE b) { if(a <= b)true(); else false(); } \
void test26 ## NAME (TYPE a, TYPE b) { if(a >= b)true(); else false(); } \
void test27 ## NAME (TYPE a, TYPE b) { if(a > b)true(); else false(); } \
TYPE test28 ## NAME (TYPE a) { return ++a; } \
TYPE test29 ## NAME (TYPE a) { return --a; } \
TYPE test30 ## NAME (TYPE *a) { return ++(*a); } \
TYPE test31 ## NAME (TYPE *a) { return (*a)++; } \
TYPE test32 ## NAME (TYPE *a) { return --(*a); } \
TYPE test33 ## NAME (TYPE *a) { return (*a)--; }
ALLOP(short _Fract, sf);
ALLOP(_Fract, f);
ALLOP(long _Fract, lf);
ALLOP(long long _Fract, llf);
ALLOP(short _Accum, sa);
ALLOP(_Accum, a);
ALLOP(long _Accum, la);
ALLOP(long long _Accum, lla);
ALLOP(unsigned short _Fract, usf);
ALLOP(unsigned _Fract, uf);
ALLOP(unsigned long _Fract, ulf);
ALLOP(unsigned long long _Fract, ullf);
ALLOP(unsigned short _Accum, usa);
ALLOP(unsigned _Accum, ua);
ALLOP(unsigned long _Accum, ula);
ALLOP(unsigned long long _Accum, ulla);
ALLOP(_Sat short _Fract, Ssf);
ALLOP(_Sat _Fract, Sf);
ALLOP(_Sat long _Fract, Slf);
ALLOP(_Sat long long _Fract, Sllf);
ALLOP(_Sat short _Accum, Ssa);
ALLOP(_Sat _Accum, Sa);
ALLOP(_Sat long _Accum, Sla);
ALLOP(_Sat long long _Accum, Slla);
ALLOP(_Sat unsigned short _Fract, Susf);
ALLOP(_Sat unsigned _Fract, Suf);
ALLOP(_Sat unsigned long _Fract, Sulf);
ALLOP(_Sat unsigned long long _Fract, Sullf);
ALLOP(_Sat unsigned short _Accum, Susa);
ALLOP(_Sat unsigned _Accum, Sua);
ALLOP(_Sat unsigned long _Accum, Sula);
ALLOP(_Sat unsigned long long _Accum, Sulla);
/* { dg-do run } */
/* { dg-options "-std=gnu99" } */
/* N1169 6.5.7 - Bitwise shift operands.
C99 6.5.5 Multiplicative operators.
C99 6.5.6 Additive operators.
C99 6.5.7 Bitwise shift operators.
C99 6.5.8 Relational operators.
C99 6.5.9 Equality operators.
C99 6.5.16 Assignment operators.
Check binary operators + - * / << >> < <= >= > == != += -= *= /= <<= >>=. */
extern void abort (void);
#define BINARY(TYPE,POSTFIX) \
{ TYPE a = 0.5 ## POSTFIX; \
TYPE b = 0.25 ## POSTFIX; \
if (a + b != 0.75 ## POSTFIX) \
abort(); \
if (a - b != 0.25 ## POSTFIX) \
abort(); \
if (a * b != 0.125 ## POSTFIX) \
abort(); \
if (b / a != 0.5 ## POSTFIX) \
abort(); \
if (b << 1 != a) \
abort(); \
if (a >> 1 != b) \
abort(); \
if (a < b != 0) \
abort(); \
if (a <= b != 0) \
abort(); \
if (a > b != 1) \
abort(); \
if (a >= b != 1) \
abort(); \
if (a == b != 0) \
abort(); \
if (a != b != 1) \
abort(); \
a += b; \
if (a != 0.75 ## POSTFIX) \
abort(); \
a -= b; \
if (a != 0.5 ## POSTFIX) \
abort(); \
a *= b; \
if (a != 0.125 ## POSTFIX) \
abort(); \
a /= b; \
if (a != 0.5 ## POSTFIX) \
abort(); \
a >>= 2; \
if (a != 0.125 ## POSTFIX) \
abort(); \
a <<= 1; \
if (a != 0.25 ## POSTFIX) \
abort(); \
}
#define FRACT_SAT_BINARY(TYPE,POSTFIX) \
{ TYPE a = 0.7 ## POSTFIX; \
TYPE b = 0.9 ## POSTFIX; \
if (a + b != 1.0 ## POSTFIX) \
abort(); \
a = -0.7 ## POSTFIX; \
b = -0.9 ## POSTFIX; \
if (a + b != -0.5 ## POSTFIX - 0.5 ## POSTFIX) \
abort(); \
a = 0.7 ## POSTFIX; \
b = -0.9 ## POSTFIX; \
if (a - b != 1.0 ## POSTFIX) \
abort(); \
a = -0.7 ## POSTFIX; \
b = 0.9 ## POSTFIX; \
if (a - b != -0.5 ## POSTFIX - 0.5 ## POSTFIX) \
abort(); \
a = -0.5 ## POSTFIX - 0.5 ## POSTFIX; \
if (a * a != 1.0 ## POSTFIX) \
abort(); \
a = 0.8 ## POSTFIX; \
b = 0.5 ## POSTFIX; \
if (a / b != 1.0 ## POSTFIX) \
abort(); \
a = -0.8 ## POSTFIX; \
b = 0.5 ## POSTFIX; \
if (a / b != -0.5 ## POSTFIX - 0.5 ## POSTFIX) \
abort(); \
a = 0.1 ## POSTFIX; \
if (a << 4 != 1.0 ## POSTFIX) \
abort(); \
a = -0.8 ## POSTFIX; \
if (a << 4 != -0.5 ## POSTFIX - 0.5 ## POSTFIX) \
abort(); \
}
#define FRACT_SAT_UNS_BINARY(TYPE,POSTFIX) \
{ TYPE a = 0.7 ## POSTFIX; \
TYPE b = 0.9 ## POSTFIX; \
if (a + b != 1.0 ## POSTFIX) \
abort(); \
if (a - b != 0.0 ## POSTFIX) \
abort(); \
if (b / a != 1.0 ## POSTFIX) \
abort(); \
if (a << 1 != 1.0 ## POSTFIX) \
abort(); \
}
int main ()
{
BINARY(short _Fract, hr);
BINARY(_Fract, r);
BINARY(long _Fract, lr);
BINARY(long long _Fract, llr);
BINARY(unsigned short _Fract, uhr);
BINARY(unsigned _Fract, ur);
BINARY(unsigned long _Fract, ulr);
BINARY(unsigned long long _Fract, ullr);
BINARY(_Sat short _Fract, hr);
BINARY(_Sat _Fract, r);
BINARY(_Sat long _Fract, lr);
BINARY(_Sat long long _Fract, llr);
BINARY(_Sat unsigned short _Fract, uhr);
BINARY(_Sat unsigned _Fract, ur);
BINARY(_Sat unsigned long _Fract, ulr);
BINARY(_Sat unsigned long long _Fract, ullr);
BINARY(short _Accum, hk);
BINARY(_Accum, k);
BINARY(long _Accum, lk);
BINARY(long long _Accum, llk);
BINARY(unsigned short _Accum, uhk);
BINARY(unsigned _Accum, uk);
BINARY(unsigned long _Accum, ulk);
BINARY(unsigned long long _Accum, ullk);
BINARY(_Sat short _Accum, hk);
BINARY(_Sat _Accum, k);
BINARY(_Sat long _Accum, lk);
BINARY(_Sat long long _Accum, llk);
BINARY(_Sat unsigned short _Accum, uhk);
BINARY(_Sat unsigned _Accum, uk);
BINARY(_Sat unsigned long _Accum, ulk);
BINARY(_Sat unsigned long long _Accum, ullk);
FRACT_SAT_BINARY(_Sat short _Fract, hr);
FRACT_SAT_BINARY(_Sat _Fract, r);
FRACT_SAT_BINARY(_Sat long _Fract, lr);
FRACT_SAT_BINARY(_Sat long long _Fract, llr);
FRACT_SAT_UNS_BINARY(_Sat unsigned short _Fract, uhr);
FRACT_SAT_UNS_BINARY(_Sat unsigned _Fract, ur);
FRACT_SAT_UNS_BINARY(_Sat unsigned long _Fract, ulr);
FRACT_SAT_UNS_BINARY(_Sat unsigned long long _Fract, ullr);
return 0;
}
/* { dg-do compile } */
/* { dg-options "-std=gnu99" } */
/* C99 6.5.3 Unary ~. */
void test ()
{
short _Fract sf;
_Fract f;
long _Fract lf;
long long _Fract llf;
unsigned short _Fract usf;
unsigned _Fract uf;
unsigned long _Fract ulf;
unsigned long long _Fract ullf;
_Sat short _Fract Ssf;
_Sat _Fract Sf;
_Sat long _Fract Slf;
_Sat long long _Fract Sllf;
_Sat unsigned short _Fract Susf;
_Sat unsigned _Fract Suf;
_Sat unsigned long _Fract Sulf;
_Sat unsigned long long _Fract Sullf;
short _Accum sa;
_Accum a;
long _Accum la;
long long _Accum lla;
unsigned short _Accum usa;
unsigned _Accum ua;
unsigned long _Accum ula;
unsigned long long _Accum ulla;
_Sat short _Accum Ssa;
_Sat _Accum Sa;
_Sat long _Accum Sla;
_Sat long long _Accum Slla;
_Sat unsigned short _Accum Susa;
_Sat unsigned _Accum Sua;
_Sat unsigned long _Accum Sula;
_Sat unsigned long long _Accum Sulla;
/* C99 Section 6.5.3.3 ~ shall have integer types. */
~sf; /* { dg-error "wrong type argument to bit-complement" } */
~f; /* { dg-error "wrong type argument to bit-complement" } */
~lf; /* { dg-error "wrong type argument to bit-complement" } */
~llf; /* { dg-error "wrong type argument to bit-complement" } */
~usf; /* { dg-error "wrong type argument to bit-complement" } */
~uf; /* { dg-error "wrong type argument to bit-complement" } */
~ulf; /* { dg-error "wrong type argument to bit-complement" } */
~ullf; /* { dg-error "wrong type argument to bit-complement" } */
~Ssf; /* { dg-error "wrong type argument to bit-complement" } */
~Sf; /* { dg-error "wrong type argument to bit-complement" } */
~Slf; /* { dg-error "wrong type argument to bit-complement" } */
~Sllf; /* { dg-error "wrong type argument to bit-complement" } */
~Susf; /* { dg-error "wrong type argument to bit-complement" } */
~Suf; /* { dg-error "wrong type argument to bit-complement" } */
~Sulf; /* { dg-error "wrong type argument to bit-complement" } */
~Sullf; /* { dg-error "wrong type argument to bit-complement" } */
~sa; /* { dg-error "wrong type argument to bit-complement" } */
~a; /* { dg-error "wrong type argument to bit-complement" } */
~la; /* { dg-error "wrong type argument to bit-complement" } */
~lla; /* { dg-error "wrong type argument to bit-complement" } */
~usa; /* { dg-error "wrong type argument to bit-complement" } */
~ua; /* { dg-error "wrong type argument to bit-complement" } */
~ula; /* { dg-error "wrong type argument to bit-complement" } */
~ulla; /* { dg-error "wrong type argument to bit-complement" } */
~Ssa; /* { dg-error "wrong type argument to bit-complement" } */
~Sa; /* { dg-error "wrong type argument to bit-complement" } */
~Sla; /* { dg-error "wrong type argument to bit-complement" } */
~Slla; /* { dg-error "wrong type argument to bit-complement" } */
~Susa; /* { dg-error "wrong type argument to bit-complement" } */
~Sua; /* { dg-error "wrong type argument to bit-complement" } */
~Sula; /* { dg-error "wrong type argument to bit-complement" } */
~Sulla; /* { dg-error "wrong type argument to bit-complement" } */
}
/* { dg-do run } */
/* { dg-options "-std=gnu99" } */
/* C99 6.9.1(9) Function definitions; parameter has automatic storage.
Test that actual parameters are passed by value and that modifications
made within functions are lost on function return.
This test is copied from gcc.dg/dfp/ and changed for fixed-point types. */
extern void abort (void);
#define FOO_FUN(NAME,TYPE,VALUE) \
int foo ## NAME (TYPE z) \
{ \
z = z + VALUE; \
}
#define FOO_TEST(NAME,TYPE,VALUE) \
{ \
TYPE NAME = VALUE; \
foo ## NAME (NAME); \
if (NAME != VALUE) \
abort (); \
}
FOO_FUN (sf, short _Fract, 0.2hr)
FOO_FUN (f, _Fract, 0.2r)
FOO_FUN (lf, long _Fract, 0.2lr)
FOO_FUN (llf, long long _Fract, 0.2llr)
FOO_FUN (usf, unsigned short _Fract, 0.2uhr)
FOO_FUN (uf, unsigned _Fract, 0.2ur)
FOO_FUN (ulf, unsigned long _Fract, 0.2ulr)
FOO_FUN (ullf, unsigned long long _Fract, 0.2ullr)
FOO_FUN (Ssf, _Sat short _Fract, 0.2hr)
FOO_FUN (Sf, _Sat _Fract, 0.2r)
FOO_FUN (Slf, _Sat long _Fract, 0.2lr)
FOO_FUN (Sllf, _Sat long long _Fract, 0.2llr)
FOO_FUN (Susf, _Sat unsigned short _Fract, 0.2uhr)
FOO_FUN (Suf, _Sat unsigned _Fract, 0.2ur)
FOO_FUN (Sulf, _Sat unsigned long _Fract, 0.2ulr)
FOO_FUN (Sullf, _Sat unsigned long long _Fract, 0.2ullr)
FOO_FUN (sa, short _Accum, 0.2hk)
FOO_FUN (a, _Accum, 0.2k)
FOO_FUN (la, long _Accum, 0.2lk)
FOO_FUN (lla, long long _Accum, 0.2llk)
FOO_FUN (usa, unsigned short _Accum, 0.2uhk)
FOO_FUN (ua, unsigned _Accum, 0.2uk)
FOO_FUN (ula, unsigned long _Accum, 0.2ulk)
FOO_FUN (ulla, unsigned long long _Accum, 0.2ullk)
FOO_FUN (Ssa, _Sat short _Accum, 0.2hk)
FOO_FUN (Sa, _Sat _Accum, 0.2k)
FOO_FUN (Sla, _Sat long _Accum, 0.2lk)
FOO_FUN (Slla, _Sat long long _Accum, 0.2llk)
FOO_FUN (Susa, _Sat unsigned short _Accum, 0.2uhk)
FOO_FUN (Sua, _Sat unsigned _Accum, 0.2uk)
FOO_FUN (Sula, _Sat unsigned long _Accum, 0.2ulk)
FOO_FUN (Sulla, _Sat unsigned long long _Accum, 0.2ullk)
int
main ()
{
FOO_TEST (sf, short _Fract, 0.2hr)
FOO_TEST (f, _Fract, 0.2r)
FOO_TEST (lf, long _Fract, 0.2lr)
FOO_TEST (llf, long long _Fract, 0.2llr)
FOO_TEST (usf, unsigned short _Fract, 0.2uhr)
FOO_TEST (uf, unsigned _Fract, 0.2ur)
FOO_TEST (ulf, unsigned long _Fract, 0.2ulr)
FOO_TEST (ullf, unsigned long long _Fract, 0.2ullr)
FOO_TEST (Ssf, _Sat short _Fract, 0.2hr)
FOO_TEST (Sf, _Sat _Fract, 0.2r)
FOO_TEST (Slf, _Sat long _Fract, 0.2lr)
FOO_TEST (Sllf, _Sat long long _Fract, 0.2llr)
FOO_TEST (Susf, _Sat unsigned short _Fract, 0.2uhr)
FOO_TEST (Suf, _Sat unsigned _Fract, 0.2ur)
FOO_TEST (Sulf, _Sat unsigned long _Fract, 0.2ulr)
FOO_TEST (Sullf, _Sat unsigned long long _Fract, 0.2ullr)
FOO_TEST (sa, short _Accum, 0.2hk)
FOO_TEST (a, _Accum, 0.2k)
FOO_TEST (la, long _Accum, 0.2lk)
FOO_TEST (lla, long long _Accum, 0.2llk)
FOO_TEST (usa, unsigned short _Accum, 0.2uhk)
FOO_TEST (ua, unsigned _Accum, 0.2uk)
FOO_TEST (ula, unsigned long _Accum, 0.2ulk)
FOO_TEST (ulla, unsigned long long _Accum, 0.2ullk)
FOO_TEST (Ssa, _Sat short _Accum, 0.2hk)
FOO_TEST (Sa, _Sat _Accum, 0.2k)
FOO_TEST (Sla, _Sat long _Accum, 0.2lk)
FOO_TEST (Slla, _Sat long long _Accum, 0.2llk)
FOO_TEST (Susa, _Sat unsigned short _Accum, 0.2uhk)
FOO_TEST (Sua, _Sat unsigned _Accum, 0.2uk)
FOO_TEST (Sula, _Sat unsigned long _Accum, 0.2ulk)
FOO_TEST (Sulla, _Sat unsigned long long _Accum, 0.2ullk)
return 0;
}
/* { dg-do compile } */
/* { dg-options "-std=gnu99 -O -Wall" } */
/* C99 6.2.7: Compatible type and composite type. */
#define FIXED_POINT_COMPOSITE_DECL(TYPE,NAME) \
TYPE g1_##NAME(); \
TYPE g2_##NAME(); \
TYPE (*h1_##NAME)[2]; \
TYPE (*h2_##NAME)[3]; \
TYPE (*h3_##NAME)[4]; \
TYPE f1_##NAME(TYPE(*)()); \
TYPE f1_##NAME(TYPE(*)(TYPE*)); \
TYPE f1_##NAME (TYPE(*g)(TYPE*)) \
{ \
TYPE NAME; \
NAME = ((TYPE (*) (TYPE*)) g)(&NAME); \
NAME = ((TYPE (*) ()) g); \
return NAME; \
} \
TYPE f2_##NAME(TYPE(*)[]); \
TYPE f2_##NAME(TYPE(*)[3]);
#define FIXED_POINT_COMPOSITE_TEST(TYPE, NAME) \
do \
{ \
TYPE NAME; \
NAME = f1_##NAME(g1_##NAME); \
NAME = f1_##NAME(g2_##NAME); \
NAME = f2_##NAME(h1_##NAME); \
NAME = f2_##NAME(h2_##NAME); \
NAME = f2_##NAME(h3_##NAME); \
} while(0)
FIXED_POINT_COMPOSITE_DECL(short _Fract, sf); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(_Fract, f); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(long _Fract, lf); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(long long _Fract, llf); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(unsigned short _Fract, usf); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(unsigned _Fract, uf); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(unsigned long _Fract, ulf); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(unsigned long long _Fract, ullf); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(_Sat short _Fract, Ssf); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(_Sat _Fract, Sf); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(_Sat long _Fract, Slf); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(_Sat long long _Fract, Sllf); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(_Sat unsigned short _Fract, Susf); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(_Sat unsigned _Fract, Suf); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(_Sat unsigned long _Fract, Sulf); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(_Sat unsigned long long _Fract, Sullf); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(short _Accum, sk); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(_Accum, k); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(long _Accum, lk); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(long long _Accum, llk); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(unsigned short _Accum, usk); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(unsigned _Accum, uk); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(unsigned long _Accum, ulk); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(unsigned long long _Accum, ullk); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(_Sat short _Accum, Ssk); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(_Sat _Accum, Sk); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(_Sat long _Accum, Slk); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(_Sat long long _Accum, Sllk); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(_Sat unsigned short _Accum, Susk); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(_Sat unsigned _Accum, Suk); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(_Sat unsigned long _Accum, Sulk); /* { dg-error "incompatible types in assignment" } */
FIXED_POINT_COMPOSITE_DECL(_Sat unsigned long long _Accum, Sullk); /* { dg-error "incompatible types in assignment" } */
int main()
{
FIXED_POINT_COMPOSITE_TEST(short _Fract, sf); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(_Fract, f); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(long _Fract, lf); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(long long _Fract, llf); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(unsigned short _Fract, usf); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(unsigned _Fract, uf); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(unsigned long _Fract, ulf); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(unsigned long long _Fract, ullf); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(_Sat short _Fract, Ssf); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(_Sat _Fract, Sf); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(_Sat long _Fract, Slf); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(_Sat long long _Fract, Sllf); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(_Sat unsigned short _Fract, Susf); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(_Sat unsigned _Fract, Suf); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(_Sat unsigned long _Fract, Sulf); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(_Sat unsigned long long _Fract, Sullf); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(short _Accum, sk); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(_Accum, k); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(long _Accum, lk); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(long long _Accum, llk); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(unsigned short _Accum, usk); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(unsigned _Accum, uk); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(unsigned long _Accum, ulk); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(unsigned long long _Accum, ullk); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(_Sat short _Accum, Ssk); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(_Sat _Accum, Sk); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(_Sat long _Accum, Slk); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(_Sat long long _Accum, Sllk); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(_Sat unsigned short _Accum, Susk); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(_Sat unsigned _Accum, Suk); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(_Sat unsigned long _Accum, Sulk); /* { dg-warning "incompatible pointer type" } */
FIXED_POINT_COMPOSITE_TEST(_Sat unsigned long long _Accum, Sullk); /* { dg-warning "incompatible pointer type" } */
return 0;
}
/* { dg-do compile } */
/* { dg-options "-std=gnu99" } */
/* N1169 6.4.4 - Constants.
Check if the constant 1 is ok. */
short _Fract sf = 1.0hr;
_Fract f = 1.0r;
long _Fract lf = 1.0lr;
long long _Fract llf = 1.0llr;
unsigned short _Fract usf = 1.0uhr;
unsigned _Fract uf = 1.0ur;
unsigned long _Fract ulf = 1.0ulr;
unsigned long long _Fract ullf = 1.0ullr;
short _Fract sfF = 1.0; /* { dg-warning "overflow" } */
_Fract fF = 1.0; /* { dg-warning "overflow" } */
long _Fract lfF = 1.0; /* { dg-warning "overflow" } */
long long _Fract llfF = 1.0; /* { dg-warning "overflow" } */
unsigned short _Fract usfF = 1.0; /* { dg-warning "overflow" } */
unsigned _Fract ufF = 1.0; /* { dg-warning "overflow" } */
unsigned long _Fract ulfF = 1.0; /* { dg-warning "overflow" } */
unsigned long long _Fract ullfF = 1.0; /* { dg-warning "overflow" } */
short _Fract sfI = 1; /* { dg-warning "overflow" } */
_Fract fI = 1; /* { dg-warning "overflow" } */
long _Fract lfI = 1; /* { dg-warning "overflow" } */
long long _Fract llfI = 1; /* { dg-warning "overflow" } */
unsigned short _Fract usfI = 1; /* { dg-warning "overflow" } */
unsigned _Fract ufI = 1; /* { dg-warning "overflow" } */
unsigned long _Fract ulfI = 1; /* { dg-warning "overflow" } */
unsigned long long _Fract ullfI = 1; /* { dg-warning "overflow" } */
/* { dg-do compile } */
/* { dg-options "-std=gnu99" } */
/* N1169 6.4.4.2a - Fixed-point constants (NEW CLAUSE).
Check if fixed-point constants are ok. */
_Accum k0 = 0k;
_Accum k1 = 9999.0e0k;
_Accum k2 = 9999.0k;
_Accum k3 = 9999k;
_Accum k4 = 9999e0k;
_Accum k5 = 09999k;
_Accum k6 = 09999e0k;
_Accum k7 = 09999.0e0k;
_Accum k8 = 09999.0k;
_Accum k9 = 0x270fp0k;
_Accum k10 = 0x270f.0p0k;
_Fract r0 = 0r;
_Fract r1 = 0e0r;
_Fract r2 = 0.0e0r;
_Fract r3 = 0.1e0r;
_Fract r4 = 0.0r;
_Fract r5 = 0.1r;
_Fract r6 = 0x0p0r;
_Fract r7 = 0x0.0p0r;
_Fract r8 = 0x0.1p0r;
/* { dg-do compile } */
/* { dg-options "-std=gnu99 -pedantic" } */
/* N1169 6.4.4.2a - Fixed-point constants (NEW CLAUSE). */
_Accum k0 = 0k; /* { dg-warning "GCC extension|ISO C" } */
_Accum k1 = 9999.0e0k; /* { dg-warning "GCC extension|ISO C" } */
_Accum k2 = 9999.0k; /* { dg-warning "GCC extension|ISO C" } */
_Accum k3 = 9999k; /* { dg-warning "GCC extension|ISO C" } */
_Accum k4 = 9999e0k; /* { dg-warning "GCC extension|ISO C" } */
_Accum k5 = 09999k; /* { dg-warning "GCC extension|ISO C" } */
_Accum k6 = 09999e0k; /* { dg-warning "GCC extension|ISO C" } */
_Accum k7 = 09999.0e0k; /* { dg-warning "GCC extension|ISO C" } */
_Accum k8 = 09999.0k; /* { dg-warning "GCC extension|ISO C" } */
_Accum k9 = 0x270fp0k; /* { dg-warning "GCC extension|ISO C" } */
_Accum k10 = 0x270f.0p0k; /* { dg-warning "GCC extension|ISO C" } */
_Fract r0 = 0r; /* { dg-warning "GCC extension|ISO C" } */
_Fract r1 = 0e0r; /* { dg-warning "GCC extension|ISO C" } */
_Fract r2 = 0.0e0r; /* { dg-warning "GCC extension|ISO C" } */
_Fract r3 = 0.1e0r; /* { dg-warning "GCC extension|ISO C" } */
_Fract r4 = 0.0r; /* { dg-warning "GCC extension|ISO C" } */
_Fract r5 = 0.1r; /* { dg-warning "GCC extension|ISO C" } */
_Fract r6 = 0x0p0r; /* { dg-warning "GCC extension|ISO C" } */
_Fract r7 = 0x0.0p0r; /* { dg-warning "GCC extension|ISO C" } */
_Fract r8 = 0x0.1p0r; /* { dg-warning "GCC extension|ISO C" } */
/* { dg-do compile } */
/* { dg-options "-std=gnu99" } */
/* N1169 7.18a.3 - Precision macros.
Check if defined fixed-point constants are ok. */
#include <stdfix.h>
short fract sf = SFRACT_MAX;
fract f = FRACT_MAX;
long fract lf = LFRACT_MAX;
long long fract llf = LLFRACT_MAX;
unsigned short fract usf = USFRACT_MAX;
unsigned fract uf = UFRACT_MAX;
unsigned long fract ulf = ULFRACT_MAX;
unsigned long long fract ullf = ULLFRACT_MAX;
sat short fract Ssf = SFRACT_MAX;
sat fract Sf = FRACT_MAX;
sat long fract Slf = LFRACT_MAX;
sat long long fract Sllf = LLFRACT_MAX;
sat unsigned short fract Susf = USFRACT_MAX;
sat unsigned fract Suf = UFRACT_MAX;
sat unsigned long fract Sulf = ULFRACT_MAX;
sat unsigned long long fract Sullf = ULLFRACT_MAX;
short fract sfm = SFRACT_MIN;
fract fm = FRACT_MIN;
long fract lfm = LFRACT_MIN;
long long fract llfm = LLFRACT_MIN;
unsigned short fract usfm = USFRACT_MIN;
unsigned fract ufm = UFRACT_MIN;
unsigned long fract ulfm = ULFRACT_MIN;
unsigned long long fract ullfm = ULLFRACT_MIN;
sat short fract Ssfm = SFRACT_MIN;
sat fract Sfm = FRACT_MIN;
sat long fract Slfm = LFRACT_MIN;
sat long long fract Sllfm = LLFRACT_MIN;
sat unsigned short fract Susfm = USFRACT_MIN;
sat unsigned fract Sufm = UFRACT_MIN;
sat unsigned long fract Sulfm = ULFRACT_MIN;
sat unsigned long long fract Sullfm = ULLFRACT_MIN;
short fract sfE = SFRACT_EPSILON;
fract fE = FRACT_EPSILON;
long fract lfE = LFRACT_EPSILON;
long long fract llfE = LLFRACT_EPSILON;
unsigned short fract usfE = USFRACT_EPSILON;
unsigned fract ufE = UFRACT_EPSILON;
unsigned long fract ulfE = ULFRACT_EPSILON;
unsigned long long fract ullfE = ULLFRACT_EPSILON;
sat short fract SsfE = SFRACT_EPSILON;
sat fract SfE = FRACT_EPSILON;
sat long fract SlfE = LFRACT_EPSILON;
sat long long fract SllfE = LLFRACT_EPSILON;
sat unsigned short fract SusfE = USFRACT_EPSILON;
sat unsigned fract SufE = UFRACT_EPSILON;
sat unsigned long fract SulfE = ULFRACT_EPSILON;
sat unsigned long long fract SullfE = ULLFRACT_EPSILON;
short accum sk = SACCUM_MAX;
accum k = ACCUM_MAX;
long accum lk = LACCUM_MAX;
long long accum llk = LLACCUM_MAX;
unsigned short accum usk = USACCUM_MAX;
unsigned accum uk = UACCUM_MAX;
unsigned long accum ulk = ULACCUM_MAX;
unsigned long long accum ullk = ULLACCUM_MAX;
sat short accum Ssk = SACCUM_MAX;
sat accum Sk = ACCUM_MAX;
sat long accum Slk = LACCUM_MAX;
sat long long accum Sllk = LLACCUM_MAX;
sat unsigned short accum Susk = USACCUM_MAX;
sat unsigned accum Suk = UACCUM_MAX;
sat unsigned long accum Sulk = ULACCUM_MAX;
sat unsigned long long accum Sullk = ULLACCUM_MAX;
short accum skm = SACCUM_MIN;
accum km = ACCUM_MIN;
long accum lkm = LACCUM_MIN;
long long accum llkm = LLACCUM_MIN;
unsigned short accum uskm = USACCUM_MIN;
unsigned accum ukm = UACCUM_MIN;
unsigned long accum ulkm = ULACCUM_MIN;
unsigned long long accum ullkm = ULLACCUM_MIN;
sat short accum Sskm = SACCUM_MIN;
sat accum Skm = ACCUM_MIN;
sat long accum Slkm = LACCUM_MIN;
sat long long accum Sllkm = LLACCUM_MIN;
sat unsigned short accum Suskm = USACCUM_MIN;
sat unsigned accum Sukm = UACCUM_MIN;
sat unsigned long accum Sulkm = ULACCUM_MIN;
sat unsigned long long accum Sullkm = ULLACCUM_MIN;
short accum skE = SACCUM_EPSILON;
accum kE = ACCUM_EPSILON;
long accum lkE = LACCUM_EPSILON;
long long accum llkE = LLACCUM_EPSILON;
unsigned short accum uskE = USACCUM_EPSILON;
unsigned accum ukE = UACCUM_EPSILON;
unsigned long accum ulkE = ULACCUM_EPSILON;
unsigned long long accum ullkE = ULLACCUM_EPSILON;
sat short accum SskE = SACCUM_EPSILON;
sat accum SkE = ACCUM_EPSILON;
sat long accum SlkE = LACCUM_EPSILON;
sat long long accum SllkE = LLACCUM_EPSILON;
sat unsigned short accum SuskE = USACCUM_EPSILON;
sat unsigned accum SukE = UACCUM_EPSILON;
sat unsigned long accum SulkE = ULACCUM_EPSILON;
sat unsigned long long accum SullkE = ULLACCUM_EPSILON;
int fbit_sf = SFRACT_FBIT;
int fbit_f = FRACT_FBIT;
int fbit_lf = LFRACT_FBIT;
int fbit_llf = LLFRACT_FBIT;
int fbit_usf = USFRACT_FBIT;
int fbit_uf = UFRACT_FBIT;
int fbit_ulf = ULFRACT_FBIT;
int fbit_ullf = ULLFRACT_FBIT;
int fbit_sk = SACCUM_FBIT;
int fbit_k = ACCUM_FBIT;
int fbit_lk = LACCUM_FBIT;
int fbit_llk = LLACCUM_FBIT;
int fbit_usk = USACCUM_FBIT;
int fbit_uk = UACCUM_FBIT;
int fbit_ulk = ULACCUM_FBIT;
int fbit_ullk = ULLACCUM_FBIT;
int ibit_sk = SACCUM_IBIT;
int ibit_k = ACCUM_IBIT;
int ibit_lk = LACCUM_IBIT;
int ibit_llk = LLACCUM_IBIT;
int ibit_usk = USACCUM_IBIT;
int ibit_uk = UACCUM_IBIT;
int ibit_ulk = ULACCUM_IBIT;
int ibit_ullk = ULLACCUM_IBIT;
# Copyright (C) 1997, 2004 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
# GCC testsuite that uses the `dg.exp' driver.
# Load support procs.
load_lib gcc-dg.exp
# Skip these tests for targets that don't support this extension.
if { ![check_effective_target_fixed_point] } {
return;
}
# If a testcase doesn't have special options, use these.
global DEFAULT_CFLAGS
if ![info exists DEFAULT_CFLAGS] then {
set DEFAULT_CFLAGS " -ansi -pedantic-errors"
}
# Initialize `dg'.
dg-init
# Main loop.
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] "" $DEFAULT_CFLAGS
# All done.
dg-finish
/* { dg-do run } */
/* { dg-options "-std=gnu99" } */
/* C99 6.5.2.2 Function calls.
Test passing array elements involving fixed-point types.
Based on the test from ../dfp/. */
extern void abort (void);
/* A handful of functions that return the Nth argument of
an incoming array. */
#define FUNC(TYPE,NAME) \
TYPE NAME ## 0 (TYPE args[]) { return args[0]; } \
TYPE NAME ## 1 (TYPE args[]) { return args[1]; } \
TYPE NAME ## 2 (TYPE args[]) { return args[2]; } \
TYPE NAME ## 3 (TYPE args[]) { return args[3]; } \
TYPE NAME ## 4 (TYPE args[]) { return args[4]; } \
TYPE NAME ## 5 (TYPE args[]) { return args[5]; }
FUNC (short _Fract, sf)
FUNC (_Fract, f)
FUNC (long _Fract, lf)
FUNC (long long _Fract, llf)
FUNC (unsigned short _Fract, usf)
FUNC (unsigned _Fract, uf)
FUNC (unsigned long _Fract, ulf)
FUNC (unsigned long long _Fract, ullf)
FUNC (_Sat short _Fract, Ssf)
FUNC (_Sat _Fract, Sf)
FUNC (_Sat long _Fract, Slf)
FUNC (_Sat long long _Fract, Sllf)
FUNC (_Sat unsigned short _Fract, Susf)
FUNC (_Sat unsigned _Fract, Suf)
FUNC (_Sat unsigned long _Fract, Sulf)
FUNC (_Sat unsigned long long _Fract, Sullf)
FUNC (short _Accum, sa)
FUNC (_Accum, a)
FUNC (long _Accum, la)
FUNC (long long _Accum, lla)
FUNC (unsigned short _Accum, usa)
FUNC (unsigned _Accum, ua)
FUNC (unsigned long _Accum, ula)
FUNC (unsigned long long _Accum, ulla)
FUNC (_Sat short _Accum, Ssa)
FUNC (_Sat _Accum, Sa)
FUNC (_Sat long _Accum, Sla)
FUNC (_Sat long long _Accum, Slla)
FUNC (_Sat unsigned short _Accum, Susa)
FUNC (_Sat unsigned _Accum, Sua)
FUNC (_Sat unsigned long _Accum, Sula)
FUNC (_Sat unsigned long long _Accum, Sulla)
int main()
{
#define TEST(TYPE,NAME,PF) \
{ \
TYPE NAME[] = { 0.0 ## PF, 0.1 ## PF, 0.2 ## PF, 0.3 ## PF, 0.4 ## PF, \
0.5 ## PF }; \
if (NAME ## 0 (NAME) != 0.0 ## PF) abort (); \
if (NAME ## 1 (NAME) != 0.1 ## PF) abort (); \
if (NAME ## 2 (NAME) != 0.2 ## PF) abort (); \
if (NAME ## 3 (NAME) != 0.3 ## PF) abort (); \
if (NAME ## 4 (NAME) != 0.4 ## PF) abort (); \
if (NAME ## 5 (NAME) != 0.5 ## PF) abort (); \
}
TEST (short _Fract, sf, hr)
TEST (_Fract, f, r)
TEST (long _Fract, lf, lr)
TEST (long long _Fract, llf, llr)
TEST (unsigned short _Fract, usf, uhr)
TEST (unsigned _Fract, uf, ur)
TEST (unsigned long _Fract, ulf, ulr)
TEST (unsigned long long _Fract, ullf, ullr)
TEST (_Sat short _Fract, Ssf, hr)
TEST (_Sat _Fract, Sf, r)
TEST (_Sat long _Fract, Slf, lr)
TEST (_Sat long long _Fract, Sllf, llr)
TEST (_Sat unsigned short _Fract, Susf, uhr)
TEST (_Sat unsigned _Fract, Suf, ur)
TEST (_Sat unsigned long _Fract, Sulf, ulr)
TEST (_Sat unsigned long long _Fract, Sullf, ullr)
TEST (short _Accum, sa, hk)
TEST (_Accum, a, k)
TEST (long _Accum, la, lk)
TEST (long long _Accum, lla, llk)
TEST (unsigned short _Accum, usa, uhk)
TEST (unsigned _Accum, ua, uk)
TEST (unsigned long _Accum, ula, ulk)
TEST (unsigned long long _Accum, ulla, ullk)
TEST (_Sat short _Accum, Ssa, hk)
TEST (_Sat _Accum, Sa, k)
TEST (_Sat long _Accum, Sla, lk)
TEST (_Sat long long _Accum, Slla, llk)
TEST (_Sat unsigned short _Accum, Susa, uhk)
TEST (_Sat unsigned _Accum, Sua, uk)
TEST (_Sat unsigned long _Accum, Sula, ulk)
TEST (_Sat unsigned long long _Accum, Sulla, ullk)
return 0;
}
/* { dg-do run } */
/* { dg-options "-std=gnu99" } */
/* C99 6.5.2.2 Function calls.
Test scalar passing and return values involving fixed-point types.
Based on the test from ../dfp/. */
extern void abort (void);
/* A handful of functions that return the Nth argument of
an incoming array. */
#define FUNC(TYPE,NAME) \
TYPE NAME ## 0 (TYPE arg0, int arg1, unsigned arg2, float arg3, double arg4) \
{ return arg0; } \
TYPE NAME ## 1 (int arg0, TYPE arg1, unsigned arg2, float arg3, double arg4) \
{ return arg1; } \
TYPE NAME ## 2 (int arg0, unsigned arg1, TYPE arg2, float arg3, double arg4) \
{ return arg2; } \
TYPE NAME ## 3 (int arg0, unsigned arg1, float arg2, TYPE arg3, double arg4) \
{ return arg3; } \
TYPE NAME ## 4 (int arg0, unsigned arg1, float arg2, double arg3, TYPE arg4) \
{ return arg4; }
FUNC (short _Fract, sf)
FUNC (_Fract, f)
FUNC (long _Fract, lf)
FUNC (long long _Fract, llf)
FUNC (unsigned short _Fract, usf)
FUNC (unsigned _Fract, uf)
FUNC (unsigned long _Fract, ulf)
FUNC (unsigned long long _Fract, ullf)
FUNC (_Sat short _Fract, Ssf)
FUNC (_Sat _Fract, Sf)
FUNC (_Sat long _Fract, Slf)
FUNC (_Sat long long _Fract, Sllf)
FUNC (_Sat unsigned short _Fract, Susf)
FUNC (_Sat unsigned _Fract, Suf)
FUNC (_Sat unsigned long _Fract, Sulf)
FUNC (_Sat unsigned long long _Fract, Sullf)
FUNC (short _Accum, sa)
FUNC (_Accum, a)
FUNC (long _Accum, la)
FUNC (long long _Accum, lla)
FUNC (unsigned short _Accum, usa)
FUNC (unsigned _Accum, ua)
FUNC (unsigned long _Accum, ula)
FUNC (unsigned long long _Accum, ulla)
FUNC (_Sat short _Accum, Ssa)
FUNC (_Sat _Accum, Sa)
FUNC (_Sat long _Accum, Sla)
FUNC (_Sat long long _Accum, Slla)
FUNC (_Sat unsigned short _Accum, Susa)
FUNC (_Sat unsigned _Accum, Sua)
FUNC (_Sat unsigned long _Accum, Sula)
FUNC (_Sat unsigned long long _Accum, Sulla)
int main()
{
#define TEST(TYPE,NAME,PF) \
{ \
if (NAME ## 0 (0.1 ## PF, -1, 1, 0.3f, 0.5) != 0.1 ## PF) abort (); \
if (NAME ## 1 (-1, 0.1 ## PF, 1, 0.3f, 0.5) != 0.1 ## PF) abort (); \
if (NAME ## 2 (-1, 1, 0.1 ## PF, 0.3f, 0.5) != 0.1 ## PF) abort (); \
if (NAME ## 3 (-1, 1, 0.3f, 0.1 ## PF, 0.5) != 0.1 ## PF) abort (); \
if (NAME ## 4 (-1, 1, 0.3f, 0.5, 0.1 ## PF) != 0.1 ## PF) abort (); \
}
TEST (short _Fract, sf, hr)
TEST (_Fract, f, r)
TEST (long _Fract, lf, lr)
TEST (long long _Fract, llf, llr)
TEST (unsigned short _Fract, usf, uhr)
TEST (unsigned _Fract, uf, ur)
TEST (unsigned long _Fract, ulf, ulr)
TEST (unsigned long long _Fract, ullf, ullr)
TEST (_Sat short _Fract, Ssf, hr)
TEST (_Sat _Fract, Sf, r)
TEST (_Sat long _Fract, Slf, lr)
TEST (_Sat long long _Fract, Sllf, llr)
TEST (_Sat unsigned short _Fract, Susf, uhr)
TEST (_Sat unsigned _Fract, Suf, ur)
TEST (_Sat unsigned long _Fract, Sulf, ulr)
TEST (_Sat unsigned long long _Fract, Sullf, ullr)
TEST (short _Accum, sa, hk)
TEST (_Accum, a, k)
TEST (long _Accum, la, lk)
TEST (long long _Accum, lla, llk)
TEST (unsigned short _Accum, usa, uhk)
TEST (unsigned _Accum, ua, uk)
TEST (unsigned long _Accum, ula, ulk)
TEST (unsigned long long _Accum, ulla, ullk)
TEST (_Sat short _Accum, Ssa, hk)
TEST (_Sat _Accum, Sa, k)
TEST (_Sat long _Accum, Sla, lk)
TEST (_Sat long long _Accum, Slla, llk)
TEST (_Sat unsigned short _Accum, Susa, uhk)
TEST (_Sat unsigned _Accum, Sua, uk)
TEST (_Sat unsigned long _Accum, Sula, ulk)
TEST (_Sat unsigned long long _Accum, Sulla, ullk)
return 0;
}
/* { dg-do run } */
/* { dg-options "-std=gnu99" } */
/* C99 6.5.2.2 Function calls.
Test scalar passing and return values involving fixed-point types.
Based on the test from ../dfp/. */
extern void abort (void);
/* A handful of functions that return the Nth argument of
an incoming array. */
#define FUNC(TYPE,NAME) \
TYPE NAME ## 0 (TYPE arg0, TYPE arg1, TYPE arg2, TYPE arg3, TYPE arg4) \
{ return arg0; } \
TYPE NAME ## 1 (TYPE arg0, TYPE arg1, TYPE arg2, TYPE arg3, TYPE arg4) \
{ return arg1; } \
TYPE NAME ## 2 (TYPE arg0, TYPE arg1, TYPE arg2, TYPE arg3, TYPE arg4) \
{ return arg2; } \
TYPE NAME ## 3 (TYPE arg0, TYPE arg1, TYPE arg2, TYPE arg3, TYPE arg4) \
{ return arg3; } \
TYPE NAME ## 4 (TYPE arg0, TYPE arg1, TYPE arg2, TYPE arg3, TYPE arg4) \
{ return arg4; }
FUNC (short _Fract, sf)
FUNC (_Fract, f)
FUNC (long _Fract, lf)
FUNC (long long _Fract, llf)
FUNC (unsigned short _Fract, usf)
FUNC (unsigned _Fract, uf)
FUNC (unsigned long _Fract, ulf)
FUNC (unsigned long long _Fract, ullf)
FUNC (_Sat short _Fract, Ssf)
FUNC (_Sat _Fract, Sf)
FUNC (_Sat long _Fract, Slf)
FUNC (_Sat long long _Fract, Sllf)
FUNC (_Sat unsigned short _Fract, Susf)
FUNC (_Sat unsigned _Fract, Suf)
FUNC (_Sat unsigned long _Fract, Sulf)
FUNC (_Sat unsigned long long _Fract, Sullf)
FUNC (short _Accum, sa)
FUNC (_Accum, a)
FUNC (long _Accum, la)
FUNC (long long _Accum, lla)
FUNC (unsigned short _Accum, usa)
FUNC (unsigned _Accum, ua)
FUNC (unsigned long _Accum, ula)
FUNC (unsigned long long _Accum, ulla)
FUNC (_Sat short _Accum, Ssa)
FUNC (_Sat _Accum, Sa)
FUNC (_Sat long _Accum, Sla)
FUNC (_Sat long long _Accum, Slla)
FUNC (_Sat unsigned short _Accum, Susa)
FUNC (_Sat unsigned _Accum, Sua)
FUNC (_Sat unsigned long _Accum, Sula)
FUNC (_Sat unsigned long long _Accum, Sulla)
int main()
{
#define TEST(TYPE,NAME,PF) \
{ \
if (NAME ## 0 (0.1 ## PF, 0.2 ## PF, 0.3 ## PF, 0.4 ## PF, 0.5 ## PF) \
!= 0.1 ## PF) abort (); \
if (NAME ## 1 (0.1 ## PF, 0.2 ## PF, 0.3 ## PF, 0.4 ## PF, 0.5 ## PF) \
!= 0.2 ## PF) abort (); \
if (NAME ## 2 (0.1 ## PF, 0.2 ## PF, 0.3 ## PF, 0.4 ## PF, 0.5 ## PF) \
!= 0.3 ## PF) abort (); \
if (NAME ## 3 (0.1 ## PF, 0.2 ## PF, 0.3 ## PF, 0.4 ## PF, 0.5 ## PF) \
!= 0.4 ## PF) abort (); \
if (NAME ## 4 (0.1 ## PF, 0.2 ## PF, 0.3 ## PF, 0.4 ## PF, 0.5 ## PF) \
!= 0.5 ## PF) abort (); \
}
TEST (short _Fract, sf, hr)
TEST (_Fract, f, r)
TEST (long _Fract, lf, lr)
TEST (long long _Fract, llf, llr)
TEST (unsigned short _Fract, usf, uhr)
TEST (unsigned _Fract, uf, ur)
TEST (unsigned long _Fract, ulf, ulr)
TEST (unsigned long long _Fract, ullf, ullr)
TEST (_Sat short _Fract, Ssf, hr)
TEST (_Sat _Fract, Sf, r)
TEST (_Sat long _Fract, Slf, lr)
TEST (_Sat long long _Fract, Sllf, llr)
TEST (_Sat unsigned short _Fract, Susf, uhr)
TEST (_Sat unsigned _Fract, Suf, ur)
TEST (_Sat unsigned long _Fract, Sulf, ulr)
TEST (_Sat unsigned long long _Fract, Sullf, ullr)
TEST (short _Accum, sa, hk)
TEST (_Accum, a, k)
TEST (long _Accum, la, lk)
TEST (long long _Accum, lla, llk)
TEST (unsigned short _Accum, usa, uhk)
TEST (unsigned _Accum, ua, uk)
TEST (unsigned long _Accum, ula, ulk)
TEST (unsigned long long _Accum, ulla, ullk)
TEST (_Sat short _Accum, Ssa, hk)
TEST (_Sat _Accum, Sa, k)
TEST (_Sat long _Accum, Sla, lk)
TEST (_Sat long long _Accum, Slla, llk)
TEST (_Sat unsigned short _Accum, Susa, uhk)
TEST (_Sat unsigned _Accum, Sua, uk)
TEST (_Sat unsigned long _Accum, Sula, ulk)
TEST (_Sat unsigned long long _Accum, Sulla, ullk)
return 0;
}
/* { dg-do run } */
/* { dg-options "-std=gnu99" } */
/* C99 6.5.2.2 Function calls.
Test structure passing and return values involving fixed-point types.
Based on the test from ../dfp/. */
extern void abort (void);
struct example
{
short _Fract sf;
char dummy1;
_Fract f;
char dummy2;
long _Fract lf;
char dummy3;
long long _Fract llf;
char dummy4;
unsigned short _Fract usf;
char dummy5;
unsigned _Fract uf;
char dummy6;
unsigned long _Fract ulf;
char dummy7;
unsigned long long _Fract ullf;
char dummy8;
_Sat short _Fract Ssf;
char dummy9;
_Sat _Fract Sf;
char dummy10;
_Sat long _Fract Slf;
char dummy11;
_Sat long long _Fract Sllf;
char dummy12;
_Sat unsigned short _Fract Susf;
char dummy13;
_Sat unsigned _Fract Suf;
char dummy14;
_Sat unsigned long _Fract Sulf;
char dummy15;
_Sat unsigned long long _Fract Sullf;
char dummy16;
short _Accum sa;
char dummya1;
_Accum a;
char dummya2;
long _Accum la;
char dummya3;
long long _Accum lla;
char dummya4;
unsigned short _Accum usa;
char dummya5;
unsigned _Accum ua;
char dummya6;
unsigned long _Accum ula;
char dummya7;
unsigned long long _Accum ulla;
char dummya8;
_Sat short _Accum Ssa;
char dummya9;
_Sat _Accum Sa;
char dummya10;
_Sat long _Accum Sla;
char dummya11;
_Sat long long _Accum Slla;
char dummya12;
_Sat unsigned short _Accum Susa;
char dummya13;
_Sat unsigned _Accum Sua;
char dummya14;
_Sat unsigned long _Accum Sula;
char dummya15;
_Sat unsigned long long _Accum Sulla;
char dummya16;
} nums = { 0.1hr, 'a',
0.2r, 'b',
0.3lr, 'c',
0.4llr, 'd',
0.5uhr, 'e',
0.6ur, 'f',
0.7ulr, 'g',
0.8ullr, 'h',
0.11r, 'i',
0.22r, 'j',
0.33lr, 'k',
0.44llr, 'l',
0.55uhr, 'm',
0.66ur, 'n',
0.77ulr, 'o',
0.88ullr, 'p',
0.1hk, 'q',
0.2k, 'r',
0.3lk, 's',
0.4llk, 't',
0.5uhk, 'u',
0.6uk, 'v',
0.7ulk, 'w',
0.8ullk, 'x',
0.11k, 'y',
0.22k, 'z',
0.33lk, '0',
0.44llk, '1',
0.55uhk, '2',
0.66uk, '3',
0.77ulk, '4',
0.88ullk, '5'
};
/* A handful of functions that return the Nth argument of
an incoming array. */
#define FUNC(TYPE,NAME) \
TYPE NAME ## _func (struct example s) \
{ return s. NAME; }
FUNC (short _Fract, sf)
FUNC (_Fract, f)
FUNC (long _Fract, lf)
FUNC (long long _Fract, llf)
FUNC (unsigned short _Fract, usf)
FUNC (unsigned _Fract, uf)
FUNC (unsigned long _Fract, ulf)
FUNC (unsigned long long _Fract, ullf)
FUNC (_Sat short _Fract, Ssf)
FUNC (_Sat _Fract, Sf)
FUNC (_Sat long _Fract, Slf)
FUNC (_Sat long long _Fract, Sllf)
FUNC (_Sat unsigned short _Fract, Susf)
FUNC (_Sat unsigned _Fract, Suf)
FUNC (_Sat unsigned long _Fract, Sulf)
FUNC (_Sat unsigned long long _Fract, Sullf)
FUNC (short _Accum, sa)
FUNC (_Accum, a)
FUNC (long _Accum, la)
FUNC (long long _Accum, lla)
FUNC (unsigned short _Accum, usa)
FUNC (unsigned _Accum, ua)
FUNC (unsigned long _Accum, ula)
FUNC (unsigned long long _Accum, ulla)
FUNC (_Sat short _Accum, Ssa)
FUNC (_Sat _Accum, Sa)
FUNC (_Sat long _Accum, Sla)
FUNC (_Sat long long _Accum, Slla)
FUNC (_Sat unsigned short _Accum, Susa)
FUNC (_Sat unsigned _Accum, Sua)
FUNC (_Sat unsigned long _Accum, Sula)
FUNC (_Sat unsigned long long _Accum, Sulla)
int main()
{
#define TEST(TYPE,NAME,VALUE) \
{ \
if (NAME ## _func (nums) != VALUE) abort (); \
}
TEST (short _Fract, sf, 0.1hr)
TEST (_Fract, f, 0.2r)
TEST (long _Fract, lf, 0.3lr)
TEST (long long _Fract, llf, 0.4llr)
TEST (unsigned short _Fract, usf, 0.5uhr)
TEST (unsigned _Fract, uf, 0.6ur)
TEST (unsigned long _Fract, ulf, 0.7ulr)
TEST (unsigned long long _Fract, ullf, 0.8ullr)
TEST (_Sat short _Fract, Ssf, 0.11hr)
TEST (_Sat _Fract, Sf, 0.22r)
TEST (_Sat long _Fract, Slf, 0.33lr)
TEST (_Sat long long _Fract, Sllf, 0.44llr)
TEST (_Sat unsigned short _Fract, Susf, 0.55uhr)
TEST (_Sat unsigned _Fract, Suf, 0.66ur)
TEST (_Sat unsigned long _Fract, Sulf, 0.77ulr)
TEST (_Sat unsigned long long _Fract, Sullf, 0.88ullr)
TEST (short _Accum, sa, 0.1hk)
TEST (_Accum, a, 0.2k)
TEST (long _Accum, la, 0.3lk)
TEST (long long _Accum, lla, 0.4llk)
TEST (unsigned short _Accum, usa, 0.5uhk)
TEST (unsigned _Accum, ua, 0.6uk)
TEST (unsigned long _Accum, ula, 0.7ulk)
TEST (unsigned long long _Accum, ulla, 0.8ullk)
TEST (_Sat short _Accum, Ssa, 0.11hk)
TEST (_Sat _Accum, Sa, 0.22k)
TEST (_Sat long _Accum, Sla, 0.33lk)
TEST (_Sat long long _Accum, Slla, 0.44llk)
TEST (_Sat unsigned short _Accum, Susa, 0.55uhk)
TEST (_Sat unsigned _Accum, Sua, 0.66uk)
TEST (_Sat unsigned long _Accum, Sula, 0.77ulk)
TEST (_Sat unsigned long long _Accum, Sulla, 0.88ullk)
return 0;
}
/* { dg-do run } */
/* { dg-options "-std=gnu99" } */
/* C99 6.5.2.2 Function calls.
Test passing varargs of fixed-point types.
Based on the test from ../dfp/. */
#include <stdarg.h>
extern void abort (void);
static int
vararg_int (unsigned arg, ...)
{
va_list ap;
int result_i;
va_start (ap, arg);
result_i = va_arg (ap, int);
return result_i;
}
static _Fract
vararg_fract (unsigned arg, ...)
{
va_list ap;
int result_i;
_Fract result_fr; \
va_start (ap, arg);
result_i = va_arg (ap, int);
result_fr = va_arg (ap, _Fract); \
return result_fr;
}
static int
vararg_double (unsigned arg, ...)
{
va_list ap;
int result_i;
_Fract result_fr; \
double result_d;
va_start (ap, arg);
result_i = va_arg (ap, int);
result_fr = va_arg (ap, _Fract); \
result_d = va_arg (ap, double); \
return result_d;
}
#define FUNC(TYPE, NAME) \
static TYPE \
vararg_ ## NAME (unsigned arg, ...) \
{ \
va_list ap; \
int result_i; \
_Fract result_fr; \
double result_d; \
TYPE result; \
va_start (ap, arg); \
result_i = va_arg (ap, int); \
result_fr = va_arg (ap, _Fract); \
result_d = va_arg (ap, double); \
result = va_arg (ap, TYPE); \
va_end (ap); \
return result; \
}
FUNC (short _Fract, sf)
FUNC (_Fract, f)
FUNC (long _Fract, lf)
FUNC (long long _Fract, llf)
FUNC (unsigned short _Fract, usf)
FUNC (unsigned _Fract, uf)
FUNC (unsigned long _Fract, ulf)
FUNC (unsigned long long _Fract, ullf)
FUNC (_Sat short _Fract, Ssf)
FUNC (_Sat _Fract, Sf)
FUNC (_Sat long _Fract, Slf)
FUNC (_Sat long long _Fract, Sllf)
FUNC (_Sat unsigned short _Fract, Susf)
FUNC (_Sat unsigned _Fract, Suf)
FUNC (_Sat unsigned long _Fract, Sulf)
FUNC (_Sat unsigned long long _Fract, Sullf)
FUNC (short _Accum, sa)
FUNC (_Accum, a)
FUNC (long _Accum, la)
FUNC (long long _Accum, lla)
FUNC (unsigned short _Accum, usa)
FUNC (unsigned _Accum, ua)
FUNC (unsigned long _Accum, ula)
FUNC (unsigned long long _Accum, ulla)
FUNC (_Sat short _Accum, Ssa)
FUNC (_Sat _Accum, Sa)
FUNC (_Sat long _Accum, Sla)
FUNC (_Sat long long _Accum, Slla)
FUNC (_Sat unsigned short _Accum, Susa)
FUNC (_Sat unsigned _Accum, Sua)
FUNC (_Sat unsigned long _Accum, Sula)
FUNC (_Sat unsigned long long _Accum, Sulla)
int main()
{
#define TEST(NAME,PF) \
if (vararg_int (0, 100, 0.9r, 55.0, 0.2 ## PF) != 100) \
abort (); \
if (vararg_fract (1, 100, 0.9r, 55.0, 0.2 ## PF) != 0.9r) \
abort (); \
if (vararg_double (2, 100, 0.9r, 55.0, 0.2 ## PF) != 55.0) \
abort (); \
if (vararg_ ## NAME (3, 100, 0.9r, 55.0, 0.2 ## PF) != 0.2 ## PF) \
abort (); \
TEST(sf, hr)
TEST(f, r)
TEST(lf, lr)
TEST(llf, llr)
TEST(usf, uhr)
TEST(uf, ur)
TEST(ulf, ulr)
TEST(ullf, ullr)
TEST(Ssf, hr)
TEST(Sf, r)
TEST(Slf, lr)
TEST(Sllf, llr)
TEST(Susf, uhr)
TEST(Suf, ur)
TEST(Sulf, ulr)
TEST(Sullf, ullr)
TEST(sa, hk)
TEST(a, k)
TEST(la, lk)
TEST(lla, llk)
TEST(usa, uhk)
TEST(ua, uk)
TEST(ula, ulk)
TEST(ulla, ullk)
TEST(Ssa, hk)
TEST(Sa, k)
TEST(Sla, lk)
TEST(Slla, llk)
TEST(Susa, uhk)
TEST(Sua, uk)
TEST(Sula, ulk)
TEST(Sulla, ullk)
return 0;
}
/* { dg-do run } */
/* { dg-options "-std=gnu99" } */
/* C99 6.5.2.2 Function calls.
Based on the test from ../dfp/. */
#include <stdarg.h>
extern void abort (void);
struct S1
{
struct
{
_Fract e;
} b[0];
};
/* Test handling vararg parameters whose size is 0. */
int check_var(int z,...)
{
double d;
struct S1 s1;
long long result;
va_list ap;
va_start (ap, z);
d = va_arg (ap, double);
s1 = va_arg (ap, struct S1);
result = va_arg (ap, long long);
va_end (ap);
return (result == 2LL);
}
int
main ()
{
struct S1 s1;
struct S1 a1[5];
if (check_var(5, 1.0, s1, 2LL, a1[2], a1[2]) == 0)
abort ();
return 0;
}
/* { dg-do run } */
/* { dg-options "-std=gnu99" } */
/* C99 6.5.2.2 Function calls.
Test passing varargs of fixed-point types.
Based on the test from ../dfp/. */
#include <stdarg.h>
extern void abort (void);
#define FUNC(TYPE, NAME) \
static TYPE \
vararg_ ## NAME (unsigned arg, ...) \
{ \
int i; \
va_list ap; \
TYPE result; \
va_start (ap, arg); \
for (i = 0; i <= arg; i++) \
result = va_arg (ap, TYPE); \
va_end (ap); \
return result; \
}
FUNC (short _Fract, sf)
FUNC (_Fract, f)
FUNC (long _Fract, lf)
FUNC (long long _Fract, llf)
FUNC (unsigned short _Fract, usf)
FUNC (unsigned _Fract, uf)
FUNC (unsigned long _Fract, ulf)
FUNC (unsigned long long _Fract, ullf)
FUNC (_Sat short _Fract, Ssf)
FUNC (_Sat _Fract, Sf)
FUNC (_Sat long _Fract, Slf)
FUNC (_Sat long long _Fract, Sllf)
FUNC (_Sat unsigned short _Fract, Susf)
FUNC (_Sat unsigned _Fract, Suf)
FUNC (_Sat unsigned long _Fract, Sulf)
FUNC (_Sat unsigned long long _Fract, Sullf)
FUNC (short _Accum, sa)
FUNC (_Accum, a)
FUNC (long _Accum, la)
FUNC (long long _Accum, lla)
FUNC (unsigned short _Accum, usa)
FUNC (unsigned _Accum, ua)
FUNC (unsigned long _Accum, ula)
FUNC (unsigned long long _Accum, ulla)
FUNC (_Sat short _Accum, Ssa)
FUNC (_Sat _Accum, Sa)
FUNC (_Sat long _Accum, Sla)
FUNC (_Sat long long _Accum, Slla)
FUNC (_Sat unsigned short _Accum, Susa)
FUNC (_Sat unsigned _Accum, Sua)
FUNC (_Sat unsigned long _Accum, Sula)
FUNC (_Sat unsigned long long _Accum, Sulla)
int main()
{
#define TEST(NAME,PF) \
if (vararg_ ## NAME (0, 0.0 ## PF, 0.1 ## PF, 0.2 ## PF, 0.3 ## PF, \
0.4 ## PF, 0.5 ## PF) != 0.0 ## PF) \
abort (); \
if (vararg_ ## NAME (1, 0.0 ## PF, 0.1 ## PF, 0.2 ## PF, 0.3 ## PF, \
0.4 ## PF, 0.5 ## PF) != 0.1 ## PF) \
abort (); \
if (vararg_ ## NAME (2, 0.0 ## PF, 0.1 ## PF, 0.2 ## PF, 0.3 ## PF, \
0.4 ## PF, 0.5 ## PF) != 0.2 ## PF) \
abort (); \
if (vararg_ ## NAME (3, 0.0 ## PF, 0.1 ## PF, 0.2 ## PF, 0.3 ## PF, \
0.4 ## PF, 0.5 ## PF) != 0.3 ## PF) \
abort (); \
if (vararg_ ## NAME (4, 0.0 ## PF, 0.1 ## PF, 0.2 ## PF, 0.3 ## PF, \
0.4 ## PF, 0.5 ## PF) != 0.4 ## PF) \
abort (); \
if (vararg_ ## NAME (5, 0.0 ## PF, 0.1 ## PF, 0.2 ## PF, 0.3 ## PF, \
0.4 ## PF, 0.5 ## PF) != 0.5 ## PF) \
abort ();
TEST(sf, hr)
TEST(f, r)
TEST(lf, lr)
TEST(llf, llr)
TEST(usf, uhr)
TEST(uf, ur)
TEST(ulf, ulr)
TEST(ullf, ullr)
TEST(Ssf, hr)
TEST(Sf, r)
TEST(Slf, lr)
TEST(Sllf, llr)
TEST(Susf, uhr)
TEST(Suf, ur)
TEST(Sulf, ulr)
TEST(Sullf, ullr)
TEST(sa, hk)
TEST(a, k)
TEST(la, lk)
TEST(lla, llk)
TEST(usa, uhk)
TEST(ua, uk)
TEST(ula, ulk)
TEST(ulla, ullk)
TEST(Ssa, hk)
TEST(Sa, k)
TEST(Sla, lk)
TEST(Slla, llk)
TEST(Susa, uhk)
TEST(Sua, uk)
TEST(Sula, ulk)
TEST(Sulla, ullk)
return 0;
}
/* { dg-do compile } */
/* { dg-options "-std=gnu99 -O2" } */
/* N1169 Conversion from fixed-point to integer.
Test if GCC warns when overflow or underflow. */
signed char sc;
unsigned char uc;
void test()
{
sc = 500k; /* { dg-warning "overflow in implicit constant conversion" } */
sc = -500k; /* { dg-warning "overflow in implicit constant conversion" } */
sc = 500lk; /* { dg-warning "overflow in implicit constant conversion" } */
sc = -500lk; /* { dg-warning "overflow in implicit constant conversion" } */
sc = 500llk; /* { dg-warning "overflow in implicit constant conversion" } */
sc = -500llk; /* { dg-warning "overflow in implicit constant conversion" } */
uc = 500k; /* { dg-warning "overflow in implicit constant conversion" } */
uc = -500k; /* { dg-warning "overflow in implicit constant conversion" } */
uc = 500lk; /* { dg-warning "overflow in implicit constant conversion" } */
uc = -500lk; /* { dg-warning "overflow in implicit constant conversion" } */
uc = 500llk; /* { dg-warning "overflow in implicit constant conversion" } */
uc = -500llk; /* { dg-warning "overflow in implicit constant conversion" } */
}
/* { dg-do compile } */
/* { dg-options "-std=c89" } */
/* Flixed-point keywords are not recognized in C89 mode. */
_Fract w; /* { dg-error "" } */
_Accum x; /* { dg-error "" } */
_Sat _Fract y; /* { dg-error "" } */
_Sat _Accum z; /* { dg-error "" } */
/* { dg-do compile } */
/* { dg-options "-std=c99" } */
/* Fixed-point keywords are not recognized in C99 mode. */
_Fract w; /* { dg-error "" } */
_Accum x; /* { dg-error "" } */
_Sat _Fract y; /* { dg-error "" } */
_Sat _Fract z; /* { dg-error "" } */
/* { dg-do compile } */
/* { dg-options "-std=c99" } */
/* Fixed-point keywords are not reserved for c99. */
int _Fract (void)
{
return 0;
}
int _Accum (void)
{
return 0;
}
int _Sat (void)
{
return 0;
}
int foo1 (int i)
{
int _Fract = i * 2;
return _Fract;
}
int foo2 (int i)
{
int _Accum = i * 2;
return _Accum;
}
int foo3 (int i)
{
int _Sat = i * 2;
return _Sat;
}
/* { dg-do compile } */
/* { dg-options "-std=gnu99 -pedantic" } */
/* Fixed-point is a GCC extension. */
_Fract w; /* { dg-warning "GCC extension|ISO C" } */
_Accum x; /* { dg-warning "GCC extension|ISO C" } */
_Sat _Fract y; /* { dg-warning "GCC extension|ISO C" } */
_Sat _Accum z; /* { dg-warning "GCC extension|ISO C" } */
/* { dg-do compile } */
/* { dg-options "-std=gnu99" } */
/* N1169 6.4.1: Keywords.
C99 6.4.1(2): Keywords.
Fixed-point keywords cannot be used in other contexts. */
int _Fract (void) /* { dg-error "" } */
{
return 0;
}
int _Accum (void) /* { dg-error "" } */
{
return 0;
}
int _Sat (void) /* { dg-error "" } */
{
return 0;
}
int foo1 (int i)
{
int _Fract = i * 2; /* { dg-error "" } */
return _Fract; /* { dg-error "" } */
}
int foo2 (int i)
{
int _Accum = i * 2; /* { dg-error "" } */
return _Accum; /* { dg-error "" } */
}
int foo3 (int i)
{
int _Sat = i * 2; /* { dg-error "" } */
return _Sat; /* { dg-error "" } */
}
/* { dg-do run } */
/* { dg-options "-std=gnu99" } */
/* C99 6.8.5.2: The for statement.
Based on the test from ../dfp/. */
extern void abort (void);
#define FUNC(TYPE,NAME,PF) \
void \
NAME (void) \
{ \
TYPE d; \
int i; \
for (d = 0.1 ## PF, i = 0; d <= 0.8 ## PF; d += 0.1 ## PF) \
i++; \
if (i != 8) \
abort(); \
}
FUNC (short _Fract, sf, hr)
FUNC (_Fract, f, r)
FUNC (long _Fract, lf, lr)
FUNC (long long _Fract, llf, llr)
FUNC (unsigned short _Fract, usf, uhr)
FUNC (unsigned _Fract, uf, ur)
FUNC (unsigned long _Fract, ulf, ulr)
FUNC (unsigned long long _Fract, ullf, ullr)
FUNC (_Sat short _Fract, Ssf, hr)
FUNC (_Sat _Fract, Sf, r)
FUNC (_Sat long _Fract, Slf, lr)
FUNC (_Sat long long _Fract, Sllf, llr)
FUNC (_Sat unsigned short _Fract, Susf, uhr)
FUNC (_Sat unsigned _Fract, Suf, ur)
FUNC (_Sat unsigned long _Fract, Sulf, ulr)
FUNC (_Sat unsigned long long _Fract, Sullf, ullr)
FUNC (short _Accum, sa, hk)
FUNC (_Accum, a, k)
FUNC (long _Accum, la, lk)
FUNC (long long _Accum, lla, llk)
FUNC (unsigned short _Accum, usa, uhk)
FUNC (unsigned _Accum, ua, uk)
FUNC (unsigned long _Accum, ula, ulk)
FUNC (unsigned long long _Accum, ulla, ullk)
FUNC (_Sat short _Accum, Ssa, hk)
FUNC (_Sat _Accum, Sa, k)
FUNC (_Sat long _Accum, Sla, lk)
FUNC (_Sat long long _Accum, Slla, llk)
FUNC (_Sat unsigned short _Accum, Susa, uhk)
FUNC (_Sat unsigned _Accum, Sua, uk)
FUNC (_Sat unsigned long _Accum, Sula, ulk)
FUNC (_Sat unsigned long long _Accum, Sulla, ullk)
int
main ()
{
sf ();
f ();
lf ();
llf ();
usf ();
uf ();
ulf ();
ullf ();
Ssf ();
Sf ();
Slf ();
Sllf ();
Susf ();
Suf ();
Sulf ();
Sullf ();
sa ();
a ();
la ();
lla ();
usa ();
ua ();
ula ();
ulla ();
Ssa ();
Sa ();
Sla ();
Slla ();
Susa ();
Sua ();
Sula ();
Sulla ();
return 0;
}
/* { dg-do compile } */
/* { dg-options "-std=gnu99" } */
typedef _Fract qq __attribute__ ((mode (QQ)));
typedef _Fract hq __attribute__ ((mode (HQ)));
typedef _Fract sq __attribute__ ((mode (SQ)));
typedef _Fract dq __attribute__ ((mode (DQ)));
typedef unsigned _Fract uqq __attribute__ ((mode (UQQ)));
typedef unsigned _Fract uhq __attribute__ ((mode (UHQ)));
typedef unsigned _Fract usq __attribute__ ((mode (USQ)));
typedef unsigned _Fract udq __attribute__ ((mode (UDQ)));
typedef _Sat _Fract Sqq __attribute__ ((mode (QQ)));
typedef _Sat _Fract Shq __attribute__ ((mode (HQ)));
typedef _Sat _Fract Ssq __attribute__ ((mode (SQ)));
typedef _Sat _Fract Sdq __attribute__ ((mode (DQ)));
typedef _Sat unsigned _Fract Suqq __attribute__ ((mode (UQQ)));
typedef _Sat unsigned _Fract Suhq __attribute__ ((mode (UHQ)));
typedef _Sat unsigned _Fract Susq __attribute__ ((mode (USQ)));
typedef _Sat unsigned _Fract Sudq __attribute__ ((mode (UDQ)));
typedef _Accum ha __attribute__ ((mode (HA)));
typedef _Accum sa __attribute__ ((mode (SA)));
typedef _Accum da __attribute__ ((mode (DA)));
typedef unsigned _Accum uha __attribute__ ((mode (UHA)));
typedef unsigned _Accum usa __attribute__ ((mode (USA)));
typedef unsigned _Accum uda __attribute__ ((mode (UDA)));
typedef _Sat _Accum Sha __attribute__ ((mode (HA)));
typedef _Sat _Accum Ssa __attribute__ ((mode (SA)));
typedef _Sat _Accum Sda __attribute__ ((mode (DA)));
typedef _Sat unsigned _Accum Suha __attribute__ ((mode (UHA)));
typedef _Sat unsigned _Accum Susa __attribute__ ((mode (USA)));
typedef _Sat unsigned _Accum Suda __attribute__ ((mode (UDA)));
/* Not all platforms support TQ, UTQ, TA, UTA modes. */
#if defined(__LP64__) && !defined(__hppa__)
typedef _Fract tq __attribute__ ((mode (TQ)));
typedef unsigned _Fract utq __attribute__ ((mode (UTQ)));
typedef _Sat _Fract Stq __attribute__ ((mode (TQ)));
typedef _Sat unsigned _Fract Sutq __attribute__ ((mode (UTQ)));
typedef _Accum ta __attribute__ ((mode (TA)));
typedef unsigned _Accum uta __attribute__ ((mode (UTA)));
typedef _Sat _Accum Sta __attribute__ ((mode (TA)));
typedef _Sat unsigned _Accum Suta __attribute__ ((mode (UTA)));
int tqsize[sizeof (tq) == 16 ? 1 : -1];
int utqsize[sizeof (utq) == 16 ? 1 : -1];
int Stqsize[sizeof (Stq) == 16 ? 1 : -1];
int Sutqsize[sizeof (Sutq) == 16 ? 1 : -1];
int tasize[sizeof (ta) == 16 ? 1 : -1];
int utasize[sizeof (uta) == 16 ? 1 : -1];
int Stasize[sizeof (Sta) == 16 ? 1 : -1];
int Sutasize[sizeof (Suta) == 16 ? 1 : -1];
int tqalign = __alignof (tq);
int utqalign = __alignof (utq);
int Stqalign = __alignof (Stq);
int Sutqalign = __alignof (Sutq);
int taalign = __alignof (ta);
int utaalign = __alignof (uta);
int Staalign = __alignof (Sta);
int Sutaalign = __alignof (Suta);
#endif
int qqsize[sizeof (qq) == 1 ? 1 : -1];
int hqsize[sizeof (hq) == 2 ? 1 : -1];
int sqsize[sizeof (sq) == 4 ? 1 : -1];
int dqsize[sizeof (dq) == 8 ? 1 : -1];
int uqqsize[sizeof (qq) == 1 ? 1 : -1];
int uhqsize[sizeof (hq) == 2 ? 1 : -1];
int usqsize[sizeof (sq) == 4 ? 1 : -1];
int udqsize[sizeof (dq) == 8 ? 1 : -1];
int Sqqsize[sizeof (Sqq) == 1 ? 1 : -1];
int Shqsize[sizeof (Shq) == 2 ? 1 : -1];
int Ssqsize[sizeof (Ssq) == 4 ? 1 : -1];
int Sdqsize[sizeof (Sdq) == 8 ? 1 : -1];
int Suqqsize[sizeof (Sqq) == 1 ? 1 : -1];
int Suhqsize[sizeof (Shq) == 2 ? 1 : -1];
int Susqsize[sizeof (Ssq) == 4 ? 1 : -1];
int Sudqsize[sizeof (Sdq) == 8 ? 1 : -1];
int hasize[sizeof (ha) == 2 ? 1 : -1];
int sasize[sizeof (sa) == 4 ? 1 : -1];
int dasize[sizeof (da) == 8 ? 1 : -1];
int uhasize[sizeof (uha) == 2 ? 1 : -1];
int usasize[sizeof (usa) == 4 ? 1 : -1];
int udasize[sizeof (uda) == 8 ? 1 : -1];
int Shasize[sizeof (Sha) == 2 ? 1 : -1];
int Ssasize[sizeof (Ssa) == 4 ? 1 : -1];
int Sdasize[sizeof (Sda) == 8 ? 1 : -1];
int Suhasize[sizeof (Suha) == 2 ? 1 : -1];
int Susasize[sizeof (Susa) == 4 ? 1 : -1];
int Sudasize[sizeof (Suda) == 8 ? 1 : -1];
int qqalign = __alignof (qq);
int hqalign = __alignof (hq);
int sqalign = __alignof (sq);
int dqalign = __alignof (dq);
int uqqalign = __alignof (uqq);
int uhqalign = __alignof (uhq);
int usqalign = __alignof (usq);
int udqalign = __alignof (udq);
int Sqqalign = __alignof (Sqq);
int Shqalign = __alignof (Shq);
int Ssqalign = __alignof (Ssq);
int Sdqalign = __alignof (Sdq);
int Suqqalign = __alignof (Suqq);
int Suhqalign = __alignof (Suhq);
int Susqalign = __alignof (Susq);
int Sudqalign = __alignof (Sudq);
int haalign = __alignof (ha);
int saalign = __alignof (sa);
int daalign = __alignof (da);
int uhaalign = __alignof (uha);
int usaalign = __alignof (usa);
int udaalign = __alignof (uda);
int Shaalign = __alignof (Sha);
int Ssaalign = __alignof (Ssa);
int Sdaalign = __alignof (Sda);
int Suhaalign = __alignof (Suha);
int Susaalign = __alignof (Susa);
int Sudaalign = __alignof (Suda);
/* { dg-do compile } */
/* { dg-options "-std=gnu99" } */
/* Check if GCC generates warnings when overflows for mul and div. */
short _Fract sf0 = __SFRACT_MIN__ * __SFRACT_MIN__; /* { dg-warning "overflow" } */
_Fract f0 = __FRACT_MIN__ * __FRACT_MIN__; /* { dg-warning "overflow" } */
long _Fract lf0 = __LFRACT_MIN__ * __LFRACT_MIN__; /* { dg-warning "overflow" } */
long long _Fract llf0 = __LLFRACT_MIN__ * __LLFRACT_MIN__; /* { dg-warning "overflow" } */
short _Fract sf1 = __SFRACT_MAX__ * __SFRACT_MIN__;
_Fract f1 = __FRACT_MAX__ * __FRACT_MIN__;
long _Fract lf1 = __LFRACT_MAX__ * __LFRACT_MIN__;
long long _Fract llf1 = __LLFRACT_MAX__ * __LLFRACT_MIN__;
short _Fract sf2 = __SFRACT_MIN__ / __SFRACT_MIN__; /* { dg-warning "overflow" } */
_Fract f2 = __FRACT_MIN__ / __FRACT_MIN__; /* { dg-warning "overflow" } */
long _Fract lf2 = __LFRACT_MIN__ / __LFRACT_MIN__; /* { dg-warning "overflow" } */
long long _Fract llf2 = __LLFRACT_MIN__ / __LLFRACT_MIN__; /* { dg-warning "overflow" } */
short _Fract sf3 = __SFRACT_MAX__ / __SFRACT_MIN__;
_Fract f3 = __FRACT_MAX__ / __FRACT_MIN__;
long _Fract lf3 = __LFRACT_MAX__ / __LFRACT_MIN__;
long long _Fract llf3 = __LLFRACT_MAX__ / __LLFRACT_MIN__;
unsigned short _Fract usf0 = __USFRACT_MIN__ * __USFRACT_MIN__;
unsigned _Fract uf0 = __UFRACT_MIN__ * __UFRACT_MIN__;
unsigned long _Fract ulf0 = __ULFRACT_MIN__ * __ULFRACT_MIN__;
unsigned long long _Fract ullf0 = __ULLFRACT_MIN__ * __ULLFRACT_MIN__;
unsigned short _Fract usf1 = __USFRACT_MAX__ * __USFRACT_MIN__;
unsigned _Fract uf1 = __UFRACT_MAX__ * __UFRACT_MIN__;
unsigned long _Fract ulf1 = __ULFRACT_MAX__ * __ULFRACT_MIN__;
unsigned long long _Fract ullf1 = __ULLFRACT_MAX__ * __ULLFRACT_MIN__;
unsigned short _Fract usf2 = __USFRACT_MAX__ / __USFRACT_MAX__; /* { dg-warning "overflow" } */
unsigned _Fract uf2 = __UFRACT_MAX__ / __UFRACT_MAX__; /* { dg-warning "overflow" } */
unsigned long _Fract ulf2 = __ULFRACT_MAX__ / __ULFRACT_MAX__; /* { dg-warning "overflow" } */
unsigned long long _Fract ullf2 = __ULLFRACT_MAX__ / __ULLFRACT_MAX__; /* { dg-warning "overflow" } */
unsigned short _Fract usf3 = __USFRACT_MIN__ / __USFRACT_MAX__;
unsigned _Fract uf3 = __UFRACT_MIN__ / __UFRACT_MAX__;
unsigned long _Fract ulf3 = __ULFRACT_MIN__ / __ULFRACT_MAX__;
unsigned long long _Fract ullf3 = __ULLFRACT_MIN__ / __ULLFRACT_MAX__;
short _Accum sa0 = __SACCUM_MIN__ * __SACCUM_MIN__; /* { dg-warning "overflow" } */
_Accum a0 = __ACCUM_MIN__ * __ACCUM_MIN__; /* { dg-warning "overflow" } */
long _Accum la0 = __LACCUM_MIN__ * __LACCUM_MIN__; /* { dg-warning "overflow" } */
long long _Accum lla0 = __LLACCUM_MIN__ * __LLACCUM_MIN__; /* { dg-warning "overflow" } */
short _Accum sa1 = __SACCUM_MAX__ * 0.1hk;
_Accum a1 = __ACCUM_MAX__ * 0.1k;
long _Accum la1 = __LACCUM_MAX__ * 0.1lk;
long long _Accum lla1 = __LLACCUM_MAX__ * 0.1llk;
short _Accum sa2 = __SACCUM_MIN__ / 0.1hk; /* { dg-warning "overflow" } */
_Accum a2 = __ACCUM_MIN__ / 0.1k; /* { dg-warning "overflow" } */
long _Accum la2 = __LACCUM_MIN__ / 0.1lk; /* { dg-warning "overflow" } */
long long _Accum lla2 = __LLACCUM_MIN__ / 0.1llk; /* { dg-warning "overflow" } */
short _Accum sa3 = __SACCUM_MAX__ / __SACCUM_MIN__;
_Accum a3 = __ACCUM_MAX__ / __ACCUM_MIN__;
long _Accum la3 = __LACCUM_MAX__ / __LACCUM_MIN__;
long long _Accum lla3 = __LLACCUM_MAX__ / __LLACCUM_MIN__;
unsigned short _Accum usa0 = __USACCUM_MIN__ * __USACCUM_MIN__;
unsigned _Accum ua0 = __UACCUM_MIN__ * __UACCUM_MIN__;
unsigned long _Accum ula0 = __ULACCUM_MIN__ * __ULACCUM_MIN__;
unsigned long long _Accum ulla0 = __ULLACCUM_MIN__ * __ULLACCUM_MIN__;
unsigned short _Accum usa1 = __USACCUM_MAX__ * __USACCUM_MAX__; /* { dg-warning "overflow" } */
unsigned _Accum ua1 = __UACCUM_MAX__ * __UACCUM_MAX__; /* { dg-warning "overflow" } */
unsigned long _Accum ula1 = __ULACCUM_MAX__ * __ULACCUM_MAX__; /* { dg-warning "overflow" } */
unsigned long long _Accum ulla1 = __ULLACCUM_MAX__ * __ULLACCUM_MAX__; /* { dg-warning "overflow" } */
unsigned short _Accum usa2 = __USACCUM_MAX__ / 0.5hk; /* { dg-warning "overflow" } */
unsigned _Accum ua2 = __UACCUM_MAX__ / 0.5k; /* { dg-warning "overflow" } */
unsigned long _Accum ula2 = __ULACCUM_MAX__ / 0.5lk; /* { dg-warning "overflow" } */
unsigned long long _Accum ulla2 = __ULLACCUM_MAX__ / 0.5llk; /* { dg-warning "overflow" } */
unsigned short _Accum usa3 = __USACCUM_MIN__ / __USACCUM_MAX__;
unsigned _Accum ua3 = __UACCUM_MIN__ / __UACCUM_MAX__;
unsigned long _Accum ula3 = __ULACCUM_MIN__ / __ULACCUM_MAX__;
unsigned long long _Accum ulla3 = __ULLACCUM_MIN__ / __ULLACCUM_MAX__;
/* { dg-do run } */
/* { dg-options "-std=gnu99 -O0" } */
extern void abort (void);
/* Make sure GCC knows there is no associativity for saturating types. */
/* Don't transform to (temp + (0.5r + 0.8r)) */
_Sat _Fract add_test (_Sat _Fract temp)
{
return temp + 0.5r + 0.8r;
}
/* Don't transform to (temp * ((-0.5r - 0.5r) * (-0.5r - 0.5r))) */
_Sat _Fract mul_test (_Sat _Fract temp)
{
return temp * (-0.5r - 0.5r) * (-0.5r - 0.5r);
}
/* Don't transform to ((temp1 + temp2) * 0.5r) */
_Sat _Fract mul_add_test (_Sat _Fract temp1, _Sat _Fract temp2)
{
return temp1 * 0.5r + temp2 * 0.5r;
}
/* Don't transform to ((temp1 - temp2) * 0.5r) */
_Sat _Fract mul_sub_test (_Sat _Fract temp1, _Sat _Fract temp2)
{
return temp1 * 0.5r - temp2 * 0.5r;
}
int main ()
{
_Sat _Fract a;
a = add_test (-0.5r);
if (a != 0.8r)
abort ();
a = mul_test (0.1r);
if (a != 0.1r)
abort ();
a = mul_add_test (0.75r, 0.5r);
if (a != 0.625r)
abort ();
a = mul_sub_test (0.75r, -0.5r);
if (a != 0.625r)
abort ();
return 0;
}
/* { dg-do compile } */
/* { dg-options "-std=gnu99" } */
/* C99 6.5.10: Bitwise AND operator.
C99 6.5.11: Bitwise exclusive OR operator.
C99 6.5.12: Bitwise inclusive OR operator.
Test that these operators do not accept fixed-point operands.
Based on the test from ../dfp/. */
extern void abort (void);
#define OPERATE(OPRD1,OPRT,OPRD2) \
do \
{ \
OPRD1 OPRT OPRD2; \
} while (0)
#define BITWISE_OPERATOR(OPRT,OPRD) \
do \
{ \
OPERATE(OPRD,OPRT,1); \
OPERATE(OPRD,OPRT,0); \
OPERATE(OPRD,OPRT,0x15); \
OPERATE(0,OPRT,OPRD); \
OPERATE(1,OPRT,OPRD); \
OPERATE(0x15,OPRT,OPRD); \
} while (0)
void operator_notfor_fixed_point()
{
short _Fract sf;
_Fract f;
long _Fract lf;
long long _Fract llf;
unsigned short _Fract usf;
unsigned _Fract uf;
unsigned long _Fract ulf;
unsigned long long _Fract ullf;
_Sat short _Fract Ssf;
_Sat _Fract Sf;
_Sat long _Fract Slf;
_Sat long long _Fract Sllf;
_Sat unsigned short _Fract Susf;
_Sat unsigned _Fract Suf;
_Sat unsigned long _Fract Sulf;
_Sat unsigned long long _Fract Sullf;
short _Accum sa;
_Accum a;
long _Accum la;
long long _Accum lla;
unsigned short _Accum usa;
unsigned _Accum ua;
unsigned long _Accum ula;
unsigned long long _Accum ulla;
_Sat short _Accum Ssa;
_Sat _Accum Sa;
_Sat long _Accum Sla;
_Sat long long _Accum Slla;
_Sat unsigned short _Accum Susa;
_Sat unsigned _Accum Sua;
_Sat unsigned long _Accum Sula;
_Sat unsigned long long _Accum Sulla;
/* C99 Section 6.5.{10,11,12} Bitwise operator. Constraints: Each of
the operands shall have integer type. Fixed-point type is rejected
by compiler when bitwise operation is performed. */
BITWISE_OPERATOR(&,sf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,sf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,sf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,f); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,f); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,f); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,lf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,lf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,lf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,llf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,llf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,llf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,usf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,usf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,usf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,uf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,uf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,uf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,ulf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,ulf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,ulf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,ullf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,ullf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,ullf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,Ssf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,Ssf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,Ssf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,Sf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,Sf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,Sf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,Slf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,Slf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,Slf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,Sllf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,Sllf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,Sllf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,Susf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,Susf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,Susf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,Suf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,Suf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,Suf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,Sulf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,Sulf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,Sulf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,Sullf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,Sullf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,Sullf); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,sa); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,sa); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,sa); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,a); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,a); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,a); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,la); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,la); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,la); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,lla); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,lla); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,lla); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,usa); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,usa); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,usa); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,ua); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,ua); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,ua); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,ula); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,ula); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,ula); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,ulla); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,ulla); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,ulla); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,Ssa); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,Ssa); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,Ssa); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,Sa); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,Sa); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,Sa); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,Sla); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,Sla); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,Sla); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,Slla); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,Slla); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,Slla); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,Susa); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,Susa); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,Susa); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,Sua); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,Sua); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,Sua); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,Sula); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,Sula); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,Sula); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(&,Sulla); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(|,Sulla); /* { dg-error "invalid operands to binary" } */
BITWISE_OPERATOR(^,Sulla); /* { dg-error "invalid operands to binary" } */
}
/* { dg-do run } */
/* { dg-options "-std=gnu99 -O0" } */
/* C99 6.5.17: Comma operator.
Test with fixed-point operands.
Based on the test from ../dfp/. */
extern void abort (void);
#define FUNC(TYPE,NAME,PF) \
volatile TYPE NAME ## a, NAME ## b, NAME ## c; \
void \
init_ ## NAME () \
{ \
NAME ## b = 0.2 ## PF; \
NAME ## c = 0.3 ## PF; \
}
FUNC (short _Fract, sf, hr)
FUNC (_Fract, f, r)
FUNC (long _Fract, lf, lr)
FUNC (long long _Fract, llf, llr)
FUNC (unsigned short _Fract, usf, uhr)
FUNC (unsigned _Fract, uf, ur)
FUNC (unsigned long _Fract, ulf, ulr)
FUNC (long long _Fract, ullf, ullr)
FUNC (_Sat short _Fract, Ssf, hr)
FUNC (_Sat _Fract, Sf, r)
FUNC (_Sat long _Fract, Slf, lr)
FUNC (_Sat long long _Fract, Sllf, llr)
FUNC (_Sat unsigned short _Fract, Susf, uhr)
FUNC (_Sat unsigned _Fract, Suf, ur)
FUNC (_Sat unsigned long _Fract, Sulf, ulr)
FUNC (_Sat long long _Fract, Sullf, ullr)
FUNC (short _Accum, sa, hk)
FUNC (_Accum, a, k)
FUNC (long _Accum, la, lk)
FUNC (long long _Accum, lla, llk)
FUNC (unsigned short _Accum, usa, uhk)
FUNC (unsigned _Accum, ua, uk)
FUNC (unsigned long _Accum, ula, ulk)
FUNC (long long _Accum, ulla, ullk)
FUNC (_Sat short _Accum, Ssa, hk)
FUNC (_Sat _Accum, Sa, k)
FUNC (_Sat long _Accum, Sla, lk)
FUNC (_Sat long long _Accum, Slla, llk)
FUNC (_Sat unsigned short _Accum, Susa, uhk)
FUNC (_Sat unsigned _Accum, Sua, uk)
FUNC (_Sat unsigned long _Accum, Sula, ulk)
FUNC (_Sat long long _Accum, Sulla, ullk)
int
main ()
{
#define TEST(NAME) \
init_ ## NAME (); \
NAME ## a = (NAME ## b, NAME ## c); \
if (NAME ## a != NAME ## c) \
abort (); \
NAME ## a = (NAME ## c, 123, NAME ## b); \
if (NAME ## a != NAME ## b) \
abort ();
TEST(sf)
TEST(f)
TEST(lf)
TEST(llf)
TEST(usf)
TEST(uf)
TEST(ulf)
TEST(ullf)
TEST(Ssf)
TEST(Sf)
TEST(Slf)
TEST(Sllf)
TEST(Susf)
TEST(Suf)
TEST(Sulf)
TEST(Sullf)
TEST(sa)
TEST(a)
TEST(la)
TEST(lla)
TEST(usa)
TEST(ua)
TEST(ula)
TEST(ulla)
TEST(Ssa)
TEST(Sa)
TEST(Sla)
TEST(Slla)
TEST(Susa)
TEST(Sua)
TEST(Sula)
TEST(Sulla)
return 0;
}
/* { dg-do run } */
/* { dg-options "-std=gnu99 -O0" } */
/* C99 6.5.15 Conditional operator.
Test with fixed-point operands.
Based on the test from ../dfp/. */
extern void abort (void);
volatile int yes, no;
#define FUNC(TYPE,NAME,PF) \
volatile TYPE NAME ## a, NAME ## b, NAME ## c; \
void \
init_ ## NAME () \
{ \
NAME ## b = 0.2 ## PF; \
NAME ## c = 0.3 ## PF; \
yes = 1; \
no = 0; \
}
FUNC (short _Fract, sf, hr)
FUNC (_Fract, f, r)
FUNC (long _Fract, lf, lr)
FUNC (long long _Fract, llf, llr)
FUNC (unsigned short _Fract, usf, uhr)
FUNC (unsigned _Fract, uf, ur)
FUNC (unsigned long _Fract, ulf, ulr)
FUNC (long long _Fract, ullf, ullr)
FUNC (_Sat short _Fract, Ssf, hr)
FUNC (_Sat _Fract, Sf, r)
FUNC (_Sat long _Fract, Slf, lr)
FUNC (_Sat long long _Fract, Sllf, llr)
FUNC (_Sat unsigned short _Fract, Susf, uhr)
FUNC (_Sat unsigned _Fract, Suf, ur)
FUNC (_Sat unsigned long _Fract, Sulf, ulr)
FUNC (_Sat long long _Fract, Sullf, ullr)
FUNC (short _Accum, sa, hk)
FUNC (_Accum, a, k)
FUNC (long _Accum, la, lk)
FUNC (long long _Accum, lla, llk)
FUNC (unsigned short _Accum, usa, uhk)
FUNC (unsigned _Accum, ua, uk)
FUNC (unsigned long _Accum, ula, ulk)
FUNC (long long _Accum, ulla, ullk)
FUNC (_Sat short _Accum, Ssa, hk)
FUNC (_Sat _Accum, Sa, k)
FUNC (_Sat long _Accum, Sla, lk)
FUNC (_Sat long long _Accum, Slla, llk)
FUNC (_Sat unsigned short _Accum, Susa, uhk)
FUNC (_Sat unsigned _Accum, Sua, uk)
FUNC (_Sat unsigned long _Accum, Sula, ulk)
FUNC (_Sat long long _Accum, Sulla, ullk)
int
main ()
{
#define TEST(NAME) \
init_ ## NAME (); \
NAME ## a = yes ? NAME ## b : NAME ## c; \
if (NAME ## a != NAME ## b) \
abort (); \
NAME ## a = no ? NAME ## b : NAME ## c; \
if (NAME ## a != NAME ## c) \
abort ();
TEST(sf)
TEST(f)
TEST(lf)
TEST(llf)
TEST(usf)
TEST(uf)
TEST(ulf)
TEST(ullf)
TEST(Ssf)
TEST(Sf)
TEST(Slf)
TEST(Sllf)
TEST(Susf)
TEST(Suf)
TEST(Sulf)
TEST(Sullf)
TEST(sa)
TEST(a)
TEST(la)
TEST(lla)
TEST(usa)
TEST(ua)
TEST(ula)
TEST(ulla)
TEST(Ssa)
TEST(Sa)
TEST(Sla)
TEST(Slla)
TEST(Susa)
TEST(Sua)
TEST(Sula)
TEST(Sulla)
return 0;
}
/* { dg-do run } */
/* { dg-options "-std=gnu99" } */
/* C99 Logical AND operator.
C99 Logical OR operator.
Test with fixed-point operands.
Based on the test from ../dfp/. */
extern void abort (void);
#define OPERATE(OPRD1,OPRT,OPRD2,RLT) \
do \
{ \
if (( (OPRD1) OPRT (OPRD2) )!= RLT) \
abort (); \
} while (0)
#define FIXED_POINT_LOGICAL(OPRD) \
do \
{ \
OPRD = 0.1; \
OPERATE(1,||,OPRD,1); \
OPERATE(0,||,OPRD,1); \
OPERATE(OPRD,||,1,1); \
OPERATE(OPRD,||,0,1); \
OPRD = 0; \
OPERATE(1,||,OPRD,1); \
OPERATE(0,||,OPRD,0); \
OPERATE(OPRD,||,1,1); \
OPERATE(OPRD,||,0,0); \
OPRD = 0.1; \
OPERATE(1,&&,OPRD,1); \
OPERATE(0,&&,OPRD,0); \
OPERATE(OPRD,&&,1,1); \
OPERATE(OPRD,&&,0,0); \
OPRD = 0; \
OPERATE(1,&&,OPRD,0); \
OPERATE(0,&&,OPRD,0); \
OPERATE(OPRD,&&,1,0); \
OPERATE(OPRD,&&,0,0); \
} while (0)
int
main ()
{
short _Fract sf;
_Fract f;
long _Fract lf;
long long _Fract llf;
unsigned short _Fract usf;
unsigned _Fract uf;
unsigned long _Fract ulf;
unsigned long long _Fract ullf;
_Sat short _Fract Ssf;
_Sat _Fract Sf;
_Sat long _Fract Slf;
_Sat long long _Fract Sllf;
_Sat unsigned short _Fract Susf;
_Sat unsigned _Fract Suf;
_Sat unsigned long _Fract Sulf;
_Sat unsigned long long _Fract Sullf;
short _Accum sa;
_Accum a;
long _Accum la;
long long _Accum lla;
unsigned short _Accum usa;
unsigned _Accum ua;
unsigned long _Accum ula;
unsigned long long _Accum ulla;
_Sat short _Accum Ssa;
_Sat _Accum Sa;
_Sat long _Accum Sla;
_Sat long long _Accum Slla;
_Sat unsigned short _Accum Susa;
_Sat unsigned _Accum Sua;
_Sat unsigned long _Accum Sula;
_Sat unsigned long long _Accum Sulla;
/* C99 Section 6.5.{13,14} Logical operator. Constraints Each of the
operands shall have scalar type. Fixed-point types would obey this. */
FIXED_POINT_LOGICAL (sf);
FIXED_POINT_LOGICAL (f);
FIXED_POINT_LOGICAL (lf);
FIXED_POINT_LOGICAL (llf);
FIXED_POINT_LOGICAL (usf);
FIXED_POINT_LOGICAL (uf);
FIXED_POINT_LOGICAL (ulf);
FIXED_POINT_LOGICAL (ullf);
FIXED_POINT_LOGICAL (Ssf);
FIXED_POINT_LOGICAL (Sf);
FIXED_POINT_LOGICAL (Slf);
FIXED_POINT_LOGICAL (Sllf);
FIXED_POINT_LOGICAL (Susf);
FIXED_POINT_LOGICAL (Suf);
FIXED_POINT_LOGICAL (Sulf);
FIXED_POINT_LOGICAL (Sullf);
FIXED_POINT_LOGICAL (sa);
FIXED_POINT_LOGICAL (a);
FIXED_POINT_LOGICAL (la);
FIXED_POINT_LOGICAL (lla);
FIXED_POINT_LOGICAL (usa);
FIXED_POINT_LOGICAL (ua);
FIXED_POINT_LOGICAL (ula);
FIXED_POINT_LOGICAL (ulla);
FIXED_POINT_LOGICAL (Ssa);
FIXED_POINT_LOGICAL (Sa);
FIXED_POINT_LOGICAL (Sla);
FIXED_POINT_LOGICAL (Slla);
FIXED_POINT_LOGICAL (Susa);
FIXED_POINT_LOGICAL (Sua);
FIXED_POINT_LOGICAL (Sula);
FIXED_POINT_LOGICAL (Sulla);
return 0;
}
/* { dg-do run } */
/* { dg-options "-std=gnu99" } */
/* C99 6.5.3 Unary operators & and *.
Based on the test from ../dfp/. */
extern void abort (void);
#define UNARY_OPERATOR(TYPE,SUFFIX) \
do \
{ \
TYPE unary_d = 0.1 ## SUFFIX; \
TYPE* unary_dp; \
/* & operator. */ \
unary_dp = &(unary_d); \
/* * operator. */ \
unary_d = *(unary_dp); \
} while (0)
int
main ()
{
/* C99 6.5.3 Unary operators. */
UNARY_OPERATOR(short _Fract, hr);
UNARY_OPERATOR(_Fract, r);
UNARY_OPERATOR(long _Fract, lr);
UNARY_OPERATOR(long long _Fract, llr);
UNARY_OPERATOR(unsigned short _Fract, uhr);
UNARY_OPERATOR(unsigned _Fract, ur);
UNARY_OPERATOR(unsigned long _Fract, ulr);
UNARY_OPERATOR(unsigned long long _Fract, ullr);
UNARY_OPERATOR(_Sat short _Fract, hr);
UNARY_OPERATOR(_Sat _Fract, r);
UNARY_OPERATOR(_Sat long _Fract, lr);
UNARY_OPERATOR(_Sat long long _Fract, llr);
UNARY_OPERATOR(_Sat unsigned short _Fract, uhr);
UNARY_OPERATOR(_Sat unsigned _Fract, ur);
UNARY_OPERATOR(_Sat unsigned long _Fract, ulr);
UNARY_OPERATOR(_Sat unsigned long long _Fract, ullr);
UNARY_OPERATOR(short _Accum, hk);
UNARY_OPERATOR(_Accum, k);
UNARY_OPERATOR(long _Accum, lk);
UNARY_OPERATOR(long long _Accum, llk);
UNARY_OPERATOR(unsigned short _Accum, uhk);
UNARY_OPERATOR(unsigned _Accum, uk);
UNARY_OPERATOR(unsigned long _Accum, ulk);
UNARY_OPERATOR(unsigned long long _Accum, ullk);
UNARY_OPERATOR(_Sat short _Accum, hk);
UNARY_OPERATOR(_Sat _Accum, k);
UNARY_OPERATOR(_Sat long _Accum, lk);
UNARY_OPERATOR(_Sat long long _Accum, llk);
UNARY_OPERATOR(_Sat unsigned short _Accum, uhk);
UNARY_OPERATOR(_Sat unsigned _Accum, uk);
UNARY_OPERATOR(_Sat unsigned long _Accum, ulk);
UNARY_OPERATOR(_Sat unsigned long long _Accum, ullk);
return 0;
}
/* { dg-do run } */
/* { dg-options "-std=gnu99" } */
/* This test is based on the test from ../dfp/. */
#include <stdarg.h>
extern void abort (void);
struct S1
{
long _Fract a[0];
};
struct S2
{
struct
{
long _Fract e;
} b[0];
};
struct S3
{
union
{
long _Fract c;
} a[0];
};
struct S4
{
int a[0];
long _Fract b[0];
};
struct S5
{
union
{
long _Fract c[0];
} a;
};
int check_var (int z, ...)
{
long long result;
va_list ap;
va_start (ap, z);
va_arg (ap, struct S1);
result = va_arg (ap, long long);
va_end (ap);
return (result == 2LL);
}
int main ()
{
struct S1 s1;
struct S2 s2;
struct S3 s3;
struct S4 s4;
struct S5 s5;
if (check_var (2, s1, 2LL) == 0)
abort ();
if (check_var (2, s2, 2LL) == 0)
abort ();
if (check_var (2, s3, 2LL) == 0)
abort ();
if (check_var (2, s4, 2LL) == 0)
abort ();
if (check_var (2, s5, 2LL) == 0)
abort ();
return 0;
}
/* { dg-do compile } */
/* { dg-options "-O -Wall" } */
/* C99 6.5.2.3 Structure and union members.
If the first expression has qualified type, the result has the so-qualified
version of the type of the designated member.
Based on the test from ../dfp/. */
struct s {_Fract f; const long _Fract lf;};
struct sv { volatile _Fract f; volatile long _Fract lf; };
union u
{
const long _Fract lf;
_Fract f;
const struct s cs;
};
struct s s;
struct sv sv;
const struct s cs;
union u u;
const union u cu;
struct s g (struct s s)
{
return s;
}
union u h (union u u)
{
return u;
}
void f()
{
cs.f = 0.1r; /* { dg-error "assignment of read-only variable" } */
cs.lf = 0.2lr; /* { dg-error "assignment of read-only variable" } */
s.lf = 0.3lr; /* { dg-error "assignment of read-only member" } */
s.f = 0.4r;
u.f = 0.5r;
u.lf = 0.6lr; /* { dg-error "assignment of read-only member" } */
u.cs.f = 0.7r; /* { dg-error "assignment of read-only member" } */
u.cs.lf = 0.8lr; /* { dg-error "assignment of read-only member" } */
cu.f = 0.9r; /* { dg-error "assignment of read-only variable" } */
cu.lf = 0.01lr; /* { dg-error "assignment of read-only variable" } */
cu.cs.f = 0.02r; /* { dg-error "assignment of read-only variable" } */
cu.cs.lf = 0.03lr; /* { dg-error "assignment of read-only variable" } */
/* f().x is a valid postfix expression but is not an lvalue if
function f() returning a structure or union. */
g(s).f = 0.04r; /* { dg-error "lvalue required" } */
h(u).lf = 0.05lr; /* { dg-error "lvalue required" } */
/* Test assignment to volatile structure members. */
sv.f = 0.06r;
sv.lf = 0.07lr;
}
/* { dg-do compile } */
/* { dg-options "-std=gnu99" } */
/* N1169 6.3.1.3a - Fixed-point types (NEW CLAUSE).
Check if all types are ok. */
short _Fract q0;
_Fract q1;
long _Fract q2;
long long _Fract q3;
unsigned short _Fract q4;
unsigned _Fract q5;
unsigned long _Fract q6;
unsigned long long _Fract q7;
_Sat short _Fract sq0;
_Sat _Fract sq1;
_Sat long _Fract sq2;
_Sat long long _Fract sq3;
_Sat unsigned short _Fract sq4;
_Sat unsigned _Fract sq5;
_Sat unsigned long _Fract sq6;
_Sat unsigned long long _Fract sq7;
short _Accum a0;
_Accum a1;
long _Accum a2;
long long _Accum a3;
unsigned short _Accum a4;
unsigned _Accum a5;
unsigned long _Accum a6;
unsigned long long _Accum a7;
_Sat short _Accum sa0;
_Sat _Accum sa1;
_Sat long _Accum sa2;
_Sat long long _Accum sa3;
_Sat unsigned short _Accum sa4;
_Sat unsigned _Accum sa5;
_Sat unsigned long _Accum sa6;
_Sat unsigned long long _Accum sa7;
/* { dg-do run } */
/* { dg-options "-std=gnu99" } */
/* C99 6.5.3 Unary operators.
Check unary operators ++ -- + - !. */
extern void abort (void);
#define INCDEC(TYPE,POSTFIX) \
{ TYPE a = 0.0 ## POSTFIX; \
if (a++ != 0.0 ## POSTFIX) \
abort(); \
if (a != 1.0 ## POSTFIX) \
abort(); \
if (a-- != 1.0 ## POSTFIX) \
abort(); \
if (a != 0.0 ## POSTFIX) \
abort(); \
if (++a != 1.0 ## POSTFIX) \
abort(); \
if (a != 1.0 ## POSTFIX) \
abort(); \
if (--a != 0.0 ## POSTFIX) \
abort(); \
if (a != 0.0 ## POSTFIX) \
abort(); \
}
#define FRACT_INCDEC(TYPE,POSTFIX) \
{ TYPE a = -0.5 ## POSTFIX; \
if (a++ != -0.5 ## POSTFIX) \
abort(); \
if (a != 0.5 ## POSTFIX) \
abort(); \
if (a-- != 0.5 ## POSTFIX) \
abort(); \
if (a != -0.5 ## POSTFIX) \
abort(); \
if (++a != 0.5 ## POSTFIX) \
abort(); \
if (a != 0.5 ## POSTFIX) \
abort(); \
if (--a != -0.5 ## POSTFIX) \
abort(); \
if (a != -0.5 ## POSTFIX) \
abort(); \
}
#define FRACT_SAT_INCDEC(TYPE,POSTFIX) \
{ TYPE a = 0.9 ## POSTFIX; \
if (++a != 1.0 ## POSTFIX) \
abort(); \
a = -0.1 ## POSTFIX; \
if (--a != -0.5 ## POSTFIX - 0.5 ## POSTFIX) \
abort(); \
}
#define FRACT_SAT_UNS_INCDEC(TYPE,POSTFIX) \
{ TYPE a = 0.9 ## POSTFIX; \
if (++a != 1.0 ## POSTFIX) \
abort(); \
a = 0.1 ## POSTFIX; \
if (--a != 0.0 ## POSTFIX) \
abort(); \
}
#define PLUS(TYPE,POSTFIX) \
{ TYPE a = 0.1 ## POSTFIX; \
if (+a != 0.1 ## POSTFIX) \
abort(); \
}
#define NEG(TYPE,POSTFIX) \
{ TYPE a = -0.1 ## POSTFIX; \
if (-a != 0.1 ## POSTFIX) \
abort(); \
}
#define FRACT_SAT_NEG(TYPE,POSTFIX) \
{ TYPE a = -0.5 ## POSTFIX - 0.5 ## POSTFIX; \
if (-a != 1.0 ## POSTFIX) \
abort(); \
}
#define UNS_NEG(TYPE,POSTFIX) \
{ TYPE a = 0.0 ## POSTFIX; \
if (-a != 0.0 ## POSTFIX) \
abort(); \
}
#define FRACT_SAT_UNS_NEG(TYPE,POSTFIX) \
{ TYPE a = 0.5 ## POSTFIX; \
if (-a != 0.0 ## POSTFIX) \
abort(); \
}
#define LOGNEG(TYPE,POSTFIX) \
{ TYPE a = 0.0 ## POSTFIX; \
TYPE b = 0.1 ## POSTFIX; \
if (!a != 1) \
abort(); \
if (!b != 0) \
abort(); \
}
int main ()
{
FRACT_INCDEC(short _Fract, hr);
FRACT_INCDEC(_Fract, r);
FRACT_INCDEC(long _Fract, lr);
FRACT_INCDEC(long long _Fract, llr);
FRACT_INCDEC(_Sat short _Fract, hr);
FRACT_INCDEC(_Sat _Fract, r);
FRACT_INCDEC(_Sat long _Fract, lr);
FRACT_INCDEC(_Sat long long _Fract, llr);
INCDEC(short _Accum, hk);
INCDEC(_Accum, k);
INCDEC(long _Accum, lk);
INCDEC(long long _Accum, llk);
INCDEC(unsigned short _Accum, uhk);
INCDEC(unsigned _Accum, uk);
INCDEC(unsigned long _Accum, ulk);
INCDEC(unsigned long long _Accum, ullk);
INCDEC(_Sat short _Accum, hk);
INCDEC(_Sat _Accum, k);
INCDEC(_Sat long _Accum, lk);
INCDEC(_Sat long long _Accum, llk);
INCDEC(_Sat unsigned short _Accum, uhk);
INCDEC(_Sat unsigned _Accum, uk);
INCDEC(_Sat unsigned long _Accum, ulk);
INCDEC(_Sat unsigned long long _Accum, ullk);
FRACT_SAT_INCDEC(_Sat short _Fract, hr);
FRACT_SAT_INCDEC(_Sat _Fract, r);
FRACT_SAT_INCDEC(_Sat long _Fract, lr);
FRACT_SAT_INCDEC(_Sat long long _Fract, llr);
FRACT_SAT_UNS_INCDEC(_Sat unsigned short _Fract, uhr);
FRACT_SAT_UNS_INCDEC(_Sat unsigned _Fract, ur);
FRACT_SAT_UNS_INCDEC(_Sat unsigned long _Fract, ulr);
FRACT_SAT_UNS_INCDEC(_Sat unsigned long long _Fract, ullr);
PLUS(short _Fract, hr);
PLUS(_Fract, r);
PLUS(long _Fract, lr);
PLUS(long long _Fract, llr);
PLUS(unsigned short _Fract, uhr);
PLUS(unsigned _Fract, ur);
PLUS(unsigned long _Fract, ulr);
PLUS(unsigned long long _Fract, ullr);
PLUS(_Sat short _Fract, hr);
PLUS(_Sat _Fract, r);
PLUS(_Sat long _Fract, lr);
PLUS(_Sat long long _Fract, llr);
PLUS(_Sat unsigned short _Fract, uhr);
PLUS(_Sat unsigned _Fract, ur);
PLUS(_Sat unsigned long _Fract, ulr);
PLUS(_Sat unsigned long long _Fract, ullr);
PLUS(short _Accum, hk);
PLUS(_Accum, k);
PLUS(long _Accum, lk);
PLUS(long long _Accum, llk);
PLUS(unsigned short _Accum, uhk);
PLUS(unsigned _Accum, uk);
PLUS(unsigned long _Accum, ulk);
PLUS(unsigned long long _Accum, ullk);
PLUS(_Sat short _Accum, hk);
PLUS(_Sat _Accum, k);
PLUS(_Sat long _Accum, lk);
PLUS(_Sat long long _Accum, llk);
PLUS(_Sat unsigned short _Accum, uhk);
PLUS(_Sat unsigned _Accum, uk);
PLUS(_Sat unsigned long _Accum, ulk);
PLUS(_Sat unsigned long long _Accum, ullk);
NEG(short _Fract, hr);
NEG(_Fract, r);
NEG(long _Fract, lr);
NEG(long long _Fract, llr);
NEG(_Sat short _Fract, hr);
NEG(_Sat _Fract, r);
NEG(_Sat long _Fract, lr);
NEG(_Sat long long _Fract, llr);
NEG(short _Accum, hk);
NEG(_Accum, k);
NEG(long _Accum, lk);
NEG(long long _Accum, llk);
NEG(_Sat short _Accum, hk);
NEG(_Sat _Accum, k);
NEG(_Sat long _Accum, lk);
NEG(_Sat long long _Accum, llk);
FRACT_SAT_NEG(_Sat short _Fract, hr);
FRACT_SAT_NEG(_Sat _Fract, r);
FRACT_SAT_NEG(_Sat long _Fract, lr);
FRACT_SAT_NEG(_Sat long long _Fract, llr);
UNS_NEG(short _Fract, hr);
UNS_NEG(_Fract, r);
UNS_NEG(long _Fract, lr);
UNS_NEG(long long _Fract, llr);
UNS_NEG(_Sat short _Fract, hr);
UNS_NEG(_Sat _Fract, r);
UNS_NEG(_Sat long _Fract, lr);
UNS_NEG(_Sat long long _Fract, llr);
UNS_NEG(short _Accum, hk);
UNS_NEG(_Accum, k);
UNS_NEG(long _Accum, lk);
UNS_NEG(long long _Accum, llk);
UNS_NEG(_Sat short _Accum, hk);
UNS_NEG(_Sat _Accum, k);
UNS_NEG(_Sat long _Accum, lk);
UNS_NEG(_Sat long long _Accum, llk);
FRACT_SAT_UNS_NEG(_Sat unsigned short _Fract, uhr);
FRACT_SAT_UNS_NEG(_Sat unsigned _Fract, ur);
FRACT_SAT_UNS_NEG(_Sat unsigned long _Fract, ulr);
FRACT_SAT_UNS_NEG(_Sat unsigned long long _Fract, ullr);
LOGNEG(short _Fract, hr);
LOGNEG(_Fract, r);
LOGNEG(long _Fract, lr);
LOGNEG(long long _Fract, llr);
LOGNEG(unsigned short _Fract, uhr);
LOGNEG(unsigned _Fract, ur);
LOGNEG(unsigned long _Fract, ulr);
LOGNEG(unsigned long long _Fract, ullr);
LOGNEG(_Sat short _Fract, hr);
LOGNEG(_Sat _Fract, r);
LOGNEG(_Sat long _Fract, lr);
LOGNEG(_Sat long long _Fract, llr);
LOGNEG(_Sat unsigned short _Fract, uhr);
LOGNEG(_Sat unsigned _Fract, ur);
LOGNEG(_Sat unsigned long _Fract, ulr);
LOGNEG(_Sat unsigned long long _Fract, ullr);
LOGNEG(short _Accum, hk);
LOGNEG(_Accum, k);
LOGNEG(long _Accum, lk);
LOGNEG(long long _Accum, llk);
LOGNEG(unsigned short _Accum, uhk);
LOGNEG(unsigned _Accum, uk);
LOGNEG(unsigned long _Accum, ulk);
LOGNEG(unsigned long long _Accum, ullk);
LOGNEG(_Sat short _Accum, hk);
LOGNEG(_Sat _Accum, k);
LOGNEG(_Sat long _Accum, lk);
LOGNEG(_Sat long long _Accum, llk);
LOGNEG(_Sat unsigned short _Accum, uhk);
LOGNEG(_Sat unsigned _Accum, uk);
LOGNEG(_Sat unsigned long _Accum, ulk);
LOGNEG(_Sat unsigned long long _Accum, ullk);
return 0;
}
/* { dg-do run } */
/* { dg-options "-std=gnu99" } */
/* Cast to union is a GNU C extension.
Based on the test from ../dfp/. */
extern void abort (void);
union u
{
long _Fract lf;
double d;
};
union n
{
double d;
_Fract f;
};
int main ()
{
static union u u1 = { 0.1lr };
static union u u2 = { 0.2lr };
static union u u4 = { 0.0 };
static union n n1 = { 0.3r };
static union n n2 = { 3.25 };
long _Fract lf;
_Fract f;
double d;
if (u1.lf != 0.1lr)
abort ();
if (u2.lf != 0.2lr)
abort ();
/* cast fixed-point to union type. */
lf = 0.4lr;
f = 0.5r;
d = 3.25;
u4 = (union u) lf;
if (u4.lf != 0.4lr)
abort ();
u4 = (union u) d;
if (u4.d != 3.25)
abort ();
n1 = (union n) f;
if (n1.f != 0.5r)
abort ();
n1 = (union n)d;
if (n1.d != 3.25)
abort ();
return 0;
}
/* { dg-do compile { target {! fixed_point} } } */
/* { dg-options "-std=gnu99" } */
_Fract w; /* { dg-error "not supported" "reject fixed-point" } */
_Sat _Fract x; /* { dg-error "not supported" "reject fixed-point" } */
_Accum y; /* { dg-error "not supported" "reject fixed-point" } */
_Sat _Accum z; /* { dg-error "not supported" "reject fixed-point" } */
/* { dg-do compile { target {fixed_point} } } */
/* { dg-mips-options "-O2 -mips32r2 -mdsp" } */
/* { dg-final { scan-assembler-times "\tdpaq_sa.l.w\t\\\$ac" 3 } } */
_Sat long long _Fract
f1 (_Sat long _Fract x, _Sat long _Fract y, _Sat long long _Fract z)
{
return (_Sat long long _Fract) x * y + z;
}
_Sat long long _Fract
f2 (_Sat long _Fract x, _Sat long _Fract y, _Sat long long _Fract z)
{
return z + (_Sat long long _Fract) y * x;
}
_Sat long long _Fract
f3 (_Sat long _Fract x, _Sat long _Fract y, _Sat long long _Fract z)
{
_Sat long long _Fract t = (_Sat long long _Fract) x * y;
int temp = 5;
if (temp == 5)
z = t + z; /* Need to put z at the end. GCC does not swap operands to
match the ssmadd pattern, because types are saturating. */
return z;
}
long long _Fract
f4 (long _Fract x, long _Fract y, long long _Fract z)
{
return (long long _Fract) x * y + z;
}
long long _Fract
f5 (long _Fract x, long _Fract y, long long _Fract z)
{
return z + (long long _Fract) y * x;
}
long long _Fract
f6 (long _Fract x, long _Fract y, long long _Fract z)
{
long long _Fract t = (long long _Fract) x * y;
int temp = 5;
if (temp == 5)
z = t + z; /* Need to put z at the end. GCC does not swap operands to
match the ssmadd pattern, because types are saturating. */
return z;
}
/* { dg-do compile { target {fixed_point} } } */
/* { dg-mips-options "-O2 -mips32r2 -mdsp" } */
/* { dg-final { scan-assembler-times "\tdpsq_sa.l.w\t\\\$ac" 2 } } */
_Sat long long _Fract
f1 (_Sat long _Fract x, _Sat long _Fract y, _Sat long long _Fract z)
{
return z - (_Sat long long _Fract) x * y;
}
_Sat long long _Fract
f2 (_Sat long _Fract x, _Sat long _Fract y, _Sat long long _Fract z)
{
_Sat long long _Fract t = (_Sat long long _Fract) x * y;
int temp = 5;
if (temp == 5)
z -= t;
return z;
}
long long _Fract
f3 (long _Fract x, long _Fract y, long long _Fract z)
{
return z - (long long _Fract) x * y;
}
long long _Fract
f4 (long _Fract x, long _Fract y, long long _Fract z)
{
long long _Fract t = (long long _Fract) x * y;
int temp = 5;
if (temp == 5)
z -= t;
return z;
}
/* Test scalar fixed-point instructions */
/* { dg-do compile { target {fixed_point} } } */
/* { dg-mips-options "-march=mips32r2 -mdspr2 -O2" } */
/* { dg-final { scan-assembler-times "\taddu\t" 10 } } */
/* { dg-final { scan-assembler-times "\tsubu\t" 10 } } */
/* { dg-final { scan-assembler "\taddu_s.qb\t" } } */
/* { dg-final { scan-assembler-times "\taddu_s.ph\t" 2 } } */
/* { dg-final { scan-assembler-times "\taddq_s.ph\t" 2 } } */
/* { dg-final { scan-assembler-times "\taddq_s.w\t" 2 } } */
/* { dg-final { scan-assembler "\tsubu_s.qb\t" } } */
/* { dg-final { scan-assembler-times "\tsubu_s.ph\t" 2 } } */
/* { dg-final { scan-assembler-times "\tsubq_s.ph\t" 2 } } */
/* { dg-final { scan-assembler-times "\tsubq_s.w\t" 2 } } */
/* { dg-final { scan-assembler-times "\tmulq_rs.ph\t" 1 } } */
/* { dg-final { scan-assembler-times "\tmulq_rs.w\t" 1 } } */
short _Fract non_sat_test1 (short _Fract a, short _Fract b)
{
return a + b;
}
_Fract non_sat_test2 (_Fract a, _Fract b)
{
return a + b;
}
long _Fract non_sat_test3 (long _Fract a, long _Fract b)
{
return a + b;
}
unsigned short _Fract non_sat_test4 (unsigned short _Fract a,
unsigned short _Fract b)
{
return a + b;
}
unsigned _Fract non_sat_test5 (unsigned _Fract a, unsigned _Fract b)
{
return a + b;
}
unsigned long _Fract non_sat_test6 (unsigned long _Fract a,
unsigned long _Fract b)
{
return a + b;
}
short _Accum non_sat_test7 (short _Accum a, short _Accum b)
{
return a + b;
}
_Accum non_sat_test8 (_Accum a, _Accum b)
{
return a + b;
}
unsigned short _Accum non_sat_test9 (unsigned short _Accum a,
unsigned short _Accum b)
{
return a + b;
}
unsigned _Accum non_sat_test10 (unsigned _Accum a, unsigned _Accum b)
{
return a + b;
}
short _Fract non_sat_test11 (short _Fract a, short _Fract b)
{
return a - b;
}
_Fract non_sat_test12 (_Fract a, _Fract b)
{
return a - b;
}
long _Fract non_sat_test13 (long _Fract a, long _Fract b)
{
return a - b;
}
unsigned short _Fract non_sat_test14 (unsigned short _Fract a,
unsigned short _Fract b)
{
return a - b;
}
unsigned _Fract non_sat_test15 (unsigned _Fract a, unsigned _Fract b)
{
return a - b;
}
unsigned long _Fract non_sat_test16 (unsigned long _Fract a,
unsigned long _Fract b)
{
return a - b;
}
short _Accum non_sat_test17 (short _Accum a, short _Accum b)
{
return a - b;
}
_Accum non_sat_test18 (_Accum a, _Accum b)
{
return a - b;
}
unsigned short _Accum non_sat_test19 (unsigned short _Accum a,
unsigned short _Accum b)
{
return a - b;
}
unsigned _Accum non_sat_test20 (unsigned _Accum a, unsigned _Accum b)
{
return a - b;
}
_Sat unsigned short _Fract test1 (_Sat unsigned short _Fract a,
_Sat unsigned short _Fract b)
{
return a + b;
}
_Sat unsigned _Fract test2 (_Sat unsigned _Fract a, _Sat unsigned _Fract b)
{
return a + b;
}
_Sat unsigned short _Accum test3 (_Sat unsigned short _Accum a,
_Sat unsigned short _Accum b)
{
return a + b;
}
_Sat _Fract test4 (_Sat _Fract a, _Sat _Fract b)
{
return a + b;
}
_Sat long _Fract test5 (_Sat long _Fract a, _Sat long _Fract b)
{
return a + b;
}
_Sat short _Accum test6 (_Sat short _Accum a, _Sat short _Accum b)
{
return a + b;
}
_Sat _Accum test7 (_Sat _Accum a, _Sat _Accum b)
{
return a + b;
}
_Sat unsigned short _Fract test8 (_Sat unsigned short _Fract a,
_Sat unsigned short _Fract b)
{
return a - b;
}
_Sat unsigned _Fract test9 (_Sat unsigned _Fract a, _Sat unsigned _Fract b)
{
return a - b;
}
_Sat unsigned short _Accum test10 (_Sat unsigned short _Accum a,
_Sat unsigned short _Accum b)
{
return a - b;
}
_Sat _Fract test11 (_Sat _Fract a, _Sat _Fract b)
{
return a - b;
}
_Sat long _Fract test12 (_Sat long _Fract a, _Sat long _Fract b)
{
return a - b;
}
_Sat short _Accum test13 (_Sat short _Accum a, _Sat short _Accum b)
{
return a - b;
}
_Sat _Accum test14 (_Sat _Accum a, _Sat _Accum b)
{
return a - b;
}
_Sat _Fract test15 (_Sat _Fract a, _Sat _Fract b)
{
return a * b;
}
_Sat long _Fract test16 (_Sat long _Fract a, _Sat long _Fract b)
{
return a * b;
}
_Fract test17 (_Fract a, _Fract b)
{
return a * b;
}
long _Fract test18 (long _Fract a, long _Fract b)
{
return a * b;
}
/* Test vector fixed-point instructions */
/* { dg-do compile { target {fixed_point} } } */
/* { dg-mips-options "-march=mips32r2 -mdspr2 -O2" } */
/* { dg-final { scan-assembler-times "\taddq_s.ph\t" 2 } } */
/* { dg-final { scan-assembler-times "\tsubq_s.ph\t" 2 } } */
/* { dg-final { scan-assembler-times "\taddu_s.qb\t" 1 } } */
/* { dg-final { scan-assembler-times "\taddu_s.ph\t" 2 } } */
/* { dg-final { scan-assembler-times "\tsubu_s.qb\t" 1 } } */
/* { dg-final { scan-assembler-times "\tsubu_s.ph\t" 2 } } */
/* { dg-final { scan-assembler-times "\tmulq_rs.ph\t" 1 } } */
typedef _Sat unsigned short _Fract sat_v4uqq __attribute__ ((vector_size(4)));
typedef _Sat unsigned _Fract sat_v2uhq __attribute__ ((vector_size(4)));
typedef _Sat unsigned short _Accum sat_v2uha __attribute__ ((vector_size(4)));
typedef _Sat _Fract sat_v2hq __attribute__ ((vector_size(4)));
typedef _Sat short _Accum sat_v2ha __attribute__ ((vector_size(4)));
typedef unsigned short _Fract v4uqq __attribute__ ((vector_size(4)));
typedef unsigned _Fract v2uhq __attribute__ ((vector_size(4)));
typedef unsigned short _Accum v2uha __attribute__ ((vector_size(4)));
typedef _Fract v2hq __attribute__ ((vector_size(4)));
typedef short _Accum v2ha __attribute__ ((vector_size(4)));
sat_v2hq test1 (sat_v2hq a, sat_v2hq b)
{
return a + b;
}
sat_v2ha test2 (sat_v2ha a, sat_v2ha b)
{
return a + b;
}
sat_v2hq test3 (sat_v2hq a, sat_v2hq b)
{
return a - b;
}
sat_v2ha test4 (sat_v2ha a, sat_v2ha b)
{
return a - b;
}
sat_v4uqq test5 (sat_v4uqq a, sat_v4uqq b)
{
return a + b;
}
sat_v2uhq test6 (sat_v2uhq a, sat_v2uhq b)
{
return a + b;
}
sat_v2uha test7 (sat_v2uha a, sat_v2uha b)
{
return a + b;
}
sat_v4uqq test8 (sat_v4uqq a, sat_v4uqq b)
{
return a - b;
}
sat_v2uhq test9 (sat_v2uhq a, sat_v2uhq b)
{
return a - b;
}
sat_v2uha test10 (sat_v2uha a, sat_v2uha b)
{
return a - b;
}
sat_v2hq test11 (sat_v2hq a, sat_v2hq b)
{
return a * b;
}
v2hq test12 (v2hq a, v2hq b)
{
return a + b;
}
v2hq test13 (v2hq a, v2hq b)
{
return a - b;
}
v2hq test14 (v2hq a, v2hq b)
{
return a * b;
}
v2ha test15 (v2ha a, v2ha b)
{
return a + b;
}
v2ha test16 (v2ha a, v2ha b)
{
return a - b;
}
v4uqq test17 (v4uqq a, v4uqq b)
{
return a + b;
}
v4uqq test18 (v4uqq a, v4uqq b)
{
return a - b;
}
v2uhq test19 (v2uhq a, v2uhq b)
{
return a + b;
}
v2uhq test20 (v2uhq a, v2uhq b)
{
return a - b;
}
v2uha test21 (v2uha a, v2uha b)
{
return a + b;
}
v2uha test22 (v2uha a, v2uha b)
{
return a - b;
}
......@@ -1271,6 +1271,14 @@ proc check_effective_target_large_long_double { } {
}]
}
# Return 1 if the target supports compiling fixed-point,
# 0 otherwise.
proc check_effective_target_fixed_point { } {
return [check_no_compiler_messages fixed_point object {
_Sat _Fract x; _Sat _Accum y;
}]
}
# Return 1 if the target supports compiling decimal floating point,
# 0 otherwise.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment