20a4d401d0
Skip the long-long test set on other platforms, because they don't have long long. Each platform would need to implement 8-byte operations like `adi 8` in its code generator, and set long long to 8 bytes in its descr file. The first test is for negation, addition, and subtraction. It also requires comparison for equality.
60 lines
1.4 KiB
C
60 lines
1.4 KiB
C
#include "test.h"
|
|
|
|
struct neg {
|
|
long long a;
|
|
long long neg_a; /* -a */
|
|
} negations[] = {
|
|
{0LL, 0LL},
|
|
{2LL, -2LL},
|
|
{-446020022096LL, 446020022096LL},
|
|
};
|
|
|
|
struct s_addsub {
|
|
long long a;
|
|
long long b;
|
|
long long a_add_b; /* a + b */
|
|
long long a_sub_b; /* a - b */
|
|
} s_cases[] = {
|
|
{2LL, 1LL, 3LL, 1LL},
|
|
{2LL, -1LL, 1LL, 3LL},
|
|
/* a + b overflows 32 bits */
|
|
{1930610480LL, 842500503LL, 2773110983LL, 1088109977LL},
|
|
{-446020022096LL, 1037107331549LL, 591087309453LL, -1483127353645LL},
|
|
{-737537585551LL, -847060446507LL, -1584598032058LL, 109522860956LL},
|
|
};
|
|
|
|
struct u_addsub {
|
|
unsigned long long a;
|
|
unsigned long long b;
|
|
unsigned long long a_add_b;
|
|
unsigned long long a_sub_b;
|
|
} u_cases[] = {
|
|
{2ULL, 1ULL, 3ULL, 1ULL},
|
|
/* a + b overflows 63 bits */
|
|
{6092994517831567942ULL, 3716888886436146324ULL,
|
|
9809883404267714266ULL, 2376105631395421618ULL},
|
|
};
|
|
|
|
#define LEN(ary) (sizeof(ary) / sizeof(ary[0]))
|
|
|
|
void _m_a_i_n(void) {
|
|
int i;
|
|
|
|
for (i = 0; i < LEN(negations); i++) {
|
|
struct neg *n = &negations[i];
|
|
ASSERT(n->a == -n->neg_a);
|
|
ASSERT(-n->a == n->neg_a);
|
|
}
|
|
for (i = 0; i < LEN(s_cases); i++) {
|
|
struct s_addsub *s = &s_cases[i];
|
|
ASSERT(s->a + s->b == s->a_add_b);
|
|
ASSERT(s->a - s->b == s->a_sub_b);
|
|
}
|
|
for (i = 0; i < LEN(u_cases); i++) {
|
|
struct u_addsub *u = &u_cases[i];
|
|
ASSERT(u->a + u->b == u->a_add_b);
|
|
ASSERT(u->a - u->b == u->a_sub_b);
|
|
}
|
|
finished();
|
|
}
|