X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=interpreters%2Fgit%2Fterp.c;fp=interpreters%2Fgit%2Fterp.c;h=d157826ce309290fcbcc9e026e17dcbf7f4f28d2;hb=3c59ba5eef5cb4d39c06eb7f523b9c3b026bdc9b;hp=870b4f11fef8d9cde3683bde5bf1a3c5db533ae6;hpb=ed91d840318ed6ebfe3a5a77fa17114ddbf56640;p=projects%2Fchimara%2Fchimara.git diff --git a/interpreters/git/terp.c b/interpreters/git/terp.c index 870b4f1..d157826 100644 --- a/interpreters/git/terp.c +++ b/interpreters/git/terp.c @@ -38,29 +38,29 @@ Opcode* gOpcodeTable; int floatCompare(git_sint32 L1, git_sint32 L2, git_sint32 L3) { - git_float F1, F2; - - if (((L3 & 0x7F800000) == 0x7F800000) && ((L3 & 0x007FFFFF) != 0)) - return 0; - if ((L1 == 0x7F800000 || L1 == 0xFF800000) && (L2 == 0x7F800000 || L2 == 0xFF800000)) - return (L1 == L2); - - F1 = DECODE_FLOAT(L2) - DECODE_FLOAT(L1); - F2 = fabs(DECODE_FLOAT(L3)); - return ((F1 <= F2) && (F1 >= -F2)); + git_float F1, F2; + + if (((L3 & 0x7F800000) == 0x7F800000) && ((L3 & 0x007FFFFF) != 0)) + return 0; + if ((L1 == 0x7F800000 || L1 == 0xFF800000) && (L2 == 0x7F800000 || L2 == 0xFF800000)) + return (L1 == L2); + + F1 = DECODE_FLOAT(L2) - DECODE_FLOAT(L1); + F2 = fabs(DECODE_FLOAT(L3)); + return ((F1 <= F2) && (F1 >= -F2)); } -#ifdef USE_OWN_POWF -float git_powf(float x, float y) -{ - if (x == 1.0f) - return 1.0f; - else if ((y == 0.0f) || (y == -0.0f)) - return 1.0f; - else if ((x == -1.0f) && isinf(y)) - return 1.0f; - return powf(x,y); -} +#ifdef USE_OWN_POWF +float git_powf(float x, float y) +{ + if (x == 1.0f) + return 1.0f; + else if ((y == 0.0f) || (y == -0.0f)) + return 1.0f; + else if ((x == -1.0f) && isinf(y)) + return 1.0f; + return powf(x,y); +} #endif // ------------------------------------------------------------- @@ -231,7 +231,12 @@ do_enter_function_L1: // Arg count is in L2. L6 = memRead8(L1++); // LocalType L5 = memRead8(L1++); // LocalCount if (L6 != 4 && L6 != 0) // We only support 4-byte locals. - fatalError("Local variable wasn't 4 bytes wide"); + { + if (L6 == 1 || L6 == 2) + fatalError("Short local variables are not supported, use Glulxe"); + else + fatalError("Local variable wasn't 4 bytes wide"); + } L4 += L5; // Cumulative local count. } while (L5 != 0); @@ -330,7 +335,7 @@ do_enter_function_L1: // Arg count is in L2. PEEPHOLE_STORE(fadd, F1 = DECODE_FLOAT(L1) + DECODE_FLOAT(L2); S1 = ENCODE_FLOAT(F1)); PEEPHOLE_STORE(fsub, F1 = DECODE_FLOAT(L1) - DECODE_FLOAT(L2); S1 = ENCODE_FLOAT(F1)); PEEPHOLE_STORE(fmul, F1 = DECODE_FLOAT(L1) * DECODE_FLOAT(L2); S1 = ENCODE_FLOAT(F1)); - PEEPHOLE_STORE(fdiv, F1 = DECODE_FLOAT(L1) / DECODE_FLOAT(L2); S1 = ENCODE_FLOAT(F1)); + PEEPHOLE_STORE(fdiv, F1 = DECODE_FLOAT(L1) / DECODE_FLOAT(L2); S1 = ENCODE_FLOAT(F1)); #define PEEPHOLE_LOAD(tag,reg) \ do_ ## tag ## _ ## reg ## _const: reg = READ_PC; goto do_ ## tag; \ @@ -1323,124 +1328,124 @@ do_tailcall: // Floating point (new with glulx spec 3.1.2) - do_numtof: - F1 = (git_float) L1; - S1 = ENCODE_FLOAT(F1); - NEXT; - - do_ftonumz: - F1 = DECODE_FLOAT(L1); - if (!signbit(F1)) { - if (isnan(F1) || isinf(F1) || (F1 > 2147483647.0)) - S1 = 0x7FFFFFFF; - else - S1 = (git_sint32) truncf(F1); - } else { - if (isnan(F1) || isinf(F1) || (F1 < -2147483647.0)) - S1 = 0x80000000; - else - S1 = (git_sint32) truncf(F1); - } - NEXT; - - do_ftonumn: - F1 = DECODE_FLOAT(L1); - if (!signbit(F1)) { - if (isnan(F1) || isinf(F1) || (F1 > 2147483647.0)) - S1 = 0x7FFFFFFF; - else - S1 = (git_sint32) roundf(F1); - } else { - if (isnan(F1) || isinf(F1) || (F1 < -2147483647.0)) - S1 = 0x80000000; - else - S1 = (git_sint32) roundf(F1); - } - NEXT; - - do_ceil: - F1 = ceilf(DECODE_FLOAT(L1)); - L2 = ENCODE_FLOAT(F1); - if ((L2 == 0x0) || (L2 == 0x80000000)) - L2 = L1 & 0x80000000; - S1 = L2; - NEXT; - - do_floor: - F1 = floorf(DECODE_FLOAT(L1)); - S1 = ENCODE_FLOAT(F1); - NEXT; - - do_sqrt: - F1 = sqrtf(DECODE_FLOAT(L1)); - S1 = ENCODE_FLOAT(F1); - NEXT; - - do_exp: - F1 = expf(DECODE_FLOAT(L1)); - S1 = ENCODE_FLOAT(F1); - NEXT; - - do_log: - F1 = logf(DECODE_FLOAT(L1)); - S1 = ENCODE_FLOAT(F1); - NEXT; - - do_pow: -#ifdef USE_OWN_POWF - F1 = git_powf(DECODE_FLOAT(L1), DECODE_FLOAT(L2)); -#else - F1 = powf(DECODE_FLOAT(L1), DECODE_FLOAT(L2)); -#endif - S1 = ENCODE_FLOAT(F1); - NEXT; - - do_atan2: - F1 = atan2f(DECODE_FLOAT(L1), DECODE_FLOAT(L2)); - S1 = ENCODE_FLOAT(F1); - NEXT; - - do_fmod: - F1 = DECODE_FLOAT(L1); - F2 = DECODE_FLOAT(L2); - F3 = fmodf(F1, F2); - F4 = (F1 - F3) / F2; - L4 = ENCODE_FLOAT(F4); - if ((L4 == 0) || (L4 == 0x80000000)) - L4 = (L1 ^ L2) & 0x80000000; - S1 = ENCODE_FLOAT(F3); - S2 = L4; - NEXT; - - do_sin: - F1 = sinf(DECODE_FLOAT(L1)); - S1 = ENCODE_FLOAT(F1); - NEXT; - - do_cos: - F1 = cosf(DECODE_FLOAT(L1)); - S1 = ENCODE_FLOAT(F1); - NEXT; - - do_tan: - F1 = tanf(DECODE_FLOAT(L1)); - S1 = ENCODE_FLOAT(F1); - NEXT; - - do_asin: - F1 = asinf(DECODE_FLOAT(L1)); - S1 = ENCODE_FLOAT(F1); - NEXT; - - do_acos: - F1 = acosf(DECODE_FLOAT(L1)); - S1 = ENCODE_FLOAT(F1); - NEXT; - - do_atan: - F1 = atanf(DECODE_FLOAT(L1)); - S1 = ENCODE_FLOAT(F1); - NEXT; + do_numtof: + F1 = (git_float) L1; + S1 = ENCODE_FLOAT(F1); + NEXT; + + do_ftonumz: + F1 = DECODE_FLOAT(L1); + if (!signbit(F1)) { + if (isnan(F1) || isinf(F1) || (F1 > 2147483647.0)) + S1 = 0x7FFFFFFF; + else + S1 = (git_sint32) truncf(F1); + } else { + if (isnan(F1) || isinf(F1) || (F1 < -2147483647.0)) + S1 = 0x80000000; + else + S1 = (git_sint32) truncf(F1); + } + NEXT; + + do_ftonumn: + F1 = DECODE_FLOAT(L1); + if (!signbit(F1)) { + if (isnan(F1) || isinf(F1) || (F1 > 2147483647.0)) + S1 = 0x7FFFFFFF; + else + S1 = (git_sint32) roundf(F1); + } else { + if (isnan(F1) || isinf(F1) || (F1 < -2147483647.0)) + S1 = 0x80000000; + else + S1 = (git_sint32) roundf(F1); + } + NEXT; + + do_ceil: + F1 = ceilf(DECODE_FLOAT(L1)); + L2 = ENCODE_FLOAT(F1); + if ((L2 == 0x0) || (L2 == 0x80000000)) + L2 = L1 & 0x80000000; + S1 = L2; + NEXT; + + do_floor: + F1 = floorf(DECODE_FLOAT(L1)); + S1 = ENCODE_FLOAT(F1); + NEXT; + + do_sqrt: + F1 = sqrtf(DECODE_FLOAT(L1)); + S1 = ENCODE_FLOAT(F1); + NEXT; + + do_exp: + F1 = expf(DECODE_FLOAT(L1)); + S1 = ENCODE_FLOAT(F1); + NEXT; + + do_log: + F1 = logf(DECODE_FLOAT(L1)); + S1 = ENCODE_FLOAT(F1); + NEXT; + + do_pow: +#ifdef USE_OWN_POWF + F1 = git_powf(DECODE_FLOAT(L1), DECODE_FLOAT(L2)); +#else + F1 = powf(DECODE_FLOAT(L1), DECODE_FLOAT(L2)); +#endif + S1 = ENCODE_FLOAT(F1); + NEXT; + + do_atan2: + F1 = atan2f(DECODE_FLOAT(L1), DECODE_FLOAT(L2)); + S1 = ENCODE_FLOAT(F1); + NEXT; + + do_fmod: + F1 = DECODE_FLOAT(L1); + F2 = DECODE_FLOAT(L2); + F3 = fmodf(F1, F2); + F4 = (F1 - F3) / F2; + L4 = ENCODE_FLOAT(F4); + if ((L4 == 0) || (L4 == 0x80000000)) + L4 = (L1 ^ L2) & 0x80000000; + S1 = ENCODE_FLOAT(F3); + S2 = L4; + NEXT; + + do_sin: + F1 = sinf(DECODE_FLOAT(L1)); + S1 = ENCODE_FLOAT(F1); + NEXT; + + do_cos: + F1 = cosf(DECODE_FLOAT(L1)); + S1 = ENCODE_FLOAT(F1); + NEXT; + + do_tan: + F1 = tanf(DECODE_FLOAT(L1)); + S1 = ENCODE_FLOAT(F1); + NEXT; + + do_asin: + F1 = asinf(DECODE_FLOAT(L1)); + S1 = ENCODE_FLOAT(F1); + NEXT; + + do_acos: + F1 = acosf(DECODE_FLOAT(L1)); + S1 = ENCODE_FLOAT(F1); + NEXT; + + do_atan: + F1 = atanf(DECODE_FLOAT(L1)); + S1 = ENCODE_FLOAT(F1); + NEXT; // Special Git opcodes