ARRO/ARRM→LSTO/LSTM

This commit is contained in:
dzaima 2022-06-14 02:12:37 +03:00
parent 5e0bda6a28
commit f9d251ec08
3 changed files with 16 additions and 16 deletions

View File

@ -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; }

View File

@ -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;
}

View File

@ -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);