mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
146 lines
4.9 KiB
146 lines
4.9 KiB
typedef __int64 longlong_t;
|
|
typedef unsigned __int64 ulonglong_t;
|
|
|
|
typedef struct {
|
|
|
|
unsigned lsw;
|
|
unsigned msw;
|
|
} dword;
|
|
|
|
typedef union {
|
|
longlong_t ll;
|
|
ulonglong_t ull;
|
|
dword dw;
|
|
} llvalue;
|
|
|
|
extern longlong_t __ll_mul (longlong_t ll_value, longlong_t multiplier);
|
|
extern longlong_t __ll_lshift (longlong_t ll_value, long ll_lshift);
|
|
extern longlong_t __ll_rshift (longlong_t ll_value, long ll_rshift);
|
|
extern longlong_t __ull_rshift (ulonglong_t ull_value, long ll_rshift);
|
|
extern longlong_t __ll_div (longlong_t divident, longlong_t divisor);
|
|
extern ulonglong_t __ull_div (ulonglong_t divident, ulonglong_t divisor);
|
|
extern longlong_t __ll_rem (longlong_t divident, longlong_t divisor);
|
|
extern ulonglong_t __ull_rem (ulonglong_t divident, ulonglong_t divisor);
|
|
extern void __ull_divremi (ulonglong_t *quotient, ulonglong_t *remainder, ulonglong_t dividend, unsigned short divisor);
|
|
extern longlong_t __ll_mod (longlong_t ll_value, longlong_t modulus);
|
|
extern longlong_t __d_to_ll (double);
|
|
extern longlong_t __f_to_ll (float);
|
|
extern ulonglong_t __d_to_ull (double);
|
|
extern ulonglong_t __f_to_ull (float);
|
|
extern double __ll_to_d (longlong_t);
|
|
extern float __ll_to_f (longlong_t);
|
|
extern double __ull_to_d (ulonglong_t);
|
|
extern float __ull_to_f (ulonglong_t);
|
|
extern ulonglong_t __ull_bit_extract (ulonglong_t *addr,
|
|
unsigned start_bit, unsigned length);
|
|
extern ulonglong_t __ull_bit_insert (ulonglong_t *addr,
|
|
unsigned start_bit, unsigned length, ulonglong_t val);
|
|
extern longlong_t __ll_bit_extract (ulonglong_t *addr,
|
|
unsigned start_bit, unsigned length);
|
|
extern longlong_t __ll_bit_insert (ulonglong_t *addr,
|
|
unsigned start_bit, unsigned length, longlong_t val);
|
|
|
|
#define MSW(x) (x).dw.msw
|
|
#define LSW(x) (x).dw.lsw
|
|
|
|
llvalue llval;
|
|
|
|
int main(int argc, char *argv[], char *env[])
|
|
{
|
|
int n,i,k, kk = 0;
|
|
llvalue lltmp1;
|
|
llvalue lltmp2;
|
|
|
|
for (n = 0; n < 64; n++) {
|
|
|
|
if (n < 32) {
|
|
MSW(llval) = 0;
|
|
LSW(llval) = 1 << i;
|
|
} else {
|
|
MSW(llval) = 1 << (i-32);
|
|
LSW(llval) = 0;
|
|
}
|
|
|
|
/* Test left shift */
|
|
for (i = 0, k = 0; i < 64; i++) {
|
|
lltmp1.ll = llval.ll << i;
|
|
if (i == 0) {
|
|
MSW(lltmp2) = MSW(llval);
|
|
LSW(lltmp2) = LSW(llval);
|
|
} else if (i < 32) {
|
|
MSW(lltmp2) = (MSW(llval) << i) | (((unsigned long)LSW(llval)) >> (32-i));
|
|
LSW(lltmp2) = LSW(llval) << i;
|
|
} else {
|
|
MSW(lltmp2) = LSW(llval) << (i-32);
|
|
LSW(lltmp2) = 0;
|
|
}
|
|
if (lltmp1.ll != lltmp2.ll) {
|
|
if (!k++)
|
|
printf("\n");
|
|
printf("(0x%8.8x%8.8x) << %d\t(0x%8.8x%8.8x) != (0x%8.8x%8.8x)\n", MSW(llval), LSW(llval), i, MSW(lltmp1), LSW(lltmp1), MSW(lltmp2), LSW(lltmp2) );
|
|
}
|
|
}
|
|
|
|
if (k) {
|
|
printf("\n\tLeft logical shift failed %d tests\n",k);
|
|
kk += k;
|
|
}
|
|
|
|
/* Test right unsigned shift */
|
|
for (i = 0, k = 0; i < 64; i++) {
|
|
lltmp1.ull = llval.ull >> i;
|
|
if (i == 0) {
|
|
MSW(lltmp2) = MSW(llval);
|
|
LSW(lltmp2) = LSW(llval);
|
|
} else if (i < 32) {
|
|
LSW(lltmp2) = (LSW(llval) >> i) | (((unsigned long)MSW(llval)) << (32-i));
|
|
MSW(lltmp2) = ((unsigned long)MSW(llval)) >> i;
|
|
} else {
|
|
MSW(lltmp2) = 0;
|
|
LSW(lltmp2) = ((unsigned long)MSW(llval)) >> (i-32);
|
|
}
|
|
if (lltmp1.ll != lltmp2.ll) {
|
|
if (!k++)
|
|
printf("\n");
|
|
printf("(0x%8.8x%8.8x) >> %d\t(0x%8.8x%8.8x) != (0x%8.8x%8.8x)\n", MSW(llval), LSW(llval), i, MSW(lltmp1), LSW(lltmp1), MSW(lltmp2), LSW(lltmp2) );
|
|
}
|
|
}
|
|
|
|
if (k) {
|
|
printf("\n\tRight logical shift failed %d tests\n",k);
|
|
k += k;
|
|
}
|
|
|
|
/* Test right arithmetic shift */
|
|
for (i = 0, k = 0; i < 64; i++) {
|
|
lltmp1.ll = llval.ll >> i;
|
|
if (i == 0) {
|
|
MSW(lltmp2) = MSW(llval);
|
|
LSW(lltmp2) = LSW(llval);
|
|
} else if (i < 32) {
|
|
LSW(lltmp2) = (LSW(llval) >> i) | ((MSW(llval) << (32-i)));
|
|
MSW(lltmp2) = MSW(llval) >> i;
|
|
} else {
|
|
MSW(lltmp2) = 0;
|
|
LSW(lltmp2) = MSW(llval) >> (i-32);
|
|
}
|
|
if (lltmp1.ll != lltmp2.ll) {
|
|
if (!k++)
|
|
printf("\n");
|
|
printf("(0x%8.8x%8.8x) >> %d\t(0x%8.8x%8.8x) != (0x%8.8x%8.8x)\n", MSW(llval), LSW(llval), i, MSW(lltmp1), LSW(lltmp1), MSW(lltmp2), LSW(lltmp2) );
|
|
}
|
|
}
|
|
|
|
if (k) {
|
|
printf("\n\tRight arithmetic shift failed %d tests\n",k);
|
|
k += k;
|
|
}
|
|
|
|
}
|
|
|
|
if (kk)
|
|
printf("\n\t'%s' failed a total of %d tests...\n", argv[0], kk);
|
|
else
|
|
printf("\n\t'%s' passed all tests...\n", argv[0]);
|
|
|
|
}
|