RPA Toolkit
dev
authormstoilov <mstoilov@b0bb84a5-424d-4f98-af44-3ef3f117eb03>
Tue, 21 Sep 2010 07:20:31 +0000 (00:20 -0700)
committermstoilov <mstoilov@b0bb84a5-424d-4f98-af44-3ef3f117eb03>
Tue, 21 Sep 2010 07:20:31 +0000 (00:20 -0700)
git-svn-id: svn+ssh://svn.crossrain.com/svn/rpase/trunk/rtk@178 b0bb84a5-424d-4f98-af44-3ef3f117eb03

rvm/rvmcodegen.c
rvm/rvmcodegen.h
tests/codegen-test.c

index 0c7ccc8..eda671f 100644 (file)
@@ -58,6 +58,23 @@ ruint rvm_codegen_funcstart_str(rvm_codegen_t *cg, const rchar* name, ruint args
        return rvm_codegen_funcstart(cg, name, r_strlen(name), args);
 }
 
+
+ruint rvm_codegen_vargs_funcstart(rvm_codegen_t *cg, const rchar* name, ruint namesize)
+{
+       ruint start = rvm_codegen_addins(cg, rvm_asm(RVM_PUSHM, DA, XX, XX, BIT(FP)|BIT(SP)|BIT(LR)));
+       rvm_codegen_addins(cg, rvm_asm(RVM_MOV, FP, SP, XX, 0));
+       rvm_codegen_addins(cg, rvm_asm(RVM_ADD, SP, SP, R0, 0));
+       rvm_codemap_add(cg->codemap, name, namesize, start);
+       return start;
+}
+
+
+ruint rvm_codegen_vargs_funcstart_str(rvm_codegen_t *cg, const rchar* name)
+{
+       return rvm_codegen_vargs_funcstart(cg, name, r_strlen(name));
+}
+
+
 void rvm_codegen_funcend(rvm_codegen_t *cg)
 {
        rvm_codegen_addins(cg, rvm_asm(RVM_MOV, SP, FP, XX, 0));
index 71c3ca4..ce2c90b 100644 (file)
@@ -25,6 +25,8 @@ rvm_codegen_t *rvm_codegen_create();
 void rvm_codegen_destroy(rvm_codegen_t *cg);
 ruint rvm_codegen_funcstart(rvm_codegen_t *cg, const rchar* name, ruint namesize, ruint args);
 ruint rvm_codegen_funcstart_str(rvm_codegen_t *cg, const rchar* name, ruint args);
+ruint rvm_codegen_vargs_funcstart(rvm_codegen_t *cg, const rchar* name, ruint namesize);
+ruint rvm_codegen_vargs_funcstart_str(rvm_codegen_t *cg, const rchar* name);
 void rvm_codegen_funcend(rvm_codegen_t *cg);
 ruint rvm_codegen_addins(rvm_codegen_t *cg, rvm_asmins_t ins);
 rvm_asmins_t *rvm_codegen_getcode(rvm_codegen_t *cg, ruint index);
index 1668cac..0004e76 100644 (file)
@@ -29,6 +29,7 @@ int main(int argc, char *argv[])
 
        rvm_codemap_invalid_add_str(cg->codemap, "add2");
        rvm_codemap_invalid_add_str(cg->codemap, "add3");
+       rvm_codemap_invalid_add_str(cg->codemap, "varadd");
 
        rvm_codegen_addins(cg, rvm_asm(RVM_MOV, R0, DA, XX, 7));
        rvm_codegen_addins(cg, rvm_asm(RVM_STS, R0, SP, DA, 1 + RVM_CODEGEN_FUNCINITOFFSET));
@@ -36,6 +37,7 @@ int main(int argc, char *argv[])
        rvm_codegen_addins(cg, rvm_asm(RVM_STS, R0, SP, DA, 2 + RVM_CODEGEN_FUNCINITOFFSET));
        rvm_codegen_addins(cg, rvm_asm(RVM_MOV, R0, DA, XX, 9));
        rvm_codegen_addins(cg, rvm_asm(RVM_STS, R0, SP, DA, 3 + RVM_CODEGEN_FUNCINITOFFSET));
+       rvm_codegen_addins(cg, rvm_asm(RVM_MOV, R0, DA, XX, 3));
        rvm_codegen_addins(cg, rvm_asmx(RVM_BL,  DA, XX, XX, &rvm_codemap_lookup_str(cg->codemap, "add3")->index));
        rvm_codegen_addins(cg, rvm_asm(RVM_SWI, DA, XX, XX, RVM_SWI_ID(ntable, 0)));
        rvm_codegen_addins(cg, rvm_asm(RVM_EXT, XX, XX, XX, 0));
@@ -51,14 +53,19 @@ int main(int argc, char *argv[])
        rvm_codegen_addins(cg, rvm_asm(RVM_LDS, R1, FP, DA, 2));
        rvm_codegen_addins(cg, rvm_asm(RVM_STS, R0, SP, DA, 1 + RVM_CODEGEN_FUNCINITOFFSET));
        rvm_codegen_addins(cg, rvm_asm(RVM_STS, R1, SP, DA, 2 + RVM_CODEGEN_FUNCINITOFFSET));
+       rvm_codegen_addins(cg, rvm_asm(RVM_MOV, R0, DA, XX, 2));
        rvm_codegen_addins(cg, rvm_asmx(RVM_BL,  DA, XX, XX, &rvm_codemap_lookup_str(cg->codemap, "add2")->index));
 
-
        rvm_codegen_addins(cg, rvm_asm(RVM_LDS, R1, FP, DA, 3));
        rvm_codegen_addins(cg, rvm_asm(RVM_STS, R0, SP, DA, 1 + RVM_CODEGEN_FUNCINITOFFSET));
        rvm_codegen_addins(cg, rvm_asm(RVM_STS, R1, SP, DA, 2 + RVM_CODEGEN_FUNCINITOFFSET));
+       rvm_codegen_addins(cg, rvm_asm(RVM_MOV, R0, DA, XX, 2));
        rvm_codegen_addins(cg, rvm_asmx(RVM_BL,  DA, XX, XX, &rvm_codemap_lookup_str(cg->codemap, "add2")->index));
+       rvm_codegen_funcend(cg);
 
+       rvm_codegen_vargs_funcstart_str(cg, "varadd");
+       rvm_codegen_addins(cg, rvm_asm(RVM_LDS, R0, FP, DA, 1));
+       rvm_codegen_addins(cg, rvm_asm(RVM_LDS, R1, FP, DA, 2));
        rvm_codegen_funcend(cg);
 
        rvm_codegen_addins(cg, rvm_asm(RVM_NOP, XX, XX, XX, 0));