match.s 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  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. r0 RN 0
  11. r1 RN 1
  12. r2 RN 2
  13. r3 RN 3
  14. r4 RN 4
  15. r5 RN 5
  16. r6 RN 6
  17. r7 RN 7
  18. r8 RN 8
  19. r9 RN 9
  20. sl RN 10
  21. fp RN 11
  22. ip RN 12
  23. sp RN 13
  24. lr RN 14
  25. pc RN 15
  26. MAX_DIST EQU 32506
  27. WMASK EQU 32767
  28. MAX_MATCH EQU 258
  29. AREA |C$$code|, CODE, READONLY
  30. ; r1 = chain_lenght
  31. ; r2 = scan
  32. ; r3 = match
  33. ; r4 = len (tmp)
  34. ; r5 = best_len
  35. ; r6 = limit
  36. ; r7 = strend
  37. ; r8 = scan_end1
  38. ; r9 = scan_end
  39. ; lr = window
  40. ; fp = prev
  41. |__max_chain_length|
  42. IMPORT max_chain_length
  43. DCD max_chain_length
  44. |__window|
  45. IMPORT window
  46. DCD window
  47. |__prev|
  48. IMPORT prev
  49. DCD prev
  50. |__prev_length|
  51. IMPORT prev_length
  52. DCD prev_length
  53. |__strstart|
  54. IMPORT strstart
  55. DCD strstart
  56. |__good_match|
  57. IMPORT good_match
  58. DCD good_match
  59. |__nice_match|
  60. IMPORT nice_match
  61. DCD nice_match
  62. |__match_start|
  63. IMPORT match_start
  64. DCD match_start
  65. DCB "longest_match"
  66. DCB &00,&00,&00
  67. DCD &ff000010
  68. EXPORT longest_match
  69. longest_match
  70. STMFD sp!, {r4-r9,fp,lr}
  71. LDR fp, [pc, #|__prev|-.-8]
  72. LDR r1, [pc, #|__max_chain_length|-.-8]
  73. LDR r1, [r1]
  74. LDR lr, [pc, #|__window|-.-8]
  75. LDR ip, [pc, #|__strstart|-.-8]
  76. LDR ip, [ip]
  77. ADD r2, lr, ip
  78. LDR r5, [pc, #|__prev_length|-.-8]
  79. LDR r5, [r5]
  80. SUBS ip, ip, #MAX_DIST-250 ; if r6 > MAX_DIST
  81. SUBCSS r6, ip, #250 ; r6 = r6 - MAXDIST
  82. MOVLS r6, #0 ; else r6 = 0
  83. ADD r7, r2, #MAX_MATCH-256
  84. ADD r7, r7, #256 ; r7 = r2 + MAX_MATCH (=258);
  85. SUB ip, r5, #1
  86. LDRB r8, [r2, ip]
  87. LDRB r9, [r2, r5]
  88. LDR ip, [pc, #|__good_match|-.-8]
  89. LDR ip, [ip]
  90. CMP r5, ip
  91. MOVCS r1, r1, LSR #2
  92. cycle
  93. ADD r3, lr, r0
  94. LDRB ip, [r3, r5]
  95. CMP ip, r9
  96. BNE cycle_end
  97. SUB ip, r5, #1
  98. LDRB ip, [r3, ip]
  99. CMP ip, r8
  100. BNE cycle_end
  101. LDRB ip, [r2]
  102. LDRB r4, [r3]
  103. CMP ip, r4
  104. BNE cycle_end
  105. LDRB ip, [r3, #1]
  106. LDRB r4, [r2, #1]
  107. CMP ip, r4
  108. BNE cycle_end
  109. ADD r2, r2, #2
  110. ADD r3, r3, #2
  111. inn_cycle
  112. LDRB ip, [r2, #1]!
  113. LDRB r4, [r3, #1]!
  114. CMP ip, r4
  115. BNE exit_inn_cycle
  116. LDRB ip, [r2, #1]!
  117. LDRB r4, [r3, #1]!
  118. CMP ip, r4
  119. BNE exit_inn_cycle
  120. LDRB ip, [r2, #1]!
  121. LDRB r4, [r3, #1]!
  122. CMP ip, r4
  123. BNE exit_inn_cycle
  124. LDRB ip, [r2, #1]!
  125. LDRB r4, [r3, #1]!
  126. CMP ip, r4
  127. BNE exit_inn_cycle
  128. LDRB ip, [r2, #1]!
  129. LDRB r4, [r3, #1]!
  130. CMP ip, r4
  131. BNE exit_inn_cycle
  132. LDRB ip, [r2, #1]!
  133. LDRB r4, [r3, #1]!
  134. CMP ip, r4
  135. BNE exit_inn_cycle
  136. LDRB ip, [r2, #1]!
  137. LDRB r4, [r3, #1]!
  138. CMP ip, r4
  139. BNE exit_inn_cycle
  140. LDRB ip, [r2, #1]!
  141. LDRB r4, [r3, #1]!
  142. CMP ip, r4
  143. BNE exit_inn_cycle
  144. CMP r2, r7
  145. BCC inn_cycle
  146. exit_inn_cycle
  147. SUB r4, r2, r7 ; len = MAX_MATCH - (int)(strend - scan);
  148. ADD r4, r4, #MAX_MATCH-256
  149. ADD r4, r4, #256
  150. SUB r2, r2, r4 ; scan = strend - MAX_MATCH
  151. CMP r4, r5 ; if (len > best_len) {
  152. BLE cycle_end
  153. LDR ip, [pc, #|__match_start|-.-8] ; match_start = cur_match;
  154. STR r0, [ip]
  155. MOV r5, r4 ; best_len = len;
  156. LDR ip, [pc, #|__nice_match|-.-8] ; if (len >= nice_match)
  157. LDR ip, [ip]
  158. CMP r4, ip
  159. BGE exit_match ; break;
  160. SUB ip, r5, #1 ; scan_end1 = scan[best_len-1];
  161. LDRB r8, [r2, ip]
  162. LDRB r9, [r2, r5] ; scan_end = scan[best_len];
  163. cycle_end
  164. MOV ip, r0, LSL #17 ; cur_match & WMASK
  165. MOV ip, ip, LSR #17
  166. LDR r0, [fp, ip, ASL #1] ; cur_match = prev[cur_match & WMASK]
  167. MOV r0, r0, ASL #16
  168. MOV r0, r0, LSR #16
  169. CMP r0, r6 ; cur_match > limit
  170. BLS exit_match
  171. SUBS r1, r1, #1 ; --chain_length
  172. BNE cycle ; chain_length != 0
  173. exit_match
  174. MOV r0, r5
  175. LDMFD sp!, {r4-r9,fp,pc}^
  176. END