diff options
| author | Shinya Sato <shinnya.sato@gmail.com> | 2026-03-26 20:47:41 +0900 |
|---|---|---|
| committer | Shinya Sato <shinnya.sato@gmail.com> | 2026-03-26 20:47:41 +0900 |
| commit | a8d572933d3a29e73bbbe20bc49e1fe988e55cfa (patch) | |
| tree | af5948828cfb6669397d249f00bc735f707fc63f /src/builtin_OP-INT.inc.c | |
| parent | ced2abdb36b005b81f2e27cfd234c4eb74abc092 (diff) | |
| download | inpla-a8d572933d3a29e73bbbe20bc49e1fe988e55cfa.tar.gz inpla-a8d572933d3a29e73bbbe20bc49e1fe988e55cfa.zip | |
v0.13.4
Diffstat (limited to '')
| -rw-r--r-- | src/builtin_OP-INT.inc.c | 140 |
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; + } + + } |
