Revision d68a6f3a target-arm/neon_helper.c

b/target-arm/neon_helper.c
1787 1787
    env->vfp.regs[rm] = make_float64(m0);
1788 1788
    env->vfp.regs[rd] = make_float64(d0);
1789 1789
}
1790

  
1791
void HELPER(neon_qzip8)(CPUState *env, uint32_t rd, uint32_t rm)
1792
{
1793
    uint64_t zm0 = float64_val(env->vfp.regs[rm]);
1794
    uint64_t zm1 = float64_val(env->vfp.regs[rm + 1]);
1795
    uint64_t zd0 = float64_val(env->vfp.regs[rd]);
1796
    uint64_t zd1 = float64_val(env->vfp.regs[rd + 1]);
1797
    uint64_t d0 = ELEM(zd0, 0, 8) | (ELEM(zm0, 0, 8) << 8)
1798
        | (ELEM(zd0, 1, 8) << 16) | (ELEM(zm0, 1, 8) << 24)
1799
        | (ELEM(zd0, 2, 8) << 32) | (ELEM(zm0, 2, 8) << 40)
1800
        | (ELEM(zd0, 3, 8) << 48) | (ELEM(zm0, 3, 8) << 56);
1801
    uint64_t d1 = ELEM(zd0, 4, 8) | (ELEM(zm0, 4, 8) << 8)
1802
        | (ELEM(zd0, 5, 8) << 16) | (ELEM(zm0, 5, 8) << 24)
1803
        | (ELEM(zd0, 6, 8) << 32) | (ELEM(zm0, 6, 8) << 40)
1804
        | (ELEM(zd0, 7, 8) << 48) | (ELEM(zm0, 7, 8) << 56);
1805
    uint64_t m0 = ELEM(zd1, 0, 8) | (ELEM(zm1, 0, 8) << 8)
1806
        | (ELEM(zd1, 1, 8) << 16) | (ELEM(zm1, 1, 8) << 24)
1807
        | (ELEM(zd1, 2, 8) << 32) | (ELEM(zm1, 2, 8) << 40)
1808
        | (ELEM(zd1, 3, 8) << 48) | (ELEM(zm1, 3, 8) << 56);
1809
    uint64_t m1 = ELEM(zd1, 4, 8) | (ELEM(zm1, 4, 8) << 8)
1810
        | (ELEM(zd1, 5, 8) << 16) | (ELEM(zm1, 5, 8) << 24)
1811
        | (ELEM(zd1, 6, 8) << 32) | (ELEM(zm1, 6, 8) << 40)
1812
        | (ELEM(zd1, 7, 8) << 48) | (ELEM(zm1, 7, 8) << 56);
1813
    env->vfp.regs[rm] = make_float64(m0);
1814
    env->vfp.regs[rm + 1] = make_float64(m1);
1815
    env->vfp.regs[rd] = make_float64(d0);
1816
    env->vfp.regs[rd + 1] = make_float64(d1);
1817
}
1818

  
1819
void HELPER(neon_qzip16)(CPUState *env, uint32_t rd, uint32_t rm)
1820
{
1821
    uint64_t zm0 = float64_val(env->vfp.regs[rm]);
1822
    uint64_t zm1 = float64_val(env->vfp.regs[rm + 1]);
1823
    uint64_t zd0 = float64_val(env->vfp.regs[rd]);
1824
    uint64_t zd1 = float64_val(env->vfp.regs[rd + 1]);
1825
    uint64_t d0 = ELEM(zd0, 0, 16) | (ELEM(zm0, 0, 16) << 16)
1826
        | (ELEM(zd0, 1, 16) << 32) | (ELEM(zm0, 1, 16) << 48);
1827
    uint64_t d1 = ELEM(zd0, 2, 16) | (ELEM(zm0, 2, 16) << 16)
1828
        | (ELEM(zd0, 3, 16) << 32) | (ELEM(zm0, 3, 16) << 48);
1829
    uint64_t m0 = ELEM(zd1, 0, 16) | (ELEM(zm1, 0, 16) << 16)
1830
        | (ELEM(zd1, 1, 16) << 32) | (ELEM(zm1, 1, 16) << 48);
1831
    uint64_t m1 = ELEM(zd1, 2, 16) | (ELEM(zm1, 2, 16) << 16)
1832
        | (ELEM(zd1, 3, 16) << 32) | (ELEM(zm1, 3, 16) << 48);
1833
    env->vfp.regs[rm] = make_float64(m0);
1834
    env->vfp.regs[rm + 1] = make_float64(m1);
1835
    env->vfp.regs[rd] = make_float64(d0);
1836
    env->vfp.regs[rd + 1] = make_float64(d1);
1837
}
1838

  
1839
void HELPER(neon_qzip32)(CPUState *env, uint32_t rd, uint32_t rm)
1840
{
1841
    uint64_t zm0 = float64_val(env->vfp.regs[rm]);
1842
    uint64_t zm1 = float64_val(env->vfp.regs[rm + 1]);
1843
    uint64_t zd0 = float64_val(env->vfp.regs[rd]);
1844
    uint64_t zd1 = float64_val(env->vfp.regs[rd + 1]);
1845
    uint64_t d0 = ELEM(zd0, 0, 32) | (ELEM(zm0, 0, 32) << 32);
1846
    uint64_t d1 = ELEM(zd0, 1, 32) | (ELEM(zm0, 1, 32) << 32);
1847
    uint64_t m0 = ELEM(zd1, 0, 32) | (ELEM(zm1, 0, 32) << 32);
1848
    uint64_t m1 = ELEM(zd1, 1, 32) | (ELEM(zm1, 1, 32) << 32);
1849
    env->vfp.regs[rm] = make_float64(m0);
1850
    env->vfp.regs[rm + 1] = make_float64(m1);
1851
    env->vfp.regs[rd] = make_float64(d0);
1852
    env->vfp.regs[rd + 1] = make_float64(d1);
1853
}
1854

  
1855
void HELPER(neon_zip8)(CPUState *env, uint32_t rd, uint32_t rm)
1856
{
1857
    uint64_t zm = float64_val(env->vfp.regs[rm]);
1858
    uint64_t zd = float64_val(env->vfp.regs[rd]);
1859
    uint64_t d0 = ELEM(zd, 0, 8) | (ELEM(zm, 0, 8) << 8)
1860
        | (ELEM(zd, 1, 8) << 16) | (ELEM(zm, 1, 8) << 24)
1861
        | (ELEM(zd, 2, 8) << 32) | (ELEM(zm, 2, 8) << 40)
1862
        | (ELEM(zd, 3, 8) << 48) | (ELEM(zm, 3, 8) << 56);
1863
    uint64_t m0 = ELEM(zd, 4, 8) | (ELEM(zm, 4, 8) << 8)
1864
        | (ELEM(zd, 5, 8) << 16) | (ELEM(zm, 5, 8) << 24)
1865
        | (ELEM(zd, 6, 8) << 32) | (ELEM(zm, 6, 8) << 40)
1866
        | (ELEM(zd, 7, 8) << 48) | (ELEM(zm, 7, 8) << 56);
1867
    env->vfp.regs[rm] = make_float64(m0);
1868
    env->vfp.regs[rd] = make_float64(d0);
1869
}
1870

  
1871
void HELPER(neon_zip16)(CPUState *env, uint32_t rd, uint32_t rm)
1872
{
1873
    uint64_t zm = float64_val(env->vfp.regs[rm]);
1874
    uint64_t zd = float64_val(env->vfp.regs[rd]);
1875
    uint64_t d0 = ELEM(zd, 0, 16) | (ELEM(zm, 0, 16) << 16)
1876
        | (ELEM(zd, 1, 16) << 32) | (ELEM(zm, 1, 16) << 48);
1877
    uint64_t m0 = ELEM(zd, 2, 16) | (ELEM(zm, 2, 16) << 16)
1878
        | (ELEM(zd, 3, 16) << 32) | (ELEM(zm, 3, 16) << 48);
1879
    env->vfp.regs[rm] = make_float64(m0);
1880
    env->vfp.regs[rd] = make_float64(d0);
1881
}

Also available in: Unified diff