mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-12-05 15:15:44 +00:00
1154 lines
26 KiB
C
1154 lines
26 KiB
C
/* SPDX-License-Identifier: BSD-2-Clause */
|
|
|
|
/**
|
|
* @file
|
|
*
|
|
* @ingroup CompilerUnitBuiltins
|
|
*/
|
|
|
|
/*
|
|
* Copyright (C) 2023 embedded brains GmbH & Co. KG
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
/*
|
|
* This file is part of the RTEMS quality process and was automatically
|
|
* generated. If you find something that needs to be fixed or
|
|
* worded better please post a report or patch to an RTEMS mailing list
|
|
* or raise a bug report:
|
|
*
|
|
* https://www.rtems.org/bugs.html
|
|
*
|
|
* For information on updating and regenerating please refer to the How-To
|
|
* section in the Software Requirements Engineering chapter of the
|
|
* RTEMS Software Engineering manual. The manual is provided as a part of
|
|
* a release. For development sources please refer to the online
|
|
* documentation at:
|
|
*
|
|
* https://docs.rtems.org
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include "config.h"
|
|
#endif
|
|
|
|
#include <setjmp.h>
|
|
#include <stdint.h>
|
|
|
|
#include "../validation/tx-support.h"
|
|
|
|
#include <rtems/test.h>
|
|
|
|
/**
|
|
* @defgroup CompilerUnitBuiltins spec:/compiler/unit/builtins
|
|
*
|
|
* @ingroup TestsuitesUnitNoClock0
|
|
*
|
|
* @brief These unit tests check compiler builtins.
|
|
*
|
|
* Explicitly test the 64-bit integer division and modulo operations. They are
|
|
* essential for the timekeeping services. On most 32-bit targets, they need a
|
|
* software implementation.
|
|
*
|
|
* This test case performs the following actions:
|
|
*
|
|
* - Check the return value of __builtin_clz() for a sample set of inputs.
|
|
*
|
|
* - Check the return value of __builtin_clzll() for a sample set of inputs.
|
|
*
|
|
* - Check the return value of __builtin_ctz() for a sample set of inputs.
|
|
*
|
|
* - Check the return value of __builtin_ctzll() for a sample set of inputs.
|
|
*
|
|
* - Check the return value of __builtin_ffs() for a sample set of inputs.
|
|
*
|
|
* - Check the return value of __builtin_ffsll() for a sample set of inputs.
|
|
*
|
|
* - Check the return value of __builtin_parity() for a sample set of inputs.
|
|
*
|
|
* - Check the return value of __builtin_parityll() for a sample set of inputs.
|
|
*
|
|
* - Check the return value of __builtin_popcount() for a sample set of inputs.
|
|
*
|
|
* - Check the return value of __builtin_popcountll() for a sample set of
|
|
* inputs.
|
|
*
|
|
* - Check the return value of __builtin_bswap32() for a sample set of inputs.
|
|
*
|
|
* - Check the return value of __builtin_bswap64() for a sample set of inputs.
|
|
*
|
|
* - Check signed 64-bit comparisons for a sample set of values.
|
|
*
|
|
* - Check unsigned 64-bit comparisons for a sample set of values.
|
|
*
|
|
* - Check signed 64-bit arithmetic left shift for a sample set of values.
|
|
*
|
|
* - Check signed 64-bit arithmetic right shift for a sample set of values.
|
|
*
|
|
* - Check unsigned 64-bit logical right shift for a sample set of values.
|
|
*
|
|
* - Check signed 64-bit multiplication for a sample set of values.
|
|
*
|
|
* - Check signed 64-bit negation for a sample set of values.
|
|
*
|
|
* - Check signed 64-bit divisions for a sample set of values.
|
|
*
|
|
* - Check unsigned 64-bit divisions for a sample set of values.
|
|
*
|
|
* - Check signed 64-bit modulo operations for a sample set of values.
|
|
*
|
|
* - Check unsigned 64-bit modulo operations for a sample set of values.
|
|
*
|
|
* @{
|
|
*/
|
|
|
|
#if __LONG_MAX__ == 0x7fffffffL && !defined(__aarch64__)
|
|
#define TEST_UDIVMODDI4
|
|
#endif
|
|
|
|
#if defined(TEST_UDIVMODDI4)
|
|
uint64_t __udivmoddi4( uint64_t n, uint64_t d, uint64_t *r );
|
|
#endif
|
|
|
|
#if defined(TEST_UDIVMODDI4) && defined(__arm__)
|
|
/*
|
|
* Here __aeabi_uldivmod() may be used to carry out integer division
|
|
* operations even though the reminder is unused. This function is
|
|
* implemented by __udivmoddi4() which may never get called without a
|
|
* reminder for compiler generated code.
|
|
*/
|
|
#define TEST_UDIVMODDI4_WITHOUT_REMINDER
|
|
#endif
|
|
|
|
static bool do_longjmp;
|
|
|
|
static jmp_buf exception_return_context;
|
|
|
|
static void Fatal(
|
|
rtems_fatal_source source,
|
|
rtems_fatal_code code,
|
|
void *arg
|
|
)
|
|
{
|
|
(void) code;
|
|
|
|
if ( source == RTEMS_FATAL_SOURCE_EXCEPTION && do_longjmp ) {
|
|
do_longjmp = false;
|
|
_ISR_Set_level( 0 );
|
|
longjmp( arg, 1 );
|
|
}
|
|
}
|
|
|
|
static void CompilerUnitBuiltins_Setup( void )
|
|
{
|
|
SetFatalHandler( Fatal, exception_return_context );
|
|
}
|
|
|
|
static void CompilerUnitBuiltins_Setup_Wrap( void *arg )
|
|
{
|
|
(void) arg;
|
|
CompilerUnitBuiltins_Setup();
|
|
}
|
|
|
|
static void CompilerUnitBuiltins_Teardown( void )
|
|
{
|
|
SetFatalHandler( NULL, NULL );
|
|
}
|
|
|
|
static void CompilerUnitBuiltins_Teardown_Wrap( void *arg )
|
|
{
|
|
(void) arg;
|
|
CompilerUnitBuiltins_Teardown();
|
|
}
|
|
|
|
static T_fixture CompilerUnitBuiltins_Fixture = {
|
|
.setup = CompilerUnitBuiltins_Setup_Wrap,
|
|
.stop = NULL,
|
|
.teardown = CompilerUnitBuiltins_Teardown_Wrap,
|
|
.scope = NULL,
|
|
.initial_context = NULL
|
|
};
|
|
|
|
/**
|
|
* @brief Check the return value of __builtin_clz() for a sample set of inputs.
|
|
*/
|
|
static void CompilerUnitBuiltins_Action_0( void )
|
|
{
|
|
volatile unsigned int n;
|
|
|
|
n = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( n );
|
|
|
|
n = 1U;
|
|
T_eq_int( __builtin_clz( n ), 31 );
|
|
|
|
n = 1U << 31;
|
|
T_eq_int( __builtin_clz( n ), 0 );
|
|
|
|
n = ~0U;
|
|
T_eq_int( __builtin_clz( n ), 0 );
|
|
}
|
|
|
|
/**
|
|
* @brief Check the return value of __builtin_clzll() for a sample set of
|
|
* inputs.
|
|
*/
|
|
static void CompilerUnitBuiltins_Action_1( void )
|
|
{
|
|
volatile unsigned long long n;
|
|
|
|
n = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( n );
|
|
|
|
n = 1ULL;
|
|
T_eq_int( __builtin_clzll( n ), 63 );
|
|
|
|
n = 1ULL << 31;
|
|
T_eq_int( __builtin_clzll( n ), 32 );
|
|
|
|
n = 1ULL << 32;
|
|
T_eq_int( __builtin_clzll( n ), 31 );
|
|
|
|
n = 1ULL << 63;
|
|
T_eq_int( __builtin_clzll( n ), 0 );
|
|
|
|
n = ~0ULL;
|
|
T_eq_int( __builtin_clzll( n ), 0 );
|
|
}
|
|
|
|
/**
|
|
* @brief Check the return value of __builtin_ctz() for a sample set of inputs.
|
|
*/
|
|
static void CompilerUnitBuiltins_Action_2( void )
|
|
{
|
|
volatile unsigned int n;
|
|
|
|
n = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( n );
|
|
|
|
n = 1U;
|
|
T_eq_int( __builtin_ctz( n ), 0 );
|
|
|
|
n = 1U << 31;
|
|
T_eq_int( __builtin_ctz( n ), 31 );
|
|
|
|
n = ~0U;
|
|
T_eq_int( __builtin_ctz( n ), 0 );
|
|
}
|
|
|
|
/**
|
|
* @brief Check the return value of __builtin_ctzll() for a sample set of
|
|
* inputs.
|
|
*/
|
|
static void CompilerUnitBuiltins_Action_3( void )
|
|
{
|
|
volatile unsigned long long n;
|
|
|
|
n = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( n );
|
|
|
|
n = 1ULL;
|
|
T_eq_int( __builtin_ctzll( n ), 0 );
|
|
|
|
n = 1ULL << 31;
|
|
T_eq_int( __builtin_ctzll( n ), 31 );
|
|
|
|
n = 1ULL << 32;
|
|
T_eq_int( __builtin_ctzll( n ), 32 );
|
|
|
|
n = 1ULL << 63;
|
|
T_eq_int( __builtin_ctzll( n ), 63 );
|
|
|
|
n = ~0ULL;
|
|
T_eq_int( __builtin_ctzll( n ), 0 );
|
|
}
|
|
|
|
/**
|
|
* @brief Check the return value of __builtin_ffs() for a sample set of inputs.
|
|
*/
|
|
static void CompilerUnitBuiltins_Action_4( void )
|
|
{
|
|
volatile unsigned int n;
|
|
|
|
n = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( n );
|
|
|
|
n = 1U;
|
|
T_eq_int( __builtin_ffs( n ), 1 );
|
|
|
|
n = 1U << 31;
|
|
T_eq_int( __builtin_ffs( n ), 32 );
|
|
|
|
n = 0U;
|
|
T_eq_int( __builtin_ffs( n ), 0 );
|
|
}
|
|
|
|
/**
|
|
* @brief Check the return value of __builtin_ffsll() for a sample set of
|
|
* inputs.
|
|
*/
|
|
static void CompilerUnitBuiltins_Action_5( void )
|
|
{
|
|
volatile unsigned long long n;
|
|
|
|
n = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( n );
|
|
|
|
n = 1ULL;
|
|
T_eq_int( __builtin_ffsll( n ), 1 );
|
|
|
|
n = 1ULL << 31;
|
|
T_eq_int( __builtin_ffsll( n ), 32 );
|
|
|
|
n = 1ULL << 32;
|
|
T_eq_int( __builtin_ffsll( n ), 33 );
|
|
|
|
n = 1ULL << 63;
|
|
T_eq_int( __builtin_ffsll( n ), 64 );
|
|
|
|
n = 0ULL;
|
|
T_eq_int( __builtin_ffsll( n ), 0 );
|
|
}
|
|
|
|
/**
|
|
* @brief Check the return value of __builtin_parity() for a sample set of
|
|
* inputs.
|
|
*/
|
|
static void CompilerUnitBuiltins_Action_6( void )
|
|
{
|
|
volatile unsigned int n;
|
|
|
|
n = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( n );
|
|
|
|
n = 1U;
|
|
T_eq_int( __builtin_parity( n ), 1 );
|
|
|
|
n = ~0U;
|
|
T_eq_int( __builtin_parity( n ), 0 );
|
|
}
|
|
|
|
/**
|
|
* @brief Check the return value of __builtin_parityll() for a sample set of
|
|
* inputs.
|
|
*/
|
|
static void CompilerUnitBuiltins_Action_7( void )
|
|
{
|
|
volatile unsigned long long n;
|
|
|
|
n = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( n );
|
|
|
|
n = 1ULL;
|
|
T_eq_int( __builtin_parityll( n ), 1 );
|
|
|
|
n = ~0ULL;
|
|
T_eq_int( __builtin_parityll( n ), 0 );
|
|
}
|
|
|
|
/**
|
|
* @brief Check the return value of __builtin_popcount() for a sample set of
|
|
* inputs.
|
|
*/
|
|
static void CompilerUnitBuiltins_Action_8( void )
|
|
{
|
|
volatile unsigned int n;
|
|
|
|
n = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( n );
|
|
|
|
n = 0U;
|
|
T_eq_int( __builtin_popcount( n ), 0 );
|
|
|
|
n = 1U;
|
|
T_eq_int( __builtin_popcount( n ), 1 );
|
|
|
|
n = ~0U;
|
|
T_eq_int( __builtin_popcount( n ), 32 );
|
|
}
|
|
|
|
/**
|
|
* @brief Check the return value of __builtin_popcountll() for a sample set of
|
|
* inputs.
|
|
*/
|
|
static void CompilerUnitBuiltins_Action_9( void )
|
|
{
|
|
volatile unsigned long long n;
|
|
|
|
n = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( n );
|
|
|
|
n = 0ULL;
|
|
T_eq_int( __builtin_popcountll( n ), 0 );
|
|
|
|
n = 1ULL;
|
|
T_eq_int( __builtin_popcountll( n ), 1 );
|
|
|
|
n = ~0ULL;
|
|
T_eq_int( __builtin_popcountll( n ), 64 );
|
|
}
|
|
|
|
/**
|
|
* @brief Check the return value of __builtin_bswap32() for a sample set of
|
|
* inputs.
|
|
*/
|
|
static void CompilerUnitBuiltins_Action_10( void )
|
|
{
|
|
volatile uint32_t n;
|
|
|
|
n = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( n );
|
|
|
|
n = UINT32_C( 0 );
|
|
T_eq_u32( __builtin_bswap32( n ), n );
|
|
|
|
n = UINT32_C( 1 );
|
|
T_eq_u32( __builtin_bswap32( n ), n << 24 );
|
|
|
|
n = UINT32_C( 0x12345678 );
|
|
T_eq_u32( __builtin_bswap32( n ), UINT32_C( 0x78563412 ) );
|
|
|
|
n = ~UINT32_C( 0 );
|
|
T_eq_u32( __builtin_bswap32( n ), n );
|
|
}
|
|
|
|
/**
|
|
* @brief Check the return value of __builtin_bswap64() for a sample set of
|
|
* inputs.
|
|
*/
|
|
static void CompilerUnitBuiltins_Action_11( void )
|
|
{
|
|
volatile uint64_t n;
|
|
|
|
n = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( n );
|
|
|
|
n = UINT64_C( 0 );
|
|
T_eq_u64( __builtin_bswap64( n ), n );
|
|
|
|
n = UINT64_C( 1 );
|
|
T_eq_u64( __builtin_bswap64( n ), n << 56 );
|
|
|
|
n = UINT64_C( 0x123456789abcdef0 );
|
|
T_eq_u64( __builtin_bswap64( n ), UINT64_C( 0xf0debc9a78563412 ) );
|
|
|
|
n = ~UINT64_C( 0 );
|
|
T_eq_u64( __builtin_bswap64( n ), n );
|
|
}
|
|
|
|
/**
|
|
* @brief Check signed 64-bit comparisons for a sample set of values.
|
|
*/
|
|
static void CompilerUnitBuiltins_Action_12( void )
|
|
{
|
|
volatile int64_t a;
|
|
volatile int64_t b;
|
|
|
|
a = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( a );
|
|
b = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( b );
|
|
|
|
a = INT64_C( 0 );
|
|
b = INT64_C( 0 );
|
|
T_false( a < b );
|
|
|
|
a = INT64_C( 0 );
|
|
b = INT64_C( 1 );
|
|
T_true( a < b );
|
|
|
|
a = INT64_C( 0x123456789abcdef0 );
|
|
b = INT64_C( 0xf0debc9a78563412 );
|
|
T_false( a < b );
|
|
|
|
a = INT64_C( 0xf0debc9a78563412 );
|
|
b = INT64_C( 0x123456789abcdef0 );
|
|
T_true( a < b );
|
|
}
|
|
|
|
/**
|
|
* @brief Check unsigned 64-bit comparisons for a sample set of values.
|
|
*/
|
|
static void CompilerUnitBuiltins_Action_13( void )
|
|
{
|
|
volatile uint64_t a;
|
|
volatile uint64_t b;
|
|
|
|
a = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( a );
|
|
b = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( b );
|
|
|
|
a = UINT64_C( 0 );
|
|
b = UINT64_C( 0 );
|
|
T_false( a < b );
|
|
|
|
a = UINT64_C( 0 );
|
|
b = UINT64_C( 1 );
|
|
T_true( a < b );
|
|
|
|
a = UINT64_C( 0x123456789abcdef0 );
|
|
b = UINT64_C( 0xf0debc9a78563412 );
|
|
T_true( a < b );
|
|
|
|
a = UINT64_C( 0xf0debc9a78563412 );
|
|
b = UINT64_C( 0x123456789abcdef0 );
|
|
T_false( a < b );
|
|
}
|
|
|
|
/**
|
|
* @brief Check signed 64-bit arithmetic left shift for a sample set of values.
|
|
*/
|
|
static void CompilerUnitBuiltins_Action_14( void )
|
|
{
|
|
volatile int64_t i;
|
|
volatile int s;
|
|
|
|
i = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( i );
|
|
s = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( s );
|
|
|
|
i = INT64_C( 1 );
|
|
s = 0;
|
|
T_eq_i64( i << s, INT64_C( 1 ) );
|
|
|
|
i = -INT64_C( 1 );
|
|
s = 0;
|
|
T_eq_i64( i << s, -INT64_C( 1 ) );
|
|
|
|
i = INT64_C( 1 );
|
|
s = 1;
|
|
T_eq_i64( i << s, INT64_C( 2 ) );
|
|
|
|
i = -INT64_C( 1 );
|
|
s = 1;
|
|
T_eq_i64( i << s, -INT64_C( 2 ) );
|
|
}
|
|
|
|
/**
|
|
* @brief Check signed 64-bit arithmetic right shift for a sample set of
|
|
* values.
|
|
*/
|
|
static void CompilerUnitBuiltins_Action_15( void )
|
|
{
|
|
volatile int64_t i;
|
|
volatile int s;
|
|
|
|
i = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( i );
|
|
s = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( s );
|
|
|
|
i = INT64_C( 1 );
|
|
s = 0;
|
|
T_eq_i64( i >> s, INT64_C( 1 ) );
|
|
|
|
i = -INT64_C( 1 );
|
|
s = 0;
|
|
T_eq_i64( i >> s, -INT64_C( 1 ) );
|
|
|
|
i = INT64_C( 2 );
|
|
s = 1;
|
|
T_eq_i64( i >> s, INT64_C( 1 ) );
|
|
|
|
i = -INT64_C( 2 );
|
|
s = 1;
|
|
T_eq_i64( i >> s, -INT64_C( 1 ) );
|
|
}
|
|
|
|
/**
|
|
* @brief Check unsigned 64-bit logical right shift for a sample set of values.
|
|
*/
|
|
static void CompilerUnitBuiltins_Action_16( void )
|
|
{
|
|
volatile uint64_t i;
|
|
volatile int s;
|
|
|
|
i = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( i );
|
|
s = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( s );
|
|
|
|
i = UINT64_C( 1 );
|
|
s = 0;
|
|
T_eq_u64( i >> s, UINT64_C( 1 ) );
|
|
|
|
i = -UINT64_C( 1 );
|
|
s = 0;
|
|
T_eq_u64( i >> s, UINT64_C( 0xffffffffffffffff ) );
|
|
|
|
i = UINT64_C( 2 );
|
|
s = 1;
|
|
T_eq_u64( i >> s, UINT64_C( 1 ) );
|
|
|
|
i = -UINT64_C( 2 );
|
|
s = 1;
|
|
T_eq_u64( i >> s, UINT64_C( 0x7fffffffffffffff ) );
|
|
}
|
|
|
|
/**
|
|
* @brief Check signed 64-bit multiplication for a sample set of values.
|
|
*/
|
|
static void CompilerUnitBuiltins_Action_17( void )
|
|
{
|
|
volatile int64_t a;
|
|
volatile int64_t b;
|
|
|
|
a = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( a );
|
|
b = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( b );
|
|
|
|
a = INT64_C( 1 );
|
|
b = INT64_C( 1 );
|
|
T_eq_i64( a * b, INT64_C( 1 ) );
|
|
|
|
a = INT64_C( 1 );
|
|
b = INT64_C( 0 );
|
|
T_eq_i64( a * b, INT64_C( 0 ) );
|
|
|
|
a = INT64_C( 0 );
|
|
b = INT64_C( 1 );
|
|
T_eq_i64( a * b, INT64_C( 0 ) );
|
|
}
|
|
|
|
/**
|
|
* @brief Check signed 64-bit negation for a sample set of values.
|
|
*/
|
|
static void CompilerUnitBuiltins_Action_18( void )
|
|
{
|
|
volatile int64_t i;
|
|
|
|
i = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( i );
|
|
|
|
i = INT64_C( 1 );
|
|
T_eq_i64( -i, -INT64_C( 1 ) );
|
|
|
|
i = -INT64_C( 1 );
|
|
T_eq_i64( -i, INT64_C( 1 ) );
|
|
}
|
|
|
|
/**
|
|
* @brief Check signed 64-bit divisions for a sample set of values.
|
|
*/
|
|
static void CompilerUnitBuiltins_Action_19( void )
|
|
{
|
|
volatile int64_t n;
|
|
volatile int64_t d;
|
|
volatile int64_t x;
|
|
|
|
n = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( n );
|
|
d = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( d );
|
|
x = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( x );
|
|
|
|
n = INT64_C( 0 );
|
|
d = INT64_C( 0 );
|
|
do_longjmp = true;
|
|
|
|
if ( setjmp( exception_return_context ) == 0 ) {
|
|
x = n / d;
|
|
}
|
|
|
|
n = INT64_C( 1 );
|
|
d = INT64_C( 0 );
|
|
do_longjmp = true;
|
|
|
|
if ( setjmp( exception_return_context ) == 0 ) {
|
|
x = n / d;
|
|
}
|
|
|
|
n = INT64_C( 0x7fffffffffffffff );
|
|
d = INT64_C( 0 );
|
|
do_longjmp = true;
|
|
|
|
if ( setjmp( exception_return_context ) == 0 ) {
|
|
x = n / d;
|
|
}
|
|
|
|
n = INT64_C( 0x7fffffff00000000 );
|
|
d = INT64_C( 0 );
|
|
do_longjmp = true;
|
|
|
|
if ( setjmp( exception_return_context ) == 0 ) {
|
|
x = n / d;
|
|
}
|
|
|
|
n = INT64_C( 0 );
|
|
d = INT64_C( 1 );
|
|
T_eq_i64( n / d, INT64_C( 0 ) );
|
|
|
|
n = INT64_C( 1 );
|
|
d = INT64_C( 1 );
|
|
T_eq_i64( n / d, INT64_C( 1 ) );
|
|
|
|
n = INT64_C( 0x7fffffffffffffff );
|
|
d = INT64_C( 1 );
|
|
T_eq_i64( n / d, INT64_C( 9223372036854775807 ) );
|
|
|
|
n = INT64_C( 2 );
|
|
d = INT64_C( 1 );
|
|
T_eq_i64( n / d, INT64_C( 2 ) );
|
|
|
|
n = INT64_C( 2 );
|
|
d = INT64_C( 1 );
|
|
T_eq_i64( n / d, INT64_C( 2 ) );
|
|
|
|
n = INT64_C( 1 );
|
|
d = INT64_C( 0x7fffffffffffffff );
|
|
T_eq_i64( n / d, INT64_C( 0 ) );
|
|
|
|
n = INT64_C( 0x7fffffffffffffff );
|
|
d = INT64_C( 0x7fffffffffffffff );
|
|
T_eq_i64( n / d, INT64_C( 1 ) );
|
|
|
|
n = INT64_C( 1 );
|
|
d = INT64_C( 0x7fffffff00000000 );
|
|
T_eq_i64( n / d, INT64_C( 0 ) );
|
|
|
|
n = INT64_C( 0x7fffffff00000000 );
|
|
d = INT64_C( 0x7fffffff00000000 );
|
|
T_eq_i64( n / d, INT64_C( 1 ) );
|
|
|
|
n = INT64_C( 0x7fffffffffffffff );
|
|
d = INT64_C( 0x7fffffff00000000 );
|
|
T_eq_i64( n / d, INT64_C( 1 ) );
|
|
|
|
n = INT64_C( 0x7fffffffffffffff );
|
|
d = INT64_C( 0x8000000000000000 );
|
|
T_eq_i64( n / d, INT64_C( 0 ) );
|
|
|
|
n = INT64_C( 0x7fffffffffffffff );
|
|
d = INT64_C( 0x0000000080000000 );
|
|
T_eq_i64( n / d, INT64_C( 0xffffffff ) );
|
|
|
|
n = INT64_C( 0x7fffffffffffffff );
|
|
d = INT64_C( 0x00000000f0000000 );
|
|
T_eq_i64( n / d, INT64_C( 2290649224 ) );
|
|
|
|
n = INT64_C( 0x00000001ffffffff );
|
|
d = INT64_C( 0x00000000f0000000 );
|
|
T_eq_i64( n / d, INT64_C( 2 ) );
|
|
|
|
n = INT64_C( 0x0000000fffffffff );
|
|
d = INT64_C( 0x000000000000000f );
|
|
T_eq_i64( n / d, INT64_C( 4581298449 ) );
|
|
|
|
n = INT64_C( 0x0000000100000001 );
|
|
d = INT64_C( 0x0000000f00000000 );
|
|
T_eq_i64( n / d, INT64_C( 0 ) );
|
|
|
|
n = INT64_C( 0x0000000f0000000f );
|
|
d = INT64_C( 0x000000ff0000000f );
|
|
T_eq_i64( n / d, INT64_C( 0 ) );
|
|
}
|
|
|
|
/**
|
|
* @brief Check unsigned 64-bit divisions for a sample set of values.
|
|
*/
|
|
static void CompilerUnitBuiltins_Action_20( void )
|
|
{
|
|
volatile uint64_t n;
|
|
volatile uint64_t d;
|
|
volatile uint64_t x;
|
|
|
|
n = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( n );
|
|
d = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( d );
|
|
x = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( x );
|
|
|
|
n = UINT64_C( 0 );
|
|
d = UINT64_C( 0 );
|
|
do_longjmp = true;
|
|
|
|
if ( setjmp( exception_return_context ) == 0 ) {
|
|
x = n / d;
|
|
}
|
|
|
|
#if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER)
|
|
do_longjmp = true;
|
|
|
|
if ( setjmp( exception_return_context ) == 0 ) {
|
|
__udivmoddi4( n, d, NULL );
|
|
}
|
|
#endif
|
|
|
|
n = UINT64_C( 1 );
|
|
d = UINT64_C( 0 );
|
|
do_longjmp = true;
|
|
|
|
if ( setjmp( exception_return_context ) == 0 ) {
|
|
x = n / d;
|
|
}
|
|
|
|
#if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER)
|
|
do_longjmp = true;
|
|
|
|
if ( setjmp( exception_return_context ) == 0 ) {
|
|
__udivmoddi4( n, d, NULL );
|
|
}
|
|
#endif
|
|
|
|
n = UINT64_C( 0x7fffffffffffffff );
|
|
d = UINT64_C( 0 );
|
|
do_longjmp = true;
|
|
|
|
if ( setjmp( exception_return_context ) == 0 ) {
|
|
x = n / d;
|
|
}
|
|
|
|
#if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER)
|
|
do_longjmp = true;
|
|
|
|
if ( setjmp( exception_return_context ) == 0 ) {
|
|
__udivmoddi4( n, d, NULL );
|
|
}
|
|
#endif
|
|
|
|
n = UINT64_C( 0x7fffffff00000000 );
|
|
d = UINT64_C( 0 );
|
|
do_longjmp = true;
|
|
|
|
if ( setjmp( exception_return_context ) == 0 ) {
|
|
x = n / d;
|
|
}
|
|
|
|
#if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER)
|
|
do_longjmp = true;
|
|
|
|
if ( setjmp( exception_return_context ) == 0 ) {
|
|
__udivmoddi4( n, d, NULL );
|
|
}
|
|
#endif
|
|
|
|
n = UINT64_C( 0x7fffffff00000000 );
|
|
d = UINT64_C( 0x7fffffff00000000 );
|
|
do_longjmp = true;
|
|
|
|
if ( setjmp( exception_return_context ) == 0 ) {
|
|
x = n / d;
|
|
}
|
|
|
|
#if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER)
|
|
do_longjmp = true;
|
|
|
|
if ( setjmp( exception_return_context ) == 0 ) {
|
|
__udivmoddi4( n, d, NULL );
|
|
}
|
|
#endif
|
|
|
|
n = UINT64_C( 0 );
|
|
d = UINT64_C( 1 );
|
|
T_eq_u64( n / d, UINT64_C( 0 ) );
|
|
#if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER)
|
|
T_eq_u64( __udivmoddi4( n, d, NULL ), UINT64_C( 0 ) );
|
|
#endif
|
|
|
|
n = UINT64_C( 1 );
|
|
d = UINT64_C( 1 );
|
|
T_eq_u64( n / d, UINT64_C( 1 ) );
|
|
#if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER)
|
|
T_eq_u64( __udivmoddi4( n, d, NULL ), UINT64_C( 1 ) );
|
|
#endif
|
|
|
|
n = UINT64_C( 0xffffffffffffffff );
|
|
d = UINT64_C( 1 );
|
|
T_eq_u64( n / d, UINT64_C( 0xffffffffffffffff ) );
|
|
#if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER)
|
|
T_eq_u64( __udivmoddi4( n, d, NULL ), UINT64_C( 0xffffffffffffffff ) );
|
|
#endif
|
|
|
|
n = UINT64_C( 2 );
|
|
d = UINT64_C( 1 );
|
|
T_eq_u64( n / d, UINT64_C( 2 ) );
|
|
#if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER)
|
|
T_eq_u64( __udivmoddi4( n, d, NULL ), UINT64_C( 2 ) );
|
|
#endif
|
|
|
|
n = UINT64_C( 1 );
|
|
d = UINT64_C( 0xffffffffffffffff );
|
|
T_eq_u64( n / d, UINT64_C( 0 ) );
|
|
#if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER)
|
|
T_eq_u64( __udivmoddi4( n, d, NULL ), UINT64_C( 0 ) );
|
|
#endif
|
|
|
|
n = UINT64_C( 0xffffffffffffffff );
|
|
d = UINT64_C( 0xffffffffffffffff );
|
|
T_eq_u64( n / d, UINT64_C( 1 ) );
|
|
#if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER)
|
|
T_eq_u64( __udivmoddi4( n, d, NULL ), UINT64_C( 1 ) );
|
|
#endif
|
|
|
|
n = UINT64_C( 0xffffffffffffffff );
|
|
d = UINT64_C( 0x8000000000000000 );
|
|
T_eq_u64( n / d, UINT64_C( 1 ) );
|
|
#if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER)
|
|
T_eq_u64( __udivmoddi4( n, d, NULL ), UINT64_C( 1 ) );
|
|
#endif
|
|
|
|
n = UINT64_C( 0x0000000100000001 );
|
|
d = UINT64_C( 0x0000000f00000000 );
|
|
T_eq_u64( n / d, UINT64_C( 0 ) );
|
|
#if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER)
|
|
T_eq_u64( __udivmoddi4( n, d, NULL ), UINT64_C( 0 ) );
|
|
#endif
|
|
|
|
n = UINT64_C( 0x0000000100000000 );
|
|
d = UINT64_C( 0x0000000f00000001 );
|
|
T_eq_u64( n / d, UINT64_C( 0 ) );
|
|
#if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER)
|
|
T_eq_u64( __udivmoddi4( n, d, NULL ), UINT64_C( 0 ) );
|
|
#endif
|
|
|
|
n = UINT64_C( 0xffffffff0000000f );
|
|
d = UINT64_C( 0x000000010000000f );
|
|
T_eq_u64( n / d, UINT64_C( 4294967280 ) );
|
|
#if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER)
|
|
T_eq_u64( __udivmoddi4( n, d, NULL ), UINT64_C( 4294967280 ) );
|
|
#endif
|
|
}
|
|
|
|
/**
|
|
* @brief Check signed 64-bit modulo operations for a sample set of values.
|
|
*/
|
|
static void CompilerUnitBuiltins_Action_21( void )
|
|
{
|
|
volatile int64_t n;
|
|
volatile int64_t d;
|
|
volatile int64_t x;
|
|
|
|
n = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( n );
|
|
d = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( d );
|
|
x = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( x );
|
|
|
|
n = INT64_C( 0 );
|
|
d = INT64_C( 0 );
|
|
do_longjmp = true;
|
|
|
|
if ( setjmp( exception_return_context ) == 0 ) {
|
|
x = n % d;
|
|
}
|
|
|
|
n = INT64_C( 1 );
|
|
d = INT64_C( 0 );
|
|
do_longjmp = true;
|
|
|
|
if ( setjmp( exception_return_context ) == 0 ) {
|
|
x = n % d;
|
|
}
|
|
|
|
n = INT64_C( 0x7fffffffffffffff );
|
|
d = INT64_C( 0 );
|
|
do_longjmp = true;
|
|
|
|
if ( setjmp( exception_return_context ) == 0 ) {
|
|
x = n % d;
|
|
}
|
|
|
|
n = INT64_C( 0x7fffffff00000000 );
|
|
d = INT64_C( 0 );
|
|
do_longjmp = true;
|
|
|
|
if ( setjmp( exception_return_context ) == 0 ) {
|
|
x = n % d;
|
|
}
|
|
|
|
n = INT64_C( 0 );
|
|
d = INT64_C( 1 );
|
|
T_eq_i64( n % d, INT64_C( 0 ) );
|
|
|
|
n = INT64_C( 1 );
|
|
d = INT64_C( 1 );
|
|
T_eq_i64( n % d, INT64_C( 0 ) );
|
|
|
|
n = INT64_C( 0x7fffffffffffffff );
|
|
d = INT64_C( 1 );
|
|
T_eq_i64( n % d, INT64_C( 0 ) );
|
|
|
|
n = INT64_C( 2 );
|
|
d = INT64_C( 1 );
|
|
T_eq_i64( n % d, INT64_C( 0 ) );
|
|
|
|
n = INT64_C( 2 );
|
|
d = INT64_C( 1 );
|
|
T_eq_i64( n % d, INT64_C( 0 ) );
|
|
|
|
n = INT64_C( 1 );
|
|
d = INT64_C( 0x7fffffffffffffff );
|
|
T_eq_i64( n % d, INT64_C( 1 ) );
|
|
|
|
n = INT64_C( 0x7fffffffffffffff );
|
|
d = INT64_C( 0x7fffffffffffffff );
|
|
T_eq_i64( n % d, INT64_C( 0 ) );
|
|
|
|
n = INT64_C( 1 );
|
|
d = INT64_C( 0x7fffffff00000000 );
|
|
T_eq_i64( n % d, INT64_C( 1 ) );
|
|
|
|
n = INT64_C( 0x7fffffff00000000 );
|
|
d = INT64_C( 0x7fffffff00000000 );
|
|
T_eq_i64( n % d, INT64_C( 0 ) );
|
|
|
|
n = INT64_C( 0x7fffffffffffffff );
|
|
d = INT64_C( 0x7fffffff00000000 );
|
|
T_eq_i64( n % d, INT64_C( 0xffffffff ) );
|
|
|
|
n = INT64_C( 0x7fffffffffffffff );
|
|
d = INT64_C( 0x8000000000000000 );
|
|
T_eq_i64( n % d, INT64_C( 0x7fffffffffffffff ) );
|
|
|
|
n = INT64_C( 0x7fffffffffffffff );
|
|
d = INT64_C( 0x0000000080000000 );
|
|
T_eq_i64( n % d, INT64_C( 2147483647 ) );
|
|
|
|
n = INT64_C( 0x7fffffffffffffff );
|
|
d = INT64_C( 0x00000000f0000000 );
|
|
T_eq_i64( n % d, INT64_C( 2147483647 ) );
|
|
|
|
n = INT64_C( 0x00000001ffffffff );
|
|
d = INT64_C( 0x00000000f0000000 );
|
|
T_eq_i64( n % d, INT64_C( 536870911 ) );
|
|
|
|
n = INT64_C( 0x0000000fffffffff );
|
|
d = INT64_C( 0x000000000000000f );
|
|
T_eq_i64( n % d, INT64_C( 0 ) );
|
|
|
|
n = INT64_C( 0x0000000100000001 );
|
|
d = INT64_C( 0x0000000f00000000 );
|
|
T_eq_i64( n % d, INT64_C( 4294967297 ) );
|
|
|
|
n = INT64_C( 0x0000000f0000000f );
|
|
d = INT64_C( 0x000000ff0000000f );
|
|
T_eq_i64( n % d, INT64_C( 64424509455 ) );
|
|
|
|
#if defined(TEST_UDIVMODDI4)
|
|
/*
|
|
* The above test cases may use __udivmoddi4(). However, the below
|
|
* parameter values for __udivmoddi4() cannot be obtained through the
|
|
* signed modulo or division operations. On some targets, calls to
|
|
* __udivmoddi4() may result from complex optimizations.
|
|
*/
|
|
n = INT64_C( 0xffffffff0000000f );
|
|
d = INT64_C( 0x000000010000000f );
|
|
T_eq_u64( __udivmoddi4( n, d, NULL ), INT64_C( 4294967280 ) );
|
|
#endif
|
|
}
|
|
|
|
/**
|
|
* @brief Check unsigned 64-bit modulo operations for a sample set of values.
|
|
*/
|
|
static void CompilerUnitBuiltins_Action_22( void )
|
|
{
|
|
volatile uint64_t n;
|
|
volatile uint64_t d;
|
|
volatile uint64_t x;
|
|
|
|
n = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( n );
|
|
d = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( d );
|
|
x = 0;
|
|
RTEMS_OBFUSCATE_VARIABLE( x );
|
|
|
|
n = UINT64_C( 0 );
|
|
d = UINT64_C( 0 );
|
|
do_longjmp = true;
|
|
|
|
if ( setjmp( exception_return_context ) == 0 ) {
|
|
x = n % d;
|
|
}
|
|
|
|
n = UINT64_C( 1 );
|
|
d = UINT64_C( 0 );
|
|
do_longjmp = true;
|
|
|
|
if ( setjmp( exception_return_context ) == 0 ) {
|
|
x = n % d;
|
|
}
|
|
|
|
n = UINT64_C( 0 );
|
|
d = UINT64_C( 1 );
|
|
T_eq_u64( n % d, UINT64_C( 0 ) );
|
|
|
|
n = UINT64_C( 1 );
|
|
d = UINT64_C( 1 );
|
|
T_eq_u64( n % d, UINT64_C( 0 ) );
|
|
|
|
n = UINT64_C( 0xffffffffffffffff );
|
|
d = UINT64_C( 1 );
|
|
T_eq_u64( n % d, UINT64_C( 0 ) );
|
|
|
|
n = UINT64_C( 2 );
|
|
d = UINT64_C( 1 );
|
|
T_eq_u64( n % d, UINT64_C( 0 ) );
|
|
|
|
n = UINT64_C( 1 );
|
|
d = UINT64_C( 0xffffffffffffffff );
|
|
T_eq_u64( n % d, UINT64_C( 1 ) );
|
|
|
|
n = UINT64_C( 0xffffffffffffffff );
|
|
d = UINT64_C( 0xffffffffffffffff );
|
|
T_eq_u64( n % d, UINT64_C( 0 ) );
|
|
}
|
|
|
|
/**
|
|
* @fn void T_case_body_CompilerUnitBuiltins( void )
|
|
*/
|
|
T_TEST_CASE_FIXTURE( CompilerUnitBuiltins, &CompilerUnitBuiltins_Fixture )
|
|
{
|
|
CompilerUnitBuiltins_Action_0();
|
|
CompilerUnitBuiltins_Action_1();
|
|
CompilerUnitBuiltins_Action_2();
|
|
CompilerUnitBuiltins_Action_3();
|
|
CompilerUnitBuiltins_Action_4();
|
|
CompilerUnitBuiltins_Action_5();
|
|
CompilerUnitBuiltins_Action_6();
|
|
CompilerUnitBuiltins_Action_7();
|
|
CompilerUnitBuiltins_Action_8();
|
|
CompilerUnitBuiltins_Action_9();
|
|
CompilerUnitBuiltins_Action_10();
|
|
CompilerUnitBuiltins_Action_11();
|
|
CompilerUnitBuiltins_Action_12();
|
|
CompilerUnitBuiltins_Action_13();
|
|
CompilerUnitBuiltins_Action_14();
|
|
CompilerUnitBuiltins_Action_15();
|
|
CompilerUnitBuiltins_Action_16();
|
|
CompilerUnitBuiltins_Action_17();
|
|
CompilerUnitBuiltins_Action_18();
|
|
CompilerUnitBuiltins_Action_19();
|
|
CompilerUnitBuiltins_Action_20();
|
|
CompilerUnitBuiltins_Action_21();
|
|
CompilerUnitBuiltins_Action_22();
|
|
}
|
|
|
|
/** @} */
|