aboutsummaryrefslogtreecommitdiff
path: root/src/builtin_OP-INT.inc.c
blob: 0bced59a0d963610042218bac901889dd0ee66aa (plain) (blame)
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
switch (BASIC(a1)->id) {
case ID_ADD: {
  COUNTUP_INTERACTION(vm);

  BASIC(a1)->id = ID_ADD2;
  VALUE a1port1 = AGENT(a1)->port[1];
  AGENT(a1)->port[1] = a2;
  a2 = a1port1;
  goto loop;
}
case ID_ADD2: {
  COUNTUP_INTERACTION(vm);

  // r << Add(m,n)
  double n = FIX2FLOAT(AGENT(a1)->port[1]);
  double m = FIX2FLOAT(a2);
  a2 = FLOAT2FIX(m + n);
  VALUE a1port0 = AGENT(a1)->port[0];
  free_Agent(a1);
  a1 = a1port0;
  goto loop;
}
case ID_SUB: {
  COUNTUP_INTERACTION(vm);

  BASIC(a1)->id = ID_SUB2;
  VALUE a1port1 = AGENT(a1)->port[1];
  AGENT(a1)->port[1] = a2;
  a2 = a1port1;
  goto loop;
}
case ID_SUB2: {
  COUNTUP_INTERACTION(vm);

  // r << Sub(m,n)
  double n = FIX2FLOAT(AGENT(a1)->port[1]);
  double m = FIX2FLOAT(a2);
  a2 = FLOAT2FIX(m - n);
  VALUE a1port0 = AGENT(a1)->port[0];
  free_Agent(a1);
  a1 = a1port0;
  goto loop;
}
case ID_MUL: {
  COUNTUP_INTERACTION(vm);

  BASIC(a1)->id = ID_MUL2;
  VALUE a1port1 = AGENT(a1)->port[1];
  AGENT(a1)->port[1] = a2;
  a2 = a1port1;
  goto loop;
}
case ID_MUL2: {
  COUNTUP_INTERACTION(vm);

  // r << Mult(m,n)
  double n = FIX2FLOAT(AGENT(a1)->port[1]);
  double m = FIX2FLOAT(a2);
  a2 = FLOAT2FIX(m * n);
  VALUE a1port0 = AGENT(a1)->port[0];
  free_Agent(a1);
  a1 = a1port0;
  goto loop;
}
case ID_DIV: {
  COUNTUP_INTERACTION(vm);

  BASIC(a1)->id = ID_DIV2;
  VALUE a1port1 = AGENT(a1)->port[1];
  AGENT(a1)->port[1] = a2;
  a2 = a1port1;
  goto loop;
}
case ID_DIV2: {
  COUNTUP_INTERACTION(vm);

  // r << DIV(m,n)
  double n = FIX2FLOAT(AGENT(a1)->port[1]);
  double m = FIX2FLOAT(a2);
  a2 = FLOAT2FIX(m / n);
  VALUE a1port0 = AGENT(a1)->port[0];
  free_Agent(a1);
  a1 = a1port0;
  goto loop;
}
case ID_MOD: {
  COUNTUP_INTERACTION(vm);

  BASIC(a1)->id = ID_MOD2;
  VALUE a1port1 = AGENT(a1)->port[1];
  AGENT(a1)->port[1] = a2;
  a2 = a1port1;
  goto loop;
}
case ID_MOD2: {
  COUNTUP_INTERACTION(vm);

  // r << MOD(m,n)
  double n = FIX2FLOAT(AGENT(a1)->port[1]);
  double m = FIX2FLOAT(a2);
  a2 = FLOAT2FIX(fmod(m, n));
  VALUE a1port0 = AGENT(a1)->port[0];
  free_Agent(a1);
  a1 = a1port0;
  goto loop;
}
case ID_ERASER: {
  COUNTUP_INTERACTION(vm);

  // Eps ~ (int n)
  free_Agent(a1);
  return;
}

case ID_DUP: {
  COUNTUP_INTERACTION(vm);

  // Dup(x,y) ~ (int n) --> x~n, y~n;
  VALUE a1port = AGENT(a1)->port[0];
  PUSH(vm, a1port, a2);

  a1port = AGENT(a1)->port[1];
  free_Agent(a1);
  a1 = a1port;
  goto loop;
}
}