Revision fe2ff6d2 libavcodec/arm/dsputil_neon.S

View differences:

libavcodec/arm/dsputil_neon.S
400 400
        bx              lr
401 401
endfunc
402 402

  
403
function ff_float_to_int16_neon, export=1
404
        subs            r2,  r2,  #8
405
        vld1.64         {d0-d1},  [r1,:128]!
406
        vcvt.s32.f32    q8,  q0,  #16
407
        vld1.64         {d2-d3},  [r1,:128]!
408
        vcvt.s32.f32    q9,  q1,  #16
409
        beq             3f
410
        bics            ip,  r2,  #15
411
        beq             2f
412
1:      subs            ip,  ip,  #16
413
        vshrn.s32       d4,  q8,  #16
414
        vld1.64         {d0-d1},  [r1,:128]!
415
        vcvt.s32.f32    q0,  q0,  #16
416
        vshrn.s32       d5,  q9,  #16
417
        vld1.64         {d2-d3},  [r1,:128]!
418
        vcvt.s32.f32    q1,  q1,  #16
419
        vshrn.s32       d6,  q0,  #16
420
        vst1.64         {d4-d5},  [r0,:128]!
421
        vshrn.s32       d7,  q1,  #16
422
        vld1.64         {d16-d17},[r1,:128]!
423
        vcvt.s32.f32    q8,  q8,  #16
424
        vld1.64         {d18-d19},[r1,:128]!
425
        vcvt.s32.f32    q9,  q9,  #16
426
        vst1.64         {d6-d7},  [r0,:128]!
427
        bne             1b
428
        ands            r2,  r2,  #15
429
        beq             3f
430
2:      vld1.64         {d0-d1},  [r1,:128]!
431
        vshrn.s32       d4,  q8,  #16
432
        vcvt.s32.f32    q0,  q0,  #16
433
        vld1.64         {d2-d3},  [r1,:128]!
434
        vshrn.s32       d5,  q9,  #16
435
        vcvt.s32.f32    q1,  q1,  #16
436
        vshrn.s32       d6,  q0,  #16
437
        vst1.64         {d4-d5},  [r0,:128]!
438
        vshrn.s32       d7,  q1,  #16
439
        vst1.64         {d6-d7},  [r0,:128]!
440
        bx              lr
441
3:      vshrn.s32       d4,  q8,  #16
442
        vshrn.s32       d5,  q9,  #16
443
        vst1.64         {d4-d5},  [r0,:128]!
444
        bx              lr
445
endfunc
446

  
447
function ff_float_to_int16_interleave_neon, export=1
448
        cmp             r3, #2
449
        ldrlt           r1, [r1]
450
        blt             ff_float_to_int16_neon
451
        bne             4f
452

  
453
        ldr             r3, [r1]
454
        ldr             r1, [r1, #4]
455

  
456
        subs            r2,  r2,  #8
457
        vld1.64         {d0-d1},  [r3,:128]!
458
        vcvt.s32.f32    q8,  q0,  #16
459
        vld1.64         {d2-d3},  [r3,:128]!
460
        vcvt.s32.f32    q9,  q1,  #16
461
        vld1.64         {d20-d21},[r1,:128]!
462
        vcvt.s32.f32    q10, q10, #16
463
        vld1.64         {d22-d23},[r1,:128]!
464
        vcvt.s32.f32    q11, q11, #16
465
        beq             3f
466
        bics            ip,  r2,  #15
467
        beq             2f
468
1:      subs            ip,  ip,  #16
469
        vld1.64         {d0-d1},  [r3,:128]!
470
        vcvt.s32.f32    q0,  q0,  #16
471
        vsri.32         q10, q8,  #16
472
        vld1.64         {d2-d3},  [r3,:128]!
473
        vcvt.s32.f32    q1,  q1,  #16
474
        vld1.64         {d24-d25},[r1,:128]!
475
        vcvt.s32.f32    q12, q12, #16
476
        vld1.64         {d26-d27},[r1,:128]!
477
        vsri.32         q11, q9,  #16
478
        vst1.64         {d20-d21},[r0,:128]!
479
        vcvt.s32.f32    q13, q13, #16
480
        vst1.64         {d22-d23},[r0,:128]!
481
        vsri.32         q12, q0,  #16
482
        vld1.64         {d16-d17},[r3,:128]!
483
        vsri.32         q13, q1,  #16
484
        vst1.64         {d24-d25},[r0,:128]!
485
        vcvt.s32.f32    q8,  q8,  #16
486
        vld1.64         {d18-d19},[r3,:128]!
487
        vcvt.s32.f32    q9,  q9,  #16
488
        vld1.64         {d20-d21},[r1,:128]!
489
        vcvt.s32.f32    q10, q10, #16
490
        vld1.64         {d22-d23},[r1,:128]!
491
        vcvt.s32.f32    q11, q11, #16
492
        vst1.64         {d26-d27},[r0,:128]!
493
        bne             1b
494
        ands            r2,  r2,  #15
495
        beq             3f
496
2:      vsri.32         q10, q8,  #16
497
        vld1.64         {d0-d1},  [r3,:128]!
498
        vcvt.s32.f32    q0,  q0,  #16
499
        vld1.64         {d2-d3},  [r3,:128]!
500
        vcvt.s32.f32    q1,  q1,  #16
501
        vld1.64         {d24-d25},[r1,:128]!
502
        vcvt.s32.f32    q12, q12, #16
503
        vsri.32         q11, q9,  #16
504
        vld1.64         {d26-d27},[r1,:128]!
505
        vcvt.s32.f32    q13, q13, #16
506
        vst1.64         {d20-d21},[r0,:128]!
507
        vsri.32         q12, q0,  #16
508
        vst1.64         {d22-d23},[r0,:128]!
509
        vsri.32         q13, q1,  #16
510
        vst1.64         {d24-d27},[r0,:128]!
511
        bx              lr
512
3:      vsri.32         q10, q8,  #16
513
        vsri.32         q11, q9,  #16
514
        vst1.64         {d20-d23},[r0,:128]!
515
        bx              lr
516

  
517
4:      push            {r4-r8,lr}
518
        cmp             r3,  #4
519
        lsl             ip,  r3,  #1
520
        blt             4f
521

  
522
        @ 4 channels
523
5:      ldmia           r1!, {r4-r7}
524
        mov             lr,  r2
525
        mov             r8,  r0
526
        vld1.64         {d16-d17},[r4,:128]!
527
        vcvt.s32.f32    q8,  q8,  #16
528
        vld1.64         {d18-d19},[r5,:128]!
529
        vcvt.s32.f32    q9,  q9,  #16
530
        vld1.64         {d20-d21},[r6,:128]!
531
        vcvt.s32.f32    q10, q10, #16
532
        vld1.64         {d22-d23},[r7,:128]!
533
        vcvt.s32.f32    q11, q11, #16
534
6:      subs            lr,  lr,  #8
535
        vld1.64         {d0-d1},  [r4,:128]!
536
        vcvt.s32.f32    q0,  q0,  #16
537
        vsri.32         q9,  q8,  #16
538
        vld1.64         {d2-d3},  [r5,:128]!
539
        vcvt.s32.f32    q1,  q1,  #16
540
        vsri.32         q11, q10, #16
541
        vld1.64         {d4-d5},  [r6,:128]!
542
        vcvt.s32.f32    q2,  q2,  #16
543
        vzip.32         d18, d22
544
        vld1.64         {d6-d7},  [r7,:128]!
545
        vcvt.s32.f32    q3,  q3,  #16
546
        vzip.32         d19, d23
547
        vst1.64         {d18},    [r8], ip
548
        vsri.32         q1,  q0,  #16
549
        vst1.64         {d22},    [r8], ip
550
        vsri.32         q3,  q2,  #16
551
        vst1.64         {d19},    [r8], ip
552
        vzip.32         d2,  d6
553
        vst1.64         {d23},    [r8], ip
554
        vzip.32         d3,  d7
555
        beq             7f
556
        vld1.64         {d16-d17},[r4,:128]!
557
        vcvt.s32.f32    q8,  q8,  #16
558
        vst1.64         {d2},     [r8], ip
559
        vld1.64         {d18-d19},[r5,:128]!
560
        vcvt.s32.f32    q9,  q9,  #16
561
        vst1.64         {d6},     [r8], ip
562
        vld1.64         {d20-d21},[r6,:128]!
563
        vcvt.s32.f32    q10, q10, #16
564
        vst1.64         {d3},     [r8], ip
565
        vld1.64         {d22-d23},[r7,:128]!
566
        vcvt.s32.f32    q11, q11, #16
567
        vst1.64         {d7},     [r8], ip
568
        b               6b
569
7:      vst1.64         {d2},     [r8], ip
570
        vst1.64         {d6},     [r8], ip
571
        vst1.64         {d3},     [r8], ip
572
        vst1.64         {d7},     [r8], ip
573
        subs            r3,  r3,  #4
574
        popeq           {r4-r8,pc}
575
        cmp             r3,  #4
576
        add             r0,  r0,  #8
577
        bge             5b
578

  
579
        @ 2 channels
580
4:      cmp             r3,  #2
581
        blt             4f
582
        ldmia           r1!, {r4-r5}
583
        mov             lr,  r2
584
        mov             r8,  r0
585
        tst             lr,  #8
586
        vld1.64         {d16-d17},[r4,:128]!
587
        vcvt.s32.f32    q8,  q8,  #16
588
        vld1.64         {d18-d19},[r5,:128]!
589
        vcvt.s32.f32    q9,  q9,  #16
590
        vld1.64         {d20-d21},[r4,:128]!
591
        vcvt.s32.f32    q10, q10, #16
592
        vld1.64         {d22-d23},[r5,:128]!
593
        vcvt.s32.f32    q11, q11, #16
594
        beq             6f
595
        subs            lr,  lr,  #8
596
        beq             7f
597
        vsri.32         d18, d16, #16
598
        vsri.32         d19, d17, #16
599
        vld1.64         {d16-d17},[r4,:128]!
600
        vcvt.s32.f32    q8,  q8,  #16
601
        vst1.32         {d18[0]}, [r8], ip
602
        vsri.32         d22, d20, #16
603
        vst1.32         {d18[1]}, [r8], ip
604
        vsri.32         d23, d21, #16
605
        vst1.32         {d19[0]}, [r8], ip
606
        vst1.32         {d19[1]}, [r8], ip
607
        vld1.64         {d18-d19},[r5,:128]!
608
        vcvt.s32.f32    q9,  q9,  #16
609
        vst1.32         {d22[0]}, [r8], ip
610
        vst1.32         {d22[1]}, [r8], ip
611
        vld1.64         {d20-d21},[r4,:128]!
612
        vcvt.s32.f32    q10, q10, #16
613
        vst1.32         {d23[0]}, [r8], ip
614
        vst1.32         {d23[1]}, [r8], ip
615
        vld1.64         {d22-d23},[r5,:128]!
616
        vcvt.s32.f32    q11, q11, #16
617
6:      subs            lr,  lr,  #16
618
        vld1.64         {d0-d1},  [r4,:128]!
619
        vcvt.s32.f32    q0,  q0,  #16
620
        vsri.32         d18, d16, #16
621
        vld1.64         {d2-d3},  [r5,:128]!
622
        vcvt.s32.f32    q1,  q1,  #16
623
        vsri.32         d19, d17, #16
624
        vld1.64         {d4-d5},  [r4,:128]!
625
        vcvt.s32.f32    q2,  q2,  #16
626
        vld1.64         {d6-d7},  [r5,:128]!
627
        vcvt.s32.f32    q3,  q3,  #16
628
        vst1.32         {d18[0]}, [r8], ip
629
        vsri.32         d22, d20, #16
630
        vst1.32         {d18[1]}, [r8], ip
631
        vsri.32         d23, d21, #16
632
        vst1.32         {d19[0]}, [r8], ip
633
        vsri.32         d2,  d0,  #16
634
        vst1.32         {d19[1]}, [r8], ip
635
        vsri.32         d3,  d1,  #16
636
        vst1.32         {d22[0]}, [r8], ip
637
        vsri.32         d6,  d4,  #16
638
        vst1.32         {d22[1]}, [r8], ip
639
        vsri.32         d7,  d5,  #16
640
        vst1.32         {d23[0]}, [r8], ip
641
        vst1.32         {d23[1]}, [r8], ip
642
        beq             6f
643
        vld1.64         {d16-d17},[r4,:128]!
644
        vcvt.s32.f32    q8,  q8,  #16
645
        vst1.32         {d2[0]},  [r8], ip
646
        vst1.32         {d2[1]},  [r8], ip
647
        vld1.64         {d18-d19},[r5,:128]!
648
        vcvt.s32.f32    q9,  q9,  #16
649
        vst1.32         {d3[0]},  [r8], ip
650
        vst1.32         {d3[1]},  [r8], ip
651
        vld1.64         {d20-d21},[r4,:128]!
652
        vcvt.s32.f32    q10, q10, #16
653
        vst1.32         {d6[0]},  [r8], ip
654
        vst1.32         {d6[1]},  [r8], ip
655
        vld1.64         {d22-d23},[r5,:128]!
656
        vcvt.s32.f32    q11, q11, #16
657
        vst1.32         {d7[0]},  [r8], ip
658
        vst1.32         {d7[1]},  [r8], ip
659
        bgt             6b
660
6:      vst1.32         {d2[0]},  [r8], ip
661
        vst1.32         {d2[1]},  [r8], ip
662
        vst1.32         {d3[0]},  [r8], ip
663
        vst1.32         {d3[1]},  [r8], ip
664
        vst1.32         {d6[0]},  [r8], ip
665
        vst1.32         {d6[1]},  [r8], ip
666
        vst1.32         {d7[0]},  [r8], ip
667
        vst1.32         {d7[1]},  [r8], ip
668
        b               8f
669
7:      vsri.32         d18, d16, #16
670
        vsri.32         d19, d17, #16
671
        vst1.32         {d18[0]}, [r8], ip
672
        vsri.32         d22, d20, #16
673
        vst1.32         {d18[1]}, [r8], ip
674
        vsri.32         d23, d21, #16
675
        vst1.32         {d19[0]}, [r8], ip
676
        vst1.32         {d19[1]}, [r8], ip
677
        vst1.32         {d22[0]}, [r8], ip
678
        vst1.32         {d22[1]}, [r8], ip
679
        vst1.32         {d23[0]}, [r8], ip
680
        vst1.32         {d23[1]}, [r8], ip
681
8:      subs            r3,  r3,  #2
682
        add             r0,  r0,  #4
683
        popeq           {r4-r8,pc}
684

  
685
        @ 1 channel
686
4:      ldr             r4,  [r1],#4
687
        tst             r2,  #8
688
        mov             lr,  r2
689
        mov             r5,  r0
690
        vld1.64         {d0-d1},  [r4,:128]!
691
        vcvt.s32.f32    q0,  q0,  #16
692
        vld1.64         {d2-d3},  [r4,:128]!
693
        vcvt.s32.f32    q1,  q1,  #16
694
        bne             8f
695
6:      subs            lr,  lr,  #16
696
        vld1.64         {d4-d5},  [r4,:128]!
697
        vcvt.s32.f32    q2,  q2,  #16
698
        vld1.64         {d6-d7},  [r4,:128]!
699
        vcvt.s32.f32    q3,  q3,  #16
700
        vst1.16         {d0[1]},  [r5,:16], ip
701
        vst1.16         {d0[3]},  [r5,:16], ip
702
        vst1.16         {d1[1]},  [r5,:16], ip
703
        vst1.16         {d1[3]},  [r5,:16], ip
704
        vst1.16         {d2[1]},  [r5,:16], ip
705
        vst1.16         {d2[3]},  [r5,:16], ip
706
        vst1.16         {d3[1]},  [r5,:16], ip
707
        vst1.16         {d3[3]},  [r5,:16], ip
708
        beq             7f
709
        vld1.64         {d0-d1},  [r4,:128]!
710
        vcvt.s32.f32    q0,  q0,  #16
711
        vld1.64         {d2-d3},  [r4,:128]!
712
        vcvt.s32.f32    q1,  q1,  #16
713
7:      vst1.16         {d4[1]},  [r5,:16], ip
714
        vst1.16         {d4[3]},  [r5,:16], ip
715
        vst1.16         {d5[1]},  [r5,:16], ip
716
        vst1.16         {d5[3]},  [r5,:16], ip
717
        vst1.16         {d6[1]},  [r5,:16], ip
718
        vst1.16         {d6[3]},  [r5,:16], ip
719
        vst1.16         {d7[1]},  [r5,:16], ip
720
        vst1.16         {d7[3]},  [r5,:16], ip
721
        bgt             6b
722
        pop             {r4-r8,pc}
723
8:      subs            lr,  lr,  #8
724
        vst1.16         {d0[1]},  [r5,:16], ip
725
        vst1.16         {d0[3]},  [r5,:16], ip
726
        vst1.16         {d1[1]},  [r5,:16], ip
727
        vst1.16         {d1[3]},  [r5,:16], ip
728
        vst1.16         {d2[1]},  [r5,:16], ip
729
        vst1.16         {d2[3]},  [r5,:16], ip
730
        vst1.16         {d3[1]},  [r5,:16], ip
731
        vst1.16         {d3[3]},  [r5,:16], ip
732
        popeq           {r4-r8,pc}
733
        vld1.64         {d0-d1},  [r4,:128]!
734
        vcvt.s32.f32    q0,  q0,  #16
735
        vld1.64         {d2-d3},  [r4,:128]!
736
        vcvt.s32.f32    q1,  q1,  #16
737
        b               6b
738
endfunc
739

  
740 403
function ff_vector_fmul_neon, export=1
741 404
        subs            r3,  r3,  #8
742 405
        vld1.64         {d0-d3},  [r1,:128]!
......
1050 713
        bx              lr
1051 714
endfunc
1052 715

  
1053
function ff_int32_to_float_fmul_scalar_neon, export=1
1054
VFP     vdup.32         q0,  d0[0]
1055
VFP     len     .req    r2
1056
NOVFP   vdup.32         q0,  r2
1057
NOVFP   len     .req    r3
1058

  
1059
        vld1.32         {q1},[r1,:128]!
1060
        vcvt.f32.s32    q3,  q1
1061
        vld1.32         {q2},[r1,:128]!
1062
        vcvt.f32.s32    q8,  q2
1063
1:      subs            len, len, #8
1064
        pld             [r1, #16]
1065
        vmul.f32        q9,  q3,  q0
1066
        vmul.f32        q10, q8,  q0
1067
        beq             2f
1068
        vld1.32         {q1},[r1,:128]!
1069
        vcvt.f32.s32    q3,  q1
1070
        vld1.32         {q2},[r1,:128]!
1071
        vcvt.f32.s32    q8,  q2
1072
        vst1.32         {q9}, [r0,:128]!
1073
        vst1.32         {q10},[r0,:128]!
1074
        b               1b
1075
2:      vst1.32         {q9}, [r0,:128]!
1076
        vst1.32         {q10},[r0,:128]!
1077
        bx              lr
1078
        .unreq  len
1079
endfunc
1080

  
1081 716
function ff_vector_fmul_reverse_neon, export=1
1082 717
        add             r2,  r2,  r3,  lsl #2
1083 718
        sub             r2,  r2,  #32

Also available in: Unified diff