Revision 02acedf9 target-arm/neon_helper.c
b/target-arm/neon_helper.c | ||
---|---|---|
1693 | 1693 |
float32 f1 = float32_abs(vfp_itos(b)); |
1694 | 1694 |
return (float32_compare_quiet(f0, f1, NFS) > 0) ? ~0 : 0; |
1695 | 1695 |
} |
1696 |
|
|
1697 |
#define ELEM(V, N, SIZE) (((V) >> ((N) * (SIZE))) & ((1ull << (SIZE)) - 1)) |
|
1698 |
|
|
1699 |
void HELPER(neon_qunzip8)(CPUState *env, uint32_t rd, uint32_t rm) |
|
1700 |
{ |
|
1701 |
uint64_t zm0 = float64_val(env->vfp.regs[rm]); |
|
1702 |
uint64_t zm1 = float64_val(env->vfp.regs[rm + 1]); |
|
1703 |
uint64_t zd0 = float64_val(env->vfp.regs[rd]); |
|
1704 |
uint64_t zd1 = float64_val(env->vfp.regs[rd + 1]); |
|
1705 |
uint64_t d0 = ELEM(zd0, 0, 8) | (ELEM(zd0, 2, 8) << 8) |
|
1706 |
| (ELEM(zd0, 4, 8) << 16) | (ELEM(zd0, 6, 8) << 24) |
|
1707 |
| (ELEM(zd1, 0, 8) << 32) | (ELEM(zd1, 2, 8) << 40) |
|
1708 |
| (ELEM(zd1, 4, 8) << 48) | (ELEM(zd1, 6, 8) << 56); |
|
1709 |
uint64_t d1 = ELEM(zm0, 0, 8) | (ELEM(zm0, 2, 8) << 8) |
|
1710 |
| (ELEM(zm0, 4, 8) << 16) | (ELEM(zm0, 6, 8) << 24) |
|
1711 |
| (ELEM(zm1, 0, 8) << 32) | (ELEM(zm1, 2, 8) << 40) |
|
1712 |
| (ELEM(zm1, 4, 8) << 48) | (ELEM(zm1, 6, 8) << 56); |
|
1713 |
uint64_t m0 = ELEM(zd0, 1, 8) | (ELEM(zd0, 3, 8) << 8) |
|
1714 |
| (ELEM(zd0, 5, 8) << 16) | (ELEM(zd0, 7, 8) << 24) |
|
1715 |
| (ELEM(zd1, 1, 8) << 32) | (ELEM(zd1, 3, 8) << 40) |
|
1716 |
| (ELEM(zd1, 5, 8) << 48) | (ELEM(zd1, 7, 8) << 56); |
|
1717 |
uint64_t m1 = ELEM(zm0, 1, 8) | (ELEM(zm0, 3, 8) << 8) |
|
1718 |
| (ELEM(zm0, 5, 8) << 16) | (ELEM(zm0, 7, 8) << 24) |
|
1719 |
| (ELEM(zm1, 1, 8) << 32) | (ELEM(zm1, 3, 8) << 40) |
|
1720 |
| (ELEM(zm1, 5, 8) << 48) | (ELEM(zm1, 7, 8) << 56); |
|
1721 |
env->vfp.regs[rm] = make_float64(m0); |
|
1722 |
env->vfp.regs[rm + 1] = make_float64(m1); |
|
1723 |
env->vfp.regs[rd] = make_float64(d0); |
|
1724 |
env->vfp.regs[rd + 1] = make_float64(d1); |
|
1725 |
} |
|
1726 |
|
|
1727 |
void HELPER(neon_qunzip16)(CPUState *env, uint32_t rd, uint32_t rm) |
|
1728 |
{ |
|
1729 |
uint64_t zm0 = float64_val(env->vfp.regs[rm]); |
|
1730 |
uint64_t zm1 = float64_val(env->vfp.regs[rm + 1]); |
|
1731 |
uint64_t zd0 = float64_val(env->vfp.regs[rd]); |
|
1732 |
uint64_t zd1 = float64_val(env->vfp.regs[rd + 1]); |
|
1733 |
uint64_t d0 = ELEM(zd0, 0, 16) | (ELEM(zd0, 2, 16) << 16) |
|
1734 |
| (ELEM(zd1, 0, 16) << 32) | (ELEM(zd1, 2, 16) << 48); |
|
1735 |
uint64_t d1 = ELEM(zm0, 0, 16) | (ELEM(zm0, 2, 16) << 16) |
|
1736 |
| (ELEM(zm1, 0, 16) << 32) | (ELEM(zm1, 2, 16) << 48); |
|
1737 |
uint64_t m0 = ELEM(zd0, 1, 16) | (ELEM(zd0, 3, 16) << 16) |
|
1738 |
| (ELEM(zd1, 1, 16) << 32) | (ELEM(zd1, 3, 16) << 48); |
|
1739 |
uint64_t m1 = ELEM(zm0, 1, 16) | (ELEM(zm0, 3, 16) << 16) |
|
1740 |
| (ELEM(zm1, 1, 16) << 32) | (ELEM(zm1, 3, 16) << 48); |
|
1741 |
env->vfp.regs[rm] = make_float64(m0); |
|
1742 |
env->vfp.regs[rm + 1] = make_float64(m1); |
|
1743 |
env->vfp.regs[rd] = make_float64(d0); |
|
1744 |
env->vfp.regs[rd + 1] = make_float64(d1); |
|
1745 |
} |
|
1746 |
|
|
1747 |
void HELPER(neon_qunzip32)(CPUState *env, uint32_t rd, uint32_t rm) |
|
1748 |
{ |
|
1749 |
uint64_t zm0 = float64_val(env->vfp.regs[rm]); |
|
1750 |
uint64_t zm1 = float64_val(env->vfp.regs[rm + 1]); |
|
1751 |
uint64_t zd0 = float64_val(env->vfp.regs[rd]); |
|
1752 |
uint64_t zd1 = float64_val(env->vfp.regs[rd + 1]); |
|
1753 |
uint64_t d0 = ELEM(zd0, 0, 32) | (ELEM(zd1, 0, 32) << 32); |
|
1754 |
uint64_t d1 = ELEM(zm0, 0, 32) | (ELEM(zm1, 0, 32) << 32); |
|
1755 |
uint64_t m0 = ELEM(zd0, 1, 32) | (ELEM(zd1, 1, 32) << 32); |
|
1756 |
uint64_t m1 = ELEM(zm0, 1, 32) | (ELEM(zm1, 1, 32) << 32); |
|
1757 |
env->vfp.regs[rm] = make_float64(m0); |
|
1758 |
env->vfp.regs[rm + 1] = make_float64(m1); |
|
1759 |
env->vfp.regs[rd] = make_float64(d0); |
|
1760 |
env->vfp.regs[rd + 1] = make_float64(d1); |
|
1761 |
} |
|
1762 |
|
|
1763 |
void HELPER(neon_unzip8)(CPUState *env, uint32_t rd, uint32_t rm) |
|
1764 |
{ |
|
1765 |
uint64_t zm = float64_val(env->vfp.regs[rm]); |
|
1766 |
uint64_t zd = float64_val(env->vfp.regs[rd]); |
|
1767 |
uint64_t d0 = ELEM(zd, 0, 8) | (ELEM(zd, 2, 8) << 8) |
|
1768 |
| (ELEM(zd, 4, 8) << 16) | (ELEM(zd, 6, 8) << 24) |
|
1769 |
| (ELEM(zm, 0, 8) << 32) | (ELEM(zm, 2, 8) << 40) |
|
1770 |
| (ELEM(zm, 4, 8) << 48) | (ELEM(zm, 6, 8) << 56); |
|
1771 |
uint64_t m0 = ELEM(zd, 1, 8) | (ELEM(zd, 3, 8) << 8) |
|
1772 |
| (ELEM(zd, 5, 8) << 16) | (ELEM(zd, 7, 8) << 24) |
|
1773 |
| (ELEM(zm, 1, 8) << 32) | (ELEM(zm, 3, 8) << 40) |
|
1774 |
| (ELEM(zm, 5, 8) << 48) | (ELEM(zm, 7, 8) << 56); |
|
1775 |
env->vfp.regs[rm] = make_float64(m0); |
|
1776 |
env->vfp.regs[rd] = make_float64(d0); |
|
1777 |
} |
|
1778 |
|
|
1779 |
void HELPER(neon_unzip16)(CPUState *env, uint32_t rd, uint32_t rm) |
|
1780 |
{ |
|
1781 |
uint64_t zm = float64_val(env->vfp.regs[rm]); |
|
1782 |
uint64_t zd = float64_val(env->vfp.regs[rd]); |
|
1783 |
uint64_t d0 = ELEM(zd, 0, 16) | (ELEM(zd, 2, 16) << 16) |
|
1784 |
| (ELEM(zm, 0, 16) << 32) | (ELEM(zm, 2, 16) << 48); |
|
1785 |
uint64_t m0 = ELEM(zd, 1, 16) | (ELEM(zd, 3, 16) << 16) |
|
1786 |
| (ELEM(zm, 1, 16) << 32) | (ELEM(zm, 3, 16) << 48); |
|
1787 |
env->vfp.regs[rm] = make_float64(m0); |
|
1788 |
env->vfp.regs[rd] = make_float64(d0); |
|
1789 |
} |
Also available in: Unified diff