//#define TEST_BCC_MIKEOS #if defined(TEST_BCC_MIKEOS) #include #else #include #define mikeos_print_string(x) printf("%s", (x)) #define mikeos_print_4hex(x) printf("%04x", (x)) #define mikeos_long_int_negate(x) (-(x)) static void mikeos_print_space(void) {printf(" ");} static void mikeos_print_newline(void) {printf("\n");} #endif static char StringOK[] = "OK "; static char StringNG[] = "NG "; #define OK {mikeos_print_string(StringOK);} #define NG {mikeos_print_string(StringNG);exit(0);} #define P(x) {mikeos_print_4hex(&(x));mikeos_print_space();} /* AMD64 must be int, not long */ #if 0 typedef long X; typedef unsigned long UX; #else typedef int X; typedef unsigned int UX; #endif /* fundamental operations */ #define ADD(var1, num1, var2, num2, result) \ ((((var1) = (num1)) + ((var2) = (num2))) == (result)) #define SUB(var1, num1, var2, num2, result) \ ((((var1) = (num1)) - ((var2) = (num2))) == (result)) #define MUL(var1, num1, var2, num2, result) \ ((((var1) = (num1)) * ((var2) = (num2))) == (result)) #define DIV(var1, num1, var2, num2, result) \ ((((var1) = (num1)) / ((var2) = (num2))) == (result)) #define MOD(var1, num1, var2, num2, result) \ ((((var1) = (num1)) % ((var2) = (num2))) == (result)) #define AND(var1, num1, var2, num2, result) \ ((((var1) = (num1)) & ((var2) = (num2))) == (result)) #define OR(var1, num1, var2, num2, result) \ ((((var1) = (num1)) | ((var2) = (num2))) == (result)) #define XOR(var1, num1, var2, num2, result) \ ((((var1) = (num1)) ^ ((var2) = (num2))) == (result)) #define NOT(var1, num1, result) \ (~((var1) = (num1)) == result) #define SHL(var1, num1, var2, num2, result) \ ((((var1) = (num1)) << ((var2) = (num2))) == (result)) #define SHR(var1, num1, var2, num2, result) \ ((((var1) = (num1)) >> ((var2) = (num2))) == (result)) #define EQ(var1, num1, var2, num2) \ (((var1) = (num1)) == ((var2) = (num2))) #define LT(var1, num1, var2, num2) \ (((var1) = (num1)) < ((var2) = (num2))) #define GT(var1, num1, var2, num2) \ (((var1) = (num1)) > ((var2) = (num2))) #define LEQ(var1, num1, var2, num2) \ (((var1) = (num1)) <= ((var2) = (num2))) #define GEQ(var1, num1, var2, num2) \ (((var1) = (num1)) >= ((var2) = (num2))) static void check_eq(void) { X x0a, x1a; UX ux0a, ux1a; static X x0s, x1s; static UX ux0s, ux1s; static char str[] = "check_eq "; mikeos_print_string(str); P(x0a); P(x1a); P(ux0a); P(ux1a); P(x0s); P(x1s); P(ux0s); P(ux1s); mikeos_print_newline(); /* lcmpl */ if (EQ(x0a, (X)0x01234567, x1a, (X)0x01234567)) {OK;} else {NG;} if (EQ(x0a, (X)0x12345678, x1s, (X)0x12345678)) {OK;} else {NG;} if (EQ(x0s, (X)0x23456789, x1a, (X)0x23456789)) {OK;} else {NG;} if (EQ(x0s, (X)0x3456789a, x1s, (X)0x3456789a)) {OK;} else {NG;} if (EQ(x0a, (X)0x01234567, x1a, (X)0x12345678)) {NG;} else {OK;} if (EQ(x0a, (X)0x12345678, x1s, (X)0x23456789)) {NG;} else {OK;} if (EQ(x0s, (X)0x23456789, x1a, (X)0x3456789a)) {NG;} else {OK;} if (EQ(x0s, (X)0x3456789a, x1s, (X)0x01234567)) {NG;} else {OK;} /* lcmpul */ if (EQ(ux0a, (X)0x01234567, ux1a, (X)0x01234567)) {OK;} else {NG;} if (EQ(ux0a, (X)0x12345678, ux1s, (X)0x12345678)) {OK;} else {NG;} if (EQ(ux0s, (X)0x23456789, ux1a, (X)0x23456789)) {OK;} else {NG;} if (EQ(ux0s, (X)0x3456789a, ux1s, (X)0x3456789a)) {OK;} else {NG;} if (EQ(ux0a, (X)0x01234567, ux1a, (X)0x12345678)) {NG;} else {OK;} if (EQ(ux0a, (X)0x12345678, ux1s, (X)0x23456789)) {NG;} else {OK;} if (EQ(ux0s, (X)0x23456789, ux1a, (X)0x3456789a)) {NG;} else {OK;} if (EQ(ux0s, (X)0x3456789a, ux1s, (X)0x01234567)) {NG;} else {OK;} mikeos_print_newline(); return; } static void check_and(void) { X x0a, x1a; UX ux0a, ux1a; static X x0s, x1s; static UX ux0s, ux1s; static char str[] = "check_and "; mikeos_print_string(str); P(x0a); P(x1a); P(ux0a); P(ux1a); P(x0s); P(x1s); P(ux0s); P(ux1s); mikeos_print_newline(); /* landl */ if (AND(x0a, (X)0x01234567, x1a, (X)0x12345678, (X)0x00204460)) {OK;} else {NG;} if (AND(x0a, (X)0x12345678, x1s, (X)0x23456789, (X)0x02044608)) {OK;} else {NG;} if (AND(x0s, (X)0x23456789, x1a, (X)0x3456789a, (X)0x20446088)) {OK;} else {NG;} if (AND(x0s, (X)0x3456789a, x1s, (X)0x01234567, (X)0x00024002)) {OK;} else {NG;} /* landul */ if (AND(ux0a, (X)0x01234567, ux1a, (X)0x12345678, (X)0x00204460)) {OK;} else {NG;} if (AND(ux0a, (X)0x12345678, ux1s, (X)0x23456789, (X)0x02044608)) {OK;} else {NG;} if (AND(ux0s, (X)0x23456789, ux1a, (X)0x3456789a, (X)0x20446088)) {OK;} else {NG;} if (AND(ux0s, (X)0x3456789a, ux1s, (X)0x01234567, (X)0x00024002)) {OK;} else {NG;} mikeos_print_newline(); return; } static void check_or(void) { X x0a, x1a; UX ux0a, ux1a; static X x0s, x1s; static UX ux0s, ux1s; static char str[] = "check_or "; mikeos_print_string(str); P(x0a); P(x1a); P(ux0a); P(ux1a); P(x0s); P(x1s); P(ux0s); P(ux1s); mikeos_print_newline(); /* lorl */ if (OR(x0a, (X)0x01234567, x1a, (X)0x12345678, (X)0x1337577f)) {OK;} else {NG;} if (OR(x0a, (X)0x12345678, x1s, (X)0x23456789, (X)0x337577f9)) {OK;} else {NG;} if (OR(x0s, (X)0x23456789, x1a, (X)0x3456789a, (X)0x37577f9b)) {OK;} else {NG;} if (OR(x0s, (X)0x3456789a, x1s, (X)0x01234567, (X)0x35777dff)) {OK;} else {NG;} /* lorul */ if (OR(ux0a, (X)0x01234567, ux1a, (X)0x12345678, (X)0x1337577f)) {OK;} else {NG;} if (OR(ux0a, (X)0x12345678, ux1s, (X)0x23456789, (X)0x337577f9)) {OK;} else {NG;} if (OR(ux0s, (X)0x23456789, ux1a, (X)0x3456789a, (X)0x37577f9b)) {OK;} else {NG;} if (OR(ux0s, (X)0x3456789a, ux1s, (X)0x01234567, (X)0x35777dff)) {OK;} else {NG;} mikeos_print_newline(); return; } static void check_xor(void) { X x0a, x1a; UX ux0a, ux1a; static X x0s, x1s; static UX ux0s, ux1s; static char str[] = "check_xor "; mikeos_print_string(str); P(x0a); P(x1a); P(ux0a); P(ux1a); P(x0s); P(x1s); P(ux0s); P(ux1s); mikeos_print_newline(); /* leorl */ if (XOR(x0a, (X)0x01234567, x1a, (X)0x12345678, (X)0x1317131f)) {OK;} else {NG;} if (XOR(x0a, (X)0x12345678, x1s, (X)0x23456789, (X)0x317131f1)) {OK;} else {NG;} if (XOR(x0s, (X)0x23456789, x1a, (X)0x3456789a, (X)0x17131f13)) {OK;} else {NG;} if (XOR(x0s, (X)0x3456789a, x1s, (X)0x01234567, (X)0x35753dfd)) {OK;} else {NG;} /* leorul */ if (XOR(ux0a, (X)0x01234567, ux1a, (X)0x12345678, (X)0x1317131f)) {OK;} else {NG;} if (XOR(ux0a, (X)0x12345678, ux1s, (X)0x23456789, (X)0x317131f1)) {OK;} else {NG;} if (XOR(ux0s, (X)0x23456789, ux1a, (X)0x3456789a, (X)0x17131f13)) {OK;} else {NG;} if (XOR(ux0s, (X)0x3456789a, ux1s, (X)0x01234567, (X)0x35753dfd)) {OK;} else {NG;} mikeos_print_newline(); return; } static void check_not(void) { X x0a; UX ux0a; static X x0s; static UX ux0s; static char str[] = "check_not "; mikeos_print_string(str); P(x0a); P(ux0a); P(x0s); P(ux0s); mikeos_print_newline(); /* lcoml */ if (NOT(x0a, (X)0x01234567, (X)0xfedcba98)) {OK;} else {NG;} if (NOT(x0s, (X)0x23456789, (X)0xdcba9876)) {OK;} else {NG;} if (NOT(ux0a, (X)0x01234567, (X)0xfedcba98)) {OK;} else {NG;} if (NOT(ux0s, (X)0x23456789, (X)0xdcba9876)) {OK;} else {NG;} mikeos_print_newline(); return; } static void check_shl(void) { X x0a, x1a; UX ux0a, ux1a; static X x0s, x1s; static UX ux0s, ux1s; static char str[] = "check_shl "; mikeos_print_string(str); P(x0a); P(x1a); P(ux0a); P(ux1a); P(x0s); P(x1s); P(ux0s); P(ux1s); mikeos_print_newline(); /* lsll */ if (SHL(x0a, (X)0x6789abcd, x1a, (X)1, (X)0xcf13579a)) {OK;} else {NG;} if (SHL(x0a, (X)0x789abcde, x1s, (X)2, (X)0xe26af378)) {OK;} else {NG;} if (SHL(x0s, (X)0x89abcdef, x1a, (X)3, (X)0x4d5e6f78)) {OK;} else {NG;} if (SHL(x0s, (X)0x9abcdef0, x1s, (X)4, (X)0xabcdef00)) {OK;} else {NG;} /* lslul */ if (SHL(ux0a, (X)0x6789abcd, ux1a, (X)1, (X)0xcf13579a)) {OK;} else {NG;} if (SHL(ux0a, (X)0x789abcde, ux1s, (X)2, (X)0xe26af378)) {OK;} else {NG;} if (SHL(ux0s, (X)0x89abcdef, ux1a, (X)3, (X)0x4d5e6f78)) {OK;} else {NG;} if (SHL(ux0s, (X)0x9abcdef0, ux1s, (X)4, (X)0xabcdef00)) {OK;} else {NG;} mikeos_print_newline(); return; } static void check_shr(void) { X x0a, x1a; UX ux0a, ux1a; static X x0s, x1s; static UX ux0s, ux1s; static char str[] = "check_shr "; mikeos_print_string(str); P(x0a); P(x1a); P(ux0a); P(ux1a); P(x0s); P(x1s); P(ux0s); P(ux1s); mikeos_print_newline(); /* lsrl */ if (SHR(x0a, (X)0x6789abcd, x1a, (X)1, (X)0x33c4d5e6)) {OK;} else {NG;} if (SHR(x0a, (X)0x789abcde, x1s, (X)2, (X)0x1e26af37)) {OK;} else {NG;} if (SHR(x0s, (X)0x89abcdef, x1a, (X)3, (X)0xf13579bd)) {OK;} else {NG;} if (SHR(x0s, (X)0x9abcdef0, x1s, (X)4, (X)0xf9abcdef)) {OK;} else {NG;} /* lsrul */ if (SHR(ux0a, (X)0x6789abcd, ux1a, (X)1, (X)0x33c4d5e6)) {OK;} else {NG;} if (SHR(ux0a, (X)0x789abcde, ux1s, (X)2, (X)0x1e26af37)) {OK;} else {NG;} if (SHR(ux0s, (X)0x89abcdef, ux1a, (X)3, (X)0x113579bd)) {OK;} else {NG;} if (SHR(ux0s, (X)0x9abcdef0, ux1s, (X)4, (X)0x09abcdef)) {OK;} else {NG;} mikeos_print_newline(); return; } static void check_inc(void) { X x0a; UX ux0a; static X x0s; static UX ux0s; static char str[] = "check_inc "; mikeos_print_string(str); P(x0a); P(ux0a); P(x0s); P(ux0s); mikeos_print_newline(); /* lincl */ x0a = (X)0x00000000; if (++x0a == (X)0x00000001) {OK;} else {NG;} x0s = (X)0x0000ffff; if (++x0s == (X)0x00010000) {OK;} else {NG;} ux0a = (X)0x00010000; if (++ux0a == (X)0x00010001) {OK;} else {NG;} ux0s = (X)0xffffffff; if (++ux0s == (X)0x00000000) {OK;} else {NG;} mikeos_print_newline(); return; } static void check_dec(void) { X x0a; UX ux0a; static X x0s; static UX ux0s; static char str[] = "check_dec "; mikeos_print_string(str); P(x0a); P(ux0a); P(x0s); P(ux0s); mikeos_print_newline(); /* ldecl */ x0a = (X)0x00000000; if (--x0a == (X)0xffffffff) {OK;} else {NG;} x0s = (X)0x00010000; if (--x0s == (X)0x0000ffff) {OK;} else {NG;} ux0a = (X)0x00010001; if (--ux0a == (X)0x00010000) {OK;} else {NG;} ux0s = (X)0x00000001; if (--ux0s == (X)0x00000000) {OK;} else {NG;} mikeos_print_newline(); return; } static void check_tst(void) { X x0a; UX ux0a; static X x0s; static UX ux0s; static char str[] = "check_tst "; mikeos_print_string(str); P(x0a); P(ux0a); P(x0s); P(ux0s); mikeos_print_newline(); /* ltstl */ x0a = (X)0x00000000; if (x0a) {NG;} else {OK;} x0a = (X)0x00000001; if (x0a) {OK;} else {NG;} x0s = (X)0x00000000; if (x0s) {NG;} else {OK;} x0s = (X)0x00010000; if (x0s) {OK;} else {NG;} ux0a = (X)0x00000000; if (ux0a) {NG;} else {OK;} ux0a = (X)0x00000001; if (ux0a) {OK;} else {NG;} ux0s = (X)0x00000000; if (ux0s) {NG;} else {OK;} ux0s = (X)0x00010000; if (ux0s) {OK;} else {NG;} mikeos_print_newline(); return; } static void check_add(void) { X x0a, x1a; UX ux0a, ux1a; static X x0s, x1s; static UX ux0s, ux1s; static char str[] = "check_add "; mikeos_print_string(str); P(x0a); P(x1a); P(ux0a); P(ux1a); P(x0s); P(x1s); P(ux0s); P(ux1s); mikeos_print_newline(); /* laddl */ if (ADD(x0a, (X)1234567890, x1a, (X)901234567, (X)2135802457)) {OK;} else {NG;} if (ADD(x0a, (X)1234567890, x1s, (X)-901234567, (X)333333323)) {OK;} else {NG;} if (ADD(x0s, (X)-1234567890, x1a, (X)901234567, (X)-333333323)) {OK;} else {NG;} if (ADD(x0s, (X)-1234567890, x1s, (X)-901234567, (X)-2135802457)) {OK;} else {NG;} /* laddul */ if (ADD(ux0a, (X)1234567890, ux1a, (X)901234567, (X)2135802457)) {OK;} else {NG;} if (ADD(ux0a, (X)1234567890, ux1s, (X)2345678901, (X)3580246791)) {OK;} else {NG;} if (ADD(ux0s, (X)3060399406, ux1a, (X)901234567, (X)3961633973)) {OK;} else {NG;} if (ADD(ux0s, (X)3060399466, ux1s, (X)333333323, (X)3393732789)) {OK;} else {NG;} mikeos_print_newline(); return; } static void check_sub(void) { X x0a, x1a; UX ux0a, ux1a; static X x0s, x1s; static UX ux0s, ux1s; static char str[] = "check_sub "; mikeos_print_string(str); P(x0a); P(x1a); P(ux0a); P(ux1a); P(x0s); P(x1s); P(ux0s); P(ux1s); mikeos_print_newline(); /* lsubl */ if (SUB(x0a, (X)1234567890, x1a, (X)901234567, (X)333333323)) {OK;} else {NG;} if (SUB(x0a, (X)1234567890, x1s, (X)-901234567, (X)2135802457)) {OK;} else {NG;} if (SUB(x0s, (X)-1234567890, x1a, (X)901234567, (X)-2135802457)) {OK;} else {NG;} if (SUB(x0s, (X)-1234567890, x1s, (X)-901234567, (X)-333333323)) {OK;} else {NG;} /* lsubul */ if (SUB(ux0a, (X)1234567890, ux1a, (X)901234567, (X)333333323)) {OK;} else {NG;} if (SUB(ux0a, (X)2345678901, ux1s, (X)1234567890, (X)1111111011)) {OK;} else {NG;} if (SUB(ux0s, (X)3060399406, ux1a, (X)901234567, (X)2159164839)) {OK;} else {NG;} if (SUB(ux0s, (X)3060399466, ux1s, (X)333333323, (X)2727066143)) {OK;} else {NG;} mikeos_print_newline(); return; } static void check_neg(void) { X x0a; UX ux0a; static X x0s; static UX ux0s; static char str[] = "check_neg "; mikeos_print_string(str); P(x0a); P(ux0a); P(x0s); P(ux0s); mikeos_print_newline(); /* lnegl */ x0a = (X)0x00000000; if (-x0a == (X)0x00000000) {OK;} else {NG;} x0s = (X)0xffffffff; if (-x0s == (X)0x00000001) {OK;} else {NG;} ux0a = (X)0x7fffffff; if (-ux0a == (X)0x80000001) {OK;} else {NG;} ux0s = (X)0x80000000; if (-ux0s == (X)0x80000000) {OK;} else {NG;} mikeos_print_newline(); return; } static void check_mul(void) { X x0a, x1a; UX ux0a, ux1a; static X x0s, x1s; static UX ux0s, ux1s; static char str[] = "check_mul "; mikeos_print_string(str); P(x0a); P(x1a); P(ux0a); P(ux1a); P(x0s); P(x1s); P(ux0s); P(ux1s); mikeos_print_newline(); /* lmull */ if (MUL(x0a, (X)12345, x1a, (X)90123, (X)1112568435)) {OK;} else {NG;} if (MUL(x0a, (X)12345, x1s, (X)-90123, (X)-1112568435)) {OK;} else {NG;} if (MUL(x0s, (X)-62125, x1a, (X)34567, (X)-2147474875)) {OK;} else {NG;} if (MUL(x0s, (X)-62125, x1s, (X)-34567, (X)2147474875)) {OK;} else {NG;} /* lmulul */ if (MUL(ux0a, (X)12345, ux1a, (X)90123, (X)1112568435)) {OK;} else {NG;} if (MUL(ux0a, (X)12345, ux1s, (X)239613, (X)2958022485)) {OK;} else {NG;} if (MUL(ux0s, (X)90123, ux1a, (X)12345, (X)1112568435)) {OK;} else {NG;} if (MUL(ux0s, (X)239613, ux1s, (X)12345, (X)2958022485)) {OK;} else {NG;} mikeos_print_newline(); return; } static void check_div(void) { X x0a, x1a; UX ux0a, ux1a; static X x0s, x1s; static UX ux0s, ux1s; static char str[] = "check_div "; mikeos_print_string(str); P(x0a); P(x1a); P(ux0a); P(ux1a); P(x0s); P(x1s); P(ux0s); P(ux1s); mikeos_print_newline(); /* ldivl */ if (DIV(x0a, (X)1112568435, x1a, (X)90123, (X)12345)) {OK;} else {NG;} if (DIV(x0a, (X)1112568435, x1s, (X)-12345, (X)-90123)) {OK;} else {NG;} if (DIV(x0s, (X)-2147474875, x1a, (X)34567, (X)-62125)) {OK;} else {NG;} if (DIV(x0s, (X)-2147474875, x1s, (X)-62125, (X)34567)) {OK;} else {NG;} /* ldivul */ if (DIV(ux0a, (X)1112568435, ux1a, (X)12345, (X)90123)) {OK;} else {NG;} if (DIV(ux0a, (X)2958022485, ux1s, (X)239613, (X)12345)) {OK;} else {NG;} if (DIV(ux0s, (X)1112568435, ux1a, (X)12345, (X)90123)) {OK;} else {NG;} if (DIV(ux0s, (X)2958022485, ux1s, (X)239613, (X)12345)) {OK;} else {NG;} mikeos_print_newline(); return; } static void check_mod(void) { X x0a, x1a; UX ux0a, ux1a; static X x0s, x1s; static UX ux0s, ux1s; static char str[] = "check_mod "; mikeos_print_string(str); P(x0a); P(x1a); P(ux0a); P(ux1a); P(x0s); P(x1s); P(ux0s); P(ux1s); mikeos_print_newline(); /* lmodl */ if (MOD(x0a, (X)1112604878, x1a, (X)90123, (X)36443)) {OK;} else {NG;} // if (MOD(x0a, (X)1112524644, x1s, (X)-12345, (X)5589)) {OK;} else {NG;} // if (MOD(x0s, (X)-2147474800, x1a, (X)34567, (X)-34492)) {OK;} else {NG;} if (MOD(x0s, (X)-2147474800, x1s, (X)-62125, (X)-62050)) {OK;} else {NG;} /* lmodul */ if (MOD(ux0a, (X)1112524644, ux1a, (X)12345, (X)5589)) {OK;} else {NG;} if (MOD(ux0a, (X)2958242607, ux1s, (X)239613, (X)220122)) {OK;} else {NG;} if (MOD(ux0s, (X)1112604878, ux1a, (X)90123, (X)36443)) {OK;} else {NG;} if (MOD(ux0s, (X)2958242600, ux1s, (X)239613, (X)220115)) {OK;} else {NG;} mikeos_print_newline(); return; } int main(int argc, char *argv[]) { check_eq(); check_and(); check_or(); check_xor(); check_not(); check_shl(); check_shr(); check_inc(); check_dec(); check_tst(); check_add(); check_sub(); check_neg(); check_mul(); check_div(); check_mod(); /* force NG to test exit()) */ mikeos_print_newline(); NG; return 0; }