diff options
Diffstat (limited to 'src/builtin_OP-INT.inc.c')
| -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; + } + + } |
