Revision 19457615 target-arm/op_helper.c

b/target-arm/op_helper.c
495 495
    }
496 496
    return res;
497 497
}
498

  
499
/* These need to return a pair of value, so still use T0/T1.  */
500
/* Transpose.  Argument order is rather strange to avoid special casing
501
   the tranlation code.
502
   On input T0 = rm, T1 = rd.  On output T0 = rd, T1 = rm  */
503
void HELPER(neon_trn_u8)(void)
504
{
505
    uint32_t rd;
506
    uint32_t rm;
507
    rd = ((T0 & 0x00ff00ff) << 8) | (T1 & 0x00ff00ff);
508
    rm = ((T1 & 0xff00ff00) >> 8) | (T0 & 0xff00ff00);
509
    T0 = rd;
510
    T1 = rm;
511
}
512

  
513
void HELPER(neon_trn_u16)(void)
514
{
515
    uint32_t rd;
516
    uint32_t rm;
517
    rd = (T0 << 16) | (T1 & 0xffff);
518
    rm = (T1 >> 16) | (T0 & 0xffff0000);
519
    T0 = rd;
520
    T1 = rm;
521
}
522

  
523
/* Worker routines for zip and unzip.  */
524
void HELPER(neon_unzip_u8)(void)
525
{
526
    uint32_t rd;
527
    uint32_t rm;
528
    rd = (T0 & 0xff) | ((T0 >> 8) & 0xff00)
529
         | ((T1 << 16) & 0xff0000) | ((T1 << 8) & 0xff000000);
530
    rm = ((T0 >> 8) & 0xff) | ((T0 >> 16) & 0xff00)
531
         | ((T1 << 8) & 0xff0000) | (T1 & 0xff000000);
532
    T0 = rd;
533
    T1 = rm;
534
}
535

  
536
void HELPER(neon_zip_u8)(void)
537
{
538
    uint32_t rd;
539
    uint32_t rm;
540
    rd = (T0 & 0xff) | ((T1 << 8) & 0xff00)
541
         | ((T0 << 16) & 0xff0000) | ((T1 << 24) & 0xff000000);
542
    rm = ((T0 >> 16) & 0xff) | ((T1 >> 8) & 0xff00)
543
         | ((T0 >> 8) & 0xff0000) | (T1 & 0xff000000);
544
    T0 = rd;
545
    T1 = rm;
546
}
547

  
548
void HELPER(neon_zip_u16)(void)
549
{
550
    uint32_t tmp;
551

  
552
    tmp = (T0 & 0xffff) | (T1 << 16);
553
    T1 = (T1 & 0xffff0000) | (T0 >> 16);
554
    T0 = tmp;
555
}

Also available in: Unified diff