Home | History | Annotate | Download | only in lzo
      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 (at) 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 /*
    273 vi:ts=4
    274 */
    275 
    276