276 lines
7.4 KiB
C
276 lines
7.4 KiB
C
/* lzo_asm.h -- LZO assembler stuff
|
|
|
|
This file is part of the LZO real-time data compression library.
|
|
|
|
Copyright (C) 1996-2014 Markus Franz Xaver Johannes Oberhumer
|
|
All Rights Reserved.
|
|
|
|
The LZO library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License as
|
|
published by the Free Software Foundation; either version 2 of
|
|
the License, or (at your option) any later version.
|
|
|
|
The LZO library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with the LZO library; see the file COPYING.
|
|
If not, write to the Free Software Foundation, Inc.,
|
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
Markus F.X.J. Oberhumer
|
|
<markus@oberhumer.com>
|
|
http://www.oberhumer.com/opensource/lzo/
|
|
*/
|
|
|
|
|
|
/***********************************************************************
|
|
// <asmconfig.h>
|
|
************************************************************************/
|
|
|
|
#if !defined(__i386__)
|
|
# error
|
|
#endif
|
|
|
|
#if !defined(IN_CONFIGURE)
|
|
#if defined(LZO_HAVE_CONFIG_H)
|
|
# include <config.h>
|
|
#else
|
|
/* manual configuration - see defaults below */
|
|
# if defined(__ELF__)
|
|
# define MFX_ASM_HAVE_TYPE 1
|
|
# define MFX_ASM_NAME_NO_UNDERSCORES 1
|
|
# elif defined(__linux__) /* Linux a.out */
|
|
# define MFX_ASM_ALIGN_PTWO 1
|
|
# elif defined(__DJGPP__)
|
|
# define MFX_ASM_ALIGN_PTWO 1
|
|
# elif defined(__GO32__) /* djgpp v1 */
|
|
# define MFX_ASM_CANNOT_USE_EBP 1
|
|
# elif defined(__EMX__)
|
|
# define MFX_ASM_ALIGN_PTWO 1
|
|
# define MFX_ASM_CANNOT_USE_EBP 1
|
|
# endif
|
|
#endif
|
|
#endif
|
|
|
|
#if 1 && defined(__ELF__)
|
|
.section .note.GNU-stack,"",@progbits
|
|
#endif
|
|
#if 0 && defined(__ELF__)
|
|
#undef i386
|
|
.arch i386
|
|
.code32
|
|
#endif
|
|
|
|
|
|
/***********************************************************************
|
|
// name always uses underscores
|
|
// [ OLD: name (default: with underscores) ]
|
|
************************************************************************/
|
|
|
|
#if !defined(LZO_ASM_NAME)
|
|
# define LZO_ASM_NAME(n) _ ## n
|
|
#if 0
|
|
# if defined(MFX_ASM_NAME_NO_UNDERSCORES)
|
|
# define LZO_ASM_NAME(n) n
|
|
# else
|
|
# define LZO_ASM_NAME(n) _ ## n
|
|
# endif
|
|
#endif
|
|
#endif
|
|
|
|
|
|
/***********************************************************************
|
|
// .type (default: do not use)
|
|
************************************************************************/
|
|
|
|
#if !defined(LZO_PUBLIC)
|
|
#if defined(__LZO_DB__)
|
|
# define LZO_PUBLIC(func) \
|
|
.p2align 4 ; .byte 0,0,0,0,0,0,0 ; .ascii "LZO_START"
|
|
# define LZO_PUBLIC_END(func) \
|
|
.p2align 4,0x90 ; .ascii "LZO_END"
|
|
#elif defined(MFX_ASM_HAVE_TYPE)
|
|
# define LZO_PUBLIC(func) \
|
|
ALIGN3 ; .type LZO_ASM_NAME(func),@function ; \
|
|
.globl LZO_ASM_NAME(func) ; LZO_ASM_NAME(func):
|
|
# define LZO_PUBLIC_END(func) \
|
|
.size LZO_ASM_NAME(func),.-LZO_ASM_NAME(func)
|
|
#else
|
|
# define LZO_PUBLIC(func) \
|
|
ALIGN3 ; .globl LZO_ASM_NAME(func) ; LZO_ASM_NAME(func):
|
|
# define LZO_PUBLIC_END(func)
|
|
#endif
|
|
#endif
|
|
|
|
|
|
/***********************************************************************
|
|
// .align (default: bytes)
|
|
************************************************************************/
|
|
|
|
#if !defined(MFX_ASM_ALIGN_BYTES) && !defined(MFX_ASM_ALIGN_PTWO)
|
|
# define MFX_ASM_ALIGN_BYTES 1
|
|
#endif
|
|
|
|
#if !defined(LZO_ASM_ALIGN)
|
|
# if defined(MFX_ASM_ALIGN_PTWO)
|
|
# define LZO_ASM_ALIGN(x) .align x
|
|
# else
|
|
# define LZO_ASM_ALIGN(x) .align (1 << (x))
|
|
# endif
|
|
#endif
|
|
|
|
#define ALIGN1 LZO_ASM_ALIGN(1)
|
|
#define ALIGN2 LZO_ASM_ALIGN(2)
|
|
#define ALIGN3 LZO_ASM_ALIGN(3)
|
|
|
|
|
|
/***********************************************************************
|
|
// ebp usage (default: can use)
|
|
************************************************************************/
|
|
|
|
#if !defined(MFX_ASM_CANNOT_USE_EBP)
|
|
# if 1 && !defined(N_3_EBP) && !defined(N_255_EBP)
|
|
# define N_3_EBP 1
|
|
# endif
|
|
# if 0 && !defined(N_3_EBP) && !defined(N_255_EBP)
|
|
# define N_255_EBP 1
|
|
# endif
|
|
#endif
|
|
|
|
#if defined(N_3_EBP) && defined(N_255_EBP)
|
|
# error
|
|
#endif
|
|
#if defined(MFX_ASM_CANNOT_USE_EBP)
|
|
# if defined(N_3_EBP) || defined(N_255_EBP)
|
|
# error
|
|
# endif
|
|
#endif
|
|
|
|
#if !defined(N_3)
|
|
# if defined(N_3_EBP)
|
|
# define N_3 %ebp
|
|
# else
|
|
# define N_3 $3
|
|
# endif
|
|
#endif
|
|
|
|
#if !defined(N_255)
|
|
# if defined(N_255_EBP)
|
|
# define N_255 %ebp
|
|
# define NOTL_3(r) xorl %ebp,r
|
|
# else
|
|
# define N_255 $255
|
|
# endif
|
|
#endif
|
|
|
|
#if !defined(NOTL_3)
|
|
# define NOTL_3(r) xorl N_3,r
|
|
#endif
|
|
|
|
|
|
/***********************************************************************
|
|
//
|
|
************************************************************************/
|
|
|
|
#ifndef INP
|
|
#define INP 4+36(%esp)
|
|
#define INS 8+36(%esp)
|
|
#define OUTP 12+36(%esp)
|
|
#define OUTS 16+36(%esp)
|
|
#endif
|
|
|
|
#define INEND 4(%esp)
|
|
#define OUTEND (%esp)
|
|
|
|
|
|
#if defined(LZO_TEST_DECOMPRESS_OVERRUN_INPUT)
|
|
# define TEST_IP_R(r) cmpl r,INEND ; jb .L_input_overrun
|
|
# define TEST_IP(addr,r) leal addr,r ; TEST_IP_R(r)
|
|
#else
|
|
# define TEST_IP_R(r)
|
|
# define TEST_IP(addr,r)
|
|
#endif
|
|
|
|
#if defined(LZO_TEST_DECOMPRESS_OVERRUN_OUTPUT)
|
|
# define TEST_OP_R(r) cmpl r,OUTEND ; jb .L_output_overrun
|
|
# define TEST_OP(addr,r) leal addr,r ; TEST_OP_R(r)
|
|
#else
|
|
# define TEST_OP_R(r)
|
|
# define TEST_OP(addr,r)
|
|
#endif
|
|
|
|
#if defined(LZO_TEST_DECOMPRESS_OVERRUN_LOOKBEHIND)
|
|
# define TEST_LOOKBEHIND(r) cmpl OUTP,r ; jb .L_lookbehind_overrun
|
|
#else
|
|
# define TEST_LOOKBEHIND(r)
|
|
#endif
|
|
|
|
|
|
/***********************************************************************
|
|
//
|
|
************************************************************************/
|
|
|
|
#define LODSB movb (%esi),%al ; incl %esi
|
|
|
|
#define MOVSB(r1,r2,x) movb (r1),x ; incl r1 ; movb x,(r2) ; incl r2
|
|
#define MOVSW(r1,r2,x) movb (r1),x ; movb x,(r2) ; \
|
|
movb 1(r1),x ; addl $2,r1 ; \
|
|
movb x,1(r2) ; addl $2,r2
|
|
#define MOVSL(r1,r2,x) movl (r1),x ; addl $4,r1 ; movl x,(r2) ; addl $4,r2
|
|
|
|
#if defined(LZO_DEBUG)
|
|
#define COPYB_C(r1,r2,x,rc) \
|
|
cmpl $0,rc ; jz .L_assert_fail; \
|
|
9: MOVSB(r1,r2,x) ; decl rc ; jnz 9b
|
|
#define COPYL_C(r1,r2,x,rc) \
|
|
cmpl $0,rc ; jz .L_assert_fail; \
|
|
9: MOVSL(r1,r2,x) ; decl rc ; jnz 9b
|
|
#else
|
|
#define COPYB_C(r1,r2,x,rc) \
|
|
9: MOVSB(r1,r2,x) ; decl rc ; jnz 9b
|
|
#define COPYL_C(r1,r2,x,rc) \
|
|
9: MOVSL(r1,r2,x) ; decl rc ; jnz 9b
|
|
#endif
|
|
|
|
#define COPYB(r1,r2,x) COPYB_C(r1,r2,x,%ecx)
|
|
#define COPYL(r1,r2,x) COPYL_C(r1,r2,x,%ecx)
|
|
|
|
|
|
/***********************************************************************
|
|
// not used
|
|
************************************************************************/
|
|
|
|
#if 0
|
|
|
|
#if 0
|
|
#define REP_MOVSB(x) rep ; movsb
|
|
#define REP_MOVSL(x) shrl $2,%ecx ; rep ; movsl
|
|
#elif 1
|
|
#define REP_MOVSB(x) COPYB(%esi,%edi,x)
|
|
#define REP_MOVSL(x) shrl $2,%ecx ; COPYL(%esi,%edi,x)
|
|
#else
|
|
#define REP_MOVSB(x) rep ; movsb
|
|
#define REP_MOVSL(x) jmp 9f ; 8: movsb ; decl %ecx ; \
|
|
9: testl $3,%edi ; jnz 8b ; \
|
|
movl %ecx,x ; shrl $2,%ecx ; andl $3,x ; \
|
|
rep ; movsl ; movl x,%ecx ; rep ; movsb
|
|
#endif
|
|
|
|
#if 1
|
|
#define NEGL(x) negl x
|
|
#else
|
|
#define NEGL(x) xorl $-1,x ; incl x
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
vi:ts=4
|
|
*/
|
|
|