int floatCompare(git_sint32 L1, git_sint32 L2, git_sint32 L3)
{
- git_float F1, F2;\r
-\r
- if (((L3 & 0x7F800000) == 0x7F800000) && ((L3 & 0x007FFFFF) != 0))\r
- return 0;\r
- if ((L1 == 0x7F800000 || L1 == 0xFF800000) && (L2 == 0x7F800000 || L2 == 0xFF800000))\r
- return (L1 == L2);\r
-\r
- F1 = DECODE_FLOAT(L2) - DECODE_FLOAT(L1);\r
- F2 = fabs(DECODE_FLOAT(L3));\r
- return ((F1 <= F2) && (F1 >= -F2));\r
+ 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\r
-float git_powf(float x, float y)\r
-{\r
- if (x == 1.0f)\r
- return 1.0f;\r
- else if ((y == 0.0f) || (y == -0.0f))\r
- return 1.0f;\r
- else if ((x == -1.0f) && isinf(y))\r
- return 1.0f;\r
- return powf(x,y);\r
-}\r
+#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
// -------------------------------------------------------------
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);
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));\r
+ 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; \
// Floating point (new with glulx spec 3.1.2)
- do_numtof:\r
- F1 = (git_float) L1;\r
- S1 = ENCODE_FLOAT(F1);\r
- NEXT;\r
-\r
- do_ftonumz:\r
- F1 = DECODE_FLOAT(L1);\r
- if (!signbit(F1)) {\r
- if (isnan(F1) || isinf(F1) || (F1 > 2147483647.0))\r
- S1 = 0x7FFFFFFF;\r
- else\r
- S1 = (git_sint32) truncf(F1);\r
- } else {\r
- if (isnan(F1) || isinf(F1) || (F1 < -2147483647.0))\r
- S1 = 0x80000000;\r
- else\r
- S1 = (git_sint32) truncf(F1);\r
- }\r
- NEXT;\r
-\r
- do_ftonumn:\r
- F1 = DECODE_FLOAT(L1);\r
- if (!signbit(F1)) {\r
- if (isnan(F1) || isinf(F1) || (F1 > 2147483647.0))\r
- S1 = 0x7FFFFFFF;\r
- else\r
- S1 = (git_sint32) roundf(F1);\r
- } else {\r
- if (isnan(F1) || isinf(F1) || (F1 < -2147483647.0))\r
- S1 = 0x80000000;\r
- else\r
- S1 = (git_sint32) roundf(F1);\r
- }\r
- NEXT;\r
-\r
- do_ceil:\r
- F1 = ceilf(DECODE_FLOAT(L1));\r
- L2 = ENCODE_FLOAT(F1);\r
- if ((L2 == 0x0) || (L2 == 0x80000000))\r
- L2 = L1 & 0x80000000;\r
- S1 = L2;\r
- NEXT;\r
-\r
- do_floor:\r
- F1 = floorf(DECODE_FLOAT(L1));\r
- S1 = ENCODE_FLOAT(F1);\r
- NEXT;\r
-\r
- do_sqrt:\r
- F1 = sqrtf(DECODE_FLOAT(L1));\r
- S1 = ENCODE_FLOAT(F1);\r
- NEXT;\r
-\r
- do_exp:\r
- F1 = expf(DECODE_FLOAT(L1));\r
- S1 = ENCODE_FLOAT(F1);\r
- NEXT;\r
-\r
- do_log:\r
- F1 = logf(DECODE_FLOAT(L1));\r
- S1 = ENCODE_FLOAT(F1);\r
- NEXT;\r
-\r
- do_pow:\r
-#ifdef USE_OWN_POWF\r
- F1 = git_powf(DECODE_FLOAT(L1), DECODE_FLOAT(L2));\r
-#else\r
- F1 = powf(DECODE_FLOAT(L1), DECODE_FLOAT(L2));\r
-#endif\r
- S1 = ENCODE_FLOAT(F1);\r
- NEXT;\r
-\r
- do_atan2:\r
- F1 = atan2f(DECODE_FLOAT(L1), DECODE_FLOAT(L2));\r
- S1 = ENCODE_FLOAT(F1);\r
- NEXT;\r
-\r
- do_fmod:\r
- F1 = DECODE_FLOAT(L1);\r
- F2 = DECODE_FLOAT(L2);\r
- F3 = fmodf(F1, F2);\r
- F4 = (F1 - F3) / F2;\r
- L4 = ENCODE_FLOAT(F4);\r
- if ((L4 == 0) || (L4 == 0x80000000))\r
- L4 = (L1 ^ L2) & 0x80000000;\r
- S1 = ENCODE_FLOAT(F3);\r
- S2 = L4;\r
- NEXT;\r
-\r
- do_sin:\r
- F1 = sinf(DECODE_FLOAT(L1));\r
- S1 = ENCODE_FLOAT(F1);\r
- NEXT;\r
-\r
- do_cos:\r
- F1 = cosf(DECODE_FLOAT(L1));\r
- S1 = ENCODE_FLOAT(F1);\r
- NEXT;\r
-\r
- do_tan:\r
- F1 = tanf(DECODE_FLOAT(L1));\r
- S1 = ENCODE_FLOAT(F1);\r
- NEXT;\r
-\r
- do_asin:\r
- F1 = asinf(DECODE_FLOAT(L1));\r
- S1 = ENCODE_FLOAT(F1);\r
- NEXT;\r
-\r
- do_acos:\r
- F1 = acosf(DECODE_FLOAT(L1));\r
- S1 = ENCODE_FLOAT(F1);\r
- NEXT;\r
-\r
- do_atan:\r
- F1 = atanf(DECODE_FLOAT(L1));\r
- S1 = ENCODE_FLOAT(F1);\r
- NEXT;\r
+ 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