| @@ -1771,6 +1771,54 @@ ST_FUNC void ggoto(void) · 1770 unmodified lines |
| 1771 | 1771 | --vtop; |
| 1772 | 1772 | } |
| 1773 | 1773 | |
| 1774 | +ST_FUNC void gen_clear_cache(void) |
| 1775 | +{ |
| 1776 | + uint32_t beg, end, dsz, isz, p, lab1, b1; |
| 1777 | + gv2(RC_INT, RC_INT); |
| 1778 | + vpushi(0); |
| 1779 | + vtop->r = get_reg(RC_INT); |
| 1780 | + vpushi(0); |
| 1781 | + vtop->r = get_reg(RC_INT); |
| 1782 | + vpushi(0); |
| 1783 | + vtop->r = get_reg(RC_INT); |
| 1784 | + beg = intr(vtop[-4].r); // x0 |
| 1785 | + end = intr(vtop[-3].r); // x1 |
| 1786 | + dsz = intr(vtop[-2].r); // x2 |
| 1787 | + isz = intr(vtop[-1].r); // x3 |
| 1788 | + p = intr(vtop[0].r); // x4 |
| 1789 | + vtop -= 5; |
| 1790 | + |
| 1791 | + o(0xd53b0020 | isz); // mrs x(isz),ctr_el0 |
| 1792 | + o(0x52800080 | p); // mov w(p),#4 |
| 1793 | + o(0x53104c00 | dsz | isz << 5); // ubfx w(dsz),w(isz),#16,#4 |
| 1794 | + o(0x1ac02000 | dsz | p << 5 | dsz << 16); // lsl w(dsz),w(p),w(dsz) |
| 1795 | + o(0x12000c00 | isz | isz << 5); // and w(isz),w(isz),#15 |
| 1796 | + o(0x1ac02000 | isz | p << 5 | isz << 16); // lsl w(isz),w(p),w(isz) |
| 1797 | + o(0x51000400 | p | dsz << 5); // sub w(p),w(dsz),#1 |
| 1798 | + o(0x8a240004 | p | beg << 5 | p << 16); // bic x(p),x(beg),x(p) |
| 1799 | + b1 = ind; o(0x14000000); // b |
| 1800 | + lab1 = ind; |
| 1801 | + o(0xd50b7b20 | p); // dc cvau,x(p) |
| 1802 | + o(0x8b000000 | p | p << 5 | dsz << 16); // add x(p),x(p),x(dsz) |
| 1803 | + *(uint32_t *)(cur_text_section->data + b1) = |
| 1804 | + (0x14000000 | (ind - b1) >> 2); |
| 1805 | + o(0xeb00001f | p << 5 | end << 16); // cmp x(p),x(end) |
| 1806 | + o(0x54ffffa3 | ((lab1 - ind) << 3 & 0xffffe0)); // b.cc lab1 |
| 1807 | + o(0xd5033b9f); // dsb ish |
| 1808 | + o(0x51000400 | p | isz << 5); // sub w(p),w(isz),#1 |
| 1809 | + o(0x8a240004 | p | beg << 5 | p << 16); // bic x(p),x(beg),x(p) |
| 1810 | + b1 = ind; o(0x14000000); // b |
| 1811 | + lab1 = ind; |
| 1812 | + o(0xd50b7520 | p); // ic ivau,x(p) |
| 1813 | + o(0x8b000000 | p | p << 5 | isz << 16); // add x(p),x(p),x(isz) |
| 1814 | + *(uint32_t *)(cur_text_section->data + b1) = |
| 1815 | + (0x14000000 | (ind - b1) >> 2); |
| 1816 | + o(0xeb00001f | p << 5 | end << 16); // cmp x(p),x(end) |
| 1817 | + o(0x54ffffa3 | ((lab1 - ind) << 3 & 0xffffe0)); // b.cc lab1 |
| 1818 | + o(0xd5033b9f); // dsb ish |
| 1819 | + o(0xd5033fdf); // isb |
| 1820 | +} |
| 1821 | + |
| 1774 | 1822 | ST_FUNC void gen_vla_sp_save(int addr) { |
| 1775 | 1823 | tcc_error("variable length arrays unsupported for this target"); |
| 1776 | 1824 | } |