1/* lzo_asm.h -- LZO assembler stuff
2
3   This file is part of the LZO real-time data compression library.
4
5   Copyright (C) 1996-2014 Markus Franz Xaver Johannes Oberhumer
6   All Rights Reserved.
7
8   The LZO library is free software; you can redistribute it and/or
9   modify it under the terms of the GNU General Public License as
10   published by the Free Software Foundation; either version 2 of
11   the License, or (at your option) any later version.
12
13   The LZO library is distributed in the hope that it will be useful,
14   but WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16   GNU General Public License for more details.
17
18   You should have received a copy of the GNU General Public License
19   along with the LZO library; see the file COPYING.
20   If not, write to the Free Software Foundation, Inc.,
21   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22
23   Markus F.X.J. Oberhumer
24   <markus@oberhumer.com>
25   http://www.oberhumer.com/opensource/lzo/
26 */
27
28
29/***********************************************************************
30// <asmconfig.h>
31************************************************************************/
32
33#if !defined(__i386__)
34#  error
35#endif
36
37#if !defined(IN_CONFIGURE)
38#if defined(LZO_HAVE_CONFIG_H)
39#  include <config.h>
40#else
41   /* manual configuration - see defaults below */
42#  if defined(__ELF__)
43#    define MFX_ASM_HAVE_TYPE 1
44#    define MFX_ASM_NAME_NO_UNDERSCORES 1
45#  elif defined(__linux__)              /* Linux a.out */
46#    define MFX_ASM_ALIGN_PTWO 1
47#  elif defined(__DJGPP__)
48#    define MFX_ASM_ALIGN_PTWO 1
49#  elif defined(__GO32__)               /* djgpp v1 */
50#    define MFX_ASM_CANNOT_USE_EBP 1
51#  elif defined(__EMX__)
52#    define MFX_ASM_ALIGN_PTWO 1
53#    define MFX_ASM_CANNOT_USE_EBP 1
54#  endif
55#endif
56#endif
57
58#if 1 && defined(__ELF__)
59.section .note.GNU-stack,"",@progbits
60#endif
61#if 0 && defined(__ELF__)
62#undef i386
63.arch i386
64.code32
65#endif
66
67
68/***********************************************************************
69// name always uses underscores
70// [ OLD: name (default: with underscores) ]
71************************************************************************/
72
73#if !defined(LZO_ASM_NAME)
74#  define LZO_ASM_NAME(n)       _ ## n
75#if 0
76#  if defined(MFX_ASM_NAME_NO_UNDERSCORES)
77#    define LZO_ASM_NAME(n)     n
78#  else
79#    define LZO_ASM_NAME(n)     _ ## n
80#  endif
81#endif
82#endif
83
84
85/***********************************************************************
86// .type (default: do not use)
87************************************************************************/
88
89#if !defined(LZO_PUBLIC)
90#if defined(__LZO_DB__)
91#  define LZO_PUBLIC(func) \
92        .p2align 4 ; .byte 0,0,0,0,0,0,0 ; .ascii "LZO_START"
93#  define LZO_PUBLIC_END(func) \
94        .p2align 4,0x90 ; .ascii "LZO_END"
95#elif defined(MFX_ASM_HAVE_TYPE)
96#  define LZO_PUBLIC(func) \
97        ALIGN3 ; .type LZO_ASM_NAME(func),@function ; \
98        .globl LZO_ASM_NAME(func) ; LZO_ASM_NAME(func):
99#  define LZO_PUBLIC_END(func) \
100        .size LZO_ASM_NAME(func),.-LZO_ASM_NAME(func)
101#else
102#  define LZO_PUBLIC(func) \
103        ALIGN3 ; .globl LZO_ASM_NAME(func) ; LZO_ASM_NAME(func):
104#  define LZO_PUBLIC_END(func)
105#endif
106#endif
107
108
109/***********************************************************************
110// .align (default: bytes)
111************************************************************************/
112
113#if !defined(MFX_ASM_ALIGN_BYTES) && !defined(MFX_ASM_ALIGN_PTWO)
114#  define MFX_ASM_ALIGN_BYTES 1
115#endif
116
117#if !defined(LZO_ASM_ALIGN)
118#  if defined(MFX_ASM_ALIGN_PTWO)
119#    define LZO_ASM_ALIGN(x)    .align x
120#  else
121#    define LZO_ASM_ALIGN(x)    .align (1 << (x))
122#  endif
123#endif
124
125#define ALIGN1              LZO_ASM_ALIGN(1)
126#define ALIGN2              LZO_ASM_ALIGN(2)
127#define ALIGN3              LZO_ASM_ALIGN(3)
128
129
130/***********************************************************************
131// ebp usage (default: can use)
132************************************************************************/
133
134#if !defined(MFX_ASM_CANNOT_USE_EBP)
135#  if 1 && !defined(N_3_EBP) && !defined(N_255_EBP)
136#    define N_3_EBP 1
137#  endif
138#  if 0 && !defined(N_3_EBP) && !defined(N_255_EBP)
139#    define N_255_EBP 1
140#  endif
141#endif
142
143#if defined(N_3_EBP) && defined(N_255_EBP)
144#  error
145#endif
146#if defined(MFX_ASM_CANNOT_USE_EBP)
147#  if defined(N_3_EBP) || defined(N_255_EBP)
148#    error
149#  endif
150#endif
151
152#if !defined(N_3)
153#  if defined(N_3_EBP)
154#    define N_3         %ebp
155#  else
156#    define N_3         $3
157#  endif
158#endif
159
160#if !defined(N_255)
161#  if defined(N_255_EBP)
162#    define N_255       %ebp
163#    define NOTL_3(r)   xorl %ebp,r
164#  else
165#    define N_255       $255
166#  endif
167#endif
168
169#if !defined(NOTL_3)
170#  define NOTL_3(r)     xorl N_3,r
171#endif
172
173
174/***********************************************************************
175//
176************************************************************************/
177
178#ifndef INP
179#define INP      4+36(%esp)
180#define INS      8+36(%esp)
181#define OUTP    12+36(%esp)
182#define OUTS    16+36(%esp)
183#endif
184
185#define INEND         4(%esp)
186#define OUTEND        (%esp)
187
188
189#if defined(LZO_TEST_DECOMPRESS_OVERRUN_INPUT)
190#  define TEST_IP_R(r)      cmpl r,INEND ; jb .L_input_overrun
191#  define TEST_IP(addr,r)   leal addr,r ; TEST_IP_R(r)
192#else
193#  define TEST_IP_R(r)
194#  define TEST_IP(addr,r)
195#endif
196
197#if defined(LZO_TEST_DECOMPRESS_OVERRUN_OUTPUT)
198#  define TEST_OP_R(r)      cmpl r,OUTEND ; jb .L_output_overrun
199#  define TEST_OP(addr,r)   leal addr,r ; TEST_OP_R(r)
200#else
201#  define TEST_OP_R(r)
202#  define TEST_OP(addr,r)
203#endif
204
205#if defined(LZO_TEST_DECOMPRESS_OVERRUN_LOOKBEHIND)
206#  define TEST_LOOKBEHIND(r)    cmpl OUTP,r ; jb .L_lookbehind_overrun
207#else
208#  define TEST_LOOKBEHIND(r)
209#endif
210
211
212/***********************************************************************
213//
214************************************************************************/
215
216#define LODSB           movb (%esi),%al ; incl %esi
217
218#define MOVSB(r1,r2,x)  movb (r1),x ; incl r1 ; movb x,(r2) ; incl r2
219#define MOVSW(r1,r2,x)  movb (r1),x ; movb x,(r2) ; \
220                        movb 1(r1),x ; addl $2,r1 ; \
221                        movb x,1(r2) ; addl $2,r2
222#define MOVSL(r1,r2,x)  movl (r1),x ; addl $4,r1 ; movl x,(r2) ; addl $4,r2
223
224#if defined(LZO_DEBUG)
225#define COPYB_C(r1,r2,x,rc) \
226                        cmpl $0,rc ; jz .L_assert_fail; \
227                        9: MOVSB(r1,r2,x) ; decl rc ; jnz 9b
228#define COPYL_C(r1,r2,x,rc) \
229                        cmpl $0,rc ; jz .L_assert_fail; \
230                        9: MOVSL(r1,r2,x) ; decl rc ; jnz 9b
231#else
232#define COPYB_C(r1,r2,x,rc) \
233                        9: MOVSB(r1,r2,x) ; decl rc ; jnz 9b
234#define COPYL_C(r1,r2,x,rc) \
235                        9: MOVSL(r1,r2,x) ; decl rc ; jnz 9b
236#endif
237
238#define COPYB(r1,r2,x)  COPYB_C(r1,r2,x,%ecx)
239#define COPYL(r1,r2,x)  COPYL_C(r1,r2,x,%ecx)
240
241
242/***********************************************************************
243// not used
244************************************************************************/
245
246#if 0
247
248#if 0
249#define REP_MOVSB(x)    rep ; movsb
250#define REP_MOVSL(x)    shrl $2,%ecx ; rep ; movsl
251#elif 1
252#define REP_MOVSB(x)    COPYB(%esi,%edi,x)
253#define REP_MOVSL(x)    shrl $2,%ecx ; COPYL(%esi,%edi,x)
254#else
255#define REP_MOVSB(x)    rep ; movsb
256#define REP_MOVSL(x)    jmp 9f ; 8: movsb ; decl %ecx ; \
257                        9: testl $3,%edi ; jnz 8b ; \
258                        movl %ecx,x ; shrl $2,%ecx ; andl $3,x ; \
259                        rep ; movsl ; movl x,%ecx ; rep ; movsb
260#endif
261
262#if 1
263#define NEGL(x)         negl x
264#else
265#define NEGL(x)         xorl $-1,x ; incl x
266#endif
267
268#endif
269
270
271
272/*
273vi:ts=4
274*/
275
276