summaryrefslogtreecommitdiffstats
path: root/asmrun/compare.c
diff options
context:
space:
mode:
Diffstat (limited to 'asmrun/compare.c')
-rw-r--r--asmrun/compare.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/asmrun/compare.c b/asmrun/compare.c
new file mode 100644
index 000000000..2b10ccf4a
--- /dev/null
+++ b/asmrun/compare.c
@@ -0,0 +1,65 @@
+#include <stdio.h>
+#include "mlvalues.h"
+
+value equal(v1, v2)
+ value v1, v2;
+{
+ header_t hdr1, hdr2;
+ long size, i;
+
+ tailcall:
+ if (v1 == v2) return Val_true;
+ if (v1 & 1) return Val_false;
+ if (v1 & 1) return Val_false;
+ hdr1 = Header_val(v1) & ~Modified_mask;
+ hdr2 = Header_val(v2) & ~Modified_mask;
+ switch(Tag_header(hdr1)) {
+ case Closure_tag:
+ case Infix_tag:
+ fprintf(stderr, "equal between functions\n");
+ exit(2);
+ case String_tag:
+ if (hdr1 != hdr2) return Val_false;
+ size = Size_header(hdr1);
+ for (i = 0; i < size; i++)
+ if (Field(v1, i) != Field(v2, i)) return Val_false;
+ return Val_true;
+ case Double_tag:
+ if (Double_val(v1) == Double_val(v2))
+ return Val_true;
+ else
+ return Val_false;
+ case Abstract_tag:
+ case Finalized_tag:
+ fprintf(stderr, "equal between abstract types\n");
+ exit(2);
+ default:
+ if (hdr1 != hdr2) return Val_false;
+ size = Size_header(hdr1);
+ for (i = 0; i < size-1; i++)
+ if (equal(Field(v1, i), Field(v2, i)) == Val_false) return Val_false;
+ v1 = Field(v1, i);
+ v2 = Field(v2, i);
+ goto tailcall;
+ }
+}
+
+value notequal(v1, v2)
+ value v1, v2;
+{
+ return (4 - equal(v1, v2));
+}
+
+#define COMPARISON(name) \
+value name(v1, v2) \
+ value v1, v2; \
+{ \
+ fprintf(stderr, "%s not implemented.\n", #name); \
+ exit(2); \
+}
+
+COMPARISON(greaterequal)
+COMPARISON(lessequal)
+COMPARISON(greaterthan)
+COMPARISON(lessthan)
+