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