1;=========================================================================== 2; Copyright (c) 1990-1999 Info-ZIP. All rights reserved. 3; 4; See the accompanying file LICENSE, version 1999-Oct-05 or later 5; (the contents of which are also included in zip.h) for terms of use. 6; If, for some reason, both of these files are missing, the Info-ZIP license 7; also may be found at: ftp://ftp.cdrom.com/pub/infozip/license.html 8;=========================================================================== 9; match.s for ARM by Sergio Monesi. 10 11r0 RN 0 12r1 RN 1 13r2 RN 2 14r3 RN 3 15r4 RN 4 16r5 RN 5 17r6 RN 6 18r7 RN 7 19r8 RN 8 20r9 RN 9 21sl RN 10 22fp RN 11 23ip RN 12 24sp RN 13 25lr RN 14 26pc RN 15 27 28MAX_DIST EQU 32506 29WMASK EQU 32767 30MAX_MATCH EQU 258 31 32 AREA |C$$code|, CODE, READONLY 33 34 35; r1 = chain_lenght 36; r2 = scan 37; r3 = match 38; r4 = len (tmp) 39; r5 = best_len 40; r6 = limit 41; r7 = strend 42; r8 = scan_end1 43; r9 = scan_end 44; lr = window 45; fp = prev 46 47|__max_chain_length| 48 IMPORT max_chain_length 49 DCD max_chain_length 50|__window| 51 IMPORT window 52 DCD window 53|__prev| 54 IMPORT prev 55 DCD prev 56|__prev_length| 57 IMPORT prev_length 58 DCD prev_length 59|__strstart| 60 IMPORT strstart 61 DCD strstart 62|__good_match| 63 IMPORT good_match 64 DCD good_match 65|__nice_match| 66 IMPORT nice_match 67 DCD nice_match 68|__match_start| 69 IMPORT match_start 70 DCD match_start 71 72 DCB "longest_match" 73 DCB &00,&00,&00 74 DCD &ff000010 75 76 EXPORT longest_match 77longest_match 78 STMFD sp!, {r4-r9,fp,lr} 79 80 LDR fp, [pc, #|__prev|-.-8] 81 82 LDR r1, [pc, #|__max_chain_length|-.-8] 83 LDR r1, [r1] 84 LDR lr, [pc, #|__window|-.-8] 85 86 LDR ip, [pc, #|__strstart|-.-8] 87 LDR ip, [ip] 88 ADD r2, lr, ip 89 LDR r5, [pc, #|__prev_length|-.-8] 90 LDR r5, [r5] 91 SUBS ip, ip, #MAX_DIST-250 ; if r6 > MAX_DIST 92 SUBCSS r6, ip, #250 ; r6 = r6 - MAXDIST 93 MOVLS r6, #0 ; else r6 = 0 94 95 ADD r7, r2, #MAX_MATCH-256 96 ADD r7, r7, #256 ; r7 = r2 + MAX_MATCH (=258); 97 98 SUB ip, r5, #1 99 LDRB r8, [r2, ip] 100 LDRB r9, [r2, r5] 101 102 LDR ip, [pc, #|__good_match|-.-8] 103 LDR ip, [ip] 104 CMP r5, ip 105 MOVCS r1, r1, LSR #2 106 107cycle 108 ADD r3, lr, r0 109 110 LDRB ip, [r3, r5] 111 CMP ip, r9 112 BNE cycle_end 113 114 SUB ip, r5, #1 115 LDRB ip, [r3, ip] 116 CMP ip, r8 117 BNE cycle_end 118 119 LDRB ip, [r2] 120 LDRB r4, [r3] 121 CMP ip, r4 122 BNE cycle_end 123 124 LDRB ip, [r3, #1] 125 LDRB r4, [r2, #1] 126 CMP ip, r4 127 BNE cycle_end 128 129 ADD r2, r2, #2 130 ADD r3, r3, #2 131 132inn_cycle 133 LDRB ip, [r2, #1]! 134 LDRB r4, [r3, #1]! 135 CMP ip, r4 136 BNE exit_inn_cycle 137 138 LDRB ip, [r2, #1]! 139 LDRB r4, [r3, #1]! 140 CMP ip, r4 141 BNE exit_inn_cycle 142 143 LDRB ip, [r2, #1]! 144 LDRB r4, [r3, #1]! 145 CMP ip, r4 146 BNE exit_inn_cycle 147 148 LDRB ip, [r2, #1]! 149 LDRB r4, [r3, #1]! 150 CMP ip, r4 151 BNE exit_inn_cycle 152 153 LDRB ip, [r2, #1]! 154 LDRB r4, [r3, #1]! 155 CMP ip, r4 156 BNE exit_inn_cycle 157 158 LDRB ip, [r2, #1]! 159 LDRB r4, [r3, #1]! 160 CMP ip, r4 161 BNE exit_inn_cycle 162 163 LDRB ip, [r2, #1]! 164 LDRB r4, [r3, #1]! 165 CMP ip, r4 166 BNE exit_inn_cycle 167 168 LDRB ip, [r2, #1]! 169 LDRB r4, [r3, #1]! 170 CMP ip, r4 171 BNE exit_inn_cycle 172 173 CMP r2, r7 174 BCC inn_cycle 175 176exit_inn_cycle 177 SUB r4, r2, r7 ; len = MAX_MATCH - (int)(strend - scan); 178 ADD r4, r4, #MAX_MATCH-256 179 ADD r4, r4, #256 180 181 SUB r2, r2, r4 ; scan = strend - MAX_MATCH 182 183 CMP r4, r5 ; if (len > best_len) { 184 BLE cycle_end 185 186 LDR ip, [pc, #|__match_start|-.-8] ; match_start = cur_match; 187 STR r0, [ip] 188 MOV r5, r4 ; best_len = len; 189 190 LDR ip, [pc, #|__nice_match|-.-8] ; if (len >= nice_match) 191 LDR ip, [ip] 192 CMP r4, ip 193 BGE exit_match ; break; 194 195 SUB ip, r5, #1 ; scan_end1 = scan[best_len-1]; 196 LDRB r8, [r2, ip] 197 LDRB r9, [r2, r5] ; scan_end = scan[best_len]; 198 199cycle_end 200 MOV ip, r0, LSL #17 ; cur_match & WMASK 201 MOV ip, ip, LSR #17 202 203 LDR r0, [fp, ip, ASL #1] ; cur_match = prev[cur_match & WMASK] 204 MOV r0, r0, ASL #16 205 MOV r0, r0, LSR #16 206 207 CMP r0, r6 ; cur_match > limit 208 BLS exit_match 209 SUBS r1, r1, #1 ; --chain_length 210 BNE cycle ; chain_length != 0 211 212exit_match 213 MOV r0, r5 214 215 LDMFD sp!, {r4-r9,fp,pc}^ 216 217 END 218