@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/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])){ ok=ana_fail(a,"non-numeric loop bounds",pc); break; }
476
- /* integral if st/tg integral */
477
- unsigned char kk=(cur[A]==K_INT&&cur[A+1]==K_INT)?K_INT:K_NUM;
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 normalizes loop; step 0/NaN bails. */
941
- g_ldx(g,4,A); /* xmm4=st */
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
- int jpos=emit_jcc(b,CC_A);
947
- g_ldx(g,2,A+1); /* tg */
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
- g_const(g,A+3,0.0);
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,CC_AE);
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);