shithub: MicroHs

Download patch

ref: b236c21c13c7d60d9a4d9ec47d7405a0e7a57058
parent: 328939a17d52af1dca2fd0a26c1705ab40695cd2
author: Lennart Augustsson <lennart.augustsson@epicgames.com>
date: Sun Feb 25 08:36:56 EST 2024

Recursion free Int comparison.

--- a/src/runtime/eval.c
+++ b/src/runtime/eval.c
@@ -2360,6 +2360,16 @@
     case T_SHL:
     case T_SHR:
     case T_ASHR:
+    case T_EQ:
+    case T_NE:
+    case T_LT:
+    case T_LE:
+    case T_GT:
+    case T_GE:
+    case T_ULT:
+    case T_ULE:
+    case T_UGT:
+    case T_UGE:
       n = ARG(TOP(1));
       PUSH(combEVAL2);
       break;
@@ -2422,6 +2432,8 @@
     case T_TOPTR: CONV(T_PTR);
 #undef CONV
 
+#if 1
+#else
     case T_EQ:   CMP(==);
     case T_NE:   CMP(!=);
     case T_LT:   CMP(<);
@@ -2432,6 +2444,7 @@
     case T_ULE:  CMPU(<=);
     case T_UGT:  CMPU(>);
     case T_UGE:  CMPU(>=);
+#endif
 
     case T_PEQ:  CMPP(==);
     case T_PNULL: SETTAG(n, T_PTR); PTR(n) = 0; RET;
@@ -2615,6 +2628,8 @@
 #endif
       yu = (uvalue_t)GETVALUE(y);
       NODEPTR p = FUN(TOP(1));
+      POP(3);
+      n = TOP(-1);
     again:
       switch (GETTAG(p)) {
       case T_IND:   p = INDIR(p); goto again;
@@ -2632,12 +2647,22 @@
       case T_SHL:   ru = xu << yu; break;
       case T_SHR:   ru = xu >> yu; break;
       case T_ASHR:  ru = (uvalue_t)((value_t)xu >> yu); break;
+
+      case T_EQ:    GOIND(xu == yu ? combTrue : combFalse);
+      case T_NE:    GOIND(xu != yu ? combTrue : combFalse);
+      case T_ULT:   GOIND(xu <  yu ? combTrue : combFalse);
+      case T_ULE:   GOIND(xu <= yu ? combTrue : combFalse);
+      case T_UGT:   GOIND(xu >  yu ? combTrue : combFalse);
+      case T_UGE:   GOIND(xu >= yu ? combTrue : combFalse);
+      case T_LT:    GOIND((value_t)xu <  (value_t)yu ? combTrue : combFalse);
+      case T_LE:    GOIND((value_t)xu <= (value_t)yu ? combTrue : combFalse);
+      case T_GT:    GOIND((value_t)xu >  (value_t)yu ? combTrue : combFalse);
+      case T_GE:    GOIND((value_t)xu >= (value_t)yu ? combTrue : combFalse);
+
       default:
         //fprintf(stderr, "tag=%d\n", GETTAG(FUN(TOP(0))));
         ERR("EVAL1");
       }
-      POP(3);
-      n = TOP(-1);
       SETINT(n, (value_t)ru);
       goto ret;
 
--