diff options
Diffstat (limited to 'doc/changes.html')
-rw-r--r-- | doc/changes.html | 323 |
1 files changed, 93 insertions, 230 deletions
diff --git a/doc/changes.html b/doc/changes.html index a20295f2..5fc74f10 100644 --- a/doc/changes.html +++ b/doc/changes.html | |||
@@ -43,6 +43,8 @@ div.major { max-width: 600px; padding: 1em; margin: 1em 0 1em 0; } | |||
43 | <a href="ext_jit.html">jit.* Library</a> | 43 | <a href="ext_jit.html">jit.* Library</a> |
44 | </li><li> | 44 | </li><li> |
45 | <a href="ext_c_api.html">Lua/C API</a> | 45 | <a href="ext_c_api.html">Lua/C API</a> |
46 | </li><li> | ||
47 | <a href="ext_profiler.html">Profiler</a> | ||
46 | </li></ul> | 48 | </li></ul> |
47 | </li><li> | 49 | </li><li> |
48 | <a href="status.html">Status</a> | 50 | <a href="status.html">Status</a> |
@@ -71,6 +73,96 @@ to see whether newer versions are available. | |||
71 | </p> | 73 | </p> |
72 | 74 | ||
73 | <div class="major" style="background: #d0d0ff;"> | 75 | <div class="major" style="background: #d0d0ff;"> |
76 | <h2 id="LuaJIT-2.1.0-beta3">LuaJIT 2.1.0-beta3 — 2017-05-01</h2> | ||
77 | <ul> | ||
78 | <li>Rewrite memory block allocator.</li> | ||
79 | <li>Add various extension from Lua 5.2/5.3.</li> | ||
80 | <li>Remove old Lua 5.0 compatibility defines.</li> | ||
81 | <li>Set arg table before evaluating <tt>LUA_INIT</tt> and <tt>-e</tt> chunks.</li> | ||
82 | <li>Fix FOLD rules for <tt>math.abs()</tt> and FP negation.</li> | ||
83 | <li>Fix soft-float <tt>math.abs()</tt> and negation.</li> | ||
84 | <li>Fix formatting of some small denormals at low precision.</li> | ||
85 | <li>LJ_GC64: Add JIT compiler support.</li> | ||
86 | <li>x64/LJ_GC64: Add JIT compiler backend.</li> | ||
87 | <li>x86/x64: Generate BMI2 shifts and rotates, if available.</li> | ||
88 | <li>Windows/x86: Add full exception interoperability.</li> | ||
89 | <li>ARM64: Add big-endian support.</li> | ||
90 | <li>ARM64: Add JIT compiler backend.</li> | ||
91 | <li>MIPS: Fix <tt>TSETR</tt> barrier.</li> | ||
92 | <li>MIPS: Support MIPS16 interlinking.</li> | ||
93 | <li>MIPS soft-float: Fix code generation for <tt>HREF</tt>.</li> | ||
94 | <li>MIPS64: Add MIPS64 hard-float JIT compiler backend.</li> | ||
95 | <li>MIPS64: Add MIPS64 hard-float/soft-float support to interpreter.</li> | ||
96 | <li>FFI: Compile bitfield loads/stores.</li> | ||
97 | <li>Various fixes common with the 2.0 branch.</li> | ||
98 | </ul> | ||
99 | |||
100 | <h2 id="LuaJIT-2.1.0-beta2">LuaJIT 2.1.0-beta2 — 2016-03-03</h2> | ||
101 | <ul> | ||
102 | <li>Enable trace stitching.</li> | ||
103 | <li>Use internal implementation for converting FP numbers to strings.</li> | ||
104 | <li>Parse Unicode escape <tt>'\u{XX...}'</tt> in string literals.</li> | ||
105 | <li>Add MIPS soft-float support.</li> | ||
106 | <li>Switch MIPS port to dual-number mode.</li> | ||
107 | <li>x86/x64: Add support for AES-NI, AVX and AVX2 to DynASM.</li> | ||
108 | <li>FFI: Add <tt>ssize_t</tt> declaration.</li> | ||
109 | <li>FFI: Parse <tt>#line NN</tt> and <tt>#NN</tt>.</li> | ||
110 | <li>Various minor fixes.</li> | ||
111 | </ul> | ||
112 | |||
113 | <h2 id="LuaJIT-2.1.0-beta1">LuaJIT 2.1.0-beta1 — 2015-08-25</h2> | ||
114 | <p> | ||
115 | This is a brief summary of the major changes in LuaJIT 2.1 compared to 2.0. | ||
116 | Please take a look at the commit history for more details. | ||
117 | </p> | ||
118 | <ul> | ||
119 | <li>Changes to the VM core: | ||
120 | <ul> | ||
121 | <li>Add low-overhead profiler (<tt>-jp</tt>).</li> | ||
122 | <li>Add <tt>LJ_GC64</tt> mode: 64 bit GC object references (really: 47 bit). Interpreter-only for now.</li> | ||
123 | <li>Add <tt>LJ_FR2</tt> mode: Two-slot frame info. Required by <tt>LJ_GC64</tt> mode.</li> | ||
124 | <li>Add <tt>table.new()</tt> and <tt>table.clear()</tt>.</li> | ||
125 | <li>Parse binary number literals (<tt>0bxxx</tt>).</li> | ||
126 | </ul></li> | ||
127 | <li>Improvements to the JIT compiler: | ||
128 | <ul> | ||
129 | <li>Add trace stitching (disabled for now).</li> | ||
130 | <li>Compile various builtins: <tt>string.char()</tt>, <tt>string.reverse()</tt>, <tt>string.lower()</tt>, <tt>string.upper()</tt>, <tt>string.rep()</tt>, <tt>string.format()</tt>, <tt>table.concat()</tt>, <tt>bit.tohex()</tt>, <tt>getfenv(0)</tt>, <tt>debug.getmetatable()</tt>.</li> | ||
131 | <li>Compile <tt>string.find()</tt> for fixed string searches (no patterns).</li> | ||
132 | <li>Compile <tt>BC_TSETM</tt>, e.g. <tt>{1,2,3,f()}</tt>.</li> | ||
133 | <li>Compile string concatenations (<tt>BC_CAT</tt>).</li> | ||
134 | <li>Compile <tt>__concat</tt> metamethod.</li> | ||
135 | <li>Various minor optimizations.</li> | ||
136 | </ul></li> | ||
137 | <li>Internal Changes: | ||
138 | <ul> | ||
139 | <li>Add support for embedding LuaJIT bytecode for builtins.</li> | ||
140 | <li>Replace various builtins with embedded bytecode.</li> | ||
141 | <li>Refactor string buffers and string formatting.</li> | ||
142 | <li>Remove obsolete non-truncating number to integer conversions.</li> | ||
143 | </ul></li> | ||
144 | <li>Ports: | ||
145 | <ul> | ||
146 | <li>Add Xbox One port (<tt>LJ_GC64</tt> mode).</li> | ||
147 | <li>ARM64: Add port of the interpreter (<tt>LJ_GC64</tt> mode).</li> | ||
148 | <li>x64: Add separate port of the interpreter to <tt>LJ_GC64</tt> mode.</li> | ||
149 | <li>x86/x64: Drop internal x87 math functions. Use libm functions.</li> | ||
150 | <li>x86: Remove x87 support from interpreter. SSE2 is mandatory now.</li> | ||
151 | <li>PPC/e500: Drop support for this architecture.</li> | ||
152 | </ul></li> | ||
153 | <li>FFI library: | ||
154 | <ul> | ||
155 | <li>FFI: Add 64 bit bitwise operations.</li> | ||
156 | <li>FFI: Compile VLA/VLS and large cdata allocations with default initialization.</li> | ||
157 | <li>FFI: Compile conversions from functions to function pointers.</li> | ||
158 | <li>FFI: Compile lightuserdata to <tt>void *</tt> conversion.</li> | ||
159 | <li>FFI: Compile <tt>ffi.gc(cdata, nil)</tt>, too.</li> | ||
160 | <li>FFI: Add <tt>ffi.typeinfo()</tt>.</li> | ||
161 | </ul></li> | ||
162 | </ul> | ||
163 | </div> | ||
164 | |||
165 | <div class="major" style="background: #ffffd0;"> | ||
74 | <h2 id="LuaJIT-2.0.5">LuaJIT 2.0.5 — 2017-05-01</h2> | 166 | <h2 id="LuaJIT-2.0.5">LuaJIT 2.0.5 — 2017-05-01</h2> |
75 | <ul> | 167 | <ul> |
76 | <li>Add workaround for MSVC 2015 stdio changes.</li> | 168 | <li>Add workaround for MSVC 2015 stdio changes.</li> |
@@ -80,7 +172,7 @@ to see whether newer versions are available. | |||
80 | <li>Remove internal <tt>__mode = "K"</tt> and replace with safe check.</li> | 172 | <li>Remove internal <tt>__mode = "K"</tt> and replace with safe check.</li> |
81 | <li>Add "proto" field to <tt>jit.util.funcinfo()</tt>.</li> | 173 | <li>Add "proto" field to <tt>jit.util.funcinfo()</tt>.</li> |
82 | <li>Fix GC step size calculation.</li> | 174 | <li>Fix GC step size calculation.</li> |
83 | <li>Initialize <tt>uv->immutable</tt> for upvalues of loaded chunks.</li> | 175 | <li>Initialize <tt>uv->immutable</tt> for upvalues of loaded chunks.</li> |
84 | <li>Fix for cdata vs. non-cdata arithmetics/comparisons.</li> | 176 | <li>Fix for cdata vs. non-cdata arithmetics/comparisons.</li> |
85 | <li>Drop leftover regs in 'for' iterator assignment, too.</li> | 177 | <li>Drop leftover regs in 'for' iterator assignment, too.</li> |
86 | <li>Fix PHI remarking in SINK pass.</li> | 178 | <li>Fix PHI remarking in SINK pass.</li> |
@@ -776,235 +868,6 @@ This matches the behavior of Lua 5.1, but not the specification.</li> | |||
776 | no point in listing differences over earlier versions.</li> | 868 | no point in listing differences over earlier versions.</li> |
777 | </ul> | 869 | </ul> |
778 | </div> | 870 | </div> |
779 | |||
780 | <div class="major" style="background: #ffff80;"> | ||
781 | <h2 id="LuaJIT-1.1.8">LuaJIT 1.1.8 — 2012-04-16</h2> | ||
782 | <ul> | ||
783 | <li>Merged with Lua 5.1.5. Also integrated fixes for all | ||
784 | <a href="http://www.lua.org/bugs.html#5.1.5"><span class="ext">»</span> <span class="ext">»</span> currently known bugs in Lua 5.1.5</a>.</li> | ||
785 | </ul> | ||
786 | |||
787 | <h2 id="LuaJIT-1.1.7">LuaJIT 1.1.7 — 2011-05-05</h2> | ||
788 | <ul> | ||
789 | <li>Added fixes for the | ||
790 | <a href="http://www.lua.org/bugs.html#5.1.4"><span class="ext">»</span> currently known bugs in Lua 5.1.4</a>.</li> | ||
791 | </ul> | ||
792 | |||
793 | <h2 id="LuaJIT-1.1.6">LuaJIT 1.1.6 — 2010-03-28</h2> | ||
794 | <ul> | ||
795 | <li>Added fixes for the | ||
796 | <a href="http://www.lua.org/bugs.html#5.1.4"><span class="ext">»</span> currently known bugs in Lua 5.1.4</a>.</li> | ||
797 | <li>Removed wrong GC check in <tt>jit_createstate()</tt>. | ||
798 | Thanks to Tim Mensch.</li> | ||
799 | <li>Fixed bad assertions while compiling <tt>table.insert()</tt> and | ||
800 | <tt>table.remove()</tt>.</li> | ||
801 | </ul> | ||
802 | |||
803 | <h2 id="LuaJIT-1.1.5">LuaJIT 1.1.5 — 2008-10-25</h2> | ||
804 | <ul> | ||
805 | <li>Merged with Lua 5.1.4. Fixes all | ||
806 | <a href="http://www.lua.org/bugs.html#5.1.3"><span class="ext">»</span> known bugs in Lua 5.1.3</a>.</li> | ||
807 | </ul> | ||
808 | |||
809 | <h2 id="LuaJIT-1.1.4">LuaJIT 1.1.4 — 2008-02-05</h2> | ||
810 | <ul> | ||
811 | <li>Merged with Lua 5.1.3. Fixes all | ||
812 | <a href="http://www.lua.org/bugs.html#5.1.2"><span class="ext">»</span> known bugs in Lua 5.1.2</a>.</li> | ||
813 | <li>Fixed possible (but unlikely) stack corruption while compiling | ||
814 | <tt>k^x</tt> expressions.</li> | ||
815 | <li>Fixed DynASM template for cmpss instruction.</li> | ||
816 | </ul> | ||
817 | |||
818 | <h2 id="LuaJIT-1.1.3">LuaJIT 1.1.3 — 2007-05-24</h2> | ||
819 | <ul> | ||
820 | <li>Merged with Lua 5.1.2. Fixes all | ||
821 | <a href="http://www.lua.org/bugs.html#5.1.1"><span class="ext">»</span> known bugs in Lua 5.1.1</a>.</li> | ||
822 | <li>Merged pending Lua 5.1.x fixes: "return -nil" bug, spurious count hook call.</li> | ||
823 | <li>Remove a (sometimes) wrong assertion in <tt>luaJIT_findpc()</tt>.</li> | ||
824 | <li>DynASM now allows labels for displacements and <tt>.aword</tt>.</li> | ||
825 | <li>Fix some compiler warnings for DynASM glue (internal API change).</li> | ||
826 | <li>Correct naming for SSSE3 (temporarily known as SSE4) in DynASM and x86 disassembler.</li> | ||
827 | <li>The loadable debug modules now handle redirection to stdout | ||
828 | (e.g. <tt>-j trace=-</tt>).</li> | ||
829 | </ul> | ||
830 | |||
831 | <h2 id="LuaJIT-1.1.2">LuaJIT 1.1.2 — 2006-06-24</h2> | ||
832 | <ul> | ||
833 | <li>Fix MSVC inline assembly: use only local variables with | ||
834 | <tt>lua_number2int()</tt>.</li> | ||
835 | <li>Fix "attempt to call a thread value" bug on Mac OS X: | ||
836 | make values of consts used as lightuserdata keys unique | ||
837 | to avoid joining by the compiler/linker.</li> | ||
838 | </ul> | ||
839 | |||
840 | <h2 id="LuaJIT-1.1.1">LuaJIT 1.1.1 — 2006-06-20</h2> | ||
841 | <ul> | ||
842 | <li>Merged with Lua 5.1.1. Fixes all | ||
843 | <a href="http://www.lua.org/bugs.html#5.1"><span class="ext">»</span> known bugs in Lua 5.1</a>.</li> | ||
844 | <li>Enforce (dynamic) linker error for EXE/DLL version mismatches.</li> | ||
845 | <li>Minor changes to DynASM: faster pre-processing, smaller encoding | ||
846 | for some immediates.</li> | ||
847 | </ul> | ||
848 | <p> | ||
849 | This release is in sync with Coco 1.1.1 (see the | ||
850 | <a href="http://coco.luajit.org/changes.html"><span class="ext">»</span> Coco Change History</a>). | ||
851 | </p> | ||
852 | |||
853 | <h2 id="LuaJIT-1.1.0">LuaJIT 1.1.0 — 2006-03-13</h2> | ||
854 | <ul> | ||
855 | <li>Merged with Lua 5.1 (final).</li> | ||
856 | |||
857 | <li>New JIT call frame setup: | ||
858 | <ul> | ||
859 | <li>The C stack is kept 16 byte aligned (faster). | ||
860 | Mandatory for Mac OS X on Intel, too.</li> | ||
861 | <li>Faster calling conventions for internal C helper functions.</li> | ||
862 | <li>Better instruction scheduling for function prologue, OP_CALL and | ||
863 | OP_RETURN.</li> | ||
864 | </ul></li> | ||
865 | |||
866 | <li>Miscellaneous optimizations: | ||
867 | <ul> | ||
868 | <li>Faster loads of FP constants. Remove narrow-to-wide store-to-load | ||
869 | forwarding stalls.</li> | ||
870 | <li>Use (scalar) SSE2 ops (if the CPU supports it) to speed up slot moves | ||
871 | and FP to integer conversions.</li> | ||
872 | <li>Optimized the two-argument form of <tt>OP_CONCAT</tt> (<tt>a..b</tt>).</li> | ||
873 | <li>Inlined <tt>OP_MOD</tt> (<tt>a%b</tt>). | ||
874 | With better accuracy than the C variant, too.</li> | ||
875 | <li>Inlined <tt>OP_POW</tt> (<tt>a^b</tt>). Unroll <tt>x^k</tt> or | ||
876 | use <tt>k^x = 2^(log2(k)*x)</tt> or call <tt>pow()</tt>.</li> | ||
877 | </ul></li> | ||
878 | |||
879 | <li>Changes in the optimizer: | ||
880 | <ul> | ||
881 | <li>Improved hinting for table keys derived from table values | ||
882 | (<tt>t1[t2[x]]</tt>).</li> | ||
883 | <li>Lookup hinting now works with arbitrary object types and | ||
884 | supports index chains, too.</li> | ||
885 | <li>Generate type hints for arithmetic and comparison operators, | ||
886 | OP_LEN, OP_CONCAT and OP_FORPREP.</li> | ||
887 | <li>Remove several hint definitions in favour of a generic COMBINE hint.</li> | ||
888 | <li>Complete rewrite of <tt>jit.opt_inline</tt> module | ||
889 | (ex <tt>jit.opt_lib</tt>).</li> | ||
890 | </ul></li> | ||
891 | |||
892 | <li>Use adaptive deoptimization: | ||
893 | <ul> | ||
894 | <li>If runtime verification of a contract fails, the affected | ||
895 | instruction is recompiled and patched on-the-fly. | ||
896 | Regular programs will trigger deoptimization only occasionally.</li> | ||
897 | <li>This avoids generating code for uncommon fallback cases | ||
898 | most of the time. Generated code is up to 30% smaller compared to | ||
899 | LuaJIT 1.0.3.</li> | ||
900 | <li>Deoptimization is used for many opcodes and contracts: | ||
901 | <ul> | ||
902 | <li>OP_CALL, OP_TAILCALL: type mismatch for callable.</li> | ||
903 | <li>Inlined calls: closure mismatch, parameter number and type mismatches.</li> | ||
904 | <li>OP_GETTABLE, OP_SETTABLE: table or key type and range mismatches.</li> | ||
905 | <li>All arithmetic and comparison operators, OP_LEN, OP_CONCAT, | ||
906 | OP_FORPREP: operand type and range mismatches.</li> | ||
907 | </ul></li> | ||
908 | <li>Complete redesign of the debug and traceback info | ||
909 | (bytecode ↔ mcode) to support deoptimization. | ||
910 | Much more flexible and needs only 50% of the space.</li> | ||
911 | <li>The modules <tt>jit.trace</tt>, <tt>jit.dumphints</tt> and | ||
912 | <tt>jit.dump</tt> handle deoptimization.</li> | ||
913 | </ul></li> | ||
914 | |||
915 | <li>Inlined many popular library functions | ||
916 | (for commonly used arguments only): | ||
917 | <ul> | ||
918 | <li>Most <tt>math.*</tt> functions (the 18 most used ones) | ||
919 | [2x-10x faster].</li> | ||
920 | <li><tt>string.len</tt>, <tt>string.sub</tt> and <tt>string.char</tt> | ||
921 | [2x-10x faster].</li> | ||
922 | <li><tt>table.insert</tt>, <tt>table.remove</tt> and <tt>table.getn</tt> | ||
923 | [3x-5x faster].</li> | ||
924 | <li><tt>coroutine.yield</tt> and <tt>coroutine.resume</tt> | ||
925 | [3x-5x faster].</li> | ||
926 | <li><tt>pairs</tt>, <tt>ipairs</tt> and the corresponding iterators | ||
927 | [8x-15x faster].</li> | ||
928 | </ul></li> | ||
929 | |||
930 | <li>Changes in the core and loadable modules and the stand-alone executable: | ||
931 | <ul> | ||
932 | <li>Added <tt>jit.version</tt>, <tt>jit.version_num</tt> | ||
933 | and <tt>jit.arch</tt>.</li> | ||
934 | <li>Reorganized some internal API functions (<tt>jit.util.*mcode*</tt>).</li> | ||
935 | <li>The <tt>-j dump</tt> output now shows JSUB names, too.</li> | ||
936 | <li>New x86 disassembler module written in pure Lua. No dependency | ||
937 | on ndisasm anymore. Flexible API, very compact (500 lines) | ||
938 | and complete (x87, MMX, SSE, SSE2, SSE3, SSSE3, privileged instructions).</li> | ||
939 | <li><tt>luajit -v</tt> prints the LuaJIT version and copyright | ||
940 | on a separate line.</li> | ||
941 | </ul></li> | ||
942 | |||
943 | <li>Added SSE, SSE2, SSE3 and SSSE3 support to DynASM.</li> | ||
944 | <li>Miscellaneous doc changes. Added a section about | ||
945 | <a href="install.html#embedding">embedding LuaJIT</a>.</li> | ||
946 | </ul> | ||
947 | <p> | ||
948 | This release is in sync with Coco 1.1.0 (see the | ||
949 | <a href="http://coco.luajit.org/changes.html"><span class="ext">»</span> Coco Change History</a>). | ||
950 | </p> | ||
951 | </div> | ||
952 | |||
953 | <div class="major" style="background: #ffffd0;"> | ||
954 | <h2 id="LuaJIT-1.0.3">LuaJIT 1.0.3 — 2005-09-08</h2> | ||
955 | <ul> | ||
956 | <li>Even more docs.</li> | ||
957 | <li>Unified closure checks in <tt>jit.*</tt>.</li> | ||
958 | <li>Fixed some range checks in <tt>jit.util.*</tt>.</li> | ||
959 | <li>Fixed __newindex call originating from <tt>jit_settable_str()</tt>.</li> | ||
960 | <li>Merged with Lua 5.1 alpha (including early bug fixes).</li> | ||
961 | </ul> | ||
962 | <p> | ||
963 | This is the first public release of LuaJIT. | ||
964 | </p> | ||
965 | |||
966 | <h2 id="LuaJIT-1.0.2">LuaJIT 1.0.2 — 2005-09-02</h2> | ||
967 | <ul> | ||
968 | <li>Add support for flushing the Valgrind translation cache <br> | ||
969 | (<tt>MYCFLAGS= -DUSE_VALGRIND</tt>).</li> | ||
970 | <li>Add support for freeing executable mcode memory to the <tt>mmap()</tt>-based | ||
971 | variant for POSIX systems.</li> | ||
972 | <li>Reorganized the C function signature handling in | ||
973 | <tt>jit.opt_lib</tt>.</li> | ||
974 | <li>Changed to index-based hints for inlining C functions. | ||
975 | Still no support in the backend for inlining.</li> | ||
976 | <li>Hardcode <tt>HEAP_CREATE_ENABLE_EXECUTE</tt> value if undefined.</li> | ||
977 | <li>Misc. changes to the <tt>jit.*</tt> modules.</li> | ||
978 | <li>Misc. changes to the Makefiles.</li> | ||
979 | <li>Lots of new docs.</li> | ||
980 | <li>Complete doc reorg.</li> | ||
981 | </ul> | ||
982 | <p> | ||
983 | Not released because Lua 5.1 alpha came out today. | ||
984 | </p> | ||
985 | |||
986 | <h2 id="LuaJIT-1.0.1">LuaJIT 1.0.1 — 2005-08-31</h2> | ||
987 | <ul> | ||
988 | <li>Missing GC step in <tt>OP_CONCAT</tt>.</li> | ||
989 | <li>Fix result handling for C –> JIT calls.</li> | ||
990 | <li>Detect CPU feature bits.</li> | ||
991 | <li>Encode conditional moves (<tt>fucomip</tt>) only when supported.</li> | ||
992 | <li>Add fallback instructions for FP compares.</li> | ||
993 | <li>Add support for <tt>LUA_COMPAT_VARARG</tt>. Still disabled by default.</li> | ||
994 | <li>MSVC needs a specific place for the <tt>CALLBACK</tt> attribute | ||
995 | (David Burgess).</li> | ||
996 | <li>Misc. doc updates.</li> | ||
997 | </ul> | ||
998 | <p> | ||
999 | Interim non-public release. | ||
1000 | Special thanks to Adam D. Moss for reporting most of the bugs. | ||
1001 | </p> | ||
1002 | |||
1003 | <h2 id="LuaJIT-1.0.0">LuaJIT 1.0.0 — 2005-08-29</h2> | ||
1004 | <p> | ||
1005 | This is the initial non-public release of LuaJIT. | ||
1006 | </p> | ||
1007 | </div> | ||
1008 | <br class="flush"> | 871 | <br class="flush"> |
1009 | </div> | 872 | </div> |
1010 | <div id="foot"> | 873 | <div id="foot"> |