aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sparc/lib/memcpy.S
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2011-10-19 18:30:14 -0400
committerDavid S. Miller <davem@davemloft.net>2011-10-20 18:17:22 -0400
commit21f74d361dfd6a7d0e47574e315f780d8172084a (patch)
tree85649c0b54a6f9deab58bc06b259712edaa78c0f /arch/sparc/lib/memcpy.S
parent045b7de9ca0cf09f1adc3efa467f668b89238390 (diff)
sparc32: Remove uses of %g7 in memcpy implementation.
This is setting things up so that we can correct the return value, so that it properly returns the original destination buffer pointer. Signed-off-by: David S. Miller <davem@davemloft.net> Tested-by: Kjetil Oftedal <oftedal@gmail.com>
Diffstat (limited to 'arch/sparc/lib/memcpy.S')
-rw-r--r--arch/sparc/lib/memcpy.S179
1 files changed, 92 insertions, 87 deletions
diff --git a/arch/sparc/lib/memcpy.S b/arch/sparc/lib/memcpy.S
index 6a8ef5d8daf0..90a598846bab 100644
--- a/arch/sparc/lib/memcpy.S
+++ b/arch/sparc/lib/memcpy.S
@@ -235,7 +235,7 @@ FUNC(memcpy) /* %o0=dst %o1=src %o2=len */
235 add %o1, 4, %o1 235 add %o1, 4, %o1
236 add %o0, 4, %o0 236 add %o0, 4, %o0
2372: 2372:
238 andcc %g1, 0xffffff80, %g7 238 andcc %g1, 0xffffff80, %g0
239 be 3f 239 be 3f
240 andcc %o0, 4, %g0 240 andcc %o0, 4, %g0
241 241
@@ -245,22 +245,23 @@ FUNC(memcpy) /* %o0=dst %o1=src %o2=len */
245 MOVE_BIGCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5) 245 MOVE_BIGCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
246 MOVE_BIGCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5) 246 MOVE_BIGCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
247 MOVE_BIGCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5) 247 MOVE_BIGCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
248 subcc %g7, 128, %g7 248 sub %g1, 128, %g1
249 add %o1, 128, %o1 249 add %o1, 128, %o1
250 bne 5b 250 cmp %g1, 128
251 bge 5b
251 add %o0, 128, %o0 252 add %o0, 128, %o0
2523: 2533:
253 andcc %g1, 0x70, %g7 254 andcc %g1, 0x70, %g4
254 be 80f 255 be 80f
255 andcc %g1, 8, %g0 256 andcc %g1, 8, %g0
256 257
257 sethi %hi(80f), %o5 258 sethi %hi(80f), %o5
258 srl %g7, 1, %o4 259 srl %g4, 1, %o4
259 add %g7, %o4, %o4 260 add %g4, %o4, %o4
260 add %o1, %g7, %o1 261 add %o1, %g4, %o1
261 sub %o5, %o4, %o5 262 sub %o5, %o4, %o5
262 jmpl %o5 + %lo(80f), %g0 263 jmpl %o5 + %lo(80f), %g0
263 add %o0, %g7, %o0 264 add %o0, %g4, %o0
264 265
26579: /* memcpy_table */ 26679: /* memcpy_table */
266 267
@@ -314,20 +315,21 @@ FUNC(memcpy) /* %o0=dst %o1=src %o2=len */
314 MOVE_BIGALIGNCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5) 315 MOVE_BIGALIGNCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
315 MOVE_BIGALIGNCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5) 316 MOVE_BIGALIGNCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
316 MOVE_BIGALIGNCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5) 317 MOVE_BIGALIGNCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
317 subcc %g7, 128, %g7 318 subcc %g1, 128, %g1
318 add %o1, 128, %o1 319 add %o1, 128, %o1
319 bne 82b 320 cmp %g1, 128
321 bge 82b
320 add %o0, 128, %o0 322 add %o0, 128, %o0
321 323
322 andcc %g1, 0x70, %g7 324 andcc %g1, 0x70, %g4
323 be 84f 325 be 84f
324 andcc %g1, 8, %g0 326 andcc %g1, 8, %g0
325 327
326 sethi %hi(84f), %o5 328 sethi %hi(84f), %o5
327 add %o1, %g7, %o1 329 add %o1, %g4, %o1
328 sub %o5, %g7, %o5 330 sub %o5, %g4, %o5
329 jmpl %o5 + %lo(84f), %g0 331 jmpl %o5 + %lo(84f), %g0
330 add %o0, %g7, %o0 332 add %o0, %g4, %o0
331 333
33283: /* amemcpy_table */ 33483: /* amemcpy_table */
333 335
@@ -376,124 +378,127 @@ FUNC(memcpy) /* %o0=dst %o1=src %o2=len */
37686: /* non_aligned */ 37886: /* non_aligned */
377 cmp %o2, 6 379 cmp %o2, 6
378 bleu 88f 380 bleu 88f
379 andcc %o0, 3, %g0 381 nop
382
383 save %sp, -96, %sp
384 andcc %i0, 3, %g0
380 be 61f 385 be 61f
381 andcc %o0, 1, %g0 386 andcc %i0, 1, %g0
382 be 60f 387 be 60f
383 andcc %o0, 2, %g0 388 andcc %i0, 2, %g0
384 389
385 ldub [%o1], %g5 390 ldub [%i1], %g5
386 add %o1, 1, %o1 391 add %i1, 1, %i1
387 stb %g5, [%o0] 392 stb %g5, [%i0]
388 sub %o2, 1, %o2 393 sub %i2, 1, %i2
389 bne 61f 394 bne 61f
390 add %o0, 1, %o0 395 add %i0, 1, %i0
39160: 39660:
392 ldub [%o1], %g3 397 ldub [%i1], %g3
393 add %o1, 2, %o1 398 add %i1, 2, %i1
394 stb %g3, [%o0] 399 stb %g3, [%i0]
395 sub %o2, 2, %o2 400 sub %i2, 2, %i2
396 ldub [%o1 - 1], %g3 401 ldub [%i1 - 1], %g3
397 add %o0, 2, %o0 402 add %i0, 2, %i0
398 stb %g3, [%o0 - 1] 403 stb %g3, [%i0 - 1]
39961: 40461:
400 and %o1, 3, %g2 405 and %i1, 3, %g2
401 and %o2, 0xc, %g3 406 and %i2, 0xc, %g3
402 and %o1, -4, %o1 407 and %i1, -4, %i1
403 cmp %g3, 4 408 cmp %g3, 4
404 sll %g2, 3, %g4 409 sll %g2, 3, %g4
405 mov 32, %g2 410 mov 32, %g2
406 be 4f 411 be 4f
407 sub %g2, %g4, %g7 412 sub %g2, %g4, %l0
408 413
409 blu 3f 414 blu 3f
410 cmp %g3, 0x8 415 cmp %g3, 0x8
411 416
412 be 2f 417 be 2f
413 srl %o2, 2, %g3 418 srl %i2, 2, %g3
414 419
415 ld [%o1], %o3 420 ld [%i1], %i3
416 add %o0, -8, %o0 421 add %i0, -8, %i0
417 ld [%o1 + 4], %o4 422 ld [%i1 + 4], %i4
418 b 8f 423 b 8f
419 add %g3, 1, %g3 424 add %g3, 1, %g3
4202: 4252:
421 ld [%o1], %o4 426 ld [%i1], %i4
422 add %o0, -12, %o0 427 add %i0, -12, %i0
423 ld [%o1 + 4], %o5 428 ld [%i1 + 4], %i5
424 add %g3, 2, %g3 429 add %g3, 2, %g3
425 b 9f 430 b 9f
426 add %o1, -4, %o1 431 add %i1, -4, %i1
4273: 4323:
428 ld [%o1], %g1 433 ld [%i1], %g1
429 add %o0, -4, %o0 434 add %i0, -4, %i0
430 ld [%o1 + 4], %o3 435 ld [%i1 + 4], %i3
431 srl %o2, 2, %g3 436 srl %i2, 2, %g3
432 b 7f 437 b 7f
433 add %o1, 4, %o1 438 add %i1, 4, %i1
4344: 4394:
435 ld [%o1], %o5 440 ld [%i1], %i5
436 cmp %o2, 7 441 cmp %i2, 7
437 ld [%o1 + 4], %g1 442 ld [%i1 + 4], %g1
438 srl %o2, 2, %g3 443 srl %i2, 2, %g3
439 bleu 10f 444 bleu 10f
440 add %o1, 8, %o1 445 add %i1, 8, %i1
441 446
442 ld [%o1], %o3 447 ld [%i1], %i3
443 add %g3, -1, %g3 448 add %g3, -1, %g3
4445: 4495:
445 sll %o5, %g4, %g2 450 sll %i5, %g4, %g2
446 srl %g1, %g7, %g5 451 srl %g1, %l0, %g5
447 or %g2, %g5, %g2 452 or %g2, %g5, %g2
448 st %g2, [%o0] 453 st %g2, [%i0]
4497: 4547:
450 ld [%o1 + 4], %o4 455 ld [%i1 + 4], %i4
451 sll %g1, %g4, %g2 456 sll %g1, %g4, %g2
452 srl %o3, %g7, %g5 457 srl %i3, %l0, %g5
453 or %g2, %g5, %g2 458 or %g2, %g5, %g2
454 st %g2, [%o0 + 4] 459 st %g2, [%i0 + 4]
4558: 4608:
456 ld [%o1 + 8], %o5 461 ld [%i1 + 8], %i5
457 sll %o3, %g4, %g2 462 sll %i3, %g4, %g2
458 srl %o4, %g7, %g5 463 srl %i4, %l0, %g5
459 or %g2, %g5, %g2 464 or %g2, %g5, %g2
460 st %g2, [%o0 + 8] 465 st %g2, [%i0 + 8]
4619: 4669:
462 ld [%o1 + 12], %g1 467 ld [%i1 + 12], %g1
463 sll %o4, %g4, %g2 468 sll %i4, %g4, %g2
464 srl %o5, %g7, %g5 469 srl %i5, %l0, %g5
465 addcc %g3, -4, %g3 470 addcc %g3, -4, %g3
466 or %g2, %g5, %g2 471 or %g2, %g5, %g2
467 add %o1, 16, %o1 472 add %i1, 16, %i1
468 st %g2, [%o0 + 12] 473 st %g2, [%i0 + 12]
469 add %o0, 16, %o0 474 add %i0, 16, %i0
470 bne,a 5b 475 bne,a 5b
471 ld [%o1], %o3 476 ld [%i1], %i3
47210: 47710:
473 sll %o5, %g4, %g2 478 sll %i5, %g4, %g2
474 srl %g1, %g7, %g5 479 srl %g1, %l0, %g5
475 srl %g7, 3, %g3 480 srl %l0, 3, %g3
476 or %g2, %g5, %g2 481 or %g2, %g5, %g2
477 sub %o1, %g3, %o1 482 sub %i1, %g3, %i1
478 andcc %o2, 2, %g0 483 andcc %i2, 2, %g0
479 st %g2, [%o0] 484 st %g2, [%i0]
480 be 1f 485 be 1f
481 andcc %o2, 1, %g0 486 andcc %i2, 1, %g0
482 487
483 ldub [%o1], %g2 488 ldub [%i1], %g2
484 add %o1, 2, %o1 489 add %i1, 2, %i1
485 stb %g2, [%o0 + 4] 490 stb %g2, [%i0 + 4]
486 add %o0, 2, %o0 491 add %i0, 2, %i0
487 ldub [%o1 - 1], %g2 492 ldub [%i1 - 1], %g2
488 stb %g2, [%o0 + 3] 493 stb %g2, [%i0 + 3]
4891: 4941:
490 be 1f 495 be 1f
491 nop 496 nop
492 ldub [%o1], %g2 497 ldub [%i1], %g2
493 stb %g2, [%o0 + 4] 498 stb %g2, [%i0 + 4]
4941: 4991:
495 retl 500 ret
496 RETL_INSN 501 restore %g0, %g0, %o0
497 502
49888: /* short_end */ 50388: /* short_end */
499 504