RPA Toolkit
renamed some of the codegen label functions.
authorMartin Stoilov <martin@rpasearch.com>
Sun, 15 May 2011 05:54:33 +0000 (22:54 -0700)
committerMartin Stoilov <martin@rpasearch.com>
Sun, 15 May 2011 05:54:33 +0000 (22:54 -0700)
rpa2/rpacompiler.c
rvm/rvmcodegen.c
rvm/rvmcodegen.h
testrpa2/rpavm-mnode.c
testrpa2/rpavm-ref.c

index 5fe1cf8..65fa969 100644 (file)
@@ -9,7 +9,7 @@ static rlong rpa_codegen_add_numlabel_s(rvm_codegen_t *cg, const rchar *alphanam
 
        r_memset(label, 0, sizeof(label));
        r_snprintf(label, sizeof(label) - 1, "L%07ld__%s:", numname, alphaname);
-       return rvm_codegen_addlabel_s(cg, label);
+       return rvm_codegen_addlabel_default_s(cg, label);
 }
 
 
@@ -299,7 +299,7 @@ rint rpa_compiler_loop_begin(rpa_compiler_t *co, const rchar *name, ruint namesi
                ruleuid = exp.rulepref->ruleuid;
        }
        exp.start = rvm_codegen_getcodesize(co->cg);
-       exp.startidx = rvm_codegen_addlabel(co->cg, name, namesize);
+       exp.startidx = rvm_codegen_addlabel_default(co->cg, name, namesize);
        exp.endidx = rpa_codegen_invalid_add_numlabel_s(co->cg, "__end", exp.start);
        exp.successidx = rpa_codegen_invalid_add_numlabel_s(co->cg, "__success", exp.start);
        exp.failidx = rpa_codegen_invalid_add_numlabel_s(co->cg, "__fail", exp.start);
@@ -341,7 +341,7 @@ rint rpa_compiler_loop_end(rpa_compiler_t *co)
        rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R3, R0, XX, 0));                                                //          |
        rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R_TOP, R_OTP, XX, 0));                                          //          |
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, exp.loopidx, rvm_asm(RVM_B, DA, XX, XX, 0));        //          |
-       rvm_codegen_redefinelabel(co->cg, exp.failidx);                                                             //          |
+       rvm_codegen_redefinelabel_default(co->cg, exp.failidx);                                                             //          |
        rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R_REC, R1, XX, 0));          //        <-------------------------------------
        rvm_codegen_addins(co->cg, rvm_asm(RVM_MOVS, R0, DA, XX, -1));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_BX, LR, XX, XX, 0));
@@ -349,7 +349,7 @@ rint rpa_compiler_loop_end(rpa_compiler_t *co)
        /*
         *  END FAILED:
         */
-       rvm_codegen_redefinelabel(co->cg, exp.endidx);
+       rvm_codegen_redefinelabel_default(co->cg, exp.endidx);
        rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R3, R_LOO, XX, 0));         // Save LOO to R3 before restoring the old one
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R0, XX, XX, 0));            // Pop the accumulated ret, use it to save the status for return
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POPM, DA, XX, XX, BIT(R_REC)|BIT(R_LOO)|BIT(R_TOP)|BIT(LR)));
@@ -376,7 +376,7 @@ rint rpa_compiler_rule_begin(rpa_compiler_t *co, const rchar *name, ruint namesi
                ruleuid = exp.rulepref->ruleuid;
        }
        exp.start = rvm_codegen_getcodesize(co->cg);
-       exp.startidx = rvm_codegen_addlabel(co->cg, name, namesize);
+       exp.startidx = rvm_codegen_addlabel_default(co->cg, name, namesize);
        exp.endidx = rpa_codegen_invalid_add_numlabel_s(co->cg, "__end", exp.start);
        exp.dataidx = rpa_compiler_addblob(co, exp.start, ruleuid, flags, name, namesize);
 
@@ -420,7 +420,7 @@ rint rpa_compiler_rule_end(rpa_compiler_t *co)
        rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R_REC, R1, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_MOVS, R0, DA, XX, -1));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_BX, LR, XX, XX, 0));
-       rvm_codegen_redefinelabel(co->cg, exp.endidx);
+       rvm_codegen_redefinelabel_default(co->cg, exp.endidx);
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, LR, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R_TOP, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R_REC, XX, XX, 0));
@@ -486,7 +486,7 @@ rint rpa_compiler_inlinerule_end(rpa_compiler_t *co)
        rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R_REC, R1, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_MOVS, R0, DA, XX, -1));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_BX, LR, XX, XX, 0));
-       rvm_codegen_redefinelabel(co->cg, exp.endidx);
+       rvm_codegen_redefinelabel_default(co->cg, exp.endidx);
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, LR, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R_TOP, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R_REC, XX, XX, 0));
@@ -525,7 +525,7 @@ rint rpa_compiler_exp_end(rpa_compiler_t *co)
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R0, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_SUBS, R0, R_TOP, R1, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_BX, LR, XX, XX, 0));
-       rvm_codegen_redefinelabel(co->cg, exp.endidx);
+       rvm_codegen_redefinelabel_default(co->cg, exp.endidx);
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, LR, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R_TOP, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R_REC, XX, XX, 0));
@@ -562,7 +562,7 @@ rint rpa_compiler_altexp_end(rpa_compiler_t *co)
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R_TOP, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_MOVS, R0, DA, XX, -1));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_BX, LR, XX, XX, 0));
-       rvm_codegen_redefinelabel(co->cg, exp.endidx);
+       rvm_codegen_redefinelabel_default(co->cg, exp.endidx);
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, LR, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R1, XX, XX, 0));
 
@@ -602,7 +602,7 @@ rint rpa_compiler_branch_end(rpa_compiler_t *co)
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R0, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_SUBS, R0, R_TOP, R1, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_BX, LR, XX, XX, 0));
-       rvm_codegen_redefinelabel(co->cg, exp.endidx);
+       rvm_codegen_redefinelabel_default(co->cg, exp.endidx);
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, LR, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R_TOP, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R_REC, XX, XX, 0));
@@ -646,7 +646,7 @@ rint rpa_compiler_nonloopybranch_end(rpa_compiler_t *co)
        rvm_codegen_addins(co->cg, rvm_asm(RVM_SUBS, R0, R_TOP, R1, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R_LOO, R0, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_BX, LR, XX, XX, 0));
-       rvm_codegen_redefinelabel(co->cg, exp.endidx);
+       rvm_codegen_redefinelabel_default(co->cg, exp.endidx);
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, LR, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R_TOP, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R_REC, XX, XX, 0));
@@ -685,7 +685,7 @@ rint rpa_compiler_class_end(rpa_compiler_t *co)
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R_TOP, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_MOVS, R0, DA, XX, -1));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_BX, LR, XX, XX, 0));
-       rvm_codegen_redefinelabel(co->cg, exp.endidx);
+       rvm_codegen_redefinelabel_default(co->cg, exp.endidx);
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, LR, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R1, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_SUBS, R0, R_TOP, R1, 0));
@@ -724,7 +724,7 @@ rint rpa_compiler_notexp_end(rpa_compiler_t *co)
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R_REC, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_MOVS, R0, DA, XX, -1));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_BX, LR, XX, XX, 0));
-       rvm_codegen_redefinelabel(co->cg, exp.endidx);
+       rvm_codegen_redefinelabel_default(co->cg, exp.endidx);
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, LR, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R_TOP, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R0, XX, XX, 0));
@@ -765,7 +765,7 @@ rint rpa_compiler_negexp_end(rpa_compiler_t *co)
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R_REC, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_MOVS, R0, DA, XX, -1));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_BX, LR, XX, XX, 0));
-       rvm_codegen_redefinelabel(co->cg, exp.endidx);
+       rvm_codegen_redefinelabel_default(co->cg, exp.endidx);
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, LR, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R_TOP, XX, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R0, XX, XX, 0));
index 1fd4453..641740b 100644 (file)
@@ -61,13 +61,19 @@ ruint rvm_codegen_addins(rvm_codegen_t *cg, rvm_asmins_t ins)
 }
 
 
-rlong rvm_codegen_redefinelabel(rvm_codegen_t *cg, rlong index)
+rlong rvm_codegen_redefinelabel(rvm_codegen_t *cg, rlong index, rulong offset)
 {
        rvm_codelabel_t *label = rvm_codemap_label(cg->codemap, index);
 
        if (!label)
                return -1;
-       return rvm_codemap_addoffset(cg->codemap, label->name->str, label->name->size, rvm_codemap_lookupadd_s(cg->codemap, ".code"), RVM_CODE2BYTE_OFFSET(rvm_codegen_getcodesize(cg)));
+       return rvm_codemap_addoffset(cg->codemap, label->name->str, label->name->size, rvm_codemap_lookupadd_s(cg->codemap, ".code"), RVM_CODE2BYTE_OFFSET(offset));
+}
+
+
+rlong rvm_codegen_redefinelabel_default(rvm_codegen_t *cg, rlong index)
+{
+       return rvm_codegen_redefinelabel(cg, index, rvm_codegen_getcodesize(cg));
 }
 
 
@@ -87,15 +93,27 @@ rlong rvm_codegen_redefinepointer(rvm_codegen_t *cg, rlong index, rpointer data)
 }
 
 
-rlong rvm_codegen_addlabel(rvm_codegen_t *cg, const rchar* name, ruint namesize)
+rlong rvm_codegen_addlabel(rvm_codegen_t *cg, const rchar* name, ruint namesize, rulong offset)
+{
+       return rvm_codemap_addoffset(cg->codemap, name, namesize, rvm_codemap_lookupadd_s(cg->codemap, ".code"), RVM_CODE2BYTE_OFFSET(offset));
+}
+
+
+rlong rvm_codegen_addlabel_s(rvm_codegen_t *cg, const rchar* name, rulong offset)
+{
+       return rvm_codegen_addlabel(cg, name, r_strlen(name), offset);
+}
+
+
+rlong rvm_codegen_addlabel_default(rvm_codegen_t *cg, const rchar* name, ruint namesize)
 {
-       return rvm_codemap_addoffset(cg->codemap, name, namesize, rvm_codemap_lookupadd_s(cg->codemap, ".code"), RVM_CODE2BYTE_OFFSET(rvm_codegen_getcodesize(cg)));
+       return rvm_codegen_addlabel(cg, name, namesize, rvm_codegen_getcodesize(cg));
 }
 
 
-rlong rvm_codegen_addlabel_s(rvm_codegen_t *cg, const rchar* name)
+rlong rvm_codegen_addlabel_default_s(rvm_codegen_t *cg, const rchar* name)
 {
-       return rvm_codegen_addlabel(cg, name, r_strlen(name));
+       return rvm_codegen_addlabel_default(cg, name, r_strlen(name));
 }
 
 
@@ -244,7 +262,7 @@ rlong rvm_codegen_add_numlabel_s(rvm_codegen_t *cg, const rchar *alphaname, rlon
 
        r_memset(label, 0, sizeof(label));
        r_snprintf(label, sizeof(label) - 1, "L%07ld__%s:", numname, alphaname);
-       return rvm_codegen_addlabel_s(cg, label);
+       return rvm_codegen_addlabel_default_s(cg, label);
 }
 
 
index a1184ba..26263ca 100644 (file)
@@ -46,10 +46,13 @@ void rvm_codegen_setcodesize(rvm_codegen_t *cg, ruint size);
 void rvm_codegen_clear(rvm_codegen_t *cg);
 rint rvm_codegen_relocate(rvm_codegen_t *cg, rvm_codelabel_t **err);
 rlong rvm_codegen_validlabel(rvm_codegen_t *cg, rlong index);
-rlong rvm_codegen_redefinelabel(rvm_codegen_t *cg, rlong index);
+rlong rvm_codegen_redefinelabel(rvm_codegen_t *cg, rlong index, rulong offset);
+rlong rvm_codegen_redefinelabel_default(rvm_codegen_t *cg, rlong index);
 rlong rvm_codegen_redefinepointer(rvm_codegen_t *cg, rlong index, rpointer data);
-rlong rvm_codegen_addlabel(rvm_codegen_t *cg, const rchar* name, ruint namesize);
-rlong rvm_codegen_addlabel_s(rvm_codegen_t *cg, const rchar* name);
+rlong rvm_codegen_addlabel(rvm_codegen_t *cg, const rchar* name, ruint namesize, rulong offset);
+rlong rvm_codegen_addlabel_s(rvm_codegen_t *cg, const rchar* name, rulong offset);
+rlong rvm_codegen_addlabel_default(rvm_codegen_t *cg, const rchar* name, ruint namesize);
+rlong rvm_codegen_addlabel_default_s(rvm_codegen_t *cg, const rchar* name);
 rlong rvm_codegen_invalid_addlabel(rvm_codegen_t *cg, const rchar* name, ruint namesize);
 rlong rvm_codegen_invalid_addlabel_s(rvm_codegen_t *cg, const rchar* name);
 rlong rvm_codegen_adddata(rvm_codegen_t *cg, const rchar *name, ruint namesize, rconstpointer data, rsize_t size);
index 88159db..64a9fdd 100644 (file)
@@ -20,7 +20,7 @@ void code_rpa_matchabc(rpa_compiler_t *co, rpastat_t *stat)
        const rchar *ruleend = "rpa_matchabc_end";
 
        ruleidx = rvm_codegen_addstring_s(co->cg, NULL, rule);
-       rvm_codegen_addlabel_s(co->cg, rule);
+       rvm_codegen_addlabel_default_s(co->cg, rule);
 
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_STRING, ruleidx, rvm_asm(RPA_EMITSTART, DA, R_TOP, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_PUSHM, DA, XX, XX, BIT(R_TOP)|BIT(LR)));
@@ -36,7 +36,7 @@ void code_rpa_matchabc(rpa_compiler_t *co, rpastat_t *stat)
        rvm_codegen_addins(co->cg, rvm_asm(RVM_SUBS, R0, R_TOP, R1, 0));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_STRING, ruleidx, rvm_asm(RPA_EMITEND, DA, R1, R0, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_BX, LR, XX, XX, 0));
-       rvm_codegen_addlabel_s(co->cg, ruleend);
+       rvm_codegen_addlabel_default_s(co->cg, ruleend);
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POPM, DA, XX, XX, BIT(R_TOP)|BIT(LR)));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R0, DA, XX, -1));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_BX, LR, XX, XX, 0));
@@ -50,7 +50,7 @@ void code_rpa_matchxyz(rpa_compiler_t *co, rpastat_t *stat)
        const rchar *ruleend = "rpa_matchxyz_end";
 
        ruleidx = rvm_codegen_addstring_s(co->cg, NULL, rule);
-       rvm_codegen_addlabel_s(co->cg, rule);
+       rvm_codegen_addlabel_default_s(co->cg, rule);
 
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_STRING, ruleidx, rvm_asm(RPA_EMITSTART, DA, R_TOP, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_PUSHM, DA, XX, XX, BIT(R_TOP)|BIT(LR)));
@@ -66,7 +66,7 @@ void code_rpa_matchxyz(rpa_compiler_t *co, rpastat_t *stat)
        rvm_codegen_addins(co->cg, rvm_asm(RVM_SUBS, R0, R_TOP, R1, 0));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_STRING, ruleidx, rvm_asm(RPA_EMITEND, DA, R1, R0, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_BX, LR, XX, XX, 0));
-       rvm_codegen_addlabel_s(co->cg, ruleend);
+       rvm_codegen_addlabel_default_s(co->cg, ruleend);
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POPM, DA, XX, XX, BIT(R_TOP)|BIT(LR)));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R0, DA, XX, -1));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_BX, LR, XX, XX, 0));
index 4addfc6..036775f 100644 (file)
@@ -20,7 +20,7 @@ void code_rpa_matchabc(rpa_compiler_t *co, rpastat_t *stat)
        const rchar *ruleend = "rpa_matchabc_end";
 
        ruleidx = rvm_codegen_addstring_s(co->cg, NULL, rule);
-       rvm_codegen_addlabel_s(co->cg, rule);
+       rvm_codegen_addlabel_default_s(co->cg, rule);
 
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_STRING, ruleidx, rvm_asm(RPA_EMITSTART, DA, R_TOP, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_PUSHM, DA, XX, XX, BIT(R_TOP)|BIT(LR)));
@@ -36,7 +36,7 @@ void code_rpa_matchabc(rpa_compiler_t *co, rpastat_t *stat)
        rvm_codegen_addins(co->cg, rvm_asm(RVM_SUBS, R0, R_TOP, R1, 0));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_STRING, ruleidx, rvm_asm(RPA_EMITEND, DA, R1, R0, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_BX, LR, XX, XX, 0));
-       rvm_codegen_addlabel_s(co->cg, ruleend);
+       rvm_codegen_addlabel_default_s(co->cg, ruleend);
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POPM, DA, XX, XX, BIT(R_TOP)|BIT(LR)));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R0, DA, XX, -1));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_BX, LR, XX, XX, 0));
@@ -50,7 +50,7 @@ void code_rpa_matchxyz(rpa_compiler_t *co, rpastat_t *stat)
        const rchar *ruleend = "rpa_matchxyz_end";
 
        ruleidx = rvm_codegen_addstring_s(co->cg, NULL, rule);
-       rvm_codegen_addlabel_s(co->cg, rule);
+       rvm_codegen_addlabel_default_s(co->cg, rule);
 
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_STRING, ruleidx, rvm_asm(RPA_EMITSTART, DA, R_TOP, XX, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_PUSHM, DA, XX, XX, BIT(R_TOP)|BIT(LR)));
@@ -66,7 +66,7 @@ void code_rpa_matchxyz(rpa_compiler_t *co, rpastat_t *stat)
        rvm_codegen_addins(co->cg, rvm_asm(RVM_SUBS, R0, R_TOP, R1, 0));
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_STRING, ruleidx, rvm_asm(RPA_EMITEND, DA, R1, R0, 0));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_BX, LR, XX, XX, 0));
-       rvm_codegen_addlabel_s(co->cg, ruleend);
+       rvm_codegen_addlabel_default_s(co->cg, ruleend);
        rvm_codegen_addins(co->cg, rvm_asm(RVM_POPM, DA, XX, XX, BIT(R_TOP)|BIT(LR)));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R0, DA, XX, -1));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_BX, LR, XX, XX, 0));