diff options
author | Mike Pall <mike> | 2009-12-16 01:29:07 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2009-12-16 01:29:07 +0100 |
commit | 4cb357d30ff96b59a4bf2421b97d4fbcd2231db9 (patch) | |
tree | 7c3cc9b2d59d1517f7e9cc701d0ae2eae822d341 | |
parent | 8df960388870e9d5e53cf4e1504bf2a8325e17a1 (diff) | |
download | luajit-4cb357d30ff96b59a4bf2421b97d4fbcd2231db9.tar.gz luajit-4cb357d30ff96b59a4bf2421b97d4fbcd2231db9.tar.bz2 luajit-4cb357d30ff96b59a4bf2421b97d4fbcd2231db9.zip |
Define x64 interpreter frame and cleanup use of stack temps.
-rw-r--r-- | src/buildvm_x86.dasc | 245 | ||||
-rw-r--r-- | src/buildvm_x86.h | 36 |
2 files changed, 175 insertions, 106 deletions
diff --git a/src/buildvm_x86.dasc b/src/buildvm_x86.dasc index 615a83d3..7638cf9b 100644 --- a/src/buildvm_x86.dasc +++ b/src/buildvm_x86.dasc | |||
@@ -19,8 +19,13 @@ | |||
19 | |// Fixed register assignments for the interpreter. | 19 | |// Fixed register assignments for the interpreter. |
20 | |// This is very fragile and has many dependencies. Caveat emptor. | 20 | |// This is very fragile and has many dependencies. Caveat emptor. |
21 | |.define BASE, edx // Not C callee-save, refetched anyway. | 21 | |.define BASE, edx // Not C callee-save, refetched anyway. |
22 | |.if not X64 or X64WIN | ||
22 | |.define KBASE, edi // Must be C callee-save. | 23 | |.define KBASE, edi // Must be C callee-save. |
23 | |.define PC, esi // Must be C callee-save. | 24 | |.define PC, esi // Must be C callee-save. |
25 | |.else | ||
26 | |.define KBASE, r13d // Must be C callee-save. | ||
27 | |.define PC, r12d // Must be C callee-save. | ||
28 | |.endif | ||
24 | |.define DISPATCH, ebx // Must be C callee-save. | 29 | |.define DISPATCH, ebx // Must be C callee-save. |
25 | | | 30 | | |
26 | |.define RA, ecx | 31 | |.define RA, ecx |
@@ -82,32 +87,23 @@ | |||
82 | |.macro pop_eax; .if X64; pop rax; .else; pop eax; .endif; .endmacro | 87 | |.macro pop_eax; .if X64; pop rax; .else; pop eax; .endif; .endmacro |
83 | | | 88 | | |
84 | |// Stack layout while in interpreter. Must match with lj_frame.h. | 89 | |// Stack layout while in interpreter. Must match with lj_frame.h. |
90 | |//----------------------------------------------------------------------- | ||
91 | |.if not X64 // x86 stack layout. | ||
92 | | | ||
85 | |.define CFRAME_SPACE, aword*7 // Delta for esp (see <--). | 93 | |.define CFRAME_SPACE, aword*7 // Delta for esp (see <--). |
86 | |.macro saveregs | 94 | |.macro saveregs |
87 | | .if X64 | 95 | | push ebp; push edi; push esi; push ebx |
88 | | .if X64WIN; push rdi; push rsi; .endif | 96 | | sub esp, CFRAME_SPACE |
89 | | push rbp; push rbx; push r12; push r13; push r14; push r15 | ||
90 | | sub rsp, CFRAME_SPACE | ||
91 | | .else | ||
92 | | push ebp; push edi; push esi; push ebx | ||
93 | | sub esp, CFRAME_SPACE | ||
94 | | .endif | ||
95 | |.endmacro | 97 | |.endmacro |
96 | |.macro restoreregs | 98 | |.macro restoreregs |
97 | | .if X64 | 99 | | add esp, CFRAME_SPACE |
98 | | add rsp, CFRAME_SPACE | 100 | | pop ebx; pop esi; pop edi; pop ebp |
99 | | pop r15; pop r14; pop r13; pop r12; pop rbx; pop rbp | ||
100 | | .if X64WIN; pop rsi; pop rdi; .endif | ||
101 | | .else | ||
102 | | add esp, CFRAME_SPACE | ||
103 | | pop ebx; pop esi; pop edi; pop ebp | ||
104 | | .endif | ||
105 | |.endmacro | 101 | |.endmacro |
106 | | | 102 | | |
107 | |.define INARG_4, aword [esp+aword*15] | 103 | |.define SAVE_ERRF, aword [esp+aword*15] // vm_pcall/vm_cpcall only. |
108 | |.define INARG_3, aword [esp+aword*14] | 104 | |.define SAVE_NRES, aword [esp+aword*14] |
109 | |.define INARG_2, aword [esp+aword*13] | 105 | |.define SAVE_CFRAME, aword [esp+aword*13] |
110 | |.define INARG_1, aword [esp+aword*12] | 106 | |.define SAVE_L, aword [esp+aword*12] |
111 | |//----- 16 byte aligned, ^^^ arguments from C caller | 107 | |//----- 16 byte aligned, ^^^ arguments from C caller |
112 | |.define SAVE_RET, aword [esp+aword*11] //<-- esp entering interpreter. | 108 | |.define SAVE_RET, aword [esp+aword*11] //<-- esp entering interpreter. |
113 | |.define SAVE_R4, aword [esp+aword*10] | 109 | |.define SAVE_R4, aword [esp+aword*10] |
@@ -116,8 +112,8 @@ | |||
116 | |//----- 16 byte aligned | 112 | |//----- 16 byte aligned |
117 | |.define SAVE_R1, aword [esp+aword*7] //<-- esp after register saves. | 113 | |.define SAVE_R1, aword [esp+aword*7] //<-- esp after register saves. |
118 | |.define SAVE_PC, aword [esp+aword*6] | 114 | |.define SAVE_PC, aword [esp+aword*6] |
119 | |.define ARG6, aword [esp+aword*5] | 115 | |.define TMP2, aword [esp+aword*5] |
120 | |.define ARG5, aword [esp+aword*4] | 116 | |.define TMP1, aword [esp+aword*4] |
121 | |//----- 16 byte aligned | 117 | |//----- 16 byte aligned |
122 | |.define ARG4, aword [esp+aword*3] | 118 | |.define ARG4, aword [esp+aword*3] |
123 | |.define ARG3, aword [esp+aword*2] | 119 | |.define ARG3, aword [esp+aword*2] |
@@ -126,24 +122,93 @@ | |||
126 | |//----- 16 byte aligned, ^^^ arguments for C callee | 122 | |//----- 16 byte aligned, ^^^ arguments for C callee |
127 | | | 123 | | |
128 | |// FPARGx overlaps ARGx and ARG(x+1) on x86. | 124 | |// FPARGx overlaps ARGx and ARG(x+1) on x86. |
129 | |.define FPARG5, qword [esp+qword*2] | ||
130 | |.define FPARG3, qword [esp+qword*1] | 125 | |.define FPARG3, qword [esp+qword*1] |
131 | |.define FPARG1, qword [esp] | 126 | |.define FPARG1, qword [esp] |
132 | |// NRESULTS overlaps ARG6 (and FPARG5) | 127 | |// TMPQ overlaps TMP1/TMP2. ARG5/NRESULTS overlap TMP1/TMP2 (and TMPQ). |
133 | |.define NRESULTS, ARG6 | 128 | |.define TMPQ, qword [esp+aword*4] |
129 | |.define ARG5, TMP1 | ||
130 | |.define NRESULTS, TMP2 | ||
134 | | | 131 | | |
135 | |// Arguments for vm_call and vm_pcall. | 132 | |// Arguments for vm_call and vm_pcall. |
136 | |.define INARG_P_ERRF, INARG_4 // vm_pcall only. | 133 | |.define INARG_BASE, SAVE_CFRAME // Overwritten by SAVE_CFRAME! |
137 | |.define INARG_NRES, INARG_3 | ||
138 | |.define INARG_BASE, INARG_2 | ||
139 | |.define SAVE_L, INARG_1 | ||
140 | | | ||
141 | |.define SAVE_CFRAME, INARG_BASE // Overwrites INARG_BASE! | ||
142 | | | 134 | | |
143 | |// Arguments for vm_cpcall. | 135 | |// Arguments for vm_cpcall. |
144 | |.define INARG_CP_UD, INARG_4 | 136 | |.define INARG_CP_UD, SAVE_ERRF |
145 | |.define INARG_CP_FUNC, INARG_3 | 137 | |.define INARG_CP_FUNC, SAVE_NRES |
146 | |.define INARG_CP_CALL, INARG_2 | 138 | |.define INARG_CP_CALL, SAVE_CFRAME |
139 | | | ||
140 | |//----------------------------------------------------------------------- | ||
141 | |.elif X64WIN // x64/Windows stack layout | ||
142 | | | ||
143 | |.define CFRAME_SPACE, aword*5 // Delta for rsp (see <--). | ||
144 | |.macro saveregs | ||
145 | | push rbp; push rdi; push rsi; push rbx | ||
146 | | sub rsp, CFRAME_SPACE | ||
147 | |.endmacro | ||
148 | |.macro restoreregs | ||
149 | | add rsp, CFRAME_SPACE | ||
150 | | pop rbx; pop rsi; pop rdi; pop rbp | ||
151 | |.endmacro | ||
152 | | | ||
153 | |.define UNUSED1, aword [esp+dword*26] | ||
154 | |.define SAVE_PC, dword [esp+dword*25] | ||
155 | |.define SAVE_L, dword [esp+dword*24] | ||
156 | |.define SAVE_ERRF, dword [esp+dword*23] | ||
157 | |.define SAVE_NRES, dword [esp+dword*22] | ||
158 | |.define TMP2, dword [esp+dword*21] | ||
159 | |.define TMP1, dword [esp+dword*20] | ||
160 | |//----- 16 byte aligned, ^^^ 32 byte register save area, owned by interpreter | ||
161 | |.define SAVE_RET, aword [esp+aword*9] //<-- rsp entering interpreter. | ||
162 | |.define SAVE_R4, aword [esp+aword*8] | ||
163 | |.define SAVE_R3, aword [esp+aword*7] | ||
164 | |.define SAVE_R2, aword [esp+aword*6] | ||
165 | |.define SAVE_R1, aword [esp+aword*5] //<-- rsp after register saves. | ||
166 | |.define SAVE_CFRAME, aword [esp+aword*4] | ||
167 | |.define CSAVE_4, aword [esp+aword*3] | ||
168 | |.define CSAVE_3, aword [esp+aword*2] | ||
169 | |.define CSAVE_2, aword [esp+aword*1] | ||
170 | |.define CSAVE_1, aword [esp] //<-- rsp while in interpreter. | ||
171 | |//----- 16 byte aligned, ^^^ 32 byte register save area, owned by callee | ||
172 | | | ||
173 | |// TMPQ overlaps TMP1/TMP2. NRESULTS overlaps TMP2 (and TMPQ). | ||
174 | |.define TMPQ, qword [esp] | ||
175 | |.define NRESULTS, TMP2 | ||
176 | | | ||
177 | |//----------------------------------------------------------------------- | ||
178 | |.else // x64/POSIX stack layout | ||
179 | | | ||
180 | |.define CFRAME_SPACE, aword*5 // Delta for rsp (see <--). | ||
181 | |.macro saveregs | ||
182 | | push rbp; push r12; push r13; push rbx | ||
183 | | sub rsp, CFRAME_SPACE | ||
184 | |.endmacro | ||
185 | |.macro restoreregs | ||
186 | | add rsp, CFRAME_SPACE | ||
187 | | pop rbx; pop r13; pop r12; pop rbp | ||
188 | |.endmacro | ||
189 | | | ||
190 | |//----- 16 byte aligned, | ||
191 | |.define SAVE_RET, aword [esp+aword*9] //<-- rsp entering interpreter. | ||
192 | |.define SAVE_R4, aword [esp+aword*8] | ||
193 | |.define SAVE_R3, aword [esp+aword*7] | ||
194 | |.define SAVE_R2, aword [esp+aword*6] | ||
195 | |.define SAVE_R1, aword [esp+aword*5] //<-- rsp after register saves. | ||
196 | |.define SAVE_CFRAME, aword [esp+aword*4] | ||
197 | |.define UNUSED1, aword [esp+aword*3] | ||
198 | |//----- ^^^ awords above, vvv dwords below | ||
199 | |.define SAVE_PC, dword [esp+dword*5] | ||
200 | |.define SAVE_L, dword [esp+dword*4] | ||
201 | |.define SAVE_ERRF, dword [esp+dword*3] | ||
202 | |.define SAVE_NRES, dword [esp+dword*2] | ||
203 | |.define TMP2, dword [esp+dword*1] | ||
204 | |.define TMP1, dword [esp] //<-- rsp while in interpreter. | ||
205 | |//----- 16 byte aligned | ||
206 | | | ||
207 | |// TMPQ overlaps TMP1/TMP2. NRESULTS overlaps TMP2 (and TMPQ). | ||
208 | |.define TMPQ, qword [esp] | ||
209 | |.define NRESULTS, TMP2 | ||
210 | | | ||
211 | |.endif | ||
147 | | | 212 | | |
148 | |//----------------------------------------------------------------------- | 213 | |//----------------------------------------------------------------------- |
149 | | | 214 | | |
@@ -163,7 +228,11 @@ | |||
163 | | movzx OP, RCL | 228 | | movzx OP, RCL |
164 | | add PC, 4 | 229 | | add PC, 4 |
165 | | shr RC, 16 | 230 | | shr RC, 16 |
231 | |.if not X64 | ||
166 | | jmp aword [DISPATCH+OP*4] | 232 | | jmp aword [DISPATCH+OP*4] |
233 | |.else | ||
234 | | jmp aword [DISPATCH+OP*8] | ||
235 | |.endif | ||
167 | |.endmacro | 236 | |.endmacro |
168 | | | 237 | | |
169 | |// Instruction footer. | 238 | |// Instruction footer. |
@@ -420,7 +489,7 @@ static void build_subroutines(BuildCtx *ctx, int cmov) | |||
420 | | mov L:RB->base, PC | 489 | | mov L:RB->base, PC |
421 | |3: | 490 | |3: |
422 | | mov RD, NRESULTS | 491 | | mov RD, NRESULTS |
423 | | mov RA, INARG_NRES // RA = wanted nresults+1 | 492 | | mov RA, SAVE_NRES // RA = wanted nresults+1 |
424 | |4: | 493 | |4: |
425 | | cmp RA, RD | 494 | | cmp RA, RD |
426 | | jne >6 // More/less results wanted? | 495 | | jne >6 // More/less results wanted? |
@@ -633,8 +702,8 @@ static void build_subroutines(BuildCtx *ctx, int cmov) | |||
633 | | // Caveat: INARG_P_* and INARG_CP_* overlap! | 702 | | // Caveat: INARG_P_* and INARG_CP_* overlap! |
634 | | mov KBASE, L:RB->stack // Compute -savestack(L, L->top). | 703 | | mov KBASE, L:RB->stack // Compute -savestack(L, L->top). |
635 | | sub KBASE, L:RB->top | 704 | | sub KBASE, L:RB->top |
636 | | mov INARG_P_ERRF, 0 // No error function. | 705 | | mov SAVE_ERRF, 0 // No error function. |
637 | | mov INARG_NRES, KBASE // Neg. delta means cframe w/o frame. | 706 | | mov SAVE_NRES, KBASE // Neg. delta means cframe w/o frame. |
638 | | // Handler may change cframe_nres(L->cframe) or cframe_errfunc(L->cframe). | 707 | | // Handler may change cframe_nres(L->cframe) or cframe_errfunc(L->cframe). |
639 | | | 708 | | |
640 | | mov ARG3, RC | 709 | | mov ARG3, RC |
@@ -693,9 +762,9 @@ static void build_subroutines(BuildCtx *ctx, int cmov) | |||
693 | |//-- Table indexing metamethods ----------------------------------------- | 762 | |//-- Table indexing metamethods ----------------------------------------- |
694 | | | 763 | | |
695 | |->vmeta_tgets: | 764 | |->vmeta_tgets: |
696 | | mov ARG5, RC // RC = GCstr * | 765 | | mov TMP1, RC // RC = GCstr * |
697 | | mov ARG6, LJ_TSTR | 766 | | mov TMP2, LJ_TSTR |
698 | | lea RC, ARG5 // Store temp. TValue in ARG5/ARG6. | 767 | | lea RC, TMP1 // Store temp. TValue in TMP1/TMP2. |
699 | | cmp PC_OP, BC_GGET | 768 | | cmp PC_OP, BC_GGET |
700 | | jne >1 | 769 | | jne >1 |
701 | | lea RA, [DISPATCH+DISPATCH_GL(tmptv)] // Store fn->l.env in g->tmptv. | 770 | | lea RA, [DISPATCH+DISPATCH_GL(tmptv)] // Store fn->l.env in g->tmptv. |
@@ -708,8 +777,8 @@ static void build_subroutines(BuildCtx *ctx, int cmov) | |||
708 | | movzx RC, PC_RC // Ugly, cannot fild from a byte. | 777 | | movzx RC, PC_RC // Ugly, cannot fild from a byte. |
709 | | mov ARG4, RC | 778 | | mov ARG4, RC |
710 | | fild ARG4 | 779 | | fild ARG4 |
711 | | fstp FPARG5 | 780 | | fstp TMPQ |
712 | | lea RC, ARG5 // Store temp. TValue in ARG5/ARG6. | 781 | | lea RC, TMP1 // Store temp. TValue in TMP1/TMP2. |
713 | | jmp >1 | 782 | | jmp >1 |
714 | | | 783 | | |
715 | |->vmeta_tgetv: | 784 | |->vmeta_tgetv: |
@@ -751,9 +820,9 @@ static void build_subroutines(BuildCtx *ctx, int cmov) | |||
751 | |//----------------------------------------------------------------------- | 820 | |//----------------------------------------------------------------------- |
752 | | | 821 | | |
753 | |->vmeta_tsets: | 822 | |->vmeta_tsets: |
754 | | mov ARG5, RC // RC = GCstr * | 823 | | mov TMP1, RC // RC = GCstr * |
755 | | mov ARG6, LJ_TSTR | 824 | | mov TMP2, LJ_TSTR |
756 | | lea RC, ARG5 // Store temp. TValue in ARG5/ARG6. | 825 | | lea RC, TMP1 // Store temp. TValue in TMP1/TMP2. |
757 | | cmp PC_OP, BC_GSET | 826 | | cmp PC_OP, BC_GSET |
758 | | jne >1 | 827 | | jne >1 |
759 | | lea RA, [DISPATCH+DISPATCH_GL(tmptv)] // Store fn->l.env in g->tmptv. | 828 | | lea RA, [DISPATCH+DISPATCH_GL(tmptv)] // Store fn->l.env in g->tmptv. |
@@ -766,8 +835,8 @@ static void build_subroutines(BuildCtx *ctx, int cmov) | |||
766 | | movzx RC, PC_RC // Ugly, cannot fild from a byte. | 835 | | movzx RC, PC_RC // Ugly, cannot fild from a byte. |
767 | | mov ARG4, RC | 836 | | mov ARG4, RC |
768 | | fild ARG4 | 837 | | fild ARG4 |
769 | | fstp FPARG5 | 838 | | fstp TMPQ |
770 | | lea RC, ARG5 // Store temp. TValue in ARG5/ARG6. | 839 | | lea RC, TMP1 // Store temp. TValue in TMP1/TMP2. |
771 | | jmp >1 | 840 | | jmp >1 |
772 | | | 841 | | |
773 | |->vmeta_tsetv: | 842 | |->vmeta_tsetv: |
@@ -930,8 +999,8 @@ static void build_subroutines(BuildCtx *ctx, int cmov) | |||
930 | | | 999 | | |
931 | |->vmeta_call: // Resolve and call __call metamethod. | 1000 | |->vmeta_call: // Resolve and call __call metamethod. |
932 | | // RA = new base, RC = nargs+1, BASE = old base, PC = return | 1001 | | // RA = new base, RC = nargs+1, BASE = old base, PC = return |
933 | | mov ARG4, RA // Save RA, RC for us. | 1002 | | mov TMP2, RA // Save RA, RC for us. |
934 | | mov ARG5, NARGS:RC | 1003 | | mov TMP1, NARGS:RC |
935 | | sub RA, 8 | 1004 | | sub RA, 8 |
936 | | lea RC, [RA+NARGS:RC*8] | 1005 | | lea RC, [RA+NARGS:RC*8] |
937 | | mov L:RB, SAVE_L | 1006 | | mov L:RB, SAVE_L |
@@ -942,8 +1011,8 @@ static void build_subroutines(BuildCtx *ctx, int cmov) | |||
942 | | mov L:RB->base, BASE // This is the callers base! | 1011 | | mov L:RB->base, BASE // This is the callers base! |
943 | | call extern lj_meta_call // (lua_State *L, TValue *func, TValue *top) | 1012 | | call extern lj_meta_call // (lua_State *L, TValue *func, TValue *top) |
944 | | mov BASE, L:RB->base | 1013 | | mov BASE, L:RB->base |
945 | | mov RA, ARG4 | 1014 | | mov RA, TMP2 |
946 | | mov NARGS:RC, ARG5 | 1015 | | mov NARGS:RC, TMP1 |
947 | | mov LFUNC:RB, [RA-8] | 1016 | | mov LFUNC:RB, [RA-8] |
948 | | add NARGS:RC, 1 | 1017 | | add NARGS:RC, 1 |
949 | | // This is fragile. L->base must not move, KBASE must always be defined. | 1018 | | // This is fragile. L->base must not move, KBASE must always be defined. |
@@ -1137,13 +1206,13 @@ static void build_subroutines(BuildCtx *ctx, int cmov) | |||
1137 | | mov ARG2, TAB:RC | 1206 | | mov ARG2, TAB:RC |
1138 | | mov ARG1, L:RB | 1207 | | mov ARG1, L:RB |
1139 | | mov RB, RA | 1208 | | mov RB, RA |
1140 | | mov ARG4, BASE // Save BASE and RA. | 1209 | | mov TMP1, BASE // Save BASE and RA. |
1141 | | add RA, 8 | 1210 | | add RA, 8 |
1142 | | mov ARG3, RA | 1211 | | mov ARG3, RA |
1143 | | call extern lj_tab_get // (lua_State *L, GCtab *t, cTValue *key) | 1212 | | call extern lj_tab_get // (lua_State *L, GCtab *t, cTValue *key) |
1144 | | // cTValue * returned in eax (RC). | 1213 | | // cTValue * returned in eax (RC). |
1145 | | mov RA, RB | 1214 | | mov RA, RB |
1146 | | mov BASE, ARG4 | 1215 | | mov BASE, TMP1 |
1147 | | mov RB, [RC] // Copy table slot. | 1216 | | mov RB, [RC] // Copy table slot. |
1148 | | mov RC, [RC+4] | 1217 | | mov RC, [RC+4] |
1149 | | mov [RA-8], RB | 1218 | | mov [RA-8], RB |
@@ -1199,13 +1268,13 @@ static void build_subroutines(BuildCtx *ctx, int cmov) | |||
1199 | | mov L:RB->base, RA // Add frame since C call can throw. | 1268 | | mov L:RB->base, RA // Add frame since C call can throw. |
1200 | | mov [RA-4], PC | 1269 | | mov [RA-4], PC |
1201 | | mov SAVE_PC, PC // Redundant (but a defined value). | 1270 | | mov SAVE_PC, PC // Redundant (but a defined value). |
1202 | | mov ARG4, BASE // Save BASE. | 1271 | | mov TMP1, BASE // Save BASE. |
1203 | | add RA, 8 | 1272 | | add RA, 8 |
1204 | | mov ARG3, RA | 1273 | | mov ARG3, RA |
1205 | | call extern lj_tab_next // (lua_State *L, GCtab *t, TValue *key) | 1274 | | call extern lj_tab_next // (lua_State *L, GCtab *t, TValue *key) |
1206 | | // Flag returned in eax (RC). | 1275 | | // Flag returned in eax (RC). |
1207 | | mov RA, L:RB->base | 1276 | | mov RA, L:RB->base |
1208 | | mov BASE, ARG4 | 1277 | | mov BASE, TMP1 |
1209 | | test RC, RC; jz >3 // End of traversal? | 1278 | | test RC, RC; jz >3 // End of traversal? |
1210 | | mov RB, [RA+8] // Copy key and value to results. | 1279 | | mov RB, [RA+8] // Copy key and value to results. |
1211 | | mov RC, [RA+12] | 1280 | | mov RC, [RA+12] |
@@ -1526,11 +1595,11 @@ static void build_subroutines(BuildCtx *ctx, int cmov) | |||
1526 | | | 1595 | | |
1527 | |.macro math_extern, func | 1596 | |.macro math_extern, func |
1528 | |.ffunc_n math_ .. func | 1597 | |.ffunc_n math_ .. func |
1529 | | mov ARG5, RA | 1598 | | mov TMP1, RA |
1530 | | fstp FPARG1 | 1599 | | fstp FPARG1 |
1531 | | mov RB, BASE | 1600 | | mov RB, BASE |
1532 | | call extern lj_wrapper_ .. func | 1601 | | call extern lj_wrapper_ .. func |
1533 | | mov RA, ARG5 | 1602 | | mov RA, TMP1 |
1534 | | mov BASE, RB | 1603 | | mov BASE, RB |
1535 | | jmp ->fff_resn | 1604 | | jmp ->fff_resn |
1536 | |.endmacro | 1605 | |.endmacro |
@@ -1645,10 +1714,10 @@ static void build_subroutines(BuildCtx *ctx, int cmov) | |||
1645 | | cmp NARGS:RC, 1+1; jne ->fff_fallback // *Exactly* 1 arg. | 1714 | | cmp NARGS:RC, 1+1; jne ->fff_fallback // *Exactly* 1 arg. |
1646 | | cmp dword [RA+4], LJ_TISNUM; ja ->fff_fallback | 1715 | | cmp dword [RA+4], LJ_TISNUM; ja ->fff_fallback |
1647 | | fld qword [RA] | 1716 | | fld qword [RA] |
1648 | | fistp ARG4 | 1717 | | fistp TMP2 |
1649 | | cmp ARG4, 255; ja ->fff_fallback | 1718 | | cmp TMP2, 255; ja ->fff_fallback |
1650 | | lea RC, ARG4 // Little-endian. | 1719 | | lea RC, TMP2 // Little-endian. |
1651 | | mov ARG5, RA // Save RA. | 1720 | | mov TMP1, RA // Save RA. |
1652 | | mov ARG3, 1 | 1721 | | mov ARG3, 1 |
1653 | | mov ARG2, RC | 1722 | | mov ARG2, RC |
1654 | |->fff_newstr: | 1723 | |->fff_newstr: |
@@ -1658,7 +1727,7 @@ static void build_subroutines(BuildCtx *ctx, int cmov) | |||
1658 | | mov L:RB->base, BASE | 1727 | | mov L:RB->base, BASE |
1659 | | call extern lj_str_new // (lua_State *L, char *str, size_t l) | 1728 | | call extern lj_str_new // (lua_State *L, char *str, size_t l) |
1660 | | // GCstr * returned in eax (RC). | 1729 | | // GCstr * returned in eax (RC). |
1661 | | mov RA, ARG5 | 1730 | | mov RA, TMP1 |
1662 | | mov BASE, L:RB->base | 1731 | | mov BASE, L:RB->base |
1663 | | mov dword [RA-4], LJ_TSTR | 1732 | | mov dword [RA-4], LJ_TSTR |
1664 | | mov [RA-8], STR:RC | 1733 | | mov [RA-8], STR:RC |
@@ -1666,13 +1735,13 @@ static void build_subroutines(BuildCtx *ctx, int cmov) | |||
1666 | | | 1735 | | |
1667 | |.ffunc string_sub | 1736 | |.ffunc string_sub |
1668 | | ffgccheck | 1737 | | ffgccheck |
1669 | | mov ARG5, RA // Save RA. | 1738 | | mov TMP1, RA // Save RA. |
1670 | | mov ARG4, -1 | 1739 | | mov TMP2, -1 |
1671 | | cmp NARGS:RC, 1+2; jb ->fff_fallback | 1740 | | cmp NARGS:RC, 1+2; jb ->fff_fallback |
1672 | | jna >1 | 1741 | | jna >1 |
1673 | | cmp dword [RA+20], LJ_TISNUM; ja ->fff_fallback | 1742 | | cmp dword [RA+20], LJ_TISNUM; ja ->fff_fallback |
1674 | | fld qword [RA+16] | 1743 | | fld qword [RA+16] |
1675 | | fistp ARG4 | 1744 | | fistp TMP2 |
1676 | |1: | 1745 | |1: |
1677 | | cmp dword [RA+4], LJ_TSTR; jne ->fff_fallback | 1746 | | cmp dword [RA+4], LJ_TSTR; jne ->fff_fallback |
1678 | | cmp dword [RA+12], LJ_TISNUM; ja ->fff_fallback | 1747 | | cmp dword [RA+12], LJ_TISNUM; ja ->fff_fallback |
@@ -1681,7 +1750,7 @@ static void build_subroutines(BuildCtx *ctx, int cmov) | |||
1681 | | mov RB, STR:RB->len | 1750 | | mov RB, STR:RB->len |
1682 | | fld qword [RA+8] | 1751 | | fld qword [RA+8] |
1683 | | fistp ARG3 | 1752 | | fistp ARG3 |
1684 | | mov RC, ARG4 | 1753 | | mov RC, TMP2 |
1685 | | cmp RB, RC // len < end? (unsigned compare) | 1754 | | cmp RB, RC // len < end? (unsigned compare) |
1686 | | jb >5 | 1755 | | jb >5 |
1687 | |2: | 1756 | |2: |
@@ -1722,13 +1791,13 @@ static void build_subroutines(BuildCtx *ctx, int cmov) | |||
1722 | | | 1791 | | |
1723 | |.ffunc_2 string_rep // Only handle the 1-char case inline. | 1792 | |.ffunc_2 string_rep // Only handle the 1-char case inline. |
1724 | | ffgccheck | 1793 | | ffgccheck |
1725 | | mov ARG5, RA // Save RA. | 1794 | | mov TMP1, RA // Save RA. |
1726 | | cmp dword [RA+4], LJ_TSTR; jne ->fff_fallback | 1795 | | cmp dword [RA+4], LJ_TSTR; jne ->fff_fallback |
1727 | | cmp dword [RA+12], LJ_TISNUM; ja ->fff_fallback | 1796 | | cmp dword [RA+12], LJ_TISNUM; ja ->fff_fallback |
1728 | | mov STR:RB, [RA] | 1797 | | mov STR:RB, [RA] |
1729 | | fld qword [RA+8] | 1798 | | fld qword [RA+8] |
1730 | | fistp ARG4 | 1799 | | fistp TMP2 |
1731 | | mov RC, ARG4 | 1800 | | mov RC, TMP2 |
1732 | | test RC, RC | 1801 | | test RC, RC |
1733 | | jle ->fff_emptystr // Count <= 0? (or non-int) | 1802 | | jle ->fff_emptystr // Count <= 0? (or non-int) |
1734 | | cmp dword STR:RB->len, 1 | 1803 | | cmp dword STR:RB->len, 1 |
@@ -1748,7 +1817,7 @@ static void build_subroutines(BuildCtx *ctx, int cmov) | |||
1748 | | | 1817 | | |
1749 | |.ffunc_1 string_reverse | 1818 | |.ffunc_1 string_reverse |
1750 | | ffgccheck | 1819 | | ffgccheck |
1751 | | mov ARG5, RA // Save RA. | 1820 | | mov TMP1, RA // Save RA. |
1752 | | cmp dword [RA+4], LJ_TSTR; jne ->fff_fallback | 1821 | | cmp dword [RA+4], LJ_TSTR; jne ->fff_fallback |
1753 | | mov STR:RB, [RA] | 1822 | | mov STR:RB, [RA] |
1754 | | mov RC, STR:RB->len | 1823 | | mov RC, STR:RB->len |
@@ -1756,7 +1825,7 @@ static void build_subroutines(BuildCtx *ctx, int cmov) | |||
1756 | | jz ->fff_emptystr // Zero length string? | 1825 | | jz ->fff_emptystr // Zero length string? |
1757 | | cmp [DISPATCH+DISPATCH_GL(tmpbuf.sz)], RC; jb ->fff_fallback_1 | 1826 | | cmp [DISPATCH+DISPATCH_GL(tmpbuf.sz)], RC; jb ->fff_fallback_1 |
1758 | | add RB, #STR | 1827 | | add RB, #STR |
1759 | | mov ARG4, PC // Need another temp register. | 1828 | | mov TMP2, PC // Need another temp register. |
1760 | | mov ARG3, RC | 1829 | | mov ARG3, RC |
1761 | | mov PC, [DISPATCH+DISPATCH_GL(tmpbuf.buf)] | 1830 | | mov PC, [DISPATCH+DISPATCH_GL(tmpbuf.buf)] |
1762 | | mov ARG2, PC | 1831 | | mov ARG2, PC |
@@ -1766,19 +1835,19 @@ static void build_subroutines(BuildCtx *ctx, int cmov) | |||
1766 | | sub RC, 1 | 1835 | | sub RC, 1 |
1767 | | mov [PC+RC], RAL | 1836 | | mov [PC+RC], RAL |
1768 | | jnz <1 | 1837 | | jnz <1 |
1769 | | mov PC, ARG4 | 1838 | | mov PC, TMP2 |
1770 | | jmp ->fff_newstr | 1839 | | jmp ->fff_newstr |
1771 | | | 1840 | | |
1772 | |.macro ffstring_case, name, lo, hi | 1841 | |.macro ffstring_case, name, lo, hi |
1773 | | .ffunc_1 name | 1842 | | .ffunc_1 name |
1774 | | ffgccheck | 1843 | | ffgccheck |
1775 | | mov ARG5, RA // Save RA. | 1844 | | mov TMP1, RA // Save RA. |
1776 | | cmp dword [RA+4], LJ_TSTR; jne ->fff_fallback | 1845 | | cmp dword [RA+4], LJ_TSTR; jne ->fff_fallback |
1777 | | mov STR:RB, [RA] | 1846 | | mov STR:RB, [RA] |
1778 | | mov RC, STR:RB->len | 1847 | | mov RC, STR:RB->len |
1779 | | cmp [DISPATCH+DISPATCH_GL(tmpbuf.sz)], RC; jb ->fff_fallback_1 | 1848 | | cmp [DISPATCH+DISPATCH_GL(tmpbuf.sz)], RC; jb ->fff_fallback_1 |
1780 | | add RB, #STR | 1849 | | add RB, #STR |
1781 | | mov ARG4, PC // Need another temp register. | 1850 | | mov TMP2, PC // Need another temp register. |
1782 | | mov ARG3, RC | 1851 | | mov ARG3, RC |
1783 | | mov PC, [DISPATCH+DISPATCH_GL(tmpbuf.buf)] | 1852 | | mov PC, [DISPATCH+DISPATCH_GL(tmpbuf.buf)] |
1784 | | mov ARG2, PC | 1853 | | mov ARG2, PC |
@@ -1795,7 +1864,7 @@ static void build_subroutines(BuildCtx *ctx, int cmov) | |||
1795 | |3: | 1864 | |3: |
1796 | | sub RC, 1 | 1865 | | sub RC, 1 |
1797 | | jns <1 | 1866 | | jns <1 |
1798 | | mov PC, ARG4 | 1867 | | mov PC, TMP2 |
1799 | | jmp ->fff_newstr | 1868 | | jmp ->fff_newstr |
1800 | |.endmacro | 1869 | |.endmacro |
1801 | | | 1870 | | |
@@ -1822,16 +1891,16 @@ static void build_subroutines(BuildCtx *ctx, int cmov) | |||
1822 | |.define TOBIT_BIAS, 0x59c00000 // 2^52 + 2^51 (float, not double!). | 1891 | |.define TOBIT_BIAS, 0x59c00000 // 2^52 + 2^51 (float, not double!). |
1823 | | | 1892 | | |
1824 | |.ffunc_n bit_tobit | 1893 | |.ffunc_n bit_tobit |
1825 | | mov ARG5, TOBIT_BIAS | 1894 | | mov TMP1, TOBIT_BIAS |
1826 | | fadd ARG5 | 1895 | | fadd TMP1 |
1827 | | fstp FPARG1 // 64 bit FP store. | 1896 | | fstp FPARG1 // 64 bit FP store. |
1828 | | fild ARG1 // 32 bit integer load (s2lfwd ok). | 1897 | | fild ARG1 // 32 bit integer load (s2lfwd ok). |
1829 | | jmp ->fff_resn | 1898 | | jmp ->fff_resn |
1830 | | | 1899 | | |
1831 | |.macro .ffunc_bit, name | 1900 | |.macro .ffunc_bit, name |
1832 | | .ffunc_n name | 1901 | | .ffunc_n name |
1833 | | mov ARG5, TOBIT_BIAS | 1902 | | mov TMP1, TOBIT_BIAS |
1834 | | fadd ARG5 | 1903 | | fadd TMP1 |
1835 | | fstp FPARG1 | 1904 | | fstp FPARG1 |
1836 | | mov RB, ARG1 | 1905 | | mov RB, ARG1 |
1837 | |.endmacro | 1906 | |.endmacro |
@@ -1845,7 +1914,7 @@ static void build_subroutines(BuildCtx *ctx, int cmov) | |||
1845 | | jbe ->fff_resbit | 1914 | | jbe ->fff_resbit |
1846 | | cmp dword [RC+4], LJ_TISNUM; ja ->fff_fallback_bit_op | 1915 | | cmp dword [RC+4], LJ_TISNUM; ja ->fff_fallback_bit_op |
1847 | | fld qword [RC] | 1916 | | fld qword [RC] |
1848 | | fadd ARG5 | 1917 | | fadd TMP1 |
1849 | | fstp FPARG1 | 1918 | | fstp FPARG1 |
1850 | | ins RB, ARG1 | 1919 | | ins RB, ARG1 |
1851 | | sub RC, 8 | 1920 | | sub RC, 8 |
@@ -1873,10 +1942,10 @@ static void build_subroutines(BuildCtx *ctx, int cmov) | |||
1873 | | | 1942 | | |
1874 | |.macro .ffunc_bit_sh, name, ins | 1943 | |.macro .ffunc_bit_sh, name, ins |
1875 | | .ffunc_nn name | 1944 | | .ffunc_nn name |
1876 | | mov ARG5, TOBIT_BIAS | 1945 | | mov TMP1, TOBIT_BIAS |
1877 | | fadd ARG5 | 1946 | | fadd TMP1 |
1878 | | fstp FPARG3 | 1947 | | fstp FPARG3 |
1879 | | fadd ARG5 | 1948 | | fadd TMP1 |
1880 | | fstp FPARG1 | 1949 | | fstp FPARG1 |
1881 | | mov RC, RA // Assumes RA is ecx. | 1950 | | mov RC, RA // Assumes RA is ecx. |
1882 | | mov RA, ARG3 | 1951 | | mov RA, ARG3 |
@@ -3121,9 +3190,9 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov) | |||
3121 | | test byte TAB:RA->nomm, 1<<MM_newindex | 3190 | | test byte TAB:RA->nomm, 1<<MM_newindex |
3122 | | jz ->vmeta_tsets // 'no __newindex' flag NOT set: check. | 3191 | | jz ->vmeta_tsets // 'no __newindex' flag NOT set: check. |
3123 | |6: | 3192 | |6: |
3124 | | mov ARG5, STR:RC | 3193 | | mov TMP1, STR:RC |
3125 | | mov ARG6, LJ_TSTR | 3194 | | mov TMP2, LJ_TSTR |
3126 | | lea RC, ARG5 // Store temp. TValue in ARG5/ARG6. | 3195 | | lea RC, TMP1 // Store temp. TValue in TMP1/TMP2. |
3127 | | mov ARG4, TAB:RB // Save TAB:RB for us. | 3196 | | mov ARG4, TAB:RB // Save TAB:RB for us. |
3128 | | mov ARG2, TAB:RB | 3197 | | mov ARG2, TAB:RB |
3129 | | mov L:RB, SAVE_L | 3198 | | mov L:RB, SAVE_L |
@@ -3179,7 +3248,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov) | |||
3179 | 3248 | ||
3180 | case BC_TSETM: | 3249 | case BC_TSETM: |
3181 | | ins_AD // RA = base (table at base-1), RD = num const (start index) | 3250 | | ins_AD // RA = base (table at base-1), RD = num const (start index) |
3182 | | mov ARG5, KBASE // Need one more free register. | 3251 | | mov TMP1, KBASE // Need one more free register. |
3183 | | fld qword [KBASE+RD*8] | 3252 | | fld qword [KBASE+RD*8] |
3184 | | fistp ARG4 // Const is guaranteed to be an int. | 3253 | | fistp ARG4 // Const is guaranteed to be an int. |
3185 | |1: | 3254 | |1: |
@@ -3208,7 +3277,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov) | |||
3208 | | sub RD, 1 | 3277 | | sub RD, 1 |
3209 | | jnz <3 | 3278 | | jnz <3 |
3210 | |4: | 3279 | |4: |
3211 | | mov KBASE, ARG5 | 3280 | | mov KBASE, TMP1 |
3212 | | ins_next | 3281 | | ins_next |
3213 | | | 3282 | | |
3214 | |5: // Need to resize array part. | 3283 | |5: // Need to resize array part. |
diff --git a/src/buildvm_x86.h b/src/buildvm_x86.h index 99823f61..09c77827 100644 --- a/src/buildvm_x86.h +++ b/src/buildvm_x86.h | |||
@@ -103,9 +103,9 @@ static const unsigned char build_actionlist[12304] = { | |||
103 | 193,41,208,137,113,252,244,141,176,233,139,105,252,248,184,3,0,0,0,129,121, | 103 | 193,41,208,137,113,252,244,141,176,233,139,105,252,248,184,3,0,0,0,129,121, |
104 | 253,252,252,239,15,133,244,29,252,255,165,233,248,50,141,4,194,139,108,36, | 104 | 253,252,252,239,15,133,244,29,252,255,165,233,248,50,141,4,194,139,108,36, |
105 | 48,137,68,36,4,137,44,36,137,116,36,24,137,149,233,232,251,1,6,139,149,233, | 105 | 48,137,68,36,4,137,44,36,137,116,36,24,137,149,233,232,251,1,6,139,149,233, |
106 | 252,233,244,42,248,29,137,76,36,12,137,68,36,16,131,252,233,8,141,4,193,139, | 106 | 252,233,244,42,248,29,137,76,36,20,137,68,36,16,131,252,233,8,141,4,193,139, |
107 | 108,36,48,137,76,36,4,137,68,36,8,137,44,36,137,116,36,24,137,149,233,232, | 107 | 108,36,48,137,76,36,4,137,68,36,8,137,44,36,137,116,36,24,137,149,233,232, |
108 | 251,1,7,139,149,233,139,76,36,12,139,68,36,16,139,105,252,248,131,192,1,57, | 108 | 251,1,7,139,149,233,139,76,36,20,139,68,36,16,139,105,252,248,131,192,1,57, |
109 | 215,15,132,244,51,252,255,165,233,248,52,255,139,108,36,48,137,76,36,4,137, | 109 | 215,15,132,244,51,252,255,165,233,248,52,255,139,108,36,48,137,76,36,4,137, |
110 | 44,36,137,116,36,24,137,149,233,232,251,1,8,139,149,233,139,70,252,252,15, | 110 | 44,36,137,116,36,24,137,149,233,232,251,1,8,139,149,233,139,70,252,252,15, |
111 | 182,204,15,182,232,193,232,16,252,255,164,253,171,233,248,53,129,252,248, | 111 | 182,204,15,182,232,193,232,16,252,255,164,253,171,233,248,53,129,252,248, |
@@ -129,8 +129,8 @@ static const unsigned char build_actionlist[12304] = { | |||
129 | 139,65,8,137,133,233,199,65,252,252,237,255,137,105,252,248,252,246,133,233, | 129 | 139,65,8,137,133,233,199,65,252,252,237,255,137,105,252,248,252,246,133,233, |
130 | 235,15,132,244,247,128,165,233,235,139,131,233,137,171,233,137,133,233,248, | 130 | 235,15,132,244,247,128,165,233,235,139,131,233,137,171,233,137,133,233,248, |
131 | 1,252,233,244,57,248,60,129,252,248,239,15,130,244,54,129,121,253,4,239,15, | 131 | 1,252,233,244,57,248,60,129,252,248,239,15,130,244,54,129,121,253,4,239,15, |
132 | 133,244,54,139,1,139,108,36,48,137,68,36,4,137,44,36,137,205,137,84,36,12, | 132 | 133,244,54,139,1,139,108,36,48,137,68,36,4,137,44,36,137,205,137,84,36,16, |
133 | 131,193,8,137,76,36,8,232,251,1,9,137,252,233,139,84,36,12,139,40,139,64, | 133 | 131,193,8,137,76,36,8,232,251,1,9,137,252,233,139,84,36,16,139,40,139,64, |
134 | 4,137,105,252,248,137,65,252,252,252,233,244,57,248,61,129,252,248,239,255, | 134 | 4,137,105,252,248,137,65,252,252,252,233,244,57,248,61,129,252,248,239,255, |
135 | 15,133,244,54,129,121,253,4,239,15,135,244,54,221,1,252,233,244,62,248,63, | 135 | 15,133,244,54,129,121,253,4,239,15,135,244,54,221,1,252,233,244,62,248,63, |
136 | 129,252,248,239,15,130,244,54,129,121,253,4,239,15,133,244,249,139,1,248, | 136 | 129,252,248,239,15,130,244,54,129,121,253,4,239,15,133,244,249,139,1,248, |
@@ -140,8 +140,8 @@ static const unsigned char build_actionlist[12304] = { | |||
140 | 36,24,137,84,36,8,137,202,137,252,233,232,251,1,10,139,141,233,139,84,36, | 140 | 36,24,137,84,36,8,137,202,137,252,233,232,251,1,10,139,141,233,139,84,36, |
141 | 8,252,233,244,2,248,65,129,252,248,239,15,130,244,54,15,132,244,248,248,1, | 141 | 8,252,233,244,2,248,65,129,252,248,239,15,130,244,54,15,132,244,248,248,1, |
142 | 129,121,253,4,239,15,133,244,54,255,139,41,137,108,36,4,139,108,36,48,137, | 142 | 129,121,253,4,239,15,133,244,54,255,139,41,137,108,36,4,139,108,36,48,137, |
143 | 44,36,137,141,233,137,113,252,252,137,116,36,24,137,84,36,12,131,193,8,137, | 143 | 44,36,137,141,233,137,113,252,252,137,116,36,24,137,84,36,16,131,193,8,137, |
144 | 76,36,8,232,251,1,11,139,141,233,139,84,36,12,133,192,15,132,244,249,139, | 144 | 76,36,8,232,251,1,11,139,141,233,139,84,36,16,133,192,15,132,244,249,139, |
145 | 105,8,139,65,12,137,105,252,248,137,65,252,252,139,105,16,139,65,20,137,41, | 145 | 105,8,139,65,12,137,105,252,248,137,65,252,252,139,105,16,139,65,20,137,41, |
146 | 137,65,4,248,66,184,237,252,233,244,67,248,2,199,65,12,237,252,233,244,1, | 146 | 137,65,4,248,66,184,237,252,233,244,67,248,2,199,65,12,237,252,233,244,1, |
147 | 248,3,199,65,252,252,237,252,233,244,57,248,68,129,252,248,239,15,130,244, | 147 | 248,3,199,65,252,252,237,252,233,244,57,248,68,129,252,248,239,15,130,244, |
@@ -261,43 +261,43 @@ static const unsigned char build_actionlist[12304] = { | |||
261 | 239,15,133,244,54,129,121,253,4,239,15,133,244,54,139,41,131,189,233,1,255, | 261 | 239,15,133,244,54,129,121,253,4,239,15,133,244,54,139,41,131,189,233,1,255, |
262 | 15,130,244,70,15,182,173,233,137,44,36,219,4,36,252,233,244,62,248,110,139, | 262 | 15,130,244,70,15,182,173,233,137,44,36,219,4,36,252,233,244,62,248,110,139, |
263 | 171,233,59,171,233,15,130,244,247,232,244,64,248,1,129,252,248,239,15,133, | 263 | 171,233,59,171,233,15,130,244,247,232,244,64,248,1,129,252,248,239,15,133, |
264 | 244,54,129,121,253,4,239,15,135,244,54,221,1,219,92,36,12,129,124,36,12,252, | 264 | 244,54,129,121,253,4,239,15,135,244,54,221,1,219,92,36,20,129,124,36,20,252, |
265 | 255,0,0,0,15,135,244,54,141,68,36,12,137,76,36,16,199,68,36,8,1,0,0,0,137, | 265 | 255,0,0,0,15,135,244,54,141,68,36,20,137,76,36,16,199,68,36,8,1,0,0,0,137, |
266 | 68,36,4,248,111,139,108,36,48,137,44,36,137,116,36,24,137,149,233,255,232, | 266 | 68,36,4,248,111,139,108,36,48,137,44,36,137,116,36,24,137,149,233,255,232, |
267 | 251,1,17,139,76,36,16,139,149,233,199,65,252,252,237,137,65,252,248,252,233, | 267 | 251,1,17,139,76,36,16,139,149,233,199,65,252,252,237,137,65,252,248,252,233, |
268 | 244,57,248,112,139,171,233,59,171,233,15,130,244,247,232,244,64,248,1,137, | 268 | 244,57,248,112,139,171,233,59,171,233,15,130,244,247,232,244,64,248,1,137, |
269 | 76,36,16,199,68,36,12,252,255,252,255,252,255,252,255,129,252,248,239,15, | 269 | 76,36,16,199,68,36,20,252,255,252,255,252,255,252,255,129,252,248,239,15, |
270 | 130,244,54,15,134,244,247,129,121,253,20,239,15,135,244,54,221,65,16,219, | 270 | 130,244,54,15,134,244,247,129,121,253,20,239,15,135,244,54,221,65,16,219, |
271 | 92,36,12,248,1,129,121,253,4,239,15,133,244,54,255,129,121,253,12,239,15, | 271 | 92,36,20,248,1,129,121,253,4,239,15,133,244,54,255,129,121,253,12,239,15, |
272 | 135,244,54,139,41,137,108,36,4,139,173,233,221,65,8,219,92,36,8,139,68,36, | 272 | 135,244,54,139,41,137,108,36,4,139,173,233,221,65,8,219,92,36,8,139,68,36, |
273 | 12,57,197,15,130,244,251,248,2,139,76,36,8,133,201,15,142,244,253,248,3,139, | 273 | 20,57,197,15,130,244,251,248,2,139,76,36,8,133,201,15,142,244,253,248,3,139, |
274 | 108,36,4,41,200,15,140,244,113,141,172,253,13,233,131,192,1,248,4,137,108, | 274 | 108,36,4,41,200,15,140,244,113,141,172,253,13,233,131,192,1,248,4,137,108, |
275 | 36,4,137,68,36,8,252,233,244,111,248,5,15,140,244,252,141,68,40,1,252,233, | 275 | 36,4,137,68,36,8,252,233,244,111,248,5,15,140,244,252,141,68,40,1,252,233, |
276 | 244,2,248,6,137,232,252,233,244,2,248,7,255,15,132,244,254,1,252,233,131, | 276 | 244,2,248,6,137,232,252,233,244,2,248,7,255,15,132,244,254,1,252,233,131, |
277 | 193,1,15,143,244,3,248,8,185,1,0,0,0,252,233,244,3,248,113,49,192,252,233, | 277 | 193,1,15,143,244,3,248,8,185,1,0,0,0,252,233,244,3,248,113,49,192,252,233, |
278 | 244,4,248,114,129,252,248,239,15,130,244,54,139,171,233,59,171,233,15,130, | 278 | 244,4,248,114,129,252,248,239,15,130,244,54,139,171,233,59,171,233,15,130, |
279 | 244,247,232,244,64,248,1,137,76,36,16,129,121,253,4,239,15,133,244,54,255, | 279 | 244,247,232,244,64,248,1,137,76,36,16,129,121,253,4,239,15,133,244,54,255, |
280 | 129,121,253,12,239,15,135,244,54,139,41,221,65,8,219,92,36,12,139,68,36,12, | 280 | 129,121,253,12,239,15,135,244,54,139,41,221,65,8,219,92,36,20,139,68,36,20, |
281 | 133,192,15,142,244,113,131,189,233,1,15,130,244,113,15,133,244,115,57,131, | 281 | 133,192,15,142,244,113,131,189,233,1,15,130,244,113,15,133,244,115,57,131, |
282 | 233,15,130,244,115,15,182,141,233,139,171,233,137,68,36,8,137,108,36,4,248, | 282 | 233,15,130,244,115,15,182,141,233,139,171,233,137,68,36,8,137,108,36,4,248, |
283 | 1,136,77,0,131,197,1,131,232,1,15,133,244,1,252,233,244,111,248,116,129,252, | 283 | 1,136,77,0,131,197,1,131,232,1,15,133,244,1,252,233,244,111,248,116,129,252, |
284 | 248,239,15,130,244,54,255,139,171,233,59,171,233,15,130,244,247,232,244,64, | 284 | 248,239,15,130,244,54,255,139,171,233,59,171,233,15,130,244,247,232,244,64, |
285 | 248,1,137,76,36,16,129,121,253,4,239,15,133,244,54,139,41,139,133,233,133, | 285 | 248,1,137,76,36,16,129,121,253,4,239,15,133,244,54,139,41,139,133,233,133, |
286 | 192,15,132,244,113,57,131,233,15,130,244,117,129,197,239,137,116,36,12,137, | 286 | 192,15,132,244,113,57,131,233,15,130,244,117,129,197,239,137,116,36,20,137, |
287 | 68,36,8,139,179,233,137,116,36,4,248,1,15,182,77,0,131,197,1,131,232,1,136, | 287 | 68,36,8,139,179,233,137,116,36,4,248,1,15,182,77,0,131,197,1,131,232,1,136, |
288 | 12,6,15,133,244,1,139,116,36,12,252,233,244,111,248,118,255,129,252,248,239, | 288 | 12,6,15,133,244,1,139,116,36,20,252,233,244,111,248,118,255,129,252,248,239, |
289 | 15,130,244,54,139,171,233,59,171,233,15,130,244,247,232,244,64,248,1,137, | 289 | 15,130,244,54,139,171,233,59,171,233,15,130,244,247,232,244,64,248,1,137, |
290 | 76,36,16,129,121,253,4,239,15,133,244,54,139,41,139,133,233,57,131,233,15, | 290 | 76,36,16,129,121,253,4,239,15,133,244,54,139,41,139,133,233,57,131,233,15, |
291 | 130,244,117,129,197,239,137,116,36,12,137,68,36,8,139,179,233,137,116,36, | 291 | 130,244,117,129,197,239,137,116,36,20,137,68,36,8,139,179,233,137,116,36, |
292 | 4,252,233,244,249,248,1,15,182,76,5,0,131,252,249,65,15,130,244,248,255,131, | 292 | 4,252,233,244,249,248,1,15,182,76,5,0,131,252,249,65,15,130,244,248,255,131, |
293 | 252,249,90,15,135,244,248,131,252,241,32,248,2,136,12,6,248,3,131,232,1,15, | 293 | 252,249,90,15,135,244,248,131,252,241,32,248,2,136,12,6,248,3,131,232,1,15, |
294 | 137,244,1,139,116,36,12,252,233,244,111,248,119,129,252,248,239,15,130,244, | 294 | 137,244,1,139,116,36,20,252,233,244,111,248,119,129,252,248,239,15,130,244, |
295 | 54,139,171,233,59,171,233,15,130,244,247,232,244,64,248,1,137,76,36,16,129, | 295 | 54,139,171,233,59,171,233,15,130,244,247,232,244,64,248,1,137,76,36,16,129, |
296 | 121,253,4,239,15,133,244,54,139,41,139,133,233,255,57,131,233,15,130,244, | 296 | 121,253,4,239,15,133,244,54,139,41,139,133,233,255,57,131,233,15,130,244, |
297 | 117,129,197,239,137,116,36,12,137,68,36,8,139,179,233,137,116,36,4,252,233, | 297 | 117,129,197,239,137,116,36,20,137,68,36,8,139,179,233,137,116,36,4,252,233, |
298 | 244,249,248,1,15,182,76,5,0,131,252,249,97,15,130,244,248,131,252,249,122, | 298 | 244,249,248,1,15,182,76,5,0,131,252,249,97,15,130,244,248,131,252,249,122, |
299 | 15,135,244,248,131,252,241,32,248,2,136,12,6,248,3,131,232,1,15,137,244,1, | 299 | 15,135,244,248,131,252,241,32,248,2,136,12,6,248,3,131,232,1,15,137,244,1, |
300 | 139,116,36,12,252,233,244,111,248,120,129,252,248,239,15,130,244,54,129,121, | 300 | 139,116,36,20,252,233,244,111,248,120,129,252,248,239,15,130,244,54,129,121, |
301 | 253,4,239,255,15,133,244,54,137,84,36,4,137,205,139,9,232,251,1,18,137,4, | 301 | 253,4,239,255,15,133,244,54,137,84,36,4,137,205,139,9,232,251,1,18,137,4, |
302 | 36,137,252,233,139,84,36,4,219,4,36,252,233,244,62,248,121,129,252,248,239, | 302 | 36,137,252,233,139,84,36,4,219,4,36,252,233,244,62,248,121,129,252,248,239, |
303 | 15,130,244,54,129,121,253,4,239,15,135,244,54,221,1,199,68,36,16,0,0,192, | 303 | 15,130,244,54,129,121,253,4,239,15,135,244,54,221,1,199,68,36,16,0,0,192, |