diff options
| author | Shinya Sato <shinnya.sato@gmail.com> | 2022-08-22 21:19:50 +0900 |
|---|---|---|
| committer | Shinya Sato <shinnya.sato@gmail.com> | 2022-08-22 21:19:50 +0900 |
| commit | e50f2cf8ccab628d0cc90823389355242a23a28a (patch) | |
| tree | d32c0ba29bee605dddcca49b8d370d66f3b8233f /src | |
| parent | 38ffa9c124d59897959a3122b4f249f4209e779a (diff) | |
| parent | 3547d92c3601f8c6c295636cd2394b1d85c31bc1 (diff) | |
| download | inpla-e50f2cf8ccab628d0cc90823389355242a23a28a.tar.gz inpla-e50f2cf8ccab628d0cc90823389355242a23a28a.zip | |
Merge branch 'develop'
Diffstat (limited to 'src')
| -rw-r--r-- | src/config.h | 10 | ||||
| -rw-r--r-- | src/inpla.y | 694 | ||||
| -rw-r--r-- | src/mytype.h | 4 |
3 files changed, 419 insertions, 289 deletions
diff --git a/src/config.h b/src/config.h index 23afdc0..17d50aa 100644 --- a/src/config.h +++ b/src/config.h @@ -5,6 +5,16 @@ // ------------------------------------------------ +// Number of Agent Ports +// ------------------------------------------------ +// MAX_PORT defines a number of ports of agents. +// Default is 5 and should be 2 or more. + +#define MAX_PORT 5 + + + +// ------------------------------------------------ // Heaps // ------------------------------------------------ // There are three methods for agents and names heaps: diff --git a/src/inpla.y b/src/inpla.y index e359144..71c39ea 100644 --- a/src/inpla.y +++ b/src/inpla.y @@ -22,8 +22,8 @@ // ---------------------------------------------- -#define VERSION "0.9.2-2" -#define BUILT_DATE "21 August 2022" +#define VERSION "0.9.2-3" +#define BUILT_DATE "22 August 2022" // ------------------------------------------------------------------ @@ -2337,7 +2337,7 @@ typedef enum { OP_RET, OP_RET_FREE_LR, OP_RET_FREE_L, OP_RET_FREE_R, - OP_LOADI, OP_LOAD, + OP_LOADI, OP_LOAD, OP_LOADP, OP_ADD, OP_SUB, OP_ADDI, OP_SUBI, OP_MUL, OP_DIV, OP_MOD, OP_LT, OP_LE, OP_EQ, OP_EQI, OP_NE, @@ -2476,7 +2476,7 @@ void IMCode_puts(int n) { "RET", "RET_FREE_LR", "RET_FREE_L", "RET_FREE_R", - "LOADI", "LOAD", + "LOADI", "LOAD", "OP_LOADP", "ADD", "SUB", "ADDI", "SUBI", "MUL", "DIV", "MOD", "LT", "LE", "EQ", "EQI", "NE", @@ -2664,6 +2664,11 @@ void IMCode_puts(int n) { imcode->operand1, imcode->operand2); break; + case OP_LOADP: + printf("%s var%ld $%ld var%ld\n", string_opcode[imcode->opcode], + imcode->operand1, imcode->operand2, imcode->operand3); + break; + // arity is 2: opcode var1 $2 case OP_PUSHI: @@ -2939,6 +2944,13 @@ void VMCode_puts(void **code, int n) { (unsigned long)code[i+2]); i+=2; + } else if (code[i] == CodeAddr[OP_LOADP]) { + printf("loadp reg%lu $%ld reg%lu\n", + (unsigned long)code[i+1], + (unsigned long)code[i+2], + (unsigned long)code[i+3]); + i+=3; + } else if (code[i] == CodeAddr[OP_LOOP]) { puts("loop"); @@ -3752,6 +3764,12 @@ int CmEnv_Optimise_check_occurence_in_block(int localvar, } break; + case OP_LOADP: + // OP src1 port dest + if (imcode->operand1 == localvar) { + return 1; + } + break; case OP_MKNAME: case OP_MKGNAME: @@ -4123,7 +4141,15 @@ int CmEnv_Optimise_VMCode_CopyPropagation(int target_imcode_addr) { break; - + case OP_LOADP: + // LOADP src port dest + if (imcode->operand1 == load_to) { + imcode->operand1 = load_from; + IMCode[target_imcode_addr].opcode = OP_DEAD_CODE; + return 1; + } + break; + case OP_PUSH: case OP_MYPUSH: @@ -4805,6 +4831,29 @@ int CmEnv_generate_VMCode(void **code) { } + + case OP_LOADP: { + // OP_LOADP src1 port dest + long src1 = imcode->operand1; + long port = imcode->operand2; + long dest = imcode->operand3; + +#ifdef OPTIMISE_IMCODE + src1 = CmEnv_using_reg(src1); + if (!CmEnv_Optimise_check_occurence_in_block(imcode->operand1, line_num)) + CmEnv_free_reg(src1); + + dest = CmEnv_using_reg(dest); +#endif + + code[addr++] = CodeAddr[imcode->opcode]; + code[addr++] = (void *)(unsigned long)src1; + code[addr++] = (void *)(unsigned long)port; + code[addr++] = (void *)(unsigned long)dest; + break; + + } + case OP_LOADI: { // OP_LOADI int1 dest @@ -6043,7 +6092,8 @@ int Compile_term_on_ast(Ast *ptr, int target) { alloc[0] = Compile_term_on_ast(ptr->left, target); result = alloc[0]; - } else { + } else { + // normal case ptr=ptr->right; for (i=0; i< arity; i++) { @@ -6092,7 +6142,7 @@ int Compile_term_on_ast(Ast *ptr, int target) { alloc[0], alloc[1], alloc[2]); } break; - + case 4: if (target == -1) { mkagent = OP_MKAGENT4; @@ -6104,7 +6154,8 @@ int Compile_term_on_ast(Ast *ptr, int target) { alloc[0], alloc[1], alloc[2], alloc[3]); } break; - + +#if MAX_PORT > 4 default: if (target == -1) { mkagent = OP_MKAGENT5; @@ -6116,7 +6167,8 @@ int Compile_term_on_ast(Ast *ptr, int target) { IMCode_genCode7(mkagent, result, GET_TUPLEID(arity), alloc[0], alloc[1], alloc[2], alloc[3], alloc[4]); } - +#endif + } } @@ -6225,18 +6277,28 @@ int Compile_term_on_ast(Ast *ptr, int target) { alloc[3]); } break; - + +#if MAX_PORT > 4 default: if (target == -1) { mkagent = OP_MKAGENT5; IMCode_genCode7(mkagent, id, alloc[0], alloc[1], alloc[2], alloc[3], alloc[4], result); + + for (i=5; i<arity; i++) { + IMCode_genCode3(OP_LOADP, alloc[i], i, result); + } + } else { mkagent = OP_REUSEAGENT5; IMCode_genCode7(mkagent, result, id, alloc[0], alloc[1], alloc[2], alloc[3], alloc[4]); + for (i=5; i<arity; i++) { + IMCode_genCode3(OP_LOADP, alloc[i], i, result); + } + } - break; +#endif } return result; @@ -6335,14 +6397,14 @@ int check_invalid_occurrence(Ast *ast) { // already twice printf("ERROR: '%s' occurs twice already. \n", ast->left->sym); printf(" Use 'ifce' command to see the occurrence.\n"); - return 1; + return 0; } } } - return 0; + return 1; } @@ -6398,6 +6460,7 @@ int Compile_eqlist_on_ast(Ast *at) { #ifndef OPTIMISE_IMCODE_TRO + // Without Tail Rcursion Optimisation // 2021/9/6: It seems, always EnvAddCodePUSH is selected // because at is not NULL in this step. Should be (next == NULL)? @@ -6423,6 +6486,7 @@ int Compile_eqlist_on_ast(Ast *at) { #else + // WITH Tail Rcursion Optimisation if ((next != NULL) || ((next == NULL) && (eq->id == AST_CNCT))) { @@ -6435,9 +6499,9 @@ int Compile_eqlist_on_ast(Ast *at) { if (eq->id == AST_CNCT_TRO_INTVAR) { + // rule_left_agent ~ expression int var2 = Compile_term_on_ast(eq->right, -1); - IMCode_genCode2(OP_LOAD_META, var2, VM_OFFSET_ANNOTATE_R); int alloc[MAX_PORT]; @@ -6449,7 +6513,7 @@ int Compile_eqlist_on_ast(Ast *at) { Ast *arg_list = deconst_term->right; // arglist - // printf("TRO: %s><int\n", deconst_term->left->sym); + // printf("TRO: %s><int\n", deconst_term->left->sym); for (int i=0; i<MAX_PORT; i++) { @@ -6461,7 +6525,31 @@ int Compile_eqlist_on_ast(Ast *at) { alloc[i] = Compile_term_on_ast(arg_list->left, -1); arg_list = ast_getTail(arg_list); } + + for (int i=0; i<arity; i++) { + if (alloc[i] == VM_OFFSET_ANNOTATE_R) { + // VM_OFFSET_ANNOTATE_R should be preserved + int newreg = CmEnv_newvar(); + IMCode_genCode2(OP_LOAD, VM_OFFSET_ANNOTATE_R, newreg); + alloc[i] = newreg; + break; + } + } + IMCode_genCode2(OP_LOAD_META, var2, VM_OFFSET_ANNOTATE_R); + + + for (int i=0; i<arity; i++) { + for (int j=i+1; j<arity; j++) { + if (alloc[j] == VM_OFFSET_METAVAR_L(i)) { + // VM_OFFSET_METAVAR_L(i) should be preserved + int newreg = CmEnv_newvar(); + IMCode_genCode2(OP_LOAD, VM_OFFSET_METAVAR_L(i), newreg); + alloc[j] = newreg; + break; + } + } + IMCode_genCode2(OP_LOAD_META, alloc[i], VM_OFFSET_METAVAR_L(i)); } @@ -6476,6 +6564,7 @@ int Compile_eqlist_on_ast(Ast *at) { } else if (eq->id == AST_CNCT_TRO) { + // rule_left_agent ~ name where the name is meta_R // Pealing (*L) Ast *eq_lhs = eq->left; // (*L)(AGENT(Fib, arglist)) @@ -7242,12 +7331,11 @@ int make_rule_oneway(Ast *ast) { ruleAgent_R = ast_remove_tuple1(ruleAgent_R); - // #define MYDEBUG1 + // #define MYDEBUG1 #ifdef MYDEBUG1 ast_puts(ruleAgent_L); puts(""); ast_puts(ruleAgent_R); puts(""); - ast_puts(bodies); - exit(1); + // ast_puts(bodies); exit(1); #endif @@ -7324,6 +7412,11 @@ int make_rule_oneway(Ast *ast) { } else { arity = get_arity_on_ast(ruleAgent_L); } + if (arity >= MAX_PORT) { + printf("ERROR: Too many arguments of '%s'. It should be MAX_PORT(=%d) or less.\n", + ruleAgent_L->left->sym, MAX_PORT); + return 0; + } IdTable_set_arity(idL, arity); code[0] = (void *)(unsigned long)arity; @@ -7332,6 +7425,11 @@ int make_rule_oneway(Ast *ast) { } else { arity = get_arity_on_ast(ruleAgent_R); } + if (arity >= MAX_PORT) { + printf("ERROR: Too many arguments of '%s'. It should be MAX_PORT(=%d) or less.\n", + ruleAgent_R->left->sym, MAX_PORT); + return 0; + } IdTable_set_arity(idR, arity); code[1] = (void *)(unsigned long)arity; @@ -7363,7 +7461,7 @@ int make_rule_oneway(Ast *ast) { CmEnv.idL = idL; CmEnv.idR = idR; - + #ifdef OPTIMISE_IMCODE_TRO int is_tro = Ast_make_annotation_TailRecursionOptimisation(rule_mainbody); // if (is_tro) { @@ -7391,7 +7489,7 @@ int make_rule_oneway(Ast *ast) { #endif - // #define MKRULE_DEBUG + // #define MKRULE_DEBUG #ifndef MKRULE_DEBUG gencode_num += CmEnv_generate_VMCode(&code[2]); #else @@ -7499,7 +7597,7 @@ int make_rule(Ast *ast) { ast->left->left = ruleAgent_R; ast->left->right = ruleAgent_L;; - set_annotation_LR(VM_OFFSET_ANNOTATE_R, VM_OFFSET_ANNOTATE_L); + // set_annotation_LR(VM_OFFSET_ANNOTATE_R, VM_OFFSET_ANNOTATE_L); // ast_puts(ast);puts(""); @@ -7749,7 +7847,7 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) { &&E_REUSEAGENT0 ,&&E_REUSEAGENT1, &&E_REUSEAGENT2, &&E_REUSEAGENT3, &&E_REUSEAGENT4, &&E_REUSEAGENT5, &&E_RET, &&E_RET_FREE_LR, &&E_RET_FREE_L, &&E_RET_FREE_R, - &&E_LOADI, &&E_LOAD, + &&E_LOADI, &&E_LOAD, &&E_LOADP, &&E_ADD, &&E_SUB, &&E_ADDI, &&E_SUBI, &&E_MUL, &&E_DIV, &&E_MOD, &&E_LT, &&E_LE, &&E_EQ, &&E_EQI, &&E_NE, &&E_UNM, &&E_RAND, &&E_INC, &&E_DEC, @@ -7781,15 +7879,13 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) { E_MKNAME: // puts("mkname dest"); - pc++; - reg[(unsigned long)code[pc++]] = make_Name(vm); - goto *code[pc]; + reg[(unsigned long)code[++pc]] = make_Name(vm); + goto *code[++pc]; E_MKGNAME: // puts("mkgname id dest"); - pc++; - i = (unsigned long)code[pc++]; + i = (unsigned long)code[++pc]; a1 = IdTable_get_heap(i); if (a1 == (VALUE)NULL) { a1 = make_Name(vm); @@ -7799,234 +7895,216 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) { IdTable_set_heap(i, a1); } - reg[(unsigned long)code[pc++]] = a1; - goto *code[pc]; + reg[(unsigned long)code[++pc]] = a1; + goto *code[++pc]; E_MKAGENT0: // puts("mkagent0 id dest"); - pc++; - i = (unsigned long)code[pc++]; - reg[(unsigned long)code[pc++]] = make_Agent(vm, i); - goto *code[pc]; + i = (unsigned long)code[++pc]; + reg[(unsigned long)code[++pc]] = make_Agent(vm, i); + goto *code[++pc]; E_MKAGENT1: #if !defined(OPTIMISE_TWO_ADDRESS) || !defined(OPTIMISE_TWO_ADDRESS_MKAGENT1) // puts("mkagent1 id src1 dest"); - pc++; - a1 = make_Agent(vm, (unsigned long)code[pc++]); - AGENT(a1)->port[0] = reg[(unsigned long)code[pc++]]; - reg[(unsigned long)code[pc++]] = a1; + a1 = make_Agent(vm, (unsigned long)code[++pc]); + AGENT(a1)->port[0] = reg[(unsigned long)code[++pc]]; + reg[(unsigned long)code[++pc]] = a1; #else // puts("mkagent1 id dest"); - pc++; - a1 = make_Agent(vm, (unsigned long)code[pc++]); - AGENT(a1)->port[0] = reg[(unsigned long)code[pc]]; - reg[(unsigned long)code[pc++]] = a1; + a1 = make_Agent(vm, (unsigned long)code[++pc]); + AGENT(a1)->port[0] = reg[(unsigned long)code[++pc]]; + reg[(unsigned long)code[pc]] = a1; #endif - goto *code[pc]; + goto *code[++pc]; E_MKAGENT2: #if !defined(OPTIMISE_TWO_ADDRESS) || !defined(OPTIMISE_TWO_ADDRESS_MKAGENT2) // puts("mkagent2 id src1 src2 dest"); - pc++; - a1 = make_Agent(vm, (unsigned long)code[pc++]); + + a1 = make_Agent(vm, (unsigned long)code[++pc]); { volatile VALUE *a1port = AGENT(a1)->port; - a1port[0] = reg[(unsigned long)code[pc++]]; - a1port[1] = reg[(unsigned long)code[pc++]]; + a1port[0] = reg[(unsigned long)code[++pc]]; + a1port[1] = reg[(unsigned long)code[++pc]]; } - reg[(unsigned long)code[pc++]] = a1; + reg[(unsigned long)code[++pc]] = a1; #else // puts("mkagent2 id src1 dest"); - pc++; - a1 = make_Agent(vm, (unsigned long)code[pc++]); + a1 = make_Agent(vm, (unsigned long)code[++pc]); { volatile VALUE *a1port = AGENT(a1)->port; - a1port[0] = reg[(unsigned long)code[pc++]]; - a1port[1] = reg[(unsigned long)code[pc]]; + a1port[0] = reg[(unsigned long)code[++pc]]; + a1port[1] = reg[(unsigned long)code[++pc]]; } - reg[(unsigned long)code[pc++]] = a1; + reg[(unsigned long)code[pc]] = a1; #endif - goto *code[pc]; + goto *code[++pc]; E_MKAGENT3: #if !defined(OPTIMISE_TWO_ADDRESS) || !defined(OPTIMISE_TWO_ADDRESS_MKAGENT3) // puts("mkagent3 id src1 src2 src3 dest"); - pc++; - a1 = make_Agent(vm, (unsigned long)code[pc++]); + + a1 = make_Agent(vm, (unsigned long)code[++pc]); { volatile VALUE *a1port = AGENT(a1)->port; - a1port[0] = reg[(unsigned long)code[pc++]]; - a1port[1] = reg[(unsigned long)code[pc++]]; - a1port[2] = reg[(unsigned long)code[pc++]]; + a1port[0] = reg[(unsigned long)code[++pc]]; + a1port[1] = reg[(unsigned long)code[++pc]]; + a1port[2] = reg[(unsigned long)code[++pc]]; } - reg[(unsigned long)code[pc++]] = a1; + reg[(unsigned long)code[++pc]] = a1; #else // puts("mkagent3 id src1 src2 dest"); - pc++; - a1 = make_Agent(vm, (unsigned long)code[pc++]); + a1 = make_Agent(vm, (unsigned long)code[++pc]); { volatile VALUE *a1port = AGENT(a1)->port; - a1port[0] = reg[(unsigned long)code[pc++]]; - a1port[1] = reg[(unsigned long)code[pc++]]; - a1port[2] = reg[(unsigned long)code[pc]]; + a1port[0] = reg[(unsigned long)code[++pc]]; + a1port[1] = reg[(unsigned long)code[++pc]]; + a1port[2] = reg[(unsigned long)code[++pc]]; } - reg[(unsigned long)code[pc++]] = a1; + reg[(unsigned long)code[pc]] = a1; #endif - goto *code[pc]; + goto *code[++pc]; E_MKAGENT4: // puts("mkagent4 id src1 src2 src3 src4 dest"); - pc++; - a1 = make_Agent(vm, (unsigned long)code[pc++]); + a1 = make_Agent(vm, (unsigned long)code[++pc]); { volatile VALUE *a1port = AGENT(a1)->port; - a1port[0] = reg[(unsigned long)code[pc++]]; - a1port[1] = reg[(unsigned long)code[pc++]]; - a1port[2] = reg[(unsigned long)code[pc++]]; - a1port[3] = reg[(unsigned long)code[pc++]]; + a1port[0] = reg[(unsigned long)code[++pc]]; + a1port[1] = reg[(unsigned long)code[++pc]]; + a1port[2] = reg[(unsigned long)code[++pc]]; + a1port[3] = reg[(unsigned long)code[++pc]]; } - reg[(unsigned long)code[pc++]] = a1; - goto *code[pc]; + reg[(unsigned long)code[++pc]] = a1; + goto *code[++pc]; E_MKAGENT5: // puts("mkagent5 id src1 src2 src3 src4 src5 dest"); - pc++; - a1 = make_Agent(vm, (unsigned long)code[pc++]); + a1 = make_Agent(vm, (unsigned long)code[++pc]); { volatile VALUE *a1port = AGENT(a1)->port; - a1port[0] = reg[(unsigned long)code[pc++]]; - a1port[1] = reg[(unsigned long)code[pc++]]; - a1port[2] = reg[(unsigned long)code[pc++]]; - a1port[3] = reg[(unsigned long)code[pc++]]; - a1port[4] = reg[(unsigned long)code[pc++]]; + a1port[0] = reg[(unsigned long)code[++pc]]; + a1port[1] = reg[(unsigned long)code[++pc]]; + a1port[2] = reg[(unsigned long)code[++pc]]; + a1port[3] = reg[(unsigned long)code[++pc]]; + a1port[4] = reg[(unsigned long)code[++pc]]; } - reg[(unsigned long)code[pc++]] = a1; - goto *code[pc]; + reg[(unsigned long)code[++pc]] = a1; + goto *code[++pc]; E_REUSEAGENT0: // puts("reuseagent target id"); - pc++; - a1 = reg[(unsigned long)code[pc++]]; - AGENT(a1)->basic.id = (unsigned long)code[pc++]; - goto *code[pc]; + a1 = reg[(unsigned long)code[++pc]]; + AGENT(a1)->basic.id = (unsigned long)code[++pc]; + goto *code[++pc]; E_REUSEAGENT1: // puts("reuseagent target id src1"); - pc++; - a1 = reg[(unsigned long)code[pc++]]; - AGENT(a1)->basic.id = (unsigned long)code[pc++]; - AGENT(a1)->port[0] = reg[(unsigned long)code[pc++]]; + a1 = reg[(unsigned long)code[++pc]]; + AGENT(a1)->basic.id = (unsigned long)code[++pc]; + AGENT(a1)->port[0] = reg[(unsigned long)code[++pc]]; - goto *code[pc]; + goto *code[++pc]; E_REUSEAGENT2: // puts("reuseagent target id src1 src2"); - pc++; - a1 = reg[(unsigned long)code[pc++]]; - AGENT(a1)->basic.id = (unsigned long)code[pc++]; + a1 = reg[(unsigned long)code[++pc]]; + AGENT(a1)->basic.id = (unsigned long)code[++pc]; { volatile VALUE *a1port = AGENT(a1)->port; - a1port[0] = reg[(unsigned long)code[pc++]]; - a1port[1] = reg[(unsigned long)code[pc++]]; + a1port[0] = reg[(unsigned long)code[++pc]]; + a1port[1] = reg[(unsigned long)code[++pc]]; } - goto *code[pc]; + goto *code[++pc]; E_REUSEAGENT3: // puts("reuseagent target id src1 src2 src3"); - pc++; - a1 = reg[(unsigned long)code[pc++]]; - AGENT(a1)->basic.id = (unsigned long)code[pc++]; + a1 = reg[(unsigned long)code[++pc]]; + AGENT(a1)->basic.id = (unsigned long)code[++pc]; { volatile VALUE *a1port = AGENT(a1)->port; - a1port[0] = reg[(unsigned long)code[pc++]]; - a1port[1] = reg[(unsigned long)code[pc++]]; - a1port[2] = reg[(unsigned long)code[pc++]]; + a1port[0] = reg[(unsigned long)code[++pc]]; + a1port[1] = reg[(unsigned long)code[++pc]]; + a1port[2] = reg[(unsigned long)code[++pc]]; } - goto *code[pc]; + goto *code[++pc]; E_REUSEAGENT4: // puts("reuseagent target id src1 src2 src3 src4"); - pc++; - a1 = reg[(unsigned long)code[pc++]]; - AGENT(a1)->basic.id = (unsigned long)code[pc++]; + a1 = reg[(unsigned long)code[++pc]]; + AGENT(a1)->basic.id = (unsigned long)code[++pc]; { volatile VALUE *a1port = AGENT(a1)->port; - a1port[0] = reg[(unsigned long)code[pc++]]; - a1port[1] = reg[(unsigned long)code[pc++]]; - a1port[2] = reg[(unsigned long)code[pc++]]; - a1port[3] = reg[(unsigned long)code[pc++]]; + a1port[0] = reg[(unsigned long)code[++pc]]; + a1port[1] = reg[(unsigned long)code[++pc]]; + a1port[2] = reg[(unsigned long)code[++pc]]; + a1port[3] = reg[(unsigned long)code[++pc]]; } - goto *code[pc]; + goto *code[++pc]; E_REUSEAGENT5: // puts("reuseagent target id src1 src2 src3 src4 src5"); - pc++; - a1 = reg[(unsigned long)code[pc++]]; - AGENT(a1)->basic.id = (unsigned long)code[pc++]; + a1 = reg[(unsigned long)code[++pc]]; + AGENT(a1)->basic.id = (unsigned long)code[++pc]; { volatile VALUE *a1port = AGENT(a1)->port; - a1port[0] = reg[(unsigned long)code[pc++]]; - a1port[1] = reg[(unsigned long)code[pc++]]; - a1port[2] = reg[(unsigned long)code[pc++]]; - a1port[3] = reg[(unsigned long)code[pc++]]; - a1port[4] = reg[(unsigned long)code[pc++]]; + a1port[0] = reg[(unsigned long)code[++pc]]; + a1port[1] = reg[(unsigned long)code[++pc]]; + a1port[2] = reg[(unsigned long)code[++pc]]; + a1port[3] = reg[(unsigned long)code[++pc]]; + a1port[4] = reg[(unsigned long)code[++pc]]; } - goto *code[pc]; + goto *code[++pc]; E_PUSH: // puts("push reg reg"); { - pc++; - VALUE a1 = reg[(unsigned long)code[pc++]]; - VALUE a2 = reg[(unsigned long)code[pc++]]; + VALUE a1 = reg[(unsigned long)code[++pc]]; + VALUE a2 = reg[(unsigned long)code[++pc]]; PUSH(vm, a1, a2); } - goto *code[pc]; + goto *code[++pc]; E_PUSHI: // puts("pushi reg fixint"); { - pc++; - - VALUE a1 = reg[(unsigned long)code[pc++]]; - VALUE a2 = (unsigned long)code[pc++]; + VALUE a1 = reg[(unsigned long)code[++pc]]; + VALUE a2 = (unsigned long)code[++pc]; PUSH(vm, a1, a2); } - goto *code[pc]; + goto *code[++pc]; E_MYPUSH: // puts("mypush reg reg"); { - pc++; - VALUE a1 = reg[(unsigned long)code[pc++]]; - VALUE a2 = reg[(unsigned long)code[pc++]]; + VALUE a1 = reg[(unsigned long)code[++pc]]; + VALUE a2 = reg[(unsigned long)code[++pc]]; MYPUSH(vm, a1, a2); } - goto *code[pc]; + goto *code[++pc]; E_LOADI: // puts("loadi num dest"); - pc++; - i = (long)code[pc++]; - reg[(unsigned long)code[pc++]] = i; - goto *code[pc]; + i = (long)code[++pc]; + reg[(unsigned long)code[++pc]] = i; + goto *code[++pc]; @@ -8115,185 +8193,179 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) { E_LOAD: // puts("load src dest"); - pc++; - a1 = reg[(unsigned long)code[pc++]]; - reg[(unsigned long)code[pc++]] = a1; - goto *code[pc]; + a1 = reg[(unsigned long)code[++pc]]; + reg[(unsigned long)code[++pc]] = a1; + goto *code[++pc]; + + + E_LOADP: + // puts("loadp src port dest"); + a1 = reg[(unsigned long)code[++pc]]; + i = (unsigned long)code[++pc]; + AGENT(reg[(unsigned long)code[++pc]])->port[i] = a1; + goto *code[++pc]; E_ADD: // puts("ADD src1 src2 dest"); - pc++; { - long i = FIX2INT(reg[(unsigned long)code[pc++]]); - long j = FIX2INT(reg[(unsigned long)code[pc++]]); + long i = FIX2INT(reg[(unsigned long)code[++pc]]); + long j = FIX2INT(reg[(unsigned long)code[++pc]]); - reg[(unsigned long)code[pc++]] = INT2FIX(i+j); + reg[(unsigned long)code[++pc]] = INT2FIX(i+j); } - goto *code[pc]; + goto *code[++pc]; E_SUB: // puts("SUB src1 src2 dest"); - pc++; { - long i = FIX2INT(reg[(unsigned long)code[pc++]]); - long j = FIX2INT(reg[(unsigned long)code[pc++]]); + long i = FIX2INT(reg[(unsigned long)code[++pc]]); + long j = FIX2INT(reg[(unsigned long)code[++pc]]); - reg[(unsigned long)code[pc++]] = INT2FIX(i-j); + reg[(unsigned long)code[++pc]] = INT2FIX(i-j); } - goto *code[pc]; + goto *code[++pc]; E_ADDI: // puts("ADDI src int dest"); - pc++; { - long i = FIX2INT(reg[(unsigned long)code[pc++]]); - long j = (unsigned long)code[pc++]; + long i = FIX2INT(reg[(unsigned long)code[++pc]]); + long j = (unsigned long)code[++pc]; - reg[(unsigned long)code[pc++]] = INT2FIX(i+j); + reg[(unsigned long)code[++pc]] = INT2FIX(i+j); } - goto *code[pc]; + goto *code[++pc]; E_SUBI: // puts("SUBI src int dest"); - pc++; { - long i = FIX2INT(reg[(unsigned long)code[pc++]]); - long j = (unsigned long)code[pc++]; + long i = FIX2INT(reg[(unsigned long)code[++pc]]); + long j = (unsigned long)code[++pc]; - reg[(unsigned long)code[pc++]] = INT2FIX(i-j); + reg[(unsigned long)code[++pc]] = INT2FIX(i-j); } - goto *code[pc]; + goto *code[++pc]; E_MUL: // puts("MUL src1 src2 dest"); - pc++; { - long i = FIX2INT(reg[(unsigned long)code[pc++]]); - long j = FIX2INT(reg[(unsigned long)code[pc++]]); + long i = FIX2INT(reg[(unsigned long)code[++pc]]); + long j = FIX2INT(reg[(unsigned long)code[++pc]]); - reg[(unsigned long)code[pc++]] = INT2FIX(i*j); + reg[(unsigned long)code[++pc]] = INT2FIX(i*j); } - goto *code[pc]; + goto *code[++pc]; E_DIV: // puts("DIV src1 src2 dest"); - pc++; { - long i = FIX2INT(reg[(unsigned long)code[pc++]]); - long j = FIX2INT(reg[(unsigned long)code[pc++]]); + long i = FIX2INT(reg[(unsigned long)code[++pc]]); + long j = FIX2INT(reg[(unsigned long)code[++pc]]); - reg[(unsigned long)code[pc++]] = INT2FIX(i/j); + reg[(unsigned long)code[++pc]] = INT2FIX(i/j); } - goto *code[pc]; + goto *code[++pc]; E_MOD: // puts("MOD src1 src2 dest"); - pc++; { - long i = FIX2INT(reg[(unsigned long)code[pc++]]); - long j = FIX2INT(reg[(unsigned long)code[pc++]]); + long i = FIX2INT(reg[(unsigned long)code[++pc]]); + long j = FIX2INT(reg[(unsigned long)code[++pc]]); - reg[(unsigned long)code[pc++]] = INT2FIX(i%j); + reg[(unsigned long)code[++pc]] = INT2FIX(i%j); } - goto *code[pc]; + goto *code[++pc]; E_LT: // puts("LT src1 src2 dest"); - pc++; { // int i = FIX2INT(reg[(unsigned long)code[pc++]]); // int j = FIX2INT(reg[(unsigned long)code[pc++]]); - long i = reg[(unsigned long)code[pc++]]; - long j = reg[(unsigned long)code[pc++]]; + long i = reg[(unsigned long)code[++pc]]; + long j = reg[(unsigned long)code[++pc]]; if (i<j) { - reg[(unsigned long)code[pc++]] = INT2FIX(1); + reg[(unsigned long)code[++pc]] = INT2FIX(1); } else { - reg[(unsigned long)code[pc++]] = INT2FIX(0); + reg[(unsigned long)code[++pc]] = INT2FIX(0); } } - goto *code[pc]; + goto *code[++pc]; E_LE: // puts("LT src1 src2 dest"); - pc++; { - long i = reg[(unsigned long)code[pc++]]; - long j = reg[(unsigned long)code[pc++]]; + long i = reg[(unsigned long)code[++pc]]; + long j = reg[(unsigned long)code[++pc]]; if (i<=j) { - reg[(unsigned long)code[pc++]] = INT2FIX(1); + reg[(unsigned long)code[++pc]] = INT2FIX(1); } else { - reg[(unsigned long)code[pc++]] = INT2FIX(0); + reg[(unsigned long)code[++pc]] = INT2FIX(0); } } - goto *code[pc]; + goto *code[++pc]; E_EQ: // puts("EQ src1 src2 dest"); - pc++; { - long i = reg[(unsigned long)code[pc++]]; - long j = reg[(unsigned long)code[pc++]]; + long i = reg[(unsigned long)code[++pc]]; + long j = reg[(unsigned long)code[++pc]]; if (i==j) { - reg[(unsigned long)code[pc++]] = INT2FIX(1); + reg[(unsigned long)code[++pc]] = INT2FIX(1); } else { - reg[(unsigned long)code[pc++]] = INT2FIX(0); + reg[(unsigned long)code[++pc]] = INT2FIX(0); } } - goto *code[pc]; + goto *code[++pc]; E_EQI: // puts("EQI src1 fixint dest"); - pc++; { - long i = reg[(unsigned long)code[pc++]]; - long j = (unsigned long)code[pc++]; + long i = reg[(unsigned long)code[++pc]]; + long j = (unsigned long)code[++pc]; if (i==j) { - reg[(unsigned long)code[pc++]] = INT2FIX(1); + reg[(unsigned long)code[++pc]] = INT2FIX(1); } else { - reg[(unsigned long)code[pc++]] = INT2FIX(0); + reg[(unsigned long)code[++pc]] = INT2FIX(0); } } - goto *code[pc]; + goto *code[++pc]; E_NE: // puts("NE src1 src2 dest"); - pc++; { - long i = reg[(unsigned long)code[pc++]]; - long j = reg[(unsigned long)code[pc++]]; + long i = reg[(unsigned long)code[++pc]]; + long j = reg[(unsigned long)code[++pc]]; if (i!=j) { - reg[(unsigned long)code[pc++]] = INT2FIX(1); + reg[(unsigned long)code[++pc]] = INT2FIX(1); } else { - reg[(unsigned long)code[pc++]] = INT2FIX(0); + reg[(unsigned long)code[++pc]] = INT2FIX(0); } } - goto *code[pc]; + goto *code[++pc]; E_LT_R0: // puts("LT_R0 src1 src2"); - pc++; { - long i = reg[(unsigned long)code[pc++]]; - long j = reg[(unsigned long)code[pc++]]; + long i = reg[(unsigned long)code[++pc]]; + long j = reg[(unsigned long)code[++pc]]; if (i<j) { reg[0] = 1; @@ -8301,15 +8373,14 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) { reg[0] = 0; } } - goto *code[pc]; + goto *code[++pc]; E_LE_R0: // puts("LE_R0 src1 src2"); - pc++; { - long i = reg[(unsigned long)code[pc++]]; - long j = reg[(unsigned long)code[pc++]]; + long i = reg[(unsigned long)code[++pc]]; + long j = reg[(unsigned long)code[++pc]]; if (i<=j) { reg[0] = 1; @@ -8317,15 +8388,14 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) { reg[0] = 0; } } - goto *code[pc]; + goto *code[++pc]; E_EQ_R0: // puts("EQ_R0 src1 src2"); - pc++; { - long i = reg[(unsigned long)code[pc++]]; - long j = reg[(unsigned long)code[pc++]]; + long i = reg[(unsigned long)code[++pc]]; + long j = reg[(unsigned long)code[++pc]]; if (i==j) { reg[0] = 1; @@ -8333,15 +8403,14 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) { reg[0] = 0; } } - goto *code[pc]; + goto *code[++pc]; E_EQI_R0: // puts("EQI_R0 src1 int"); - pc++; { - long i = reg[(unsigned long)code[pc++]]; - long j = (unsigned long)code[pc++]; + long i = reg[(unsigned long)code[++pc]]; + long j = (unsigned long)code[++pc]; if (i==j) { reg[0] = 1; @@ -8349,17 +8418,16 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) { reg[0] = 0; } } - goto *code[pc]; + goto *code[++pc]; E_NE_R0: // puts("NE_R0 src1 src2"); - pc++; { - long i = reg[(unsigned long)code[pc++]]; - long j = reg[(unsigned long)code[pc++]]; + long i = reg[(unsigned long)code[++pc]]; + long j = reg[(unsigned long)code[++pc]]; if (i!=j) { reg[0] = 1; @@ -8367,7 +8435,7 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) { reg[0] = 0; } } - goto *code[pc]; + goto *code[++pc]; @@ -8375,50 +8443,47 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) { E_JMPEQ0: // puts("JMPEQ0 reg pc"); // the pc is a relative address, not absolute one! - pc++; { - long i = reg[(unsigned long)code[pc++]]; + long i = reg[(unsigned long)code[++pc]]; if (!FIX2INT(i)) { - int j = (unsigned long)code[pc++]; + int j = (unsigned long)code[++pc]; pc += j; } else { - pc++; + ++pc; } } - goto *code[pc]; + goto *code[++pc]; E_JMPEQ0_R0: // puts("JMPEQ0_R0 pc"); - pc++; { long i = reg[0]; if (!i) { - int j = (unsigned long)code[pc++]; + int j = (unsigned long)code[++pc]; pc += j; } else { - pc++; + ++pc; } } - goto *code[pc]; + goto *code[++pc]; E_JMPNEQ0: // puts("JMPNEQ0 reg pc"); - pc++; { - long i = reg[(unsigned long)code[pc++]]; + long i = reg[(unsigned long)code[++pc]]; if (FIX2INT(i)) { - int j = (unsigned long)code[pc++]; + int j = (unsigned long)code[++pc]; pc += j; } else { - pc++; + ++pc; } } - goto *code[pc]; + goto *code[++pc]; @@ -8527,78 +8592,70 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) { E_UNM: #if !defined(OPTIMISE_TWO_ADDRESS) || !defined(OPTIMISE_TWO_ADDRESS_UNARY) // puts("UNM src dest"); - pc++; { - long i = FIX2INT(reg[(unsigned long)code[pc++]]); - reg[(unsigned long)code[pc++]] = INT2FIX(-1 * i); + long i = FIX2INT(reg[(unsigned long)code[++pc]]); + reg[(unsigned long)code[++pc]] = INT2FIX(-1 * i); } #else // puts("UNM dest"); - pc++; { - long i = FIX2INT(reg[(unsigned long)code[pc]]); - reg[(unsigned long)code[pc++]] = INT2FIX(-1 * i); + long i = FIX2INT(reg[(unsigned long)code[++pc]]); + reg[(unsigned long)code[pc]] = INT2FIX(-1 * i); } #endif - goto *code[pc]; + goto *code[++pc]; E_RAND: #if !defined(OPTIMISE_TWO_ADDRESS) || !defined(OPTIMISE_TWO_ADDRESS_UNARY) // puts("RAND src dest"); - pc++; { - long i = FIX2INT(reg[(unsigned long)code[pc++]]); - reg[(unsigned long)code[pc++]] = INT2FIX(rand() % i); + long i = FIX2INT(reg[(unsigned long)code[++pc]]); + reg[(unsigned long)code[++pc]] = INT2FIX(rand() % i); } #else // puts("RAND dest"); - pc++; { - long i = FIX2INT(reg[(unsigned long)code[pc]]); - reg[(unsigned long)code[pc++]] = INT2FIX(rand() % i); + long i = FIX2INT(reg[(unsigned long)code[++pc]]); + reg[(unsigned long)code[pc]] = INT2FIX(rand() % i); } #endif - goto *code[pc]; + goto *code[++pc]; E_INC: #if !defined(OPTIMISE_TWO_ADDRESS) || !defined(OPTIMISE_TWO_ADDRESS_UNARY) // puts("INC src dest"); - pc++; { - long i = FIX2INT(reg[(unsigned long)code[pc++]]); - reg[(unsigned long)code[pc++]] = INT2FIX(++i); + long i = FIX2INT(reg[(unsigned long)code[++pc]]); + reg[(unsigned long)code[++pc]] = INT2FIX(++i); } #else // puts("INC src"); - pc++; { - long i = FIX2INT(reg[(unsigned long)code[pc]]); - reg[(unsigned long)code[pc++]] = INT2FIX(++i); + long i = FIX2INT(reg[(unsigned long)code[++pc]]); + reg[(unsigned long)code[pc]] = INT2FIX(++i); } #endif - goto *code[pc]; + goto *code[++pc]; E_DEC: #if !defined(OPTIMISE_TWO_ADDRESS) || !defined(OPTIMISE_TWO_ADDRESS_UNARY) // puts("DEC src dest"); - pc++; { - long i = FIX2INT(reg[(unsigned long)code[pc++]]); - reg[(unsigned long)code[pc++]] = INT2FIX(--i); + long i = FIX2INT(reg[(unsigned long)code[++pc]]); + reg[(unsigned long)code[++pc]] = INT2FIX(--i); } #else // puts("DEC dest"); - pc++; { - long i = FIX2INT(reg[(unsigned long)code[pc]]); - reg[(unsigned long)code[pc++]] = INT2FIX(--i); + long i = FIX2INT(reg[(unsigned long)code[++pc]]); + reg[(unsigned long)code[pc]] = INT2FIX(--i); } #endif - goto *code[pc]; + goto *code[++pc]; @@ -8641,8 +8698,7 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) { E_NOP: - pc++; - goto *code[pc]; + goto *code[++pc]; @@ -10158,6 +10214,51 @@ void select_kind_of_push(Ast *ast, int p1, int p2) { } +int check_ast_arity(Ast *ast) { + int i; + Ast *ptr; + char *sym; + + if (ast == NULL) { + return 1; + } + + if (ast->id == AST_AGENT) { + ptr = ast->right; + sym = ast->left->sym; + + for (i=0; i<MAX_PORT; i++) { + if (ptr == NULL) { + return 1; + } + if (!check_ast_arity(ptr->left)) { + return 0; + } + ptr = ast_getTail(ptr); + } + + if (ptr != NULL) { + printf("Error!: `%s' has too many arguments. It should be MAX_PORT(=%d) or less.\n", sym, MAX_PORT); + return 0; + } + + } else if (ast->id == AST_TUPLE) { + if ((ast->intval <= MAX_PORT) && (ast->intval <= 5)) { + return 1; + } else { + if (MAX_PORT <= 5) { + printf("Error: A tuple has too many arguments. It should be MAX_PORT(=%d) or less.\n", + MAX_PORT); + } else { + printf("Error: A tuple has too many arguments. It should be 5 or less.\n"); + } + return 0; + } + } + + return 1; +} + #ifndef THREAD @@ -10248,9 +10349,13 @@ int exec(Ast *at) { { Ast *tmp_at=at; while (tmp_at != NULL) { - if ((check_invalid_occurrence(tmp_at->left->left)) - && (check_invalid_occurrence(tmp_at->left->right))) { - // both ara invalid + + if (!(check_ast_arity(tmp_at->left->left)) + || !(check_ast_arity(tmp_at->left->right)) + || !(check_invalid_occurrence(tmp_at->left->left)) + || !(check_invalid_occurrence(tmp_at->left->right))) { + + // invalid case if (yyin != stdin) exit(-1); return 0; } @@ -10299,13 +10404,15 @@ int exec(Ast *at) { CmEnv_retrieve_MKGNAME(); CmEnv_generate_VMCode(code); - // // for debug - // CmEnv_retrieve_MKGNAME(); - // IMCode_puts(0); //exit(1); - // - // int codenum = CmEnv_generate_VMCode(code); - // VMCode_puts(code, codenum-2); //exit(1); - // // end for debug + // // for debug + // CmEnv_retrieve_MKGNAME(); + // IMCode_puts(0); //exit(1); + // + // int codenum = CmEnv_generate_VMCode(code); + // VMCode_puts(code, codenum-2); //exit(1); + // // end for debug + + #ifdef COUNT_MKAGENT NumberOfMkAgent=0; @@ -10536,9 +10643,13 @@ int exec(Ast *at) { { Ast *tmp_at=at; while (tmp_at != NULL) { - if ((check_invalid_occurrence(tmp_at->left->left)) - && (check_invalid_occurrence(tmp_at->left->right))) { - // both ara invalid + + if (!(check_ast_arity(tmp_at->left->left)) + || !(check_ast_arity(tmp_at->left->right)) + || !(check_invalid_occurrence(tmp_at->left->left)) + || !(check_invalid_occurrence(tmp_at->left->right))) { + + // invalid case if (yyin != stdin) exit(-1); return 0; } @@ -10751,7 +10862,7 @@ int main(int argc, char *argv[]) printf(" -t <num> Set the number of threads (Default: %10d)\n", MaxThreadsNum); #else - printf(" -w Enable Weak Reduction strategy (Default: false)\n"); + printf(" -w Enable Weak Reduction strategy (Default: disable)\n"); #endif @@ -10963,8 +11074,15 @@ int main(int argc, char *argv[]) } else { if (!(yyin = fopen(fname, "r"))) { - printf("Error: The file '%s' can not be opened.\n", fname); - exit(-1); + + char *fname_in = malloc(sizeof(char*) * 256); + snprintf(fname_in, 256, "%s.in", fname); + if (!(yyin = fopen(fname_in, "r"))) { + printf("Error: The file '%s' cannot be opened.\n", fname); + exit(-1); + } + + free(fname_in); } } diff --git a/src/mytype.h b/src/mytype.h index 74f5d19..4cc3909 100644 --- a/src/mytype.h +++ b/src/mytype.h @@ -1,6 +1,8 @@ #ifndef _TYPE_ #define _TYPE_ +#include "config.h" + typedef unsigned int IDTYPE; typedef unsigned long VALUE; @@ -10,7 +12,7 @@ typedef struct { } Basic; -#define MAX_PORT 5 +//#define MAX_PORT 5 #ifndef THREAD typedef struct { |
