summaryrefslogtreecommitdiffstats
path: root/asmrun/compare.c
blob: 2b10ccf4a85a3d0d225ce3d4a1bac2a8f072f9e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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)