aboutsummaryrefslogtreecommitdiff
path: root/src/builtin_OP-INT.inc.c
diff options
context:
space:
mode:
authorShinya Sato <shinnya.sato@gmail.com>2026-03-26 20:47:41 +0900
committerShinya Sato <shinnya.sato@gmail.com>2026-03-26 20:47:41 +0900
commita8d572933d3a29e73bbbe20bc49e1fe988e55cfa (patch)
treeaf5948828cfb6669397d249f00bc735f707fc63f /src/builtin_OP-INT.inc.c
parentced2abdb36b005b81f2e27cfd234c4eb74abc092 (diff)
downloadinpla-a8d572933d3a29e73bbbe20bc49e1fe988e55cfa.tar.gz
inpla-a8d572933d3a29e73bbbe20bc49e1fe988e55cfa.zip
v0.13.4
Diffstat (limited to 'src/builtin_OP-INT.inc.c')
-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;
+ }
+
+ }