18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* memcpy.S: Sparc optimized memcpy and memmove code 38c2ecf20Sopenharmony_ci * Hand optimized from GNU libc's memcpy and memmove 48c2ecf20Sopenharmony_ci * Copyright (C) 1991,1996 Free Software Foundation 58c2ecf20Sopenharmony_ci * Copyright (C) 1995 Linus Torvalds (Linus.Torvalds@helsinki.fi) 68c2ecf20Sopenharmony_ci * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) 78c2ecf20Sopenharmony_ci * Copyright (C) 1996 Eddie C. Dost (ecd@skynet.be) 88c2ecf20Sopenharmony_ci * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz) 98c2ecf20Sopenharmony_ci */ 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include <asm/export.h> 128c2ecf20Sopenharmony_ci#define FUNC(x) \ 138c2ecf20Sopenharmony_ci .globl x; \ 148c2ecf20Sopenharmony_ci .type x,@function; \ 158c2ecf20Sopenharmony_ci .align 4; \ 168c2ecf20Sopenharmony_cix: 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci/* Both these macros have to start with exactly the same insn */ 198c2ecf20Sopenharmony_ci#define MOVE_BIGCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \ 208c2ecf20Sopenharmony_ci ldd [%src + (offset) + 0x00], %t0; \ 218c2ecf20Sopenharmony_ci ldd [%src + (offset) + 0x08], %t2; \ 228c2ecf20Sopenharmony_ci ldd [%src + (offset) + 0x10], %t4; \ 238c2ecf20Sopenharmony_ci ldd [%src + (offset) + 0x18], %t6; \ 248c2ecf20Sopenharmony_ci st %t0, [%dst + (offset) + 0x00]; \ 258c2ecf20Sopenharmony_ci st %t1, [%dst + (offset) + 0x04]; \ 268c2ecf20Sopenharmony_ci st %t2, [%dst + (offset) + 0x08]; \ 278c2ecf20Sopenharmony_ci st %t3, [%dst + (offset) + 0x0c]; \ 288c2ecf20Sopenharmony_ci st %t4, [%dst + (offset) + 0x10]; \ 298c2ecf20Sopenharmony_ci st %t5, [%dst + (offset) + 0x14]; \ 308c2ecf20Sopenharmony_ci st %t6, [%dst + (offset) + 0x18]; \ 318c2ecf20Sopenharmony_ci st %t7, [%dst + (offset) + 0x1c]; 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci#define MOVE_BIGALIGNCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \ 348c2ecf20Sopenharmony_ci ldd [%src + (offset) + 0x00], %t0; \ 358c2ecf20Sopenharmony_ci ldd [%src + (offset) + 0x08], %t2; \ 368c2ecf20Sopenharmony_ci ldd [%src + (offset) + 0x10], %t4; \ 378c2ecf20Sopenharmony_ci ldd [%src + (offset) + 0x18], %t6; \ 388c2ecf20Sopenharmony_ci std %t0, [%dst + (offset) + 0x00]; \ 398c2ecf20Sopenharmony_ci std %t2, [%dst + (offset) + 0x08]; \ 408c2ecf20Sopenharmony_ci std %t4, [%dst + (offset) + 0x10]; \ 418c2ecf20Sopenharmony_ci std %t6, [%dst + (offset) + 0x18]; 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci#define MOVE_LASTCHUNK(src, dst, offset, t0, t1, t2, t3) \ 448c2ecf20Sopenharmony_ci ldd [%src - (offset) - 0x10], %t0; \ 458c2ecf20Sopenharmony_ci ldd [%src - (offset) - 0x08], %t2; \ 468c2ecf20Sopenharmony_ci st %t0, [%dst - (offset) - 0x10]; \ 478c2ecf20Sopenharmony_ci st %t1, [%dst - (offset) - 0x0c]; \ 488c2ecf20Sopenharmony_ci st %t2, [%dst - (offset) - 0x08]; \ 498c2ecf20Sopenharmony_ci st %t3, [%dst - (offset) - 0x04]; 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci#define MOVE_LASTALIGNCHUNK(src, dst, offset, t0, t1, t2, t3) \ 528c2ecf20Sopenharmony_ci ldd [%src - (offset) - 0x10], %t0; \ 538c2ecf20Sopenharmony_ci ldd [%src - (offset) - 0x08], %t2; \ 548c2ecf20Sopenharmony_ci std %t0, [%dst - (offset) - 0x10]; \ 558c2ecf20Sopenharmony_ci std %t2, [%dst - (offset) - 0x08]; 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci#define MOVE_SHORTCHUNK(src, dst, offset, t0, t1) \ 588c2ecf20Sopenharmony_ci ldub [%src - (offset) - 0x02], %t0; \ 598c2ecf20Sopenharmony_ci ldub [%src - (offset) - 0x01], %t1; \ 608c2ecf20Sopenharmony_ci stb %t0, [%dst - (offset) - 0x02]; \ 618c2ecf20Sopenharmony_ci stb %t1, [%dst - (offset) - 0x01]; 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci .text 648c2ecf20Sopenharmony_ci .align 4 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ciFUNC(memmove) 678c2ecf20Sopenharmony_ciEXPORT_SYMBOL(memmove) 688c2ecf20Sopenharmony_ci cmp %o0, %o1 698c2ecf20Sopenharmony_ci mov %o0, %g7 708c2ecf20Sopenharmony_ci bleu 9f 718c2ecf20Sopenharmony_ci sub %o0, %o1, %o4 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci add %o1, %o2, %o3 748c2ecf20Sopenharmony_ci cmp %o3, %o0 758c2ecf20Sopenharmony_ci bleu 0f 768c2ecf20Sopenharmony_ci andcc %o4, 3, %o5 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci add %o1, %o2, %o1 798c2ecf20Sopenharmony_ci add %o0, %o2, %o0 808c2ecf20Sopenharmony_ci sub %o1, 1, %o1 818c2ecf20Sopenharmony_ci sub %o0, 1, %o0 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ci1: /* reverse_bytes */ 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_ci ldub [%o1], %o4 868c2ecf20Sopenharmony_ci subcc %o2, 1, %o2 878c2ecf20Sopenharmony_ci stb %o4, [%o0] 888c2ecf20Sopenharmony_ci sub %o1, 1, %o1 898c2ecf20Sopenharmony_ci bne 1b 908c2ecf20Sopenharmony_ci sub %o0, 1, %o0 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_ci retl 938c2ecf20Sopenharmony_ci mov %g7, %o0 948c2ecf20Sopenharmony_ci 958c2ecf20Sopenharmony_ci/* NOTE: This code is executed just for the cases, 968c2ecf20Sopenharmony_ci where %src (=%o1) & 3 is != 0. 978c2ecf20Sopenharmony_ci We need to align it to 4. So, for (%src & 3) 988c2ecf20Sopenharmony_ci 1 we need to do ldub,lduh 998c2ecf20Sopenharmony_ci 2 lduh 1008c2ecf20Sopenharmony_ci 3 just ldub 1018c2ecf20Sopenharmony_ci so even if it looks weird, the branches 1028c2ecf20Sopenharmony_ci are correct here. -jj 1038c2ecf20Sopenharmony_ci */ 1048c2ecf20Sopenharmony_ci78: /* dword_align */ 1058c2ecf20Sopenharmony_ci 1068c2ecf20Sopenharmony_ci andcc %o1, 1, %g0 1078c2ecf20Sopenharmony_ci be 4f 1088c2ecf20Sopenharmony_ci andcc %o1, 2, %g0 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ci ldub [%o1], %g2 1118c2ecf20Sopenharmony_ci add %o1, 1, %o1 1128c2ecf20Sopenharmony_ci stb %g2, [%o0] 1138c2ecf20Sopenharmony_ci sub %o2, 1, %o2 1148c2ecf20Sopenharmony_ci bne 3f 1158c2ecf20Sopenharmony_ci add %o0, 1, %o0 1168c2ecf20Sopenharmony_ci4: 1178c2ecf20Sopenharmony_ci lduh [%o1], %g2 1188c2ecf20Sopenharmony_ci add %o1, 2, %o1 1198c2ecf20Sopenharmony_ci sth %g2, [%o0] 1208c2ecf20Sopenharmony_ci sub %o2, 2, %o2 1218c2ecf20Sopenharmony_ci b 3f 1228c2ecf20Sopenharmony_ci add %o0, 2, %o0 1238c2ecf20Sopenharmony_ci 1248c2ecf20Sopenharmony_ciFUNC(memcpy) /* %o0=dst %o1=src %o2=len */ 1258c2ecf20Sopenharmony_ciEXPORT_SYMBOL(memcpy) 1268c2ecf20Sopenharmony_ci 1278c2ecf20Sopenharmony_ci sub %o0, %o1, %o4 1288c2ecf20Sopenharmony_ci mov %o0, %g7 1298c2ecf20Sopenharmony_ci9: 1308c2ecf20Sopenharmony_ci andcc %o4, 3, %o5 1318c2ecf20Sopenharmony_ci0: 1328c2ecf20Sopenharmony_ci bne 86f 1338c2ecf20Sopenharmony_ci cmp %o2, 15 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_ci bleu 90f 1368c2ecf20Sopenharmony_ci andcc %o1, 3, %g0 1378c2ecf20Sopenharmony_ci 1388c2ecf20Sopenharmony_ci bne 78b 1398c2ecf20Sopenharmony_ci3: 1408c2ecf20Sopenharmony_ci andcc %o1, 4, %g0 1418c2ecf20Sopenharmony_ci 1428c2ecf20Sopenharmony_ci be 2f 1438c2ecf20Sopenharmony_ci mov %o2, %g1 1448c2ecf20Sopenharmony_ci 1458c2ecf20Sopenharmony_ci ld [%o1], %o4 1468c2ecf20Sopenharmony_ci sub %g1, 4, %g1 1478c2ecf20Sopenharmony_ci st %o4, [%o0] 1488c2ecf20Sopenharmony_ci add %o1, 4, %o1 1498c2ecf20Sopenharmony_ci add %o0, 4, %o0 1508c2ecf20Sopenharmony_ci2: 1518c2ecf20Sopenharmony_ci andcc %g1, 0xffffff80, %g0 1528c2ecf20Sopenharmony_ci be 3f 1538c2ecf20Sopenharmony_ci andcc %o0, 4, %g0 1548c2ecf20Sopenharmony_ci 1558c2ecf20Sopenharmony_ci be 82f + 4 1568c2ecf20Sopenharmony_ci5: 1578c2ecf20Sopenharmony_ci MOVE_BIGCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5) 1588c2ecf20Sopenharmony_ci MOVE_BIGCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5) 1598c2ecf20Sopenharmony_ci MOVE_BIGCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5) 1608c2ecf20Sopenharmony_ci MOVE_BIGCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5) 1618c2ecf20Sopenharmony_ci sub %g1, 128, %g1 1628c2ecf20Sopenharmony_ci add %o1, 128, %o1 1638c2ecf20Sopenharmony_ci cmp %g1, 128 1648c2ecf20Sopenharmony_ci bge 5b 1658c2ecf20Sopenharmony_ci add %o0, 128, %o0 1668c2ecf20Sopenharmony_ci3: 1678c2ecf20Sopenharmony_ci andcc %g1, 0x70, %g4 1688c2ecf20Sopenharmony_ci be 80f 1698c2ecf20Sopenharmony_ci andcc %g1, 8, %g0 1708c2ecf20Sopenharmony_ci 1718c2ecf20Sopenharmony_ci sethi %hi(80f), %o5 1728c2ecf20Sopenharmony_ci srl %g4, 1, %o4 1738c2ecf20Sopenharmony_ci add %g4, %o4, %o4 1748c2ecf20Sopenharmony_ci add %o1, %g4, %o1 1758c2ecf20Sopenharmony_ci sub %o5, %o4, %o5 1768c2ecf20Sopenharmony_ci jmpl %o5 + %lo(80f), %g0 1778c2ecf20Sopenharmony_ci add %o0, %g4, %o0 1788c2ecf20Sopenharmony_ci 1798c2ecf20Sopenharmony_ci79: /* memcpy_table */ 1808c2ecf20Sopenharmony_ci 1818c2ecf20Sopenharmony_ci MOVE_LASTCHUNK(o1, o0, 0x60, g2, g3, g4, g5) 1828c2ecf20Sopenharmony_ci MOVE_LASTCHUNK(o1, o0, 0x50, g2, g3, g4, g5) 1838c2ecf20Sopenharmony_ci MOVE_LASTCHUNK(o1, o0, 0x40, g2, g3, g4, g5) 1848c2ecf20Sopenharmony_ci MOVE_LASTCHUNK(o1, o0, 0x30, g2, g3, g4, g5) 1858c2ecf20Sopenharmony_ci MOVE_LASTCHUNK(o1, o0, 0x20, g2, g3, g4, g5) 1868c2ecf20Sopenharmony_ci MOVE_LASTCHUNK(o1, o0, 0x10, g2, g3, g4, g5) 1878c2ecf20Sopenharmony_ci MOVE_LASTCHUNK(o1, o0, 0x00, g2, g3, g4, g5) 1888c2ecf20Sopenharmony_ci 1898c2ecf20Sopenharmony_ci80: /* memcpy_table_end */ 1908c2ecf20Sopenharmony_ci be 81f 1918c2ecf20Sopenharmony_ci andcc %g1, 4, %g0 1928c2ecf20Sopenharmony_ci 1938c2ecf20Sopenharmony_ci ldd [%o1], %g2 1948c2ecf20Sopenharmony_ci add %o0, 8, %o0 1958c2ecf20Sopenharmony_ci st %g2, [%o0 - 0x08] 1968c2ecf20Sopenharmony_ci add %o1, 8, %o1 1978c2ecf20Sopenharmony_ci st %g3, [%o0 - 0x04] 1988c2ecf20Sopenharmony_ci 1998c2ecf20Sopenharmony_ci81: /* memcpy_last7 */ 2008c2ecf20Sopenharmony_ci 2018c2ecf20Sopenharmony_ci be 1f 2028c2ecf20Sopenharmony_ci andcc %g1, 2, %g0 2038c2ecf20Sopenharmony_ci 2048c2ecf20Sopenharmony_ci ld [%o1], %g2 2058c2ecf20Sopenharmony_ci add %o1, 4, %o1 2068c2ecf20Sopenharmony_ci st %g2, [%o0] 2078c2ecf20Sopenharmony_ci add %o0, 4, %o0 2088c2ecf20Sopenharmony_ci1: 2098c2ecf20Sopenharmony_ci be 1f 2108c2ecf20Sopenharmony_ci andcc %g1, 1, %g0 2118c2ecf20Sopenharmony_ci 2128c2ecf20Sopenharmony_ci lduh [%o1], %g2 2138c2ecf20Sopenharmony_ci add %o1, 2, %o1 2148c2ecf20Sopenharmony_ci sth %g2, [%o0] 2158c2ecf20Sopenharmony_ci add %o0, 2, %o0 2168c2ecf20Sopenharmony_ci1: 2178c2ecf20Sopenharmony_ci be 1f 2188c2ecf20Sopenharmony_ci nop 2198c2ecf20Sopenharmony_ci 2208c2ecf20Sopenharmony_ci ldub [%o1], %g2 2218c2ecf20Sopenharmony_ci stb %g2, [%o0] 2228c2ecf20Sopenharmony_ci1: 2238c2ecf20Sopenharmony_ci retl 2248c2ecf20Sopenharmony_ci mov %g7, %o0 2258c2ecf20Sopenharmony_ci 2268c2ecf20Sopenharmony_ci82: /* ldd_std */ 2278c2ecf20Sopenharmony_ci MOVE_BIGALIGNCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5) 2288c2ecf20Sopenharmony_ci MOVE_BIGALIGNCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5) 2298c2ecf20Sopenharmony_ci MOVE_BIGALIGNCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5) 2308c2ecf20Sopenharmony_ci MOVE_BIGALIGNCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5) 2318c2ecf20Sopenharmony_ci subcc %g1, 128, %g1 2328c2ecf20Sopenharmony_ci add %o1, 128, %o1 2338c2ecf20Sopenharmony_ci cmp %g1, 128 2348c2ecf20Sopenharmony_ci bge 82b 2358c2ecf20Sopenharmony_ci add %o0, 128, %o0 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ci andcc %g1, 0x70, %g4 2388c2ecf20Sopenharmony_ci be 84f 2398c2ecf20Sopenharmony_ci andcc %g1, 8, %g0 2408c2ecf20Sopenharmony_ci 2418c2ecf20Sopenharmony_ci sethi %hi(84f), %o5 2428c2ecf20Sopenharmony_ci add %o1, %g4, %o1 2438c2ecf20Sopenharmony_ci sub %o5, %g4, %o5 2448c2ecf20Sopenharmony_ci jmpl %o5 + %lo(84f), %g0 2458c2ecf20Sopenharmony_ci add %o0, %g4, %o0 2468c2ecf20Sopenharmony_ci 2478c2ecf20Sopenharmony_ci83: /* amemcpy_table */ 2488c2ecf20Sopenharmony_ci 2498c2ecf20Sopenharmony_ci MOVE_LASTALIGNCHUNK(o1, o0, 0x60, g2, g3, g4, g5) 2508c2ecf20Sopenharmony_ci MOVE_LASTALIGNCHUNK(o1, o0, 0x50, g2, g3, g4, g5) 2518c2ecf20Sopenharmony_ci MOVE_LASTALIGNCHUNK(o1, o0, 0x40, g2, g3, g4, g5) 2528c2ecf20Sopenharmony_ci MOVE_LASTALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5) 2538c2ecf20Sopenharmony_ci MOVE_LASTALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5) 2548c2ecf20Sopenharmony_ci MOVE_LASTALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5) 2558c2ecf20Sopenharmony_ci MOVE_LASTALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5) 2568c2ecf20Sopenharmony_ci 2578c2ecf20Sopenharmony_ci84: /* amemcpy_table_end */ 2588c2ecf20Sopenharmony_ci be 85f 2598c2ecf20Sopenharmony_ci andcc %g1, 4, %g0 2608c2ecf20Sopenharmony_ci 2618c2ecf20Sopenharmony_ci ldd [%o1], %g2 2628c2ecf20Sopenharmony_ci add %o0, 8, %o0 2638c2ecf20Sopenharmony_ci std %g2, [%o0 - 0x08] 2648c2ecf20Sopenharmony_ci add %o1, 8, %o1 2658c2ecf20Sopenharmony_ci85: /* amemcpy_last7 */ 2668c2ecf20Sopenharmony_ci be 1f 2678c2ecf20Sopenharmony_ci andcc %g1, 2, %g0 2688c2ecf20Sopenharmony_ci 2698c2ecf20Sopenharmony_ci ld [%o1], %g2 2708c2ecf20Sopenharmony_ci add %o1, 4, %o1 2718c2ecf20Sopenharmony_ci st %g2, [%o0] 2728c2ecf20Sopenharmony_ci add %o0, 4, %o0 2738c2ecf20Sopenharmony_ci1: 2748c2ecf20Sopenharmony_ci be 1f 2758c2ecf20Sopenharmony_ci andcc %g1, 1, %g0 2768c2ecf20Sopenharmony_ci 2778c2ecf20Sopenharmony_ci lduh [%o1], %g2 2788c2ecf20Sopenharmony_ci add %o1, 2, %o1 2798c2ecf20Sopenharmony_ci sth %g2, [%o0] 2808c2ecf20Sopenharmony_ci add %o0, 2, %o0 2818c2ecf20Sopenharmony_ci1: 2828c2ecf20Sopenharmony_ci be 1f 2838c2ecf20Sopenharmony_ci nop 2848c2ecf20Sopenharmony_ci 2858c2ecf20Sopenharmony_ci ldub [%o1], %g2 2868c2ecf20Sopenharmony_ci stb %g2, [%o0] 2878c2ecf20Sopenharmony_ci1: 2888c2ecf20Sopenharmony_ci retl 2898c2ecf20Sopenharmony_ci mov %g7, %o0 2908c2ecf20Sopenharmony_ci 2918c2ecf20Sopenharmony_ci86: /* non_aligned */ 2928c2ecf20Sopenharmony_ci cmp %o2, 6 2938c2ecf20Sopenharmony_ci bleu 88f 2948c2ecf20Sopenharmony_ci nop 2958c2ecf20Sopenharmony_ci 2968c2ecf20Sopenharmony_ci save %sp, -96, %sp 2978c2ecf20Sopenharmony_ci andcc %i0, 3, %g0 2988c2ecf20Sopenharmony_ci be 61f 2998c2ecf20Sopenharmony_ci andcc %i0, 1, %g0 3008c2ecf20Sopenharmony_ci be 60f 3018c2ecf20Sopenharmony_ci andcc %i0, 2, %g0 3028c2ecf20Sopenharmony_ci 3038c2ecf20Sopenharmony_ci ldub [%i1], %g5 3048c2ecf20Sopenharmony_ci add %i1, 1, %i1 3058c2ecf20Sopenharmony_ci stb %g5, [%i0] 3068c2ecf20Sopenharmony_ci sub %i2, 1, %i2 3078c2ecf20Sopenharmony_ci bne 61f 3088c2ecf20Sopenharmony_ci add %i0, 1, %i0 3098c2ecf20Sopenharmony_ci60: 3108c2ecf20Sopenharmony_ci ldub [%i1], %g3 3118c2ecf20Sopenharmony_ci add %i1, 2, %i1 3128c2ecf20Sopenharmony_ci stb %g3, [%i0] 3138c2ecf20Sopenharmony_ci sub %i2, 2, %i2 3148c2ecf20Sopenharmony_ci ldub [%i1 - 1], %g3 3158c2ecf20Sopenharmony_ci add %i0, 2, %i0 3168c2ecf20Sopenharmony_ci stb %g3, [%i0 - 1] 3178c2ecf20Sopenharmony_ci61: 3188c2ecf20Sopenharmony_ci and %i1, 3, %g2 3198c2ecf20Sopenharmony_ci and %i2, 0xc, %g3 3208c2ecf20Sopenharmony_ci and %i1, -4, %i1 3218c2ecf20Sopenharmony_ci cmp %g3, 4 3228c2ecf20Sopenharmony_ci sll %g2, 3, %g4 3238c2ecf20Sopenharmony_ci mov 32, %g2 3248c2ecf20Sopenharmony_ci be 4f 3258c2ecf20Sopenharmony_ci sub %g2, %g4, %l0 3268c2ecf20Sopenharmony_ci 3278c2ecf20Sopenharmony_ci blu 3f 3288c2ecf20Sopenharmony_ci cmp %g3, 0x8 3298c2ecf20Sopenharmony_ci 3308c2ecf20Sopenharmony_ci be 2f 3318c2ecf20Sopenharmony_ci srl %i2, 2, %g3 3328c2ecf20Sopenharmony_ci 3338c2ecf20Sopenharmony_ci ld [%i1], %i3 3348c2ecf20Sopenharmony_ci add %i0, -8, %i0 3358c2ecf20Sopenharmony_ci ld [%i1 + 4], %i4 3368c2ecf20Sopenharmony_ci b 8f 3378c2ecf20Sopenharmony_ci add %g3, 1, %g3 3388c2ecf20Sopenharmony_ci2: 3398c2ecf20Sopenharmony_ci ld [%i1], %i4 3408c2ecf20Sopenharmony_ci add %i0, -12, %i0 3418c2ecf20Sopenharmony_ci ld [%i1 + 4], %i5 3428c2ecf20Sopenharmony_ci add %g3, 2, %g3 3438c2ecf20Sopenharmony_ci b 9f 3448c2ecf20Sopenharmony_ci add %i1, -4, %i1 3458c2ecf20Sopenharmony_ci3: 3468c2ecf20Sopenharmony_ci ld [%i1], %g1 3478c2ecf20Sopenharmony_ci add %i0, -4, %i0 3488c2ecf20Sopenharmony_ci ld [%i1 + 4], %i3 3498c2ecf20Sopenharmony_ci srl %i2, 2, %g3 3508c2ecf20Sopenharmony_ci b 7f 3518c2ecf20Sopenharmony_ci add %i1, 4, %i1 3528c2ecf20Sopenharmony_ci4: 3538c2ecf20Sopenharmony_ci ld [%i1], %i5 3548c2ecf20Sopenharmony_ci cmp %i2, 7 3558c2ecf20Sopenharmony_ci ld [%i1 + 4], %g1 3568c2ecf20Sopenharmony_ci srl %i2, 2, %g3 3578c2ecf20Sopenharmony_ci bleu 10f 3588c2ecf20Sopenharmony_ci add %i1, 8, %i1 3598c2ecf20Sopenharmony_ci 3608c2ecf20Sopenharmony_ci ld [%i1], %i3 3618c2ecf20Sopenharmony_ci add %g3, -1, %g3 3628c2ecf20Sopenharmony_ci5: 3638c2ecf20Sopenharmony_ci sll %i5, %g4, %g2 3648c2ecf20Sopenharmony_ci srl %g1, %l0, %g5 3658c2ecf20Sopenharmony_ci or %g2, %g5, %g2 3668c2ecf20Sopenharmony_ci st %g2, [%i0] 3678c2ecf20Sopenharmony_ci7: 3688c2ecf20Sopenharmony_ci ld [%i1 + 4], %i4 3698c2ecf20Sopenharmony_ci sll %g1, %g4, %g2 3708c2ecf20Sopenharmony_ci srl %i3, %l0, %g5 3718c2ecf20Sopenharmony_ci or %g2, %g5, %g2 3728c2ecf20Sopenharmony_ci st %g2, [%i0 + 4] 3738c2ecf20Sopenharmony_ci8: 3748c2ecf20Sopenharmony_ci ld [%i1 + 8], %i5 3758c2ecf20Sopenharmony_ci sll %i3, %g4, %g2 3768c2ecf20Sopenharmony_ci srl %i4, %l0, %g5 3778c2ecf20Sopenharmony_ci or %g2, %g5, %g2 3788c2ecf20Sopenharmony_ci st %g2, [%i0 + 8] 3798c2ecf20Sopenharmony_ci9: 3808c2ecf20Sopenharmony_ci ld [%i1 + 12], %g1 3818c2ecf20Sopenharmony_ci sll %i4, %g4, %g2 3828c2ecf20Sopenharmony_ci srl %i5, %l0, %g5 3838c2ecf20Sopenharmony_ci addcc %g3, -4, %g3 3848c2ecf20Sopenharmony_ci or %g2, %g5, %g2 3858c2ecf20Sopenharmony_ci add %i1, 16, %i1 3868c2ecf20Sopenharmony_ci st %g2, [%i0 + 12] 3878c2ecf20Sopenharmony_ci add %i0, 16, %i0 3888c2ecf20Sopenharmony_ci bne,a 5b 3898c2ecf20Sopenharmony_ci ld [%i1], %i3 3908c2ecf20Sopenharmony_ci10: 3918c2ecf20Sopenharmony_ci sll %i5, %g4, %g2 3928c2ecf20Sopenharmony_ci srl %g1, %l0, %g5 3938c2ecf20Sopenharmony_ci srl %l0, 3, %g3 3948c2ecf20Sopenharmony_ci or %g2, %g5, %g2 3958c2ecf20Sopenharmony_ci sub %i1, %g3, %i1 3968c2ecf20Sopenharmony_ci andcc %i2, 2, %g0 3978c2ecf20Sopenharmony_ci st %g2, [%i0] 3988c2ecf20Sopenharmony_ci be 1f 3998c2ecf20Sopenharmony_ci andcc %i2, 1, %g0 4008c2ecf20Sopenharmony_ci 4018c2ecf20Sopenharmony_ci ldub [%i1], %g2 4028c2ecf20Sopenharmony_ci add %i1, 2, %i1 4038c2ecf20Sopenharmony_ci stb %g2, [%i0 + 4] 4048c2ecf20Sopenharmony_ci add %i0, 2, %i0 4058c2ecf20Sopenharmony_ci ldub [%i1 - 1], %g2 4068c2ecf20Sopenharmony_ci stb %g2, [%i0 + 3] 4078c2ecf20Sopenharmony_ci1: 4088c2ecf20Sopenharmony_ci be 1f 4098c2ecf20Sopenharmony_ci nop 4108c2ecf20Sopenharmony_ci ldub [%i1], %g2 4118c2ecf20Sopenharmony_ci stb %g2, [%i0 + 4] 4128c2ecf20Sopenharmony_ci1: 4138c2ecf20Sopenharmony_ci ret 4148c2ecf20Sopenharmony_ci restore %g7, %g0, %o0 4158c2ecf20Sopenharmony_ci 4168c2ecf20Sopenharmony_ci88: /* short_end */ 4178c2ecf20Sopenharmony_ci 4188c2ecf20Sopenharmony_ci and %o2, 0xe, %o3 4198c2ecf20Sopenharmony_ci20: 4208c2ecf20Sopenharmony_ci sethi %hi(89f), %o5 4218c2ecf20Sopenharmony_ci sll %o3, 3, %o4 4228c2ecf20Sopenharmony_ci add %o0, %o3, %o0 4238c2ecf20Sopenharmony_ci sub %o5, %o4, %o5 4248c2ecf20Sopenharmony_ci add %o1, %o3, %o1 4258c2ecf20Sopenharmony_ci jmpl %o5 + %lo(89f), %g0 4268c2ecf20Sopenharmony_ci andcc %o2, 1, %g0 4278c2ecf20Sopenharmony_ci 4288c2ecf20Sopenharmony_ci MOVE_SHORTCHUNK(o1, o0, 0x0c, g2, g3) 4298c2ecf20Sopenharmony_ci MOVE_SHORTCHUNK(o1, o0, 0x0a, g2, g3) 4308c2ecf20Sopenharmony_ci MOVE_SHORTCHUNK(o1, o0, 0x08, g2, g3) 4318c2ecf20Sopenharmony_ci MOVE_SHORTCHUNK(o1, o0, 0x06, g2, g3) 4328c2ecf20Sopenharmony_ci MOVE_SHORTCHUNK(o1, o0, 0x04, g2, g3) 4338c2ecf20Sopenharmony_ci MOVE_SHORTCHUNK(o1, o0, 0x02, g2, g3) 4348c2ecf20Sopenharmony_ci MOVE_SHORTCHUNK(o1, o0, 0x00, g2, g3) 4358c2ecf20Sopenharmony_ci 4368c2ecf20Sopenharmony_ci89: /* short_table_end */ 4378c2ecf20Sopenharmony_ci 4388c2ecf20Sopenharmony_ci be 1f 4398c2ecf20Sopenharmony_ci nop 4408c2ecf20Sopenharmony_ci 4418c2ecf20Sopenharmony_ci ldub [%o1], %g2 4428c2ecf20Sopenharmony_ci stb %g2, [%o0] 4438c2ecf20Sopenharmony_ci1: 4448c2ecf20Sopenharmony_ci retl 4458c2ecf20Sopenharmony_ci mov %g7, %o0 4468c2ecf20Sopenharmony_ci 4478c2ecf20Sopenharmony_ci90: /* short_aligned_end */ 4488c2ecf20Sopenharmony_ci bne 88b 4498c2ecf20Sopenharmony_ci andcc %o2, 8, %g0 4508c2ecf20Sopenharmony_ci 4518c2ecf20Sopenharmony_ci be 1f 4528c2ecf20Sopenharmony_ci andcc %o2, 4, %g0 4538c2ecf20Sopenharmony_ci 4548c2ecf20Sopenharmony_ci ld [%o1 + 0x00], %g2 4558c2ecf20Sopenharmony_ci ld [%o1 + 0x04], %g3 4568c2ecf20Sopenharmony_ci add %o1, 8, %o1 4578c2ecf20Sopenharmony_ci st %g2, [%o0 + 0x00] 4588c2ecf20Sopenharmony_ci st %g3, [%o0 + 0x04] 4598c2ecf20Sopenharmony_ci add %o0, 8, %o0 4608c2ecf20Sopenharmony_ci1: 4618c2ecf20Sopenharmony_ci b 81b 4628c2ecf20Sopenharmony_ci mov %o2, %g1 463