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