1 /* SPDX-License-Identifier: GPL-2.0 */ 1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* memcpy.S: Sparc optimized memcpy and memmov 2 /* memcpy.S: Sparc optimized memcpy and memmove code 3 * Hand optimized from GNU libc's memcpy and m 3 * Hand optimized from GNU libc's memcpy and memmove 4 * Copyright (C) 1991,1996 Free Software Found 4 * Copyright (C) 1991,1996 Free Software Foundation 5 * Copyright (C) 1995 Linus Torvalds (Linus.To 5 * Copyright (C) 1995 Linus Torvalds (Linus.Torvalds@helsinki.fi) 6 * Copyright (C) 1996 David S. Miller (davem@c 6 * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) 7 * Copyright (C) 1996 Eddie C. Dost (ecd@skyne 7 * Copyright (C) 1996 Eddie C. Dost (ecd@skynet.be) 8 * Copyright (C) 1996 Jakub Jelinek (jj@sunsit 8 * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz) 9 */ 9 */ 10 10 11 #include <linux/export.h> 11 #include <linux/export.h> 12 12 13 #define FUNC(x) \ 13 #define FUNC(x) \ 14 .globl x; \ 14 .globl x; \ 15 .type x,@function; \ 15 .type x,@function; \ 16 .align 4; \ 16 .align 4; \ 17 x: 17 x: 18 18 19 /* Both these macros have to start with exactl 19 /* Both these macros have to start with exactly the same insn */ 20 #define MOVE_BIGCHUNK(src, dst, offset, t0, t1 20 #define MOVE_BIGCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \ 21 ldd [%src + (offset) + 0x00], %t0; 21 ldd [%src + (offset) + 0x00], %t0; \ 22 ldd [%src + (offset) + 0x08], %t2; 22 ldd [%src + (offset) + 0x08], %t2; \ 23 ldd [%src + (offset) + 0x10], %t4; 23 ldd [%src + (offset) + 0x10], %t4; \ 24 ldd [%src + (offset) + 0x18], %t6; 24 ldd [%src + (offset) + 0x18], %t6; \ 25 st %t0, [%dst + (offset) + 0x00]; 25 st %t0, [%dst + (offset) + 0x00]; \ 26 st %t1, [%dst + (offset) + 0x04]; 26 st %t1, [%dst + (offset) + 0x04]; \ 27 st %t2, [%dst + (offset) + 0x08]; 27 st %t2, [%dst + (offset) + 0x08]; \ 28 st %t3, [%dst + (offset) + 0x0c]; 28 st %t3, [%dst + (offset) + 0x0c]; \ 29 st %t4, [%dst + (offset) + 0x10]; 29 st %t4, [%dst + (offset) + 0x10]; \ 30 st %t5, [%dst + (offset) + 0x14]; 30 st %t5, [%dst + (offset) + 0x14]; \ 31 st %t6, [%dst + (offset) + 0x18]; 31 st %t6, [%dst + (offset) + 0x18]; \ 32 st %t7, [%dst + (offset) + 0x1c]; 32 st %t7, [%dst + (offset) + 0x1c]; 33 33 34 #define MOVE_BIGALIGNCHUNK(src, dst, offset, t 34 #define MOVE_BIGALIGNCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \ 35 ldd [%src + (offset) + 0x00], %t0; 35 ldd [%src + (offset) + 0x00], %t0; \ 36 ldd [%src + (offset) + 0x08], %t2; 36 ldd [%src + (offset) + 0x08], %t2; \ 37 ldd [%src + (offset) + 0x10], %t4; 37 ldd [%src + (offset) + 0x10], %t4; \ 38 ldd [%src + (offset) + 0x18], %t6; 38 ldd [%src + (offset) + 0x18], %t6; \ 39 std %t0, [%dst + (offset) + 0x00]; 39 std %t0, [%dst + (offset) + 0x00]; \ 40 std %t2, [%dst + (offset) + 0x08]; 40 std %t2, [%dst + (offset) + 0x08]; \ 41 std %t4, [%dst + (offset) + 0x10]; 41 std %t4, [%dst + (offset) + 0x10]; \ 42 std %t6, [%dst + (offset) + 0x18]; 42 std %t6, [%dst + (offset) + 0x18]; 43 43 44 #define MOVE_LASTCHUNK(src, dst, offset, t0, t 44 #define MOVE_LASTCHUNK(src, dst, offset, t0, t1, t2, t3) \ 45 ldd [%src - (offset) - 0x10], %t0; 45 ldd [%src - (offset) - 0x10], %t0; \ 46 ldd [%src - (offset) - 0x08], %t2; 46 ldd [%src - (offset) - 0x08], %t2; \ 47 st %t0, [%dst - (offset) - 0x10]; 47 st %t0, [%dst - (offset) - 0x10]; \ 48 st %t1, [%dst - (offset) - 0x0c]; 48 st %t1, [%dst - (offset) - 0x0c]; \ 49 st %t2, [%dst - (offset) - 0x08]; 49 st %t2, [%dst - (offset) - 0x08]; \ 50 st %t3, [%dst - (offset) - 0x04]; 50 st %t3, [%dst - (offset) - 0x04]; 51 51 52 #define MOVE_LASTALIGNCHUNK(src, dst, offset, 52 #define MOVE_LASTALIGNCHUNK(src, dst, offset, t0, t1, t2, t3) \ 53 ldd [%src - (offset) - 0x10], %t0; 53 ldd [%src - (offset) - 0x10], %t0; \ 54 ldd [%src - (offset) - 0x08], %t2; 54 ldd [%src - (offset) - 0x08], %t2; \ 55 std %t0, [%dst - (offset) - 0x10]; 55 std %t0, [%dst - (offset) - 0x10]; \ 56 std %t2, [%dst - (offset) - 0x08]; 56 std %t2, [%dst - (offset) - 0x08]; 57 57 58 #define MOVE_SHORTCHUNK(src, dst, offset, t0, 58 #define MOVE_SHORTCHUNK(src, dst, offset, t0, t1) \ 59 ldub [%src - (offset) - 0x02], %t0; 59 ldub [%src - (offset) - 0x02], %t0; \ 60 ldub [%src - (offset) - 0x01], %t1; 60 ldub [%src - (offset) - 0x01], %t1; \ 61 stb %t0, [%dst - (offset) - 0x02]; 61 stb %t0, [%dst - (offset) - 0x02]; \ 62 stb %t1, [%dst - (offset) - 0x01]; 62 stb %t1, [%dst - (offset) - 0x01]; 63 63 64 .text 64 .text 65 .align 4 65 .align 4 66 66 67 FUNC(memmove) 67 FUNC(memmove) 68 EXPORT_SYMBOL(memmove) 68 EXPORT_SYMBOL(memmove) 69 cmp %o0, %o1 69 cmp %o0, %o1 70 mov %o0, %g7 70 mov %o0, %g7 71 bleu 9f 71 bleu 9f 72 sub %o0, %o1, %o4 72 sub %o0, %o1, %o4 73 73 74 add %o1, %o2, %o3 74 add %o1, %o2, %o3 75 cmp %o3, %o0 75 cmp %o3, %o0 76 bleu 0f 76 bleu 0f 77 andcc %o4, 3, %o5 77 andcc %o4, 3, %o5 78 78 79 add %o1, %o2, %o1 79 add %o1, %o2, %o1 80 add %o0, %o2, %o0 80 add %o0, %o2, %o0 81 sub %o1, 1, %o1 81 sub %o1, 1, %o1 82 sub %o0, 1, %o0 82 sub %o0, 1, %o0 83 83 84 1: /* reverse_bytes */ 84 1: /* reverse_bytes */ 85 85 86 ldub [%o1], %o4 86 ldub [%o1], %o4 87 subcc %o2, 1, %o2 87 subcc %o2, 1, %o2 88 stb %o4, [%o0] 88 stb %o4, [%o0] 89 sub %o1, 1, %o1 89 sub %o1, 1, %o1 90 bne 1b 90 bne 1b 91 sub %o0, 1, %o0 91 sub %o0, 1, %o0 92 92 93 retl 93 retl 94 mov %g7, %o0 94 mov %g7, %o0 95 95 96 /* NOTE: This code is executed just for the ca 96 /* NOTE: This code is executed just for the cases, 97 where %src (=%o1) & 3 is != 0. 97 where %src (=%o1) & 3 is != 0. 98 We need to align it to 4. So, for (%s 98 We need to align it to 4. So, for (%src & 3) 99 1 we need to do ldub,lduh 99 1 we need to do ldub,lduh 100 2 lduh 100 2 lduh 101 3 just ldub 101 3 just ldub 102 so even if it looks weird, the branch 102 so even if it looks weird, the branches 103 are correct here. -jj 103 are correct here. -jj 104 */ 104 */ 105 78: /* dword_align */ 105 78: /* dword_align */ 106 106 107 andcc %o1, 1, %g0 107 andcc %o1, 1, %g0 108 be 4f 108 be 4f 109 andcc %o1, 2, %g0 109 andcc %o1, 2, %g0 110 110 111 ldub [%o1], %g2 111 ldub [%o1], %g2 112 add %o1, 1, %o1 112 add %o1, 1, %o1 113 stb %g2, [%o0] 113 stb %g2, [%o0] 114 sub %o2, 1, %o2 114 sub %o2, 1, %o2 115 bne 3f 115 bne 3f 116 add %o0, 1, %o0 116 add %o0, 1, %o0 117 4: 117 4: 118 lduh [%o1], %g2 118 lduh [%o1], %g2 119 add %o1, 2, %o1 119 add %o1, 2, %o1 120 sth %g2, [%o0] 120 sth %g2, [%o0] 121 sub %o2, 2, %o2 121 sub %o2, 2, %o2 122 b 3f 122 b 3f 123 add %o0, 2, %o0 123 add %o0, 2, %o0 124 124 125 FUNC(memcpy) /* %o0=dst %o1=src %o2=len */ 125 FUNC(memcpy) /* %o0=dst %o1=src %o2=len */ 126 EXPORT_SYMBOL(memcpy) 126 EXPORT_SYMBOL(memcpy) 127 127 128 sub %o0, %o1, %o4 128 sub %o0, %o1, %o4 129 mov %o0, %g7 129 mov %o0, %g7 130 9: 130 9: 131 andcc %o4, 3, %o5 131 andcc %o4, 3, %o5 132 0: 132 0: 133 bne 86f 133 bne 86f 134 cmp %o2, 15 134 cmp %o2, 15 135 135 136 bleu 90f 136 bleu 90f 137 andcc %o1, 3, %g0 137 andcc %o1, 3, %g0 138 138 139 bne 78b 139 bne 78b 140 3: 140 3: 141 andcc %o1, 4, %g0 141 andcc %o1, 4, %g0 142 142 143 be 2f 143 be 2f 144 mov %o2, %g1 144 mov %o2, %g1 145 145 146 ld [%o1], %o4 146 ld [%o1], %o4 147 sub %g1, 4, %g1 147 sub %g1, 4, %g1 148 st %o4, [%o0] 148 st %o4, [%o0] 149 add %o1, 4, %o1 149 add %o1, 4, %o1 150 add %o0, 4, %o0 150 add %o0, 4, %o0 151 2: 151 2: 152 andcc %g1, 0xffffff80, %g0 152 andcc %g1, 0xffffff80, %g0 153 be 3f 153 be 3f 154 andcc %o0, 4, %g0 154 andcc %o0, 4, %g0 155 155 156 be 82f + 4 156 be 82f + 4 157 5: 157 5: 158 MOVE_BIGCHUNK(o1, o0, 0x00, o2, o3, o4 158 MOVE_BIGCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5) 159 MOVE_BIGCHUNK(o1, o0, 0x20, o2, o3, o4 159 MOVE_BIGCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5) 160 MOVE_BIGCHUNK(o1, o0, 0x40, o2, o3, o4 160 MOVE_BIGCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5) 161 MOVE_BIGCHUNK(o1, o0, 0x60, o2, o3, o4 161 MOVE_BIGCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5) 162 sub %g1, 128, %g1 162 sub %g1, 128, %g1 163 add %o1, 128, %o1 163 add %o1, 128, %o1 164 cmp %g1, 128 164 cmp %g1, 128 165 bge 5b 165 bge 5b 166 add %o0, 128, %o0 166 add %o0, 128, %o0 167 3: 167 3: 168 andcc %g1, 0x70, %g4 168 andcc %g1, 0x70, %g4 169 be 80f 169 be 80f 170 andcc %g1, 8, %g0 170 andcc %g1, 8, %g0 171 171 172 sethi %hi(80f), %o5 172 sethi %hi(80f), %o5 173 srl %g4, 1, %o4 173 srl %g4, 1, %o4 174 add %g4, %o4, %o4 174 add %g4, %o4, %o4 175 add %o1, %g4, %o1 175 add %o1, %g4, %o1 176 sub %o5, %o4, %o5 176 sub %o5, %o4, %o5 177 jmpl %o5 + %lo(80f), %g0 177 jmpl %o5 + %lo(80f), %g0 178 add %o0, %g4, %o0 178 add %o0, %g4, %o0 179 179 180 79: /* memcpy_table */ 180 79: /* memcpy_table */ 181 181 182 MOVE_LASTCHUNK(o1, o0, 0x60, g2, g3, g 182 MOVE_LASTCHUNK(o1, o0, 0x60, g2, g3, g4, g5) 183 MOVE_LASTCHUNK(o1, o0, 0x50, g2, g3, g 183 MOVE_LASTCHUNK(o1, o0, 0x50, g2, g3, g4, g5) 184 MOVE_LASTCHUNK(o1, o0, 0x40, g2, g3, g 184 MOVE_LASTCHUNK(o1, o0, 0x40, g2, g3, g4, g5) 185 MOVE_LASTCHUNK(o1, o0, 0x30, g2, g3, g 185 MOVE_LASTCHUNK(o1, o0, 0x30, g2, g3, g4, g5) 186 MOVE_LASTCHUNK(o1, o0, 0x20, g2, g3, g 186 MOVE_LASTCHUNK(o1, o0, 0x20, g2, g3, g4, g5) 187 MOVE_LASTCHUNK(o1, o0, 0x10, g2, g3, g 187 MOVE_LASTCHUNK(o1, o0, 0x10, g2, g3, g4, g5) 188 MOVE_LASTCHUNK(o1, o0, 0x00, g2, g3, g 188 MOVE_LASTCHUNK(o1, o0, 0x00, g2, g3, g4, g5) 189 189 190 80: /* memcpy_table_end */ 190 80: /* memcpy_table_end */ 191 be 81f 191 be 81f 192 andcc %g1, 4, %g0 192 andcc %g1, 4, %g0 193 193 194 ldd [%o1], %g2 194 ldd [%o1], %g2 195 add %o0, 8, %o0 195 add %o0, 8, %o0 196 st %g2, [%o0 - 0x08] 196 st %g2, [%o0 - 0x08] 197 add %o1, 8, %o1 197 add %o1, 8, %o1 198 st %g3, [%o0 - 0x04] 198 st %g3, [%o0 - 0x04] 199 199 200 81: /* memcpy_last7 */ 200 81: /* memcpy_last7 */ 201 201 202 be 1f 202 be 1f 203 andcc %g1, 2, %g0 203 andcc %g1, 2, %g0 204 204 205 ld [%o1], %g2 205 ld [%o1], %g2 206 add %o1, 4, %o1 206 add %o1, 4, %o1 207 st %g2, [%o0] 207 st %g2, [%o0] 208 add %o0, 4, %o0 208 add %o0, 4, %o0 209 1: 209 1: 210 be 1f 210 be 1f 211 andcc %g1, 1, %g0 211 andcc %g1, 1, %g0 212 212 213 lduh [%o1], %g2 213 lduh [%o1], %g2 214 add %o1, 2, %o1 214 add %o1, 2, %o1 215 sth %g2, [%o0] 215 sth %g2, [%o0] 216 add %o0, 2, %o0 216 add %o0, 2, %o0 217 1: 217 1: 218 be 1f 218 be 1f 219 nop 219 nop 220 220 221 ldub [%o1], %g2 221 ldub [%o1], %g2 222 stb %g2, [%o0] 222 stb %g2, [%o0] 223 1: 223 1: 224 retl 224 retl 225 mov %g7, %o0 225 mov %g7, %o0 226 226 227 82: /* ldd_std */ 227 82: /* ldd_std */ 228 MOVE_BIGALIGNCHUNK(o1, o0, 0x00, o2, o 228 MOVE_BIGALIGNCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5) 229 MOVE_BIGALIGNCHUNK(o1, o0, 0x20, o2, o 229 MOVE_BIGALIGNCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5) 230 MOVE_BIGALIGNCHUNK(o1, o0, 0x40, o2, o 230 MOVE_BIGALIGNCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5) 231 MOVE_BIGALIGNCHUNK(o1, o0, 0x60, o2, o 231 MOVE_BIGALIGNCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5) 232 subcc %g1, 128, %g1 232 subcc %g1, 128, %g1 233 add %o1, 128, %o1 233 add %o1, 128, %o1 234 cmp %g1, 128 234 cmp %g1, 128 235 bge 82b 235 bge 82b 236 add %o0, 128, %o0 236 add %o0, 128, %o0 237 237 238 andcc %g1, 0x70, %g4 238 andcc %g1, 0x70, %g4 239 be 84f 239 be 84f 240 andcc %g1, 8, %g0 240 andcc %g1, 8, %g0 241 241 242 sethi %hi(84f), %o5 242 sethi %hi(84f), %o5 243 add %o1, %g4, %o1 243 add %o1, %g4, %o1 244 sub %o5, %g4, %o5 244 sub %o5, %g4, %o5 245 jmpl %o5 + %lo(84f), %g0 245 jmpl %o5 + %lo(84f), %g0 246 add %o0, %g4, %o0 246 add %o0, %g4, %o0 247 247 248 83: /* amemcpy_table */ 248 83: /* amemcpy_table */ 249 249 250 MOVE_LASTALIGNCHUNK(o1, o0, 0x60, g2, 250 MOVE_LASTALIGNCHUNK(o1, o0, 0x60, g2, g3, g4, g5) 251 MOVE_LASTALIGNCHUNK(o1, o0, 0x50, g2, 251 MOVE_LASTALIGNCHUNK(o1, o0, 0x50, g2, g3, g4, g5) 252 MOVE_LASTALIGNCHUNK(o1, o0, 0x40, g2, 252 MOVE_LASTALIGNCHUNK(o1, o0, 0x40, g2, g3, g4, g5) 253 MOVE_LASTALIGNCHUNK(o1, o0, 0x30, g2, 253 MOVE_LASTALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5) 254 MOVE_LASTALIGNCHUNK(o1, o0, 0x20, g2, 254 MOVE_LASTALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5) 255 MOVE_LASTALIGNCHUNK(o1, o0, 0x10, g2, 255 MOVE_LASTALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5) 256 MOVE_LASTALIGNCHUNK(o1, o0, 0x00, g2, 256 MOVE_LASTALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5) 257 257 258 84: /* amemcpy_table_end */ 258 84: /* amemcpy_table_end */ 259 be 85f 259 be 85f 260 andcc %g1, 4, %g0 260 andcc %g1, 4, %g0 261 261 262 ldd [%o1], %g2 262 ldd [%o1], %g2 263 add %o0, 8, %o0 263 add %o0, 8, %o0 264 std %g2, [%o0 - 0x08] 264 std %g2, [%o0 - 0x08] 265 add %o1, 8, %o1 265 add %o1, 8, %o1 266 85: /* amemcpy_last7 */ 266 85: /* amemcpy_last7 */ 267 be 1f 267 be 1f 268 andcc %g1, 2, %g0 268 andcc %g1, 2, %g0 269 269 270 ld [%o1], %g2 270 ld [%o1], %g2 271 add %o1, 4, %o1 271 add %o1, 4, %o1 272 st %g2, [%o0] 272 st %g2, [%o0] 273 add %o0, 4, %o0 273 add %o0, 4, %o0 274 1: 274 1: 275 be 1f 275 be 1f 276 andcc %g1, 1, %g0 276 andcc %g1, 1, %g0 277 277 278 lduh [%o1], %g2 278 lduh [%o1], %g2 279 add %o1, 2, %o1 279 add %o1, 2, %o1 280 sth %g2, [%o0] 280 sth %g2, [%o0] 281 add %o0, 2, %o0 281 add %o0, 2, %o0 282 1: 282 1: 283 be 1f 283 be 1f 284 nop 284 nop 285 285 286 ldub [%o1], %g2 286 ldub [%o1], %g2 287 stb %g2, [%o0] 287 stb %g2, [%o0] 288 1: 288 1: 289 retl 289 retl 290 mov %g7, %o0 290 mov %g7, %o0 291 291 292 86: /* non_aligned */ 292 86: /* non_aligned */ 293 cmp %o2, 6 293 cmp %o2, 6 294 bleu 88f 294 bleu 88f 295 nop 295 nop 296 296 297 save %sp, -96, %sp 297 save %sp, -96, %sp 298 andcc %i0, 3, %g0 298 andcc %i0, 3, %g0 299 be 61f 299 be 61f 300 andcc %i0, 1, %g0 300 andcc %i0, 1, %g0 301 be 60f 301 be 60f 302 andcc %i0, 2, %g0 302 andcc %i0, 2, %g0 303 303 304 ldub [%i1], %g5 304 ldub [%i1], %g5 305 add %i1, 1, %i1 305 add %i1, 1, %i1 306 stb %g5, [%i0] 306 stb %g5, [%i0] 307 sub %i2, 1, %i2 307 sub %i2, 1, %i2 308 bne 61f 308 bne 61f 309 add %i0, 1, %i0 309 add %i0, 1, %i0 310 60: 310 60: 311 ldub [%i1], %g3 311 ldub [%i1], %g3 312 add %i1, 2, %i1 312 add %i1, 2, %i1 313 stb %g3, [%i0] 313 stb %g3, [%i0] 314 sub %i2, 2, %i2 314 sub %i2, 2, %i2 315 ldub [%i1 - 1], %g3 315 ldub [%i1 - 1], %g3 316 add %i0, 2, %i0 316 add %i0, 2, %i0 317 stb %g3, [%i0 - 1] 317 stb %g3, [%i0 - 1] 318 61: 318 61: 319 and %i1, 3, %g2 319 and %i1, 3, %g2 320 and %i2, 0xc, %g3 320 and %i2, 0xc, %g3 321 and %i1, -4, %i1 321 and %i1, -4, %i1 322 cmp %g3, 4 322 cmp %g3, 4 323 sll %g2, 3, %g4 323 sll %g2, 3, %g4 324 mov 32, %g2 324 mov 32, %g2 325 be 4f 325 be 4f 326 sub %g2, %g4, %l0 326 sub %g2, %g4, %l0 327 327 328 blu 3f 328 blu 3f 329 cmp %g3, 0x8 329 cmp %g3, 0x8 330 330 331 be 2f 331 be 2f 332 srl %i2, 2, %g3 332 srl %i2, 2, %g3 333 333 334 ld [%i1], %i3 334 ld [%i1], %i3 335 add %i0, -8, %i0 335 add %i0, -8, %i0 336 ld [%i1 + 4], %i4 336 ld [%i1 + 4], %i4 337 b 8f 337 b 8f 338 add %g3, 1, %g3 338 add %g3, 1, %g3 339 2: 339 2: 340 ld [%i1], %i4 340 ld [%i1], %i4 341 add %i0, -12, %i0 341 add %i0, -12, %i0 342 ld [%i1 + 4], %i5 342 ld [%i1 + 4], %i5 343 add %g3, 2, %g3 343 add %g3, 2, %g3 344 b 9f 344 b 9f 345 add %i1, -4, %i1 345 add %i1, -4, %i1 346 3: 346 3: 347 ld [%i1], %g1 347 ld [%i1], %g1 348 add %i0, -4, %i0 348 add %i0, -4, %i0 349 ld [%i1 + 4], %i3 349 ld [%i1 + 4], %i3 350 srl %i2, 2, %g3 350 srl %i2, 2, %g3 351 b 7f 351 b 7f 352 add %i1, 4, %i1 352 add %i1, 4, %i1 353 4: 353 4: 354 ld [%i1], %i5 354 ld [%i1], %i5 355 cmp %i2, 7 355 cmp %i2, 7 356 ld [%i1 + 4], %g1 356 ld [%i1 + 4], %g1 357 srl %i2, 2, %g3 357 srl %i2, 2, %g3 358 bleu 10f 358 bleu 10f 359 add %i1, 8, %i1 359 add %i1, 8, %i1 360 360 361 ld [%i1], %i3 361 ld [%i1], %i3 362 add %g3, -1, %g3 362 add %g3, -1, %g3 363 5: 363 5: 364 sll %i5, %g4, %g2 364 sll %i5, %g4, %g2 365 srl %g1, %l0, %g5 365 srl %g1, %l0, %g5 366 or %g2, %g5, %g2 366 or %g2, %g5, %g2 367 st %g2, [%i0] 367 st %g2, [%i0] 368 7: 368 7: 369 ld [%i1 + 4], %i4 369 ld [%i1 + 4], %i4 370 sll %g1, %g4, %g2 370 sll %g1, %g4, %g2 371 srl %i3, %l0, %g5 371 srl %i3, %l0, %g5 372 or %g2, %g5, %g2 372 or %g2, %g5, %g2 373 st %g2, [%i0 + 4] 373 st %g2, [%i0 + 4] 374 8: 374 8: 375 ld [%i1 + 8], %i5 375 ld [%i1 + 8], %i5 376 sll %i3, %g4, %g2 376 sll %i3, %g4, %g2 377 srl %i4, %l0, %g5 377 srl %i4, %l0, %g5 378 or %g2, %g5, %g2 378 or %g2, %g5, %g2 379 st %g2, [%i0 + 8] 379 st %g2, [%i0 + 8] 380 9: 380 9: 381 ld [%i1 + 12], %g1 381 ld [%i1 + 12], %g1 382 sll %i4, %g4, %g2 382 sll %i4, %g4, %g2 383 srl %i5, %l0, %g5 383 srl %i5, %l0, %g5 384 addcc %g3, -4, %g3 384 addcc %g3, -4, %g3 385 or %g2, %g5, %g2 385 or %g2, %g5, %g2 386 add %i1, 16, %i1 386 add %i1, 16, %i1 387 st %g2, [%i0 + 12] 387 st %g2, [%i0 + 12] 388 add %i0, 16, %i0 388 add %i0, 16, %i0 389 bne,a 5b 389 bne,a 5b 390 ld [%i1], %i3 390 ld [%i1], %i3 391 10: 391 10: 392 sll %i5, %g4, %g2 392 sll %i5, %g4, %g2 393 srl %g1, %l0, %g5 393 srl %g1, %l0, %g5 394 srl %l0, 3, %g3 394 srl %l0, 3, %g3 395 or %g2, %g5, %g2 395 or %g2, %g5, %g2 396 sub %i1, %g3, %i1 396 sub %i1, %g3, %i1 397 andcc %i2, 2, %g0 397 andcc %i2, 2, %g0 398 st %g2, [%i0] 398 st %g2, [%i0] 399 be 1f 399 be 1f 400 andcc %i2, 1, %g0 400 andcc %i2, 1, %g0 401 401 402 ldub [%i1], %g2 402 ldub [%i1], %g2 403 add %i1, 2, %i1 403 add %i1, 2, %i1 404 stb %g2, [%i0 + 4] 404 stb %g2, [%i0 + 4] 405 add %i0, 2, %i0 405 add %i0, 2, %i0 406 ldub [%i1 - 1], %g2 406 ldub [%i1 - 1], %g2 407 stb %g2, [%i0 + 3] 407 stb %g2, [%i0 + 3] 408 1: 408 1: 409 be 1f 409 be 1f 410 nop 410 nop 411 ldub [%i1], %g2 411 ldub [%i1], %g2 412 stb %g2, [%i0 + 4] 412 stb %g2, [%i0 + 4] 413 1: 413 1: 414 ret 414 ret 415 restore %g7, %g0, %o0 415 restore %g7, %g0, %o0 416 416 417 88: /* short_end */ 417 88: /* short_end */ 418 418 419 and %o2, 0xe, %o3 419 and %o2, 0xe, %o3 420 20: 420 20: 421 sethi %hi(89f), %o5 421 sethi %hi(89f), %o5 422 sll %o3, 3, %o4 422 sll %o3, 3, %o4 423 add %o0, %o3, %o0 423 add %o0, %o3, %o0 424 sub %o5, %o4, %o5 424 sub %o5, %o4, %o5 425 add %o1, %o3, %o1 425 add %o1, %o3, %o1 426 jmpl %o5 + %lo(89f), %g0 426 jmpl %o5 + %lo(89f), %g0 427 andcc %o2, 1, %g0 427 andcc %o2, 1, %g0 428 428 429 MOVE_SHORTCHUNK(o1, o0, 0x0c, g2, g3) 429 MOVE_SHORTCHUNK(o1, o0, 0x0c, g2, g3) 430 MOVE_SHORTCHUNK(o1, o0, 0x0a, g2, g3) 430 MOVE_SHORTCHUNK(o1, o0, 0x0a, g2, g3) 431 MOVE_SHORTCHUNK(o1, o0, 0x08, g2, g3) 431 MOVE_SHORTCHUNK(o1, o0, 0x08, g2, g3) 432 MOVE_SHORTCHUNK(o1, o0, 0x06, g2, g3) 432 MOVE_SHORTCHUNK(o1, o0, 0x06, g2, g3) 433 MOVE_SHORTCHUNK(o1, o0, 0x04, g2, g3) 433 MOVE_SHORTCHUNK(o1, o0, 0x04, g2, g3) 434 MOVE_SHORTCHUNK(o1, o0, 0x02, g2, g3) 434 MOVE_SHORTCHUNK(o1, o0, 0x02, g2, g3) 435 MOVE_SHORTCHUNK(o1, o0, 0x00, g2, g3) 435 MOVE_SHORTCHUNK(o1, o0, 0x00, g2, g3) 436 436 437 89: /* short_table_end */ 437 89: /* short_table_end */ 438 438 439 be 1f 439 be 1f 440 nop 440 nop 441 441 442 ldub [%o1], %g2 442 ldub [%o1], %g2 443 stb %g2, [%o0] 443 stb %g2, [%o0] 444 1: 444 1: 445 retl 445 retl 446 mov %g7, %o0 446 mov %g7, %o0 447 447 448 90: /* short_aligned_end */ 448 90: /* short_aligned_end */ 449 bne 88b 449 bne 88b 450 andcc %o2, 8, %g0 450 andcc %o2, 8, %g0 451 451 452 be 1f 452 be 1f 453 andcc %o2, 4, %g0 453 andcc %o2, 4, %g0 454 454 455 ld [%o1 + 0x00], %g2 455 ld [%o1 + 0x00], %g2 456 ld [%o1 + 0x04], %g3 456 ld [%o1 + 0x04], %g3 457 add %o1, 8, %o1 457 add %o1, 8, %o1 458 st %g2, [%o0 + 0x00] 458 st %g2, [%o0 + 0x00] 459 st %g3, [%o0 + 0x04] 459 st %g3, [%o0 + 0x04] 460 add %o0, 8, %o0 460 add %o0, 8, %o0 461 1: 461 1: 462 b 81b 462 b 81b 463 mov %o2, %g1 463 mov %o2, %g1
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.