1/* 2 * Copyright (C) 2017 Hangzhou C-SKY Microsystems co.,ltd. 3 * 4 * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB 5 * in this tarball. 6 */ 7 8#include <endian.h> 9#include "macro.S" 10 11#ifdef WANT_WIDE 12# define Wstrcpy wcscpy 13#else 14# define Wstrcpy strcpy 15#endif 16 17 .align 2 18 .global Wstrcpy 19 .type Wstrcpy, @function 20Wstrcpy: 21 22 mov a3, a0 23 or a2, a1, a3 24 andi t0, a2, 3 25 M_BEZ t0, 2f 26 mov t0, a1 27 1: 28 ld.b a2, (t0) 29 stb a2, (a3) 30 addi t0, t0, 1 31 addi a3, a3, 1 32 M_BNEZ a2, 1b 33 34 jmp r15 35 36 2: 37 ldw a2, (a1) 38 tstnbz a2 39 bf 11f 40 stw a2, (a3) 41 42 ldw a2, (a1, 4) 43 tstnbz a2 44 bf 4f 45 stw a2, (a3, 4) 46 47 ldw a2, (a1, 8) 48 tstnbz a2 49 bf 5f 50 stw a2, (a3, 8) 51 52 ldw a2, (a1, 12) 53 tstnbz a2 54 bf 6f 55 stw a2, (a3, 12) 56 57 ldw a2, (a1, 16) 58 tstnbz a2 59 bf 7f 60 stw a2, (a3, 16) 61 62 ldw a2, (a1, 20) 63 tstnbz a2 64 bf 8f 65 stw a2, (a3, 20) 66 67 ldw a2, (a1, 24) 68 tstnbz a2 69 bf 9f 70 stw a2, (a3, 24) 71 72 ldw a2, (a1, 28) 73 tstnbz a2 74 bf 10f 75 stw a2, (a3, 28) 76 77 addi a3, 32 78 addi a1, 32 79 br 2b 80 81 4: 82 addi a3, 4 83 br 11f 84 85 5: 86 addi a3, 8 87 br 11f 88 89 6: 90 addi a3, 12 91 br 11f 92 93 7: 94 addi a3, 16 95 br 11f 96 97 8: 98 addi a3, 20 99 br 11f 100 101 9: 102 addi a3, 24 103 br 11f 104 105 10: 106 addi a3, 28 107 11: 108#ifdef __CSKYBE__ 109 xtrb0 t0, a2 110 st.b t0, (a3) 111 M_BEZ t0, 5f 112 xtrb1 t0, a2 113 st.b t0, (a3, 1) 114 M_BEZ t0, 5f 115 xtrb2 t0, a2 116 st.b t0, (a3, 2 ) 117 M_BEZ t0, 5f 118 stw a2, (a3) 119#else 120 xtrb3 t0, a2 121 st.b t0, (a3) 122 M_BEZ t0, 5f 123 xtrb2 t0, a2 124 st.b t0, (a3, 1) 125 M_BEZ t0, 5f 126 xtrb1 t0, a2 127 st.b t0, (a3, 2) 128 M_BEZ t0, 5f 129 stw a2, (a3) 130#endif 131 5: 132 jmp r15 133 134 135libc_hidden_def(Wstrcpy) 136.weak Wstrcpy 137