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;
}
}
|