aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2009-12-29 01:38:26 +0100
committerMike Pall <mike>2009-12-29 01:38:26 +0100
commit374f53471528e1592d9075c47e579d2f3c546beb (patch)
tree46fabaa61de90e0bf232de21ab70370eb61af6c1 /src
parent8a9cfa4b4592e50be1903b83d28c8ea2fbc4aa43 (diff)
downloadluajit-374f53471528e1592d9075c47e579d2f3c546beb.tar.gz
luajit-374f53471528e1592d9075c47e579d2f3c546beb.tar.bz2
luajit-374f53471528e1592d9075c47e579d2f3c546beb.zip
Logical 'not' must be sign-extended for address operands.
Diffstat (limited to 'src')
-rw-r--r--src/buildvm_x86.dasc42
-rw-r--r--src/lib_jit.c8
-rw-r--r--src/lj_err.c4
-rw-r--r--src/lj_func.c2
-rw-r--r--src/lj_meta.c2
-rw-r--r--src/lj_record.c4
6 files changed, 35 insertions, 27 deletions
diff --git a/src/buildvm_x86.dasc b/src/buildvm_x86.dasc
index 0f0488be..d2bb80df 100644
--- a/src/buildvm_x86.dasc
+++ b/src/buildvm_x86.dasc
@@ -37,19 +37,27 @@
37|.endif 37|.endif
38| 38|
39|.define RA, ecx 39|.define RA, ecx
40|.if X64; .define RAa, rcx; .else; .define RAa, RA; .endif
41|.define RAL, cl 40|.define RAL, cl
42|.define RB, ebp // Must be ebp (C callee-save). 41|.define RB, ebp // Must be ebp (C callee-save).
43|.if X64; .define RBa, rbp; .else; .define RBa, RB; .endif
44|.define RC, eax // Must be eax (fcomparepp and others). 42|.define RC, eax // Must be eax (fcomparepp and others).
45|.define RCW, ax 43|.define RCW, ax
46|.define RCH, ah 44|.define RCH, ah
47|.define RCL, al 45|.define RCL, al
48|.define OP, RB 46|.define OP, RB
49|.define RD, RC 47|.define RD, RC
50|.if X64; .define RDa, rax; .else; .define RDa, RD; .endif
51|.define RDW, RCW 48|.define RDW, RCW
52|.define RDL, RCL 49|.define RDL, RCL
50|.if X64
51|.define RAa, rcx
52|.define RBa, rbp
53|.define RCa, rax
54|.define RDa, rax
55|.else
56|.define RAa, RA
57|.define RBa, RB
58|.define RCa, RC
59|.define RDa, RD
60|.endif
53| 61|
54|.if not X64 62|.if not X64
55|.define FCARG1, ecx // x86 fastcall arguments. 63|.define FCARG1, ecx // x86 fastcall arguments.
@@ -237,7 +245,7 @@
237|.macro ins_ABC; movzx RB, RCH; movzx RC, RCL; .endmacro 245|.macro ins_ABC; movzx RB, RCH; movzx RC, RCL; .endmacro
238|.macro ins_AB_; movzx RB, RCH; .endmacro 246|.macro ins_AB_; movzx RB, RCH; .endmacro
239|.macro ins_A_C; movzx RC, RCL; .endmacro 247|.macro ins_A_C; movzx RC, RCL; .endmacro
240|.macro ins_AND; not RD; .endmacro 248|.macro ins_AND; not RDa; .endmacro
241| 249|
242|// Instruction decode+dispatch. Carefully tuned (nope, lodsd is not faster). 250|// Instruction decode+dispatch. Carefully tuned (nope, lodsd is not faster).
243|.macro ins_NEXT 251|.macro ins_NEXT
@@ -898,7 +906,7 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
898 |->vmeta_tgets: 906 |->vmeta_tgets:
899 | mov TMP1, RC // RC = GCstr * 907 | mov TMP1, RC // RC = GCstr *
900 | mov TMP2, LJ_TSTR 908 | mov TMP2, LJ_TSTR
901 | lea RC, TMP1 // Store temp. TValue in TMP1/TMP2. 909 | lea RCa, TMP1 // Store temp. TValue in TMP1/TMP2.
902 | cmp PC_OP, BC_GGET 910 | cmp PC_OP, BC_GGET
903 | jne >1 911 | jne >1
904 | lea RA, [DISPATCH+DISPATCH_GL(tmptv)] // Store fn->l.env in g->tmptv. 912 | lea RA, [DISPATCH+DISPATCH_GL(tmptv)] // Store fn->l.env in g->tmptv.
@@ -919,7 +927,7 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
919 | fstp TMPQ 927 | fstp TMPQ
920 |.endif 928 |.endif
921 } 929 }
922 | lea RC, TMP1 // Store temp. TValue in TMP1/TMP2. 930 | lea RCa, TMP1 // Store temp. TValue in TMP1/TMP2.
923 | jmp >1 931 | jmp >1
924 | 932 |
925 |->vmeta_tgetv: 933 |->vmeta_tgetv:
@@ -933,7 +941,7 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
933 | mov L:CARG1d, SAVE_L 941 | mov L:CARG1d, SAVE_L
934 | mov L:CARG1d->base, BASE // Caveat: CARG2d/CARG3d may be BASE. 942 | mov L:CARG1d->base, BASE // Caveat: CARG2d/CARG3d may be BASE.
935 | mov CARG2d, RB 943 | mov CARG2d, RB
936 | mov CARG3d, RC 944 | mov CARG3, RCa // May be 64 bit ptr to stack.
937 | mov L:RB, L:CARG1d 945 | mov L:RB, L:CARG1d
938 |.else 946 |.else
939 | mov ARG2, RB 947 | mov ARG2, RB
@@ -971,7 +979,7 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
971 |->vmeta_tsets: 979 |->vmeta_tsets:
972 | mov TMP1, RC // RC = GCstr * 980 | mov TMP1, RC // RC = GCstr *
973 | mov TMP2, LJ_TSTR 981 | mov TMP2, LJ_TSTR
974 | lea RC, TMP1 // Store temp. TValue in TMP1/TMP2. 982 | lea RCa, TMP1 // Store temp. TValue in TMP1/TMP2.
975 | cmp PC_OP, BC_GSET 983 | cmp PC_OP, BC_GSET
976 | jne >1 984 | jne >1
977 | lea RA, [DISPATCH+DISPATCH_GL(tmptv)] // Store fn->l.env in g->tmptv. 985 | lea RA, [DISPATCH+DISPATCH_GL(tmptv)] // Store fn->l.env in g->tmptv.
@@ -992,7 +1000,7 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
992 | fstp TMPQ 1000 | fstp TMPQ
993 |.endif 1001 |.endif
994 } 1002 }
995 | lea RC, TMP1 // Store temp. TValue in TMP1/TMP2. 1003 | lea RCa, TMP1 // Store temp. TValue in TMP1/TMP2.
996 | jmp >1 1004 | jmp >1
997 | 1005 |
998 |->vmeta_tsetv: 1006 |->vmeta_tsetv:
@@ -1006,7 +1014,7 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
1006 | mov L:CARG1d, SAVE_L 1014 | mov L:CARG1d, SAVE_L
1007 | mov L:CARG1d->base, BASE // Caveat: CARG2d/CARG3d may be BASE. 1015 | mov L:CARG1d->base, BASE // Caveat: CARG2d/CARG3d may be BASE.
1008 | mov CARG2d, RB 1016 | mov CARG2d, RB
1009 | mov CARG3d, RC 1017 | mov CARG3, RCa // May be 64 bit ptr to stack.
1010 | mov L:RB, L:CARG1d 1018 | mov L:RB, L:CARG1d
1011 |.else 1019 |.else
1012 | mov ARG2, RB 1020 | mov ARG2, RB
@@ -1887,7 +1895,7 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
1887 | 1895 |
1888 |7: // Non-standard return case. 1896 |7: // Non-standard return case.
1889 | mov BASE, RA 1897 | mov BASE, RA
1890 | mov RA, -8 // Results start at BASE+RA = BASE-8. 1898 | mov RAa, -8 // Results start at BASE+RA = BASE-8.
1891 | jmp ->vm_return 1899 | jmp ->vm_return
1892 | 1900 |
1893 if (sse) { 1901 if (sse) {
@@ -3906,8 +3914,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
3906 | ins_AD // RA = dst, RD = hbits|asize 3914 | ins_AD // RA = dst, RD = hbits|asize
3907 |.if X64 3915 |.if X64
3908 | mov L:CARG1d, SAVE_L 3916 | mov L:CARG1d, SAVE_L
3909 |1:
3910 | mov L:CARG1d->base, BASE // Caveat: CARG2d/CARG3d may be BASE. 3917 | mov L:CARG1d->base, BASE // Caveat: CARG2d/CARG3d may be BASE.
3918 |1:
3911 | mov CARG3d, RD 3919 | mov CARG3d, RD
3912 | and RD, 0x7ff 3920 | and RD, 0x7ff
3913 | shr CARG3d, 11 3921 | shr CARG3d, 11
@@ -3982,7 +3990,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
3982 | mov L:FCARG1, L:RB 3990 | mov L:FCARG1, L:RB
3983 | call extern lj_gc_step_fixtop@4 // (lua_State *L) 3991 | call extern lj_gc_step_fixtop@4 // (lua_State *L)
3984 | movzx RD, PC_RD // Need to reload RD. 3992 | movzx RD, PC_RD // Need to reload RD.
3985 | not RD 3993 | not RDa
3986 | jmp <2 3994 | jmp <2
3987 break; 3995 break;
3988 3996
@@ -4052,7 +4060,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
4052 break; 4060 break;
4053 case BC_TGETS: 4061 case BC_TGETS:
4054 | ins_ABC // RA = dst, RB = table, RC = str const (~) 4062 | ins_ABC // RA = dst, RB = table, RC = str const (~)
4055 | not RC 4063 | not RCa
4056 | mov STR:RC, [KBASE+RC*4] 4064 | mov STR:RC, [KBASE+RC*4]
4057 | checktab RB, ->vmeta_tgets 4065 | checktab RB, ->vmeta_tgets
4058 | mov TAB:RB, [BASE+RB*8] 4066 | mov TAB:RB, [BASE+RB*8]
@@ -4182,7 +4190,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
4182 break; 4190 break;
4183 case BC_TSETS: 4191 case BC_TSETS:
4184 | ins_ABC // RA = src, RB = table, RC = str const (~) 4192 | ins_ABC // RA = src, RB = table, RC = str const (~)
4185 | not RC 4193 | not RCa
4186 | mov STR:RC, [KBASE+RC*4] 4194 | mov STR:RC, [KBASE+RC*4]
4187 | checktab RB, ->vmeta_tsets 4195 | checktab RB, ->vmeta_tsets
4188 | mov TAB:RB, [BASE+RB*8] 4196 | mov TAB:RB, [BASE+RB*8]
@@ -4427,7 +4435,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
4427 | test PC, FRAME_TYPE // Lua frame below? 4435 | test PC, FRAME_TYPE // Lua frame below?
4428 | jnz <4 4436 | jnz <4
4429 | movzx RD, PC_RA // Need to prepare BASE/KBASE. 4437 | movzx RD, PC_RA // Need to prepare BASE/KBASE.
4430 | not RD 4438 | not RDa
4431 | lea BASE, [BASE+RD*8] 4439 | lea BASE, [BASE+RD*8]
4432 | mov LFUNC:KBASE, [BASE-8] 4440 | mov LFUNC:KBASE, [BASE-8]
4433 | mov PROTO:KBASE, LFUNC:KBASE->pt 4441 | mov PROTO:KBASE, LFUNC:KBASE->pt
@@ -4591,7 +4599,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
4591 break; 4599 break;
4592 } 4600 }
4593 | movzx RA, PC_RA 4601 | movzx RA, PC_RA
4594 | not RA // Note: ~RA = -(RA+1) 4602 | not RAa // Note: ~RA = -(RA+1)
4595 | lea BASE, [BASE+RA*8] // base = base - (RA+1)*8 4603 | lea BASE, [BASE+RA*8] // base = base - (RA+1)*8
4596 | mov LFUNC:KBASE, [BASE-8] 4604 | mov LFUNC:KBASE, [BASE-8]
4597 | mov PROTO:KBASE, LFUNC:KBASE->pt 4605 | mov PROTO:KBASE, LFUNC:KBASE->pt
diff --git a/src/lib_jit.c b/src/lib_jit.c
index 0352fbe5..dceb9e5c 100644
--- a/src/lib_jit.c
+++ b/src/lib_jit.c
@@ -224,14 +224,14 @@ LJLIB_CF(jit_util_funcbc)
224LJLIB_CF(jit_util_funck) 224LJLIB_CF(jit_util_funck)
225{ 225{
226 GCproto *pt = check_Lproto(L, 0); 226 GCproto *pt = check_Lproto(L, 0);
227 MSize idx = (MSize)lj_lib_checkint(L, 2); 227 ptrdiff_t idx = (ptrdiff_t)lj_lib_checkint(L, 2);
228 if ((int32_t)idx >= 0) { 228 if (idx >= 0) {
229 if (idx < pt->sizekn) { 229 if (idx < (ptrdiff_t)pt->sizekn) {
230 setnumV(L->top-1, pt->k.n[idx]); 230 setnumV(L->top-1, pt->k.n[idx]);
231 return 1; 231 return 1;
232 } 232 }
233 } else { 233 } else {
234 if (~idx < pt->sizekgc) { 234 if (~idx < (ptrdiff_t)pt->sizekgc) {
235 GCobj *gc = gcref(pt->k.gc[idx]); 235 GCobj *gc = gcref(pt->k.gc[idx]);
236 setgcV(L, L->top-1, &gc->gch, ~gc->gch.gct); 236 setgcV(L, L->top-1, &gc->gch, ~gc->gch.gct);
237 return 1; 237 return 1;
diff --git a/src/lj_err.c b/src/lj_err.c
index 20be9e9a..02a7c4cc 100644
--- a/src/lj_err.c
+++ b/src/lj_err.c
@@ -107,10 +107,10 @@ restart:
107 if (ra == slot) { slot = bc_d(ins); goto restart; } 107 if (ra == slot) { slot = bc_d(ins); goto restart; }
108 break; 108 break;
109 case BC_GGET: 109 case BC_GGET:
110 *name = strdata(gco2str(gcref(pt->k.gc[~bc_d(ins)]))); 110 *name = strdata(gco2str(gcref(pt->k.gc[~(ptrdiff_t)bc_d(ins)])));
111 return "global"; 111 return "global";
112 case BC_TGETS: 112 case BC_TGETS:
113 *name = strdata(gco2str(gcref(pt->k.gc[~bc_c(ins)]))); 113 *name = strdata(gco2str(gcref(pt->k.gc[~(ptrdiff_t)bc_c(ins)])));
114 if (ip > pt->bc) { 114 if (ip > pt->bc) {
115 BCIns insp = ip[-1]; 115 BCIns insp = ip[-1];
116 if (bc_op(insp) == BC_MOV && bc_a(insp) == ra+1 && 116 if (bc_op(insp) == BC_MOV && bc_a(insp) == ra+1 &&
diff --git a/src/lj_func.c b/src/lj_func.c
index af4f424e..61a810f2 100644
--- a/src/lj_func.c
+++ b/src/lj_func.c
@@ -169,7 +169,7 @@ GCfunc *lj_func_newL_gc(lua_State *L, GCproto *pt, GCfuncL *parent)
169 nuv = fn->l.nupvalues; 169 nuv = fn->l.nupvalues;
170 base = L->base; 170 base = L->base;
171 for (i = 0; i < nuv; i++) { 171 for (i = 0; i < nuv; i++) {
172 int v = pt->uv[i]; 172 ptrdiff_t v = pt->uv[i];
173 GCupval *uv = v < 0 ? &gcref(puv[~v])->uv : func_finduv(L, base + v); 173 GCupval *uv = v < 0 ? &gcref(puv[~v])->uv : func_finduv(L, base + v);
174 setgcref(fn->l.uvptr[i], obj2gco(uv)); 174 setgcref(fn->l.uvptr[i], obj2gco(uv));
175 } 175 }
diff --git a/src/lj_meta.c b/src/lj_meta.c
index da661d54..dd965cde 100644
--- a/src/lj_meta.c
+++ b/src/lj_meta.c
@@ -295,7 +295,7 @@ TValue *lj_meta_equal(lua_State *L, GCobj *o1, GCobj *o2, int ne)
295 top = curr_top(L); 295 top = curr_top(L);
296 setcont(top, ne ? lj_cont_condf : lj_cont_condt); 296 setcont(top, ne ? lj_cont_condf : lj_cont_condt);
297 copyTV(L, top+1, mo); 297 copyTV(L, top+1, mo);
298 it = ~o1->gch.gct; 298 it = ~(int32_t)o1->gch.gct;
299 setgcV(L, top+2, &o1->gch, it); 299 setgcV(L, top+2, &o1->gch, it);
300 setgcV(L, top+3, &o2->gch, it); 300 setgcV(L, top+3, &o2->gch, it);
301 return top+2; /* Trigger metamethod call. */ 301 return top+2; /* Trigger metamethod call. */
diff --git a/src/lj_record.c b/src/lj_record.c
index 9466b529..6206bfcd 100644
--- a/src/lj_record.c
+++ b/src/lj_record.c
@@ -1751,7 +1751,7 @@ void lj_record_ins(jit_State *J)
1751 case BCMpri: setitype(rcv, (int32_t)~rc); rc = TREF_PRI(IRT_NIL+rc); break; 1751 case BCMpri: setitype(rcv, (int32_t)~rc); rc = TREF_PRI(IRT_NIL+rc); break;
1752 case BCMnum: { lua_Number n = J->pt->k.n[rc]; 1752 case BCMnum: { lua_Number n = J->pt->k.n[rc];
1753 setnumV(rcv, n); ix.key = rc = lj_ir_knumint(J, n); } break; 1753 setnumV(rcv, n); ix.key = rc = lj_ir_knumint(J, n); } break;
1754 case BCMstr: { GCstr *s = strref(J->pt->k.gc[~rc]); 1754 case BCMstr: { GCstr *s = strref(J->pt->k.gc[~(ptrdiff_t)rc]);
1755 setstrV(J->L, rcv, s); ix.key = rc = lj_ir_kstr(J, s); } break; 1755 setstrV(J->L, rcv, s); ix.key = rc = lj_ir_kstr(J, s); } break;
1756 default: break; /* Handled later. */ 1756 default: break; /* Handled later. */
1757 } 1757 }
@@ -1943,7 +1943,7 @@ void lj_record_ins(jit_State *J)
1943 break; 1943 break;
1944 case BC_TDUP: 1944 case BC_TDUP:
1945 rc = emitir(IRT(IR_TDUP, IRT_TAB), 1945 rc = emitir(IRT(IR_TDUP, IRT_TAB),
1946 lj_ir_ktab(J, tabref(J->pt->k.gc[~rc])), 0); 1946 lj_ir_ktab(J, tabref(J->pt->k.gc[~(ptrdiff_t)rc])), 0);
1947 break; 1947 break;
1948 1948
1949 /* -- Calls and vararg handling ----------------------------------------- */ 1949 /* -- Calls and vararg handling ----------------------------------------- */