diff --git a/src/jit/nvm_x86_64.c b/src/jit/nvm_x86_64.c index c39cb4aa..40ce8718 100644 --- a/src/jit/nvm_x86_64.c +++ b/src/jit/nvm_x86_64.c @@ -109,10 +109,10 @@ INS B i_FN2Oi(B w, B x, BB2B fm, BBB2B fd, u32* bc) { POS_UPD; if (q_N(x)) { dec(w); return x; } else return q_N(w)? fm(b((u64)0), x) : fd(b((u64)0), w, x); } -INS B i_ARR_0() { // TODO combine with ADDI +INS B i_LST_0() { // TODO combine with ADDI return emptyHVec(); } -INS B i_ARR_p(B el0, i64 sz, B* cStack) { assert(sz>0); +INS B i_LST_p(B el0, i64 sz, B* cStack) { assert(sz>0); HArr_p r = m_harrUv(sz); // can't use harrs as gStack isn't updated bool allNum = isNum(el0); r.a[sz-1] = el0; @@ -364,7 +364,7 @@ static OptRes opt(u32* bc0) { TSSIZE(stk)-= SETM==*sbc? 2 : 1; break; } - case ARRO: case ARRM: { i32 len = *bc++; + case LSTO: case LSTM: { i32 len = *bc++; bool allNum = len>0; for (i32 i = 0; i < len; i++) { S(c,i); if(c.p==-1) goto defIns; @@ -499,7 +499,7 @@ void freeOpt(OptRes o) { path_wChars(m_str8l("asm_off"), o); dec(o); B s = emptyCVec(); #define F(X) AFMT("s/%p$/%p # i_" #X "/;", i_##X, i_##X); - F(POPS)F(INC)F(FN1C)F(FN1O)F(FN2C)F(FN2O)F(FN1Oi)F(FN2Oi)F(ARR_0)F(ARR_p)F(DFND_0)F(DFND_1)F(DFND_2)F(MD1C)F(MD2C)F(MD2R)F(TR2D)F(TR3D)F(TR3O)F(NOVAR)F(EXTO)F(EXTU)F(SETN)F(SETU)F(SETM)F(SETC)F(SETH1)F(SETH2)F(PRED1)F(PRED2)F(SETNi)F(SETUi)F(SETMi)F(SETCi)F(SETNv)F(SETUv)F(SETMv)F(SETCv)F(FLDO)F(VFYM)F(ALIM)F(CHKV)F(FAIL)F(RETD) + F(POPS)F(INC)F(FN1C)F(FN1O)F(FN2C)F(FN2O)F(FN1Oi)F(FN2Oi)F(LST_0)F(LST_p)F(ARMM)F(ARMO)F(DFND_0)F(DFND_1)F(DFND_2)F(MD1C)F(MD2C)F(MD2R)F(TR2D)F(TR3D)F(TR3O)F(NOVAR)F(EXTO)F(EXTU)F(SETN)F(SETU)F(SETM)F(SETC)F(SETH1)F(SETH2)F(PRED1)F(PRED2)F(SETNi)F(SETUi)F(SETMi)F(SETCi)F(SETNv)F(SETUv)F(SETMv)F(SETCv)F(FLDO)F(VFYM)F(ALIM)F(CHKV)F(FAIL)F(RETD) #undef F path_wChars(m_str8l("asm_sed"), s); dec(s); } @@ -613,12 +613,12 @@ Nvm_res m_nvm(Body* body) { case FN2Ci: { u64 fn = L64; POS_UPD(R_A0,R_A3); MOV(R_A1, R_RES); GET(R_A2,1,1); CCALL(fn); } break; case FN1Oi:TOPp; GET(R_A1,0,2); IMM(R_A1,L64); IMM(R_A2,off); CCALL(i_FN1Oi); break; // ( B x, BB2B fm, u32* bc) case FN2Oi:TOPp; GET(R_A1,1,1); IMM(R_A2,L64); IMM(R_A3, L64); IMM(R_A4,off); CCALL(i_FN2Oi); break; // (B w, B x, BB2B fm, BBB2B fd, u32* bc) - case ARRM: case ARRO:; { bool o = *(bc-1) == ARRO; + case LSTM: case LSTO:; { bool o = *(bc-1) == LSTO; u32 sz = *bc++; - if (sz==0 ) { TOPs; CCALL(i_ARR_0); } // unused with optimizations + if (sz==0 ) { TOPs; CCALL(i_LST_0); } // unused with optimizations else if (sz==1 && o) { TOPp; GET(R_A3,0,2); CCALL(m_vec1); } // (B a) else if (sz==2 && o) { TOPpR(R_A1); GET(R_A0,1,1); CCALL(m_vec2); } // (B a, B b) - else { TOPp; IMM(R_A1, sz); lGPos=SPOSq(1-sz); INV(2,0,i_ARR_p); } // (B a, i64 sz, S) + else { TOPp; IMM(R_A1, sz); lGPos=SPOSq(1-sz); INV(2,0,i_LST_p); } // (B a, i64 sz, S) } break; case ARMO: { u32 sz = *bc++; TOPp; IMM(R_A1, sz); lGPos=SPOSq(1-sz); INV(2,0,i_ARMO); break; } case ARMM: { u32 sz = *bc++; TOPp; IMM(R_A1, sz); lGPos=SPOSq(1-sz); INV(2,0,i_ARMM); break; } diff --git a/src/vm.c b/src/vm.c index aa1099cd..1e43cc1d 100644 --- a/src/vm.c +++ b/src/vm.c @@ -11,7 +11,7 @@ #define UNWIND_COMPILER 1 #endif -#define FOR_BC(F) F(PUSH) F(DYNO) F(DYNM) F(ARRO) F(ARRM) F(ARMO) F(ARMM) F(FN1C) F(FN2C) F(MD1C) F(MD2C) F(TR2D) \ +#define FOR_BC(F) F(PUSH) F(DYNO) F(DYNM) F(LSTO) F(LSTM) F(ARMO) F(ARMM) F(FN1C) F(FN2C) F(MD1C) F(MD2C) F(TR2D) \ F(TR3D) F(SETN) F(SETU) F(SETM) F(SETC) F(POPS) F(DFND) F(FN1O) F(FN2O) F(CHKV) F(TR3O) \ F(MD2R) F(MD2L) F(VARO) F(VARM) F(VFYM) F(SETH) F(RETN) F(FLDO) F(FLDM) F(ALIM) F(NOTM) F(RETD) F(SYSV) F(VARU) F(PRED) \ F(EXTO) F(EXTM) F(EXTU) F(ADDI) F(ADDU) F(FN1Ci)F(FN1Oi)F(FN2Ci)F(FN2Oi) \ @@ -730,7 +730,7 @@ B evalBC(Body* b, Scope* sc, Block* bl) { // doesn't consume dec(f); break; } - case ARRO: case ARRM: { + case LSTO: case LSTM: { u32 sz = *bc++; if (sz==0) { ADD(emptyHVec()); @@ -1160,7 +1160,7 @@ void comp_init() { bL_m[POPS]=1; bL_m[CHKV]=1; bL_m[VFYM]=1; bL_m[NOTM]=1; bL_m[RETN]=1; bL_m[RETD]=1; bL_m[FAIL]=1; bL_m[PRED]=1; - bL_m[PUSH]=2; bL_m[DFND]=2; bL_m[ARRO]=2; bL_m[ARRM]=2; bL_m[ARMO]=2; bL_m[ARMM]=2; + bL_m[PUSH]=2; bL_m[DFND]=2; bL_m[LSTO]=2; bL_m[LSTM]=2; bL_m[ARMO]=2; bL_m[ARMM]=2; bL_m[DYNO]=2; bL_m[DYNM]=2; bL_m[FLDO]=2; bL_m[FLDM]=2; bL_m[SYSV]=2; bL_m[ALIM]=2; @@ -1205,8 +1205,8 @@ void comp_init() { // stack added map for (i32 i = 0; i < BC_SIZE; i++) sA_m[i] = sD_m[i] + sC_m[i]; - sA_m[ARRO]=1; sA_m[ARMO]=1; - sA_m[ARRM]=1; sA_m[ARMM]=1; + sA_m[LSTO]=1; sA_m[ARMO]=1; + sA_m[LSTM]=1; sA_m[ARMM]=1; } diff --git a/src/vm.h b/src/vm.h index 16e09d79..edea6558 100644 --- a/src/vm.h +++ b/src/vm.h @@ -23,8 +23,8 @@ enum { POPS = 0x06, // pop object from stack RETN = 0x07, // returns top of stack RETD = 0x08, // return a namespace of exported items - ARRO = 0x0B, // N; create a vector of top N items - ARRM = 0x0C, // N; create a mutable vector of top N items + LSTO = 0x0B, // N; create a vector of top N items + LSTM = 0x0C, // N; create a mutable vector of top N items ARMO = 0x0D, // push `>ToS` ARMM = 0x0E, // push a mutable version of `>ToS` that unpacks cells of what its assigned to @@ -193,8 +193,8 @@ extern i32 sC_m[BC_SIZE]; extern i32 sA_m[BC_SIZE]; static u32* nextBC (u32* p) { return p + bL_m[*p]; } static i32 stackAdded (u32* p) { return sA_m[*p]; } -static i32 stackDiff (u32* p) { if (*p==ARRO|*p==ARRM|*p==ARMO|*p==ARMM) return 1-p[1]; return sD_m[*p]; } -static i32 stackConsumed(u32* p) { if (*p==ARRO|*p==ARRM|*p==ARMO|*p==ARMM) return p[1]; return sC_m[*p]; } +static i32 stackDiff (u32* p) { if (*p==LSTO|*p==LSTM|*p==ARMO|*p==ARMM) return 1-p[1]; return sD_m[*p]; } +static i32 stackConsumed(u32* p) { if (*p==LSTO|*p==LSTM|*p==ARMO|*p==ARMM) return p[1]; return sC_m[*p]; } char* bc_repr(u32 p);