@hsusulist/luc 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -6
- package/bin/luc.js +292 -23
- package/install.ps1 +222 -9
- package/package.json +1 -1
- package/scripts/postinstall.js +2 -2
- package/scripts/prepack.js +1 -1
- package/src/lcode-linux/lcode.c +294 -2
- package/src/luc_core.c +5527 -5407
- package/src/luc_libs.c +5760 -5262
- package/src/luc_nums.c +1747 -0
- package/src/luc_trans.c +10 -19
package/src/luc_trans.c
CHANGED
|
@@ -472,9 +472,10 @@ static int ana_region(Ana *a,int startpc){
|
|
|
472
472
|
break; }
|
|
473
473
|
case OP_FORPREP: {
|
|
474
474
|
if(A+3>=n){ ok=ana_fail(a,"loop registers out of frame",pc); break; }
|
|
475
|
-
if(!KISNUM(cur[A])||!KISNUM(cur[A+1])){
|
|
476
|
-
|
|
477
|
-
|
|
475
|
+
if(!KISNUM(cur[A])||!KISNUM(cur[A+1])||!KISNUM(cur[A+2])){
|
|
476
|
+
ok=ana_fail(a,"non-numeric loop bounds",pc); break;
|
|
477
|
+
}
|
|
478
|
+
unsigned char kk=(cur[A]==K_INT&&cur[A+1]==K_INT&&cur[A+2]==K_INT)?K_INT:K_NUM;
|
|
478
479
|
cur[A]=cur[A+1]=cur[A+2]=cur[A+3]=kk;
|
|
479
480
|
ok=succ_to(a,pc+1+GET_sBx(ins),cur);
|
|
480
481
|
goto region_done; }
|
|
@@ -937,27 +938,17 @@ static int gen_body(Gen *g){
|
|
|
937
938
|
JCCTO(op==OP_JMPIF?CC_NE:CC_E,tgt);
|
|
938
939
|
break; }
|
|
939
940
|
case OP_FORPREP: {
|
|
940
|
-
/* FORPREP
|
|
941
|
-
g_ldx(g,4,A); /* xmm4=
|
|
941
|
+
/* FORPREP biases the starting index; step 0/NaN bails. */
|
|
942
|
+
g_ldx(g,4,A); /* xmm4=step */
|
|
942
943
|
sse_rr(b,0x66,SSE_XORPD,1,1);
|
|
943
944
|
sse_rr(b,0x66,SSE_COMISD,4,1);
|
|
944
945
|
BAILCC(CC_P);
|
|
945
946
|
BAILCC(CC_E);
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
sse_rr(b,0xF2,SSE_SUB,2,4); /* tg-st */
|
|
947
|
+
g_ldx(g,2,A+2); /* xmm2=start */
|
|
948
|
+
sse_rr(b,0xF2,SSE_SUB,2,4); /* start-step */
|
|
949
949
|
g_stx(g,A,2);
|
|
950
|
-
sse_rr(b,0x66,SSE_XORPD,1,1);
|
|
951
|
-
g_stx(g,A+1,1);
|
|
952
|
-
int jend=emit_jmp(b);
|
|
953
|
-
patch_rel(b,jpos,b->n);
|
|
954
|
-
sse_rr(b,0xF2,SSE_MOVSD_LD,0,4);
|
|
955
|
-
emit_neg_x0(g);
|
|
956
|
-
g_stx(g,A,0); /* A=-st */
|
|
957
|
-
patch_rel(b,jend,b->n);
|
|
958
950
|
g_stx(g,A+2,4);
|
|
959
|
-
|
|
960
|
-
for(int k=0;k<4;k++) g_kill(g,A+k);
|
|
951
|
+
for(int k=0;k<3;k++) g_kill(g,A+k);
|
|
961
952
|
JUMPTO(pc+1+GET_sBx(ins));
|
|
962
953
|
break; }
|
|
963
954
|
case OP_FORLOOP: {
|
|
@@ -974,7 +965,7 @@ static int gen_body(Gen *g){
|
|
|
974
965
|
patch_rel(b,jdown,b->n);
|
|
975
966
|
g_ldx(g,1,A+1);
|
|
976
967
|
sse_rr(b,0x66,SSE_COMISD,0,1); /* idx vs lim */
|
|
977
|
-
int jt2=emit_jcc(b,
|
|
968
|
+
int jt2=emit_jcc(b,CC_A);
|
|
978
969
|
int jo2=emit_jmp(b);
|
|
979
970
|
patch_rel(b,jt1,b->n);
|
|
980
971
|
patch_rel(b,jt2,b->n);
|