diff options
author | David S. Miller <davem@davemloft.net> | 2011-10-19 18:30:14 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-10-20 18:17:22 -0400 |
commit | 21f74d361dfd6a7d0e47574e315f780d8172084a (patch) | |
tree | 85649c0b54a6f9deab58bc06b259712edaa78c0f /arch/sparc/lib/memcpy.S | |
parent | 045b7de9ca0cf09f1adc3efa467f668b89238390 (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.S | 179 |
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 |
237 | 2: | 237 | 2: |
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 |
252 | 3: | 253 | 3: |
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 | ||
265 | 79: /* memcpy_table */ | 266 | 79: /* 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 | ||
332 | 83: /* amemcpy_table */ | 334 | 83: /* amemcpy_table */ |
333 | 335 | ||
@@ -376,124 +378,127 @@ FUNC(memcpy) /* %o0=dst %o1=src %o2=len */ | |||
376 | 86: /* non_aligned */ | 378 | 86: /* 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 |
391 | 60: | 396 | 60: |
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] |
399 | 61: | 404 | 61: |
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 |
420 | 2: | 425 | 2: |
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 |
427 | 3: | 432 | 3: |
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 |
434 | 4: | 439 | 4: |
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 |
444 | 5: | 449 | 5: |
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] |
449 | 7: | 454 | 7: |
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] |
455 | 8: | 460 | 8: |
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] |
461 | 9: | 466 | 9: |
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 |
472 | 10: | 477 | 10: |
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] |
489 | 1: | 494 | 1: |
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] |
494 | 1: | 499 | 1: |
495 | retl | 500 | ret |
496 | RETL_INSN | 501 | restore %g0, %g0, %o0 |
497 | 502 | ||
498 | 88: /* short_end */ | 503 | 88: /* short_end */ |
499 | 504 | ||