/* 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 */