aboutsummaryrefslogtreecommitdiff
path: root/src/builtin_OP-INT.inc.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/builtin_OP-INT.inc.c140
1 files changed, 140 insertions, 0 deletions
diff --git a/src/builtin_OP-INT.inc.c b/src/builtin_OP-INT.inc.c
new file mode 100644
index 0000000..4c55728
--- /dev/null
+++ b/src/builtin_OP-INT.inc.c
@@ -0,0 +1,140 @@
+ 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)
+ long n = FIX2INT(AGENT(a1)->port[1]);
+ long m = FIX2INT(a2);
+ a2 = INT2FIX(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)
+ long n = FIX2INT(AGENT(a1)->port[1]);
+ long m = FIX2INT(a2);
+ a2 = INT2FIX(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)
+ long n = FIX2INT(AGENT(a1)->port[1]);
+ long m = FIX2INT(a2);
+ a2 = INT2FIX(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)
+ long n = FIX2INT(AGENT(a1)->port[1]);
+ long m = FIX2INT(a2);
+ a2 = INT2FIX(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)
+ long n = FIX2INT(AGENT(a1)->port[1]);
+ long m = FIX2INT(a2);
+ a2 = INT2FIX(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;
+ }
+
+ }