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