Update interpreters to latest Garglk codebase
[projects/chimara/chimara.git] / interpreters / git / terp.c
index 870b4f11fef8d9cde3683bde5bf1a3c5db533ae6..d157826ce309290fcbcc9e026e17dcbf7f4f28d2 100644 (file)
@@ -38,29 +38,29 @@ Opcode* gOpcodeTable;
 
 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
 
 // -------------------------------------------------------------
@@ -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));\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; \
@@ -1323,124 +1328,124 @@ do_tailcall:
         
     // 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