Unified · Split
| @@ -63,23 +63,22 @@ pstep RN r1 · 62 unmodified lines | ||
| 63 | 63 | ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- |
| 64 | 64 | stmdb sp!, {r4 - r11, lr} |
| 65 | 65 | |
| 66 | − sub src, src, pstep, lsl #1 ; move src pointer down by 2 lines | |
| 66 | + ldr r12, [r3] ; limit | |
| 67 | + ldr r3, [src, -pstep, lsl #1] ; p1 | |
| 67 | 68 | |
| 68 | − ldr r12, [r3], #4 ; limit | |
| 69 | − ldr r3, [src], pstep ; p1 | |
| 69 | + ldr r9, [sp, #40] ; count for 8-in-parallel | |
| 70 | + ldr r4, [src, -pstep] ; p0 | |
| 70 | 71 | |
| 71 | − ldr r9, [sp, #36] ; count for 8-in-parallel | |
| 72 | − ldr r4, [src], pstep ; p0 | |
| 73 | − | |
| 74 | − ldr r7, [r2], #4 ; flimit | |
| 75 | − ldr r5, [src], pstep ; q0 | |
| 72 | + ldr r7, [r2] ; flimit | |
| 73 | + ldr r5, [src] ; q0 | |
| 76 | 74 | ldr r2, c0x80808080 |
| 77 | 75 | |
| 78 | − ldr r6, [src] ; q1 | |
| 76 | + ldr r6, [src, pstep] ; q1 | |
| 79 | 77 | |
| 80 | 78 | uadd8 r7, r7, r7 ; flimit * 2 |
| 81 | − mov r9, r9, lsl #1 ; 4-in-parallel | |
| 79 | + mov r9, r9, lsl #1 ; double the count. we're doing 4 at a time | |
| 82 | 80 | uadd8 r12, r7, r12 ; flimit * 2 + limit |
| 81 | + mov lr, #0 | |
| 83 | 82 | |
| 84 | 83 | |simple_hnext8| |
| 85 | 84 | ; vp8_simple_filter_mask() function |
| @@ -89,22 +88,19 @@ pstep RN r1 · 3 unmodified lines | ||
| 89 | 88 | uqsub8 r10, r4, r5 ; p0 - q0 |
| 90 | 89 | uqsub8 r11, r5, r4 ; q0 - p0 |
| 91 | 90 | orr r8, r8, r7 ; abs(p1 - q1) |
| 92 | − ldr lr, c0x7F7F7F7F ; 01111111 mask | |
| 93 | 91 | orr r10, r10, r11 ; abs(p0 - q0) |
| 94 | − and r8, lr, r8, lsr #1 ; abs(p1 - q1) / 2 | |
| 92 | + uhadd8 r8, r8, lr ; abs(p1 - q2) >> 1 | |
| 95 | 93 | uqadd8 r10, r10, r10 ; abs(p0 - q0) * 2 |
| 96 | − mvn lr, #0 ; r10 == -1 | |
| 94 | + ; STALL waiting on r10 | |
| 97 | 95 | uqadd8 r10, r10, r8 ; abs(p0 - q0)*2 + abs(p1 - q1)/2 |
| 98 | − ; STALL waiting on r10 :( | |
| 99 | − uqsub8 r10, r10, r12 ; compare to flimit | |
| 100 | − mov r8, #0 | |
| 101 | − | |
| 102 | − usub8 r10, r8, r10 ; use usub8 instead of ssub8 | |
| 103 | − ; STALL (maybe?) when are flags set? :/ | |
| 104 | − sel r10, lr, r8 ; filter mask: lr | |
| 105 | − | |
| 96 | + ; STALL waiting on r10 | |
| 97 | + mvn r8, #0 | |
| 98 | + uqsub8 r10, r10, r12 ; compare to flimit. need to do this twice because uqsub8 doesn't set GE flags | |
| 99 | + ; and usub8 doesn't saturate | |
| 100 | + usub8 r10, lr, r10 ; set GE flags for each byte | |
| 101 | + sel r10, r8, lr ; filter mask: F or 0 | |
| 106 | 102 | cmp r10, #0 |
| 107 | − beq simple_hskip_filter ; skip filtering | |
| 103 | + beq simple_hskip_filter ; skip filtering if we're &ing with 0s. would just write out the same values | |
| 108 | 104 | |
| 109 | 105 | ;vp8_simple_filter() function |
| 110 | 106 | |
| @@ -113,55 +109,45 @@ pstep RN r1 · 2 unmodified lines | ||
| 113 | 109 | eor r4, r4, r2 ; p0 offset to convert to a signed value |
| 114 | 110 | eor r5, r5, r2 ; q0 offset to convert to a signed value |
| 115 | 111 | |
| 116 | − qsub8 r3, r3, r6 ; vp8_filter (r3) = vp8_signed_char_clamp(p1-q1) | |
| 117 | − qsub8 r6, r5, r4 ; vp8_filter = vp8_signed_char_clamp(vp8_filter + 3 * ( q0 - p0)) | |
| 112 | + qsub8 r3, r3, r6 ; vp8_signed_char_clamp(p1-q1) | |
| 113 | + qsub8 r6, r5, r4 ; vp8_signed_char_clamp(q0-p0) | |
| 114 | + qadd8 r3, r3, r6 ; += q0-p0 | |
| 115 | + qadd8 r3, r3, r6 ; += q0-p0 | |
| 116 | + qadd8 r3, r3, r6 ; p1-q1 + 3*(q0-p0)) | |
| 117 | + and r3, r3, r10 ; &= mask | |
| 118 | 118 | |
| 119 | − qadd8 r3, r3, r6 | |
| 120 | − ldr r8, c0x03030303 ; r8 = 3 | |
| 121 | − | |
| 122 | − qadd8 r3, r3, r6 | |
| 123 | 119 | ldr r7, c0x04040404 |
| 124 | − | |
| 125 | − qadd8 r3, r3, r6 | |
| 126 | − and r3, r3, lr ; vp8_filter &= mask; | |
| 120 | + ldr r8, c0x03030303 | |
| 127 | 121 | |
| 128 | 122 | ;save bottom 3 bits so that we round one side +4 and the other +3 |
| 123 | + qadd8 r7 , r3 , r7 ; Filter1 (r3) = vp8_signed_char_clamp(vp8_filter+4) | |
| 129 | 124 | qadd8 r8 , r3 , r8 ; Filter2 (r8) = vp8_signed_char_clamp(vp8_filter+3) |
| 130 | − qadd8 r3 , r3 , r7 ; Filter1 (r3) = vp8_signed_char_clamp(vp8_filter+4) | |
| 131 | 125 | |
| 132 | − mov r7, #0 | |
| 133 | − shadd8 r8 , r8 , r7 ; Filter2 >>= 3 | |
| 134 | − shadd8 r3 , r3 , r7 ; Filter1 >>= 3 | |
| 135 | − shadd8 r8 , r8 , r7 | |
| 136 | − shadd8 r3 , r3 , r7 | |
| 137 | − shadd8 r8 , r8 , r7 ; r8: Filter2 | |
| 138 | − shadd8 r3 , r3 , r7 ; r7: filter1 | |
| 126 | + mov r3, #0 | |
| 127 | + shadd8 r7 , r7 , r3 | |
| 128 | + shadd8 r8 , r8 , r3 | |
| 129 | + shadd8 r7 , r7 , r3 | |
| 130 | + shadd8 r8 , r8 , r3 | |
| 131 | + shadd8 r7 , r7 , r3 ; Filter1 >>= 3 | |
| 132 | + shadd8 r8 , r8 , r3 ; Filter2 >>= 3 | |
| 139 | 133 | |
| 140 | − ;calculate output | |
| 141 | − sub src, src, pstep, lsl #1 | |
| 142 | 134 | |
| 135 | + qsub8 r5 ,r5, r7 ; u = vp8_signed_char_clamp(q0 - Filter1) | |
| 143 | 136 | qadd8 r4, r4, r8 ; u = vp8_signed_char_clamp(p0 + Filter2) |
| 144 | − qsub8 r5 ,r5, r3 ; u = vp8_signed_char_clamp(q0 - Filter1) | |
| 145 | − eor r4, r4, r2 ; *op0 = u^0x80 | |
| 146 | − str r4, [src], pstep ; store op0 result | |
| 147 | 137 | eor r5, r5, r2 ; *oq0 = u^0x80 |
| 148 | − str r5, [src], pstep ; store oq0 result | |
| 138 | + str r5, [src] ; store oq0 result | |
| 139 | + eor r4, r4, r2 ; *op0 = u^0x80 | |
| 140 | + str r4, [src, -pstep] ; store op0 result | |
| 149 | 141 | |
| 150 | 142 | |simple_hskip_filter| |
| 151 | − add src, src, #4 | |
| 152 | − sub src, src, pstep | |
| 153 | − sub src, src, pstep, lsl #1 | |
| 154 | 143 | |
| 155 | 144 | subs r9, r9, #1 |
| 145 | + addne src, src, #4 ; next row | |
| 156 | 146 | |
| 157 | − ;pld [src] | |
| 158 | − ;pld [src, pstep] | |
| 159 | − ;pld [src, pstep, lsl #1] | |
| 160 | − | |
| 161 | − ldrne r3, [src], pstep ; p1 | |
| 162 | − ldrne r4, [src], pstep ; p0 | |
| 163 | − ldrne r5, [src], pstep ; q0 | |
| 164 | − ldrne r6, [src] ; q1 | |
| 147 | + ldrne r3, [src, -pstep, lsl #1] ; p1 | |
| 148 | + ldrne r4, [src, -pstep] ; p0 | |
| 149 | + ldrne r5, [src] ; q0 | |
| 150 | + ldrne r6, [src, pstep] ; q1 | |
| 165 | 151 | |
| 166 | 152 | bne simple_hnext8 |
| 167 | 153 | |
| @@ -174,9 +160,9 @@ pstep RN r1 · 6 unmodified lines | ||
| 174 | 160 | ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- |
| 175 | 161 | stmdb sp!, {r4 - r11, lr} |
| 176 | 162 | |
| 177 | − ldr r12, [r2], #4 ; r12: flimit | |
| 163 | + ldr r12, [r2] ; r12: flimit | |
| 178 | 164 | ldr r2, c0x80808080 |
| 179 | − ldr r7, [r3], #4 ; limit | |
| 165 | + ldr r7, [r3] ; limit | |
| 180 | 166 | |
| 181 | 167 | ; load soure data to r7, r8, r9, r10 |
| 182 | 168 | ldrh r3, [src, #-2] |
| @@ -213,16 +199,15 @@ pstep RN r1 · 30 unmodified lines | ||
| 213 | 199 | uqsub8 r10, r5, r4 ; q0 - p0 |
| 214 | 200 | orr r7, r7, r8 ; abs(p1 - q1) |
| 215 | 201 | orr r9, r9, r10 ; abs(p0 - q0) |
| 216 | − ldr lr, c0x7F7F7F7F ; 0111 1111 mask | |
| 217 | − uqadd8 r9, r9, r9 ; abs(p0 - q0) * 2 | |
| 218 | − and r7, lr, r7, lsr #1 ; abs(p1 - q1) / 2 | |
| 219 | 202 | mov r8, #0 |
| 203 | + uqadd8 r9, r9, r9 ; abs(p0 - q0) * 2 | |
| 204 | + uhadd8 r7, r7, r8 ; abs(p1 - q1) / 2 | |
| 220 | 205 | uqadd8 r7, r7, r9 ; abs(p0 - q0)*2 + abs(p1 - q1)/2 |
| 221 | 206 | mvn r10, #0 ; r10 == -1 |
| 222 | 207 | uqsub8 r7, r7, r12 ; compare to flimit |
| 223 | 208 | |
| 224 | 209 | usub8 r7, r8, r7 |
| 225 | − sel r7, r10, r8 ; filter mask: lr | |
| 210 | + sel lr, r10, r8 ; filter mask | |
| 226 | 211 | |
| 227 | 212 | cmp lr, #0 |
| 228 | 213 | beq simple_vskip_filter ; skip filtering |
| @@ -286,10 +271,6 @@ pstep RN r1 · 57 unmodified lines | ||
| 286 | 271 | |simple_vskip_filter| |
| 287 | 272 | subs r11, r11, #1 |
| 288 | 273 | |
| 289 | − ;pld [src] | |
| 290 | − ;pld [src, pstep] | |
| 291 | − ;pld [src, pstep, lsl #1] | |
| 292 | − | |
| 293 | 274 | ; load soure data to r7, r8, r9, r10 |
| 294 | 275 | ldrneh r3, [src, #-2] |
| 295 | 276 | ldrneh r4, [src], pstep |
| @@ -316,7 +297,5 @@ pstep RN r1 · 20 unmodified lines | ||
| 316 | 297 | c0x80808080 DCD 0x80808080 |
| 317 | 298 | c0x03030303 DCD 0x03030303 |
| 318 | 299 | c0x04040404 DCD 0x04040404 |
| 319 | −c0x01010101 DCD 0x01010101 | |
| 320 | −c0x7F7F7F7F DCD 0x7F7F7F7F | |
| 321 | 300 | |
| 322 | 301 | END |