summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/target/arm/lcd-as-memframe.S68
1 files changed, 67 insertions, 1 deletions
diff --git a/firmware/target/arm/lcd-as-memframe.S b/firmware/target/arm/lcd-as-memframe.S
index 2d0aff937f..a6f9145fab 100644
--- a/firmware/target/arm/lcd-as-memframe.S
+++ b/firmware/target/arm/lcd-as-memframe.S
@@ -170,6 +170,11 @@ lcd_write_yuv420_lines:
170 add lr, r9, r7, asr #8 @ lr = r = (Y >> 9) + rv 170 add lr, r9, r7, asr #8 @ lr = r = (Y >> 9) + rv
171 add r7, r10, r7, asr #7 @ r7 = g = (Y >> 8) + guv 171 add r7, r10, r7, asr #7 @ r7 = g = (Y >> 8) + guv
172 @ 172 @
173#if ARM_ARCH >= 6
174 usat r1, #5, r1 @ clamp b
175 usat lr, #5, lr @ clamp r
176 usat r7, #6, r7 @ clamp g
177#else
173 orr r12, r1, lr @ check if clamping is needed... 178 orr r12, r1, lr @ check if clamping is needed...
174 orr r12, r12, r7, asr #1 @ ...at all 179 orr r12, r12, r7, asr #1 @ ...at all
175 cmp r12, #31 @ 180 cmp r12, #31 @
@@ -184,6 +189,7 @@ lcd_write_yuv420_lines:
184 mvnhi r7, r7, asr #31 @ 189 mvnhi r7, r7, asr #31 @
185 andhi r7, r7, #63 @ 190 andhi r7, r7, #63 @
18615: @ no clamp @ 19115: @ no clamp @
192#endif
187 @ 193 @
188 ldrb r12, [r4, r3] @ r12 = Y' = *(Y'_p + stride) 194 ldrb r12, [r4, r3] @ r12 = Y' = *(Y'_p + stride)
189 @ 195 @
@@ -206,6 +212,11 @@ lcd_write_yuv420_lines:
206 add lr, r9, r7, asr #8 @ lr = r = (Y >> 9) + rv 212 add lr, r9, r7, asr #8 @ lr = r = (Y >> 9) + rv
207 add r7, r10, r7, asr #7 @ r7 = g = (Y >> 8) + guv 213 add r7, r10, r7, asr #7 @ r7 = g = (Y >> 8) + guv
208 @ 214 @
215#if ARM_ARCH >= 6
216 usat r1, #5, r1 @ clamp b
217 usat lr, #5, lr @ clamp r
218 usat r7, #6, r7 @ clamp g
219#else
209 orr r12, r1, lr @ check if clamping is needed... 220 orr r12, r1, lr @ check if clamping is needed...
210 orr r12, r12, r7, asr #1 @ ...at all 221 orr r12, r12, r7, asr #1 @ ...at all
211 cmp r12, #31 @ 222 cmp r12, #31 @
@@ -220,6 +231,7 @@ lcd_write_yuv420_lines:
220 mvnhi r7, r7, asr #31 @ 231 mvnhi r7, r7, asr #31 @
221 andhi r7, r7, #63 @ 232 andhi r7, r7, #63 @
22215: @ no clamp @ 23315: @ no clamp @
234#endif
223 @ 235 @
224 ldrb r12, [r4], #1 @ r12 = Y' = *(Y'_p++) 236 ldrb r12, [r4], #1 @ r12 = Y' = *(Y'_p++)
225 @ 237 @
@@ -245,6 +257,11 @@ lcd_write_yuv420_lines:
245 add lr, r9, r7, asr #8 @ lr = r = (Y >> 9) + rv 257 add lr, r9, r7, asr #8 @ lr = r = (Y >> 9) + rv
246 add r7, r10, r7, asr #7 @ r7 = g = (Y >> 8) + guv 258 add r7, r10, r7, asr #7 @ r7 = g = (Y >> 8) + guv
247 @ 259 @
260#if ARM_ARCH >= 6
261 usat r1, #5, r1 @ clamp b
262 usat lr, #5, lr @ clamp r
263 usat r7, #6, r7 @ clamp g
264#else
248 orr r12, r1, lr @ check if clamping is needed... 265 orr r12, r1, lr @ check if clamping is needed...
249 orr r12, r12, r7, asr #1 @ ...at all 266 orr r12, r12, r7, asr #1 @ ...at all
250 cmp r12, #31 @ 267 cmp r12, #31 @
@@ -259,6 +276,7 @@ lcd_write_yuv420_lines:
259 mvnhi r7, r7, asr #31 @ 276 mvnhi r7, r7, asr #31 @
260 andhi r7, r7, #63 @ 277 andhi r7, r7, #63 @
26115: @ no clamp @ 27815: @ no clamp @
279#endif
262 @ 280 @
263 ldrb r12, [r4, r3] @ r12 = Y' = *(Y'_p + stride) 281 ldrb r12, [r4, r3] @ r12 = Y' = *(Y'_p + stride)
264 @ 282 @
@@ -281,6 +299,11 @@ lcd_write_yuv420_lines:
281 add lr, r9, r7, asr #8 @ lr = r = (Y >> 9) + rv 299 add lr, r9, r7, asr #8 @ lr = r = (Y >> 9) + rv
282 add r7, r10, r7, asr #7 @ r7 = g = (Y >> 8) + guv 300 add r7, r10, r7, asr #7 @ r7 = g = (Y >> 8) + guv
283 @ 301 @
302#if ARM_ARCH >= 6
303 usat r1, #5, r1 @ clamp b
304 usat lr, #5, lr @ clamp r
305 usat r7, #6, r7 @ clamp g
306#else
284 orr r12, r1, lr @ check if clamping is needed... 307 orr r12, r1, lr @ check if clamping is needed...
285 orr r12, r12, r7, asr #1 @ ...at all 308 orr r12, r12, r7, asr #1 @ ...at all
286 cmp r12, #31 @ 309 cmp r12, #31 @
@@ -295,6 +318,7 @@ lcd_write_yuv420_lines:
295 mvnhi r7, r7, asr #31 @ 318 mvnhi r7, r7, asr #31 @
296 andhi r7, r7, #63 @ 319 andhi r7, r7, #63 @
29715: @ no clamp @ 32015: @ no clamp @
321#endif
298 @ 322 @
299 orr r12, r1, lr, lsl #11 @ r12 = b | (r << 11) 323 orr r12, r1, lr, lsl #11 @ r12 = b | (r << 11)
300 orr r12, r12, r7, lsl #5 @ r12 |= (g << 5) 324 orr r12, r12, r7, lsl #5 @ r12 |= (g << 5)
@@ -425,6 +449,16 @@ lcd_write_yuv420_lines_odither:
425 add r11, r11, r12, lsl #1 @ r = r11 + delta*2 449 add r11, r11, r12, lsl #1 @ r = r11 + delta*2
426 add r7, r7, r12, lsr #1 @ g = r7 + delta/2 450 add r7, r7, r12, lsr #1 @ g = r7 + delta/2
427 @ 451 @
452#if ARM_ARCH >= 6
453 usat r11, #5, r11, asr #11 @ clamp r
454 usat r7, #6, r7, asr #9 @ clamp g
455 usat r1, #5, r1, asr #10 @ clamp b
456 @
457 ldrb r12, [r4, r3] @ r12 = Y' = *(Y'_p + stride)
458 @
459 orr r1, r1, r11, lsl #11 @ r1 = b | (r << 11)
460 orr r1, r1, r7, lsl #5 @ r1 |= (g << 5)
461#else
428 orr r12, r1, r11, asr #1 @ check if clamping is needed... 462 orr r12, r1, r11, asr #1 @ check if clamping is needed...
429 orr r12, r12, r7 @ ...at all 463 orr r12, r12, r7 @ ...at all
430 movs r12, r12, asr #15 @ 464 movs r12, r12, asr #15 @
@@ -444,6 +478,7 @@ lcd_write_yuv420_lines_odither:
444 and r7, r7, #0x7e00 @ r1 = pixel = (r & 0xf800) | 478 and r7, r7, #0x7e00 @ r1 = pixel = (r & 0xf800) |
445 orr r11, r11, r7, lsr #4 @ ((g & 0x7e00) >> 4) | 479 orr r11, r11, r7, lsr #4 @ ((g & 0x7e00) >> 4) |
446 orr r1, r11, r1, lsr #10 @ (b >> 10) 480 orr r1, r11, r1, lsr #10 @ (b >> 10)
481#endif
447 @ 482 @
448#if LCD_WIDTH >= LCD_HEIGHT 483#if LCD_WIDTH >= LCD_HEIGHT
449 strh r1, [r0] @ 484 strh r1, [r0] @
@@ -477,6 +512,16 @@ lcd_write_yuv420_lines_odither:
477 add r11, r11, r12, lsl #1 @ r = r11 + delta*2 512 add r11, r11, r12, lsl #1 @ r = r11 + delta*2
478 add r7, r7, r12, lsr #1 @ g = r7 + delta/2 513 add r7, r7, r12, lsr #1 @ g = r7 + delta/2
479 @ 514 @
515#if ARM_ARCH >= 6
516 usat r11, #5, r11, asr #11 @ clamp r
517 usat r7, #6, r7, asr #9 @ clamp g
518 usat r1, #5, r1, asr #10 @ clamp b
519 @
520 ldrb r12, [r4], #1 @ r12 = Y' = *(Y'_p++)
521 @
522 orr r1, r1, r11, lsl #11 @ r1 = b | (r << 11)
523 orr r1, r1, r7, lsl #5 @ r1 |= (g << 5)
524#else
480 orr r12, r1, r11, asr #1 @ check if clamping is needed... 525 orr r12, r1, r11, asr #1 @ check if clamping is needed...
481 orr r12, r12, r7 @ ...at all 526 orr r12, r12, r7 @ ...at all
482 movs r12, r12, asr #15 @ 527 movs r12, r12, asr #15 @
@@ -496,6 +541,7 @@ lcd_write_yuv420_lines_odither:
496 and r7, r7, #0x7e00 @ r1 = pixel = (r & 0xf800) | 541 and r7, r7, #0x7e00 @ r1 = pixel = (r & 0xf800) |
497 orr r11, r11, r7, lsr #4 @ ((g & 0x7e00) >> 4) | 542 orr r11, r11, r7, lsr #4 @ ((g & 0x7e00) >> 4) |
498 orr r1, r11, r1, lsr #10 @ (b >> 10) 543 orr r1, r11, r1, lsr #10 @ (b >> 10)
544#endif
499 @ 545 @
500#if LCD_WIDTH >= LCD_HEIGHT 546#if LCD_WIDTH >= LCD_HEIGHT
501 add r0, r0, #2*LCD_WIDTH @ 547 add r0, r0, #2*LCD_WIDTH @
@@ -534,6 +580,16 @@ lcd_write_yuv420_lines_odither:
534 add r11, r11, r12, lsl #1 @ r = r11 + delta*2 580 add r11, r11, r12, lsl #1 @ r = r11 + delta*2
535 add r7, r7, r12, lsr #1 @ g = r7 + delta/2 581 add r7, r7, r12, lsr #1 @ g = r7 + delta/2
536 @ 582 @
583#if ARM_ARCH >= 6
584 usat r11, #5, r11, asr #11 @ clamp r
585 usat r7, #6, r7, asr #9 @ clamp g
586 usat r1, #5, r1, asr #10 @ clamp b
587 @
588 ldrb r12, [r4, r3] @ r12 = Y' = *(Y'_p + stride)
589 @
590 orr r1, r1, r11, lsl #11 @ r1 = b | (r << 11)
591 orr r1, r1, r7, lsl #5 @ r1 |= (g << 5)
592#else
537 orr r12, r1, r11, asr #1 @ check if clamping is needed... 593 orr r12, r1, r11, asr #1 @ check if clamping is needed...
538 orr r12, r12, r7 @ ...at all 594 orr r12, r12, r7 @ ...at all
539 movs r12, r12, asr #15 @ 595 movs r12, r12, asr #15 @
@@ -547,12 +603,13 @@ lcd_write_yuv420_lines_odither:
547 mvnne r7, r12, lsr #15 @ 603 mvnne r7, r12, lsr #15 @
54815: @ no clamp @ 60415: @ no clamp @
549 @ 605 @
550 ldrb r12, [r4, r3] @ r12 = Y' = *(Y'_p + stride) 606 ldrb r12, [r4, r3] @ r12 = Y' = *(Y'_p + stride)
551 @ 607 @
552 and r11, r11, #0xf800 @ pack pixel 608 and r11, r11, #0xf800 @ pack pixel
553 and r7, r7, #0x7e00 @ r1 = pixel = (r & 0xf800) | 609 and r7, r7, #0x7e00 @ r1 = pixel = (r & 0xf800) |
554 orr r11, r11, r7, lsr #4 @ ((g & 0x7e00) >> 4) | 610 orr r11, r11, r7, lsr #4 @ ((g & 0x7e00) >> 4) |
555 orr r1, r11, r1, lsr #10 @ (b >> 10) 611 orr r1, r11, r1, lsr #10 @ (b >> 10)
612#endif
556 @ 613 @
557#if LCD_WIDTH >= LCD_HEIGHT 614#if LCD_WIDTH >= LCD_HEIGHT
558 strh r1, [r0, #2] 615 strh r1, [r0, #2]
@@ -586,6 +643,14 @@ lcd_write_yuv420_lines_odither:
586 add r11, r11, r14, lsl #1 @ r = r11 + delta*2 643 add r11, r11, r14, lsl #1 @ r = r11 + delta*2
587 add r7, r7, r14, lsr #1 @ g = r7 + delta/2 644 add r7, r7, r14, lsr #1 @ g = r7 + delta/2
588 @ 645 @
646#if ARM_ARCH >= 6
647 usat r11, #5, r11, asr #11 @ clamp r
648 usat r7, #6, r7, asr #9 @ clamp g
649 usat r1, #5, r1, asr #10 @ clamp b
650 @
651 orr r1, r1, r11, lsl #11 @ r1 = b | (r << 11)
652 orr r1, r1, r7, lsl #5 @ r1 |= (g << 5)
653#else
589 orr r12, r1, r11, asr #1 @ check if clamping is needed... 654 orr r12, r1, r11, asr #1 @ check if clamping is needed...
590 orr r12, r12, r7 @ ...at all 655 orr r12, r12, r7 @ ...at all
591 movs r12, r12, asr #15 @ 656 movs r12, r12, asr #15 @
@@ -603,6 +668,7 @@ lcd_write_yuv420_lines_odither:
603 and r7, r7, #0x7e00 @ r1 = pixel = (r & 0xf800) | 668 and r7, r7, #0x7e00 @ r1 = pixel = (r & 0xf800) |
604 orr r11, r11, r7, lsr #4 @ ((g & 0x7e00) >> 4) | 669 orr r11, r11, r7, lsr #4 @ ((g & 0x7e00) >> 4) |
605 orr r1, r11, r1, lsr #10 @ (b >> 10) 670 orr r1, r11, r1, lsr #10 @ (b >> 10)
671#endif
606 @ 672 @
607#if LCD_WIDTH >= LCD_HEIGHT 673#if LCD_WIDTH >= LCD_HEIGHT
608 add r0, r0, #2*LCD_WIDTH 674 add r0, r0, #2*LCD_WIDTH