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