cc65/test/val/add3.c

266 lines
3.6 KiB
C

/*
!!DESCRIPTION!! Addition tests - mostly int's
!!ORIGIN!! SDCC regression tests
!!LICENCE!! GPL, read COPYING.GPL
*/
#include "common.h"
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
unsigned char failures=0;
char char0 = 0;
char char1 = 0;
char char2 = 0;
/*
this test assumes:
sizeof(char) == 1
sizeof(int) == 2
sizeof(long) == 4
*/
#ifdef REFERENCE
/*
make sure the reference output uses types with
proper size
*/
#include <stdint.h>
#ifdef SIZEOF_INT_16BIT
int16_t int0 = 0;
int16_t int1 = 0;
#else
int32_t int0 = 0;
int32_t int1 = 0;
#endif
int32_t long0 = 0;
int32_t long1 = 0;
uint32_t ulong0 = 0;
uint32_t ulong1 = 0;
#else
int int0 = 0;
int int1 = 0;
long long0 = 0;
long long1 = 0;
unsigned long ulong0 = 0;
unsigned long ulong1 = 0;
#endif
#ifdef SUPPORT_BIT_TYPES
bit bit0 = 0;
bit bit1 = 0;
bit bit2 = 0;
bit bit3 = 0;
bit bit4 = 0;
bit bit5 = 0;
bit bit6 = 0;
bit bit7 = 0;
bit bit8 = 0;
bit bit9 = 0;
bit bit10 = 0;
bit bit11 = 0;
#endif
void done(char *name)
{
printf("%s done - failures: %d\n", name, failures);
if(failures)
exit(failures);
}
void add_char2char(void)
{
if(char0 != 4)
failures++;
if(char1 != 5)
failures++;
char0 = char0 + char1;
if(char0 != 9)
failures++;
char0 += 127;
#if (!defined(REFCC) && defined(UNSIGNED_CHARS)) || (defined(REFCC) && defined(REFCC_UNSIGNED_CHARS))
if(char0 < 0)
failures++;
if(char0 != (127+9))
failures++;
#else
if(char0 > 0)
failures++;
if(char0 != -0x78)
failures++;
#endif
done("add_char2char");
}
void add_compound_char(void)
{
char0 = char1+5;
if(char0 != 9)
failures++;
if((char0+char1) != 13)
failures++;
done("add_compound_char");
}
void add_int2int(void)
{
if(int0 != 4)
failures++;
if(int1 != 5)
failures++;
int0 += int1;
if(int0 != 9)
failures++;
int0 += 0x7fff;
if(int0 != -0x7ff8)
failures++;
done("add_int2int");
}
void add_compound_int(void)
{
int0 = int1+5;
if(int0 != 9)
failures++;
if((int0+int1) != 13)
failures++;
done("add_compound_int");
}
void add_lit2long(void)
{
if(long0 != 0)
failures++;
long0++;
if(long0 != 1)
failures++;
long0 = long0 + 0xff;
if(long0 != 0x100)
failures++;
long0 = long0 + 0x100;
if(long0 != 0x200)
failures++;
long0 = long0 + 0xfe00;
if(long0 != 0x10000)
failures++;
long0 = long0 + 0xff0000;
if(long0 != 0x1000000)
failures++;
long0 = long0 + 0x7e000000;
if(long0 != 0x7f000000)
failures++;
/* wrap around zero */
long0 = long0 + 0x2000000;
if(long0 != -0x7f000000)
failures++;
long0 = long0 + 0x7f000000;
if(long0 != 0)
failures++;
done("add_lit2long");
}
void add_lit2ulong(void)
{
if(ulong0 != 0)
failures++;
ulong0++;
if(ulong0 != 1)
failures++;
ulong0 = ulong0 + 0xff;
if(ulong0 != 0x100)
failures++;
ulong0 = ulong0 + 0x100;
if(ulong0 != 0x200)
failures++;
ulong0 = ulong0 + 0xfe00;
if(ulong0 != 0x10000)
failures++;
ulong0 = ulong0 + 0xff0000;
if(ulong0 != 0x1000000)
failures++;
ulong0 = ulong0 + 0x7e000000;
if(ulong0 != 0x7f000000)
failures++;
ulong0 = ulong0 + 0x2000000;
if(ulong0 != 0x81000000)
failures++;
/* wrap around zero */
ulong0 = ulong0 + 0x7f000000;
if(ulong0)
failures++;
done("add_lit2ulong");
}
int main(void)
{
char0=4;
char1 = char0 + 1;
add_char2char();
char1=4;
add_compound_char();
int0 = 4;
int1 = int0 + 1;
add_int2int();
int1=4;
add_compound_int();
add_lit2long();
add_lit2ulong();
/* if not exit() */
return 0;
}