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 /* 273 vi:ts=4 274 */ 275 276