Commit 83f89ca755c9f783b8229d968c4e9d2c660ca427

Authored by Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc:
  sparc64: Fix masking and shifting in VIS fpcmp emulation.
  sparc32: Correct the return value of memcpy.
  sparc32: Remove uses of %g7 in memcpy implementation.
  sparc32: Remove non-kernel code from memcpy implementation.

Showing 2 changed files Side-by-side Diff

arch/sparc/kernel/visemul.c
... ... @@ -713,17 +713,17 @@
713 713 s16 b = (rs2 >> (i * 16)) & 0xffff;
714 714  
715 715 if (a > b)
716   - rd_val |= 1 << i;
  716 + rd_val |= 8 >> i;
717 717 }
718 718 break;
719 719  
720 720 case FCMPGT32_OPF:
721 721 for (i = 0; i < 2; i++) {
722   - s32 a = (rs1 >> (i * 32)) & 0xffff;
723   - s32 b = (rs2 >> (i * 32)) & 0xffff;
  722 + s32 a = (rs1 >> (i * 32)) & 0xffffffff;
  723 + s32 b = (rs2 >> (i * 32)) & 0xffffffff;
724 724  
725 725 if (a > b)
726   - rd_val |= 1 << i;
  726 + rd_val |= 2 >> i;
727 727 }
728 728 break;
729 729  
730 730  
731 731  
... ... @@ -733,17 +733,17 @@
733 733 s16 b = (rs2 >> (i * 16)) & 0xffff;
734 734  
735 735 if (a <= b)
736   - rd_val |= 1 << i;
  736 + rd_val |= 8 >> i;
737 737 }
738 738 break;
739 739  
740 740 case FCMPLE32_OPF:
741 741 for (i = 0; i < 2; i++) {
742   - s32 a = (rs1 >> (i * 32)) & 0xffff;
743   - s32 b = (rs2 >> (i * 32)) & 0xffff;
  742 + s32 a = (rs1 >> (i * 32)) & 0xffffffff;
  743 + s32 b = (rs2 >> (i * 32)) & 0xffffffff;
744 744  
745 745 if (a <= b)
746   - rd_val |= 1 << i;
  746 + rd_val |= 2 >> i;
747 747 }
748 748 break;
749 749  
750 750  
751 751  
... ... @@ -753,17 +753,17 @@
753 753 s16 b = (rs2 >> (i * 16)) & 0xffff;
754 754  
755 755 if (a != b)
756   - rd_val |= 1 << i;
  756 + rd_val |= 8 >> i;
757 757 }
758 758 break;
759 759  
760 760 case FCMPNE32_OPF:
761 761 for (i = 0; i < 2; i++) {
762   - s32 a = (rs1 >> (i * 32)) & 0xffff;
763   - s32 b = (rs2 >> (i * 32)) & 0xffff;
  762 + s32 a = (rs1 >> (i * 32)) & 0xffffffff;
  763 + s32 b = (rs2 >> (i * 32)) & 0xffffffff;
764 764  
765 765 if (a != b)
766   - rd_val |= 1 << i;
  766 + rd_val |= 2 >> i;
767 767 }
768 768 break;
769 769  
770 770  
771 771  
... ... @@ -773,17 +773,17 @@
773 773 s16 b = (rs2 >> (i * 16)) & 0xffff;
774 774  
775 775 if (a == b)
776   - rd_val |= 1 << i;
  776 + rd_val |= 8 >> i;
777 777 }
778 778 break;
779 779  
780 780 case FCMPEQ32_OPF:
781 781 for (i = 0; i < 2; i++) {
782   - s32 a = (rs1 >> (i * 32)) & 0xffff;
783   - s32 b = (rs2 >> (i * 32)) & 0xffff;
  782 + s32 a = (rs1 >> (i * 32)) & 0xffffffff;
  783 + s32 b = (rs2 >> (i * 32)) & 0xffffffff;
784 784  
785 785 if (a == b)
786   - rd_val |= 1 << i;
  786 + rd_val |= 2 >> i;
787 787 }
788 788 break;
789 789 }
arch/sparc/lib/memcpy.S
Changes suppressed. Click to show
... ... @@ -7,40 +7,12 @@
7 7 * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
8 8 */
9 9  
10   -#ifdef __KERNEL__
11   -
12   -#define FUNC(x) \
  10 +#define FUNC(x) \
13 11 .globl x; \
14 12 .type x,@function; \
15   - .align 4; \
  13 + .align 4; \
16 14 x:
17 15  
18   -#undef FASTER_REVERSE
19   -#undef FASTER_NONALIGNED
20   -#define FASTER_ALIGNED
21   -
22   -/* In kernel these functions don't return a value.
23   - * One should use macros in asm/string.h for that purpose.
24   - * We return 0, so that bugs are more apparent.
25   - */
26   -#define SETUP_RETL
27   -#define RETL_INSN clr %o0
28   -
29   -#else
30   -
31   -/* libc */
32   -
33   -#include "DEFS.h"
34   -
35   -#define FASTER_REVERSE
36   -#define FASTER_NONALIGNED
37   -#define FASTER_ALIGNED
38   -
39   -#define SETUP_RETL mov %o0, %g6
40   -#define RETL_INSN mov %g6, %o0
41   -
42   -#endif
43   -
44 16 /* Both these macros have to start with exactly the same insn */
45 17 #define MOVE_BIGCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \
46 18 ldd [%src + (offset) + 0x00], %t0; \
... ... @@ -164,30 +136,6 @@
164 136 .text
165 137 .align 4
166 138  
167   -#ifdef FASTER_REVERSE
168   -
169   -70: /* rdword_align */
170   -
171   - andcc %o1, 1, %g0
172   - be 4f
173   - andcc %o1, 2, %g0
174   -
175   - ldub [%o1 - 1], %g2
176   - sub %o1, 1, %o1
177   - stb %g2, [%o0 - 1]
178   - sub %o2, 1, %o2
179   - be 3f
180   - sub %o0, 1, %o0
181   -4:
182   - lduh [%o1 - 2], %g2
183   - sub %o1, 2, %o1
184   - sth %g2, [%o0 - 2]
185   - sub %o2, 2, %o2
186   - b 3f
187   - sub %o0, 2, %o0
188   -
189   -#endif /* FASTER_REVERSE */
190   -
191 139 0:
192 140 retl
193 141 nop ! Only bcopy returns here and it retuns void...
... ... @@ -198,7 +146,7 @@
198 146 #endif
199 147 FUNC(memmove)
200 148 cmp %o0, %o1
201   - SETUP_RETL
  149 + mov %o0, %g7
202 150 bleu 9f
203 151 sub %o0, %o1, %o4
204 152  
... ... @@ -207,8 +155,6 @@
207 155 bleu 0f
208 156 andcc %o4, 3, %o5
209 157  
210   -#ifndef FASTER_REVERSE
211   -
212 158 add %o1, %o2, %o1
213 159 add %o0, %o2, %o0
214 160 sub %o1, 1, %o1
215 161  
... ... @@ -224,296 +170,8 @@
224 170 sub %o0, 1, %o0
225 171  
226 172 retl
227   - RETL_INSN
  173 + mov %g7, %o0
228 174  
229   -#else /* FASTER_REVERSE */
230   -
231   - add %o1, %o2, %o1
232   - add %o0, %o2, %o0
233   - bne 77f
234   - cmp %o2, 15
235   - bleu 91f
236   - andcc %o1, 3, %g0
237   - bne 70b
238   -3:
239   - andcc %o1, 4, %g0
240   -
241   - be 2f
242   - mov %o2, %g1
243   -
244   - ld [%o1 - 4], %o4
245   - sub %g1, 4, %g1
246   - st %o4, [%o0 - 4]
247   - sub %o1, 4, %o1
248   - sub %o0, 4, %o0
249   -2:
250   - andcc %g1, 0xffffff80, %g7
251   - be 3f
252   - andcc %o0, 4, %g0
253   -
254   - be 74f + 4
255   -5:
256   - RMOVE_BIGCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5)
257   - RMOVE_BIGCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
258   - RMOVE_BIGCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
259   - RMOVE_BIGCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
260   - subcc %g7, 128, %g7
261   - sub %o1, 128, %o1
262   - bne 5b
263   - sub %o0, 128, %o0
264   -3:
265   - andcc %g1, 0x70, %g7
266   - be 72f
267   - andcc %g1, 8, %g0
268   -
269   - sethi %hi(72f), %o5
270   - srl %g7, 1, %o4
271   - add %g7, %o4, %o4
272   - sub %o1, %g7, %o1
273   - sub %o5, %o4, %o5
274   - jmpl %o5 + %lo(72f), %g0
275   - sub %o0, %g7, %o0
276   -
277   -71: /* rmemcpy_table */
278   - RMOVE_LASTCHUNK(o1, o0, 0x60, g2, g3, g4, g5)
279   - RMOVE_LASTCHUNK(o1, o0, 0x50, g2, g3, g4, g5)
280   - RMOVE_LASTCHUNK(o1, o0, 0x40, g2, g3, g4, g5)
281   - RMOVE_LASTCHUNK(o1, o0, 0x30, g2, g3, g4, g5)
282   - RMOVE_LASTCHUNK(o1, o0, 0x20, g2, g3, g4, g5)
283   - RMOVE_LASTCHUNK(o1, o0, 0x10, g2, g3, g4, g5)
284   - RMOVE_LASTCHUNK(o1, o0, 0x00, g2, g3, g4, g5)
285   -
286   -72: /* rmemcpy_table_end */
287   -
288   - be 73f
289   - andcc %g1, 4, %g0
290   -
291   - ldd [%o1 - 0x08], %g2
292   - sub %o0, 8, %o0
293   - sub %o1, 8, %o1
294   - st %g2, [%o0]
295   - st %g3, [%o0 + 0x04]
296   -
297   -73: /* rmemcpy_last7 */
298   -
299   - be 1f
300   - andcc %g1, 2, %g0
301   -
302   - ld [%o1 - 4], %g2
303   - sub %o1, 4, %o1
304   - st %g2, [%o0 - 4]
305   - sub %o0, 4, %o0
306   -1:
307   - be 1f
308   - andcc %g1, 1, %g0
309   -
310   - lduh [%o1 - 2], %g2
311   - sub %o1, 2, %o1
312   - sth %g2, [%o0 - 2]
313   - sub %o0, 2, %o0
314   -1:
315   - be 1f
316   - nop
317   -
318   - ldub [%o1 - 1], %g2
319   - stb %g2, [%o0 - 1]
320   -1:
321   - retl
322   - RETL_INSN
323   -
324   -74: /* rldd_std */
325   - RMOVE_BIGALIGNCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5)
326   - RMOVE_BIGALIGNCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
327   - RMOVE_BIGALIGNCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
328   - RMOVE_BIGALIGNCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
329   - subcc %g7, 128, %g7
330   - sub %o1, 128, %o1
331   - bne 74b
332   - sub %o0, 128, %o0
333   -
334   - andcc %g1, 0x70, %g7
335   - be 72b
336   - andcc %g1, 8, %g0
337   -
338   - sethi %hi(72b), %o5
339   - srl %g7, 1, %o4
340   - add %g7, %o4, %o4
341   - sub %o1, %g7, %o1
342   - sub %o5, %o4, %o5
343   - jmpl %o5 + %lo(72b), %g0
344   - sub %o0, %g7, %o0
345   -
346   -75: /* rshort_end */
347   -
348   - and %o2, 0xe, %o3
349   -2:
350   - sethi %hi(76f), %o5
351   - sll %o3, 3, %o4
352   - sub %o0, %o3, %o0
353   - sub %o5, %o4, %o5
354   - sub %o1, %o3, %o1
355   - jmpl %o5 + %lo(76f), %g0
356   - andcc %o2, 1, %g0
357   -
358   - RMOVE_SHORTCHUNK(o1, o0, 0x0c, g2, g3)
359   - RMOVE_SHORTCHUNK(o1, o0, 0x0a, g2, g3)
360   - RMOVE_SHORTCHUNK(o1, o0, 0x08, g2, g3)
361   - RMOVE_SHORTCHUNK(o1, o0, 0x06, g2, g3)
362   - RMOVE_SHORTCHUNK(o1, o0, 0x04, g2, g3)
363   - RMOVE_SHORTCHUNK(o1, o0, 0x02, g2, g3)
364   - RMOVE_SHORTCHUNK(o1, o0, 0x00, g2, g3)
365   -
366   -76: /* rshort_table_end */
367   -
368   - be 1f
369   - nop
370   - ldub [%o1 - 1], %g2
371   - stb %g2, [%o0 - 1]
372   -1:
373   - retl
374   - RETL_INSN
375   -
376   -91: /* rshort_aligned_end */
377   -
378   - bne 75b
379   - andcc %o2, 8, %g0
380   -
381   - be 1f
382   - andcc %o2, 4, %g0
383   -
384   - ld [%o1 - 0x08], %g2
385   - ld [%o1 - 0x04], %g3
386   - sub %o1, 8, %o1
387   - st %g2, [%o0 - 0x08]
388   - st %g3, [%o0 - 0x04]
389   - sub %o0, 8, %o0
390   -1:
391   - b 73b
392   - mov %o2, %g1
393   -
394   -77: /* rnon_aligned */
395   - cmp %o2, 15
396   - bleu 75b
397   - andcc %o0, 3, %g0
398   - be 64f
399   - andcc %o0, 1, %g0
400   - be 63f
401   - andcc %o0, 2, %g0
402   - ldub [%o1 - 1], %g5
403   - sub %o1, 1, %o1
404   - stb %g5, [%o0 - 1]
405   - sub %o0, 1, %o0
406   - be 64f
407   - sub %o2, 1, %o2
408   -63:
409   - ldub [%o1 - 1], %g5
410   - sub %o1, 2, %o1
411   - stb %g5, [%o0 - 1]
412   - sub %o0, 2, %o0
413   - ldub [%o1], %g5
414   - sub %o2, 2, %o2
415   - stb %g5, [%o0]
416   -64:
417   - and %o1, 3, %g2
418   - and %o1, -4, %o1
419   - and %o2, 0xc, %g3
420   - add %o1, 4, %o1
421   - cmp %g3, 4
422   - sll %g2, 3, %g4
423   - mov 32, %g2
424   - be 4f
425   - sub %g2, %g4, %g7
426   -
427   - blu 3f
428   - cmp %g3, 8
429   -
430   - be 2f
431   - srl %o2, 2, %g3
432   -
433   - ld [%o1 - 4], %o3
434   - add %o0, -8, %o0
435   - ld [%o1 - 8], %o4
436   - add %o1, -16, %o1
437   - b 7f
438   - add %g3, 1, %g3
439   -2:
440   - ld [%o1 - 4], %o4
441   - add %o0, -4, %o0
442   - ld [%o1 - 8], %g1
443   - add %o1, -12, %o1
444   - b 8f
445   - add %g3, 2, %g3
446   -3:
447   - ld [%o1 - 4], %o5
448   - add %o0, -12, %o0
449   - ld [%o1 - 8], %o3
450   - add %o1, -20, %o1
451   - b 6f
452   - srl %o2, 2, %g3
453   -4:
454   - ld [%o1 - 4], %g1
455   - srl %o2, 2, %g3
456   - ld [%o1 - 8], %o5
457   - add %o1, -24, %o1
458   - add %o0, -16, %o0
459   - add %g3, -1, %g3
460   -
461   - ld [%o1 + 12], %o3
462   -5:
463   - sll %o5, %g4, %g2
464   - srl %g1, %g7, %g5
465   - or %g2, %g5, %g2
466   - st %g2, [%o0 + 12]
467   -6:
468   - ld [%o1 + 8], %o4
469   - sll %o3, %g4, %g2
470   - srl %o5, %g7, %g5
471   - or %g2, %g5, %g2
472   - st %g2, [%o0 + 8]
473   -7:
474   - ld [%o1 + 4], %g1
475   - sll %o4, %g4, %g2
476   - srl %o3, %g7, %g5
477   - or %g2, %g5, %g2
478   - st %g2, [%o0 + 4]
479   -8:
480   - ld [%o1], %o5
481   - sll %g1, %g4, %g2
482   - srl %o4, %g7, %g5
483   - addcc %g3, -4, %g3
484   - or %g2, %g5, %g2
485   - add %o1, -16, %o1
486   - st %g2, [%o0]
487   - add %o0, -16, %o0
488   - bne,a 5b
489   - ld [%o1 + 12], %o3
490   - sll %o5, %g4, %g2
491   - srl %g1, %g7, %g5
492   - srl %g4, 3, %g3
493   - or %g2, %g5, %g2
494   - add %o1, %g3, %o1
495   - andcc %o2, 2, %g0
496   - st %g2, [%o0 + 12]
497   - be 1f
498   - andcc %o2, 1, %g0
499   -
500   - ldub [%o1 + 15], %g5
501   - add %o1, -2, %o1
502   - stb %g5, [%o0 + 11]
503   - add %o0, -2, %o0
504   - ldub [%o1 + 16], %g5
505   - stb %g5, [%o0 + 12]
506   -1:
507   - be 1f
508   - nop
509   - ldub [%o1 + 15], %g5
510   - stb %g5, [%o0 + 11]
511   -1:
512   - retl
513   - RETL_INSN
514   -
515   -#endif /* FASTER_REVERSE */
516   -
517 175 /* NOTE: This code is executed just for the cases,
518 176 where %src (=%o1) & 3 is != 0.
519 177 We need to align it to 4. So, for (%src & 3)
... ... @@ -546,7 +204,7 @@
546 204 FUNC(memcpy) /* %o0=dst %o1=src %o2=len */
547 205  
548 206 sub %o0, %o1, %o4
549   - SETUP_RETL
  207 + mov %o0, %g7
550 208 9:
551 209 andcc %o4, 3, %o5
552 210 0:
... ... @@ -569,7 +227,7 @@
569 227 add %o1, 4, %o1
570 228 add %o0, 4, %o0
571 229 2:
572   - andcc %g1, 0xffffff80, %g7
  230 + andcc %g1, 0xffffff80, %g0
573 231 be 3f
574 232 andcc %o0, 4, %g0
575 233  
576 234  
577 235  
578 236  
579 237  
... ... @@ -579,22 +237,23 @@
579 237 MOVE_BIGCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
580 238 MOVE_BIGCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
581 239 MOVE_BIGCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
582   - subcc %g7, 128, %g7
  240 + sub %g1, 128, %g1
583 241 add %o1, 128, %o1
584   - bne 5b
  242 + cmp %g1, 128
  243 + bge 5b
585 244 add %o0, 128, %o0
586 245 3:
587   - andcc %g1, 0x70, %g7
  246 + andcc %g1, 0x70, %g4
588 247 be 80f
589 248 andcc %g1, 8, %g0
590 249  
591 250 sethi %hi(80f), %o5
592   - srl %g7, 1, %o4
593   - add %g7, %o4, %o4
594   - add %o1, %g7, %o1
  251 + srl %g4, 1, %o4
  252 + add %g4, %o4, %o4
  253 + add %o1, %g4, %o1
595 254 sub %o5, %o4, %o5
596 255 jmpl %o5 + %lo(80f), %g0
597   - add %o0, %g7, %o0
  256 + add %o0, %g4, %o0
598 257  
599 258 79: /* memcpy_table */
600 259  
601 260  
602 261  
603 262  
604 263  
605 264  
... ... @@ -641,43 +300,28 @@
641 300 stb %g2, [%o0]
642 301 1:
643 302 retl
644   - RETL_INSN
  303 + mov %g7, %o0
645 304  
646 305 82: /* ldd_std */
647 306 MOVE_BIGALIGNCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5)
648 307 MOVE_BIGALIGNCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
649 308 MOVE_BIGALIGNCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
650 309 MOVE_BIGALIGNCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
651   - subcc %g7, 128, %g7
  310 + subcc %g1, 128, %g1
652 311 add %o1, 128, %o1
653   - bne 82b
  312 + cmp %g1, 128
  313 + bge 82b
654 314 add %o0, 128, %o0
655 315  
656   -#ifndef FASTER_ALIGNED
657   -
658   - andcc %g1, 0x70, %g7
659   - be 80b
660   - andcc %g1, 8, %g0
661   -
662   - sethi %hi(80b), %o5
663   - srl %g7, 1, %o4
664   - add %g7, %o4, %o4
665   - add %o1, %g7, %o1
666   - sub %o5, %o4, %o5
667   - jmpl %o5 + %lo(80b), %g0
668   - add %o0, %g7, %o0
669   -
670   -#else /* FASTER_ALIGNED */
671   -
672   - andcc %g1, 0x70, %g7
  316 + andcc %g1, 0x70, %g4
673 317 be 84f
674 318 andcc %g1, 8, %g0
675 319  
676 320 sethi %hi(84f), %o5
677   - add %o1, %g7, %o1
678   - sub %o5, %g7, %o5
  321 + add %o1, %g4, %o1
  322 + sub %o5, %g4, %o5
679 323 jmpl %o5 + %lo(84f), %g0
680   - add %o0, %g7, %o0
  324 + add %o0, %g4, %o0
681 325  
682 326 83: /* amemcpy_table */
683 327  
684 328  
685 329  
686 330  
687 331  
688 332  
689 333  
690 334  
691 335  
692 336  
693 337  
694 338  
695 339  
696 340  
697 341  
698 342  
699 343  
700 344  
701 345  
702 346  
703 347  
704 348  
705 349  
706 350  
707 351  
708 352  
709 353  
710 354  
711 355  
712 356  
713 357  
714 358  
715 359  
716 360  
717 361  
718 362  
719 363  
... ... @@ -721,383 +365,133 @@
721 365 stb %g2, [%o0]
722 366 1:
723 367 retl
724   - RETL_INSN
  368 + mov %g7, %o0
725 369  
726   -#endif /* FASTER_ALIGNED */
727   -
728 370 86: /* non_aligned */
729 371 cmp %o2, 6
730 372 bleu 88f
  373 + nop
731 374  
732   -#ifdef FASTER_NONALIGNED
733   -
734   - cmp %o2, 256
735   - bcc 87f
736   -
737   -#endif /* FASTER_NONALIGNED */
738   -
739   - andcc %o0, 3, %g0
  375 + save %sp, -96, %sp
  376 + andcc %i0, 3, %g0
740 377 be 61f
741   - andcc %o0, 1, %g0
  378 + andcc %i0, 1, %g0
742 379 be 60f
743   - andcc %o0, 2, %g0
  380 + andcc %i0, 2, %g0
744 381  
745   - ldub [%o1], %g5
746   - add %o1, 1, %o1
747   - stb %g5, [%o0]
748   - sub %o2, 1, %o2
  382 + ldub [%i1], %g5
  383 + add %i1, 1, %i1
  384 + stb %g5, [%i0]
  385 + sub %i2, 1, %i2
749 386 bne 61f
750   - add %o0, 1, %o0
  387 + add %i0, 1, %i0
751 388 60:
752   - ldub [%o1], %g3
753   - add %o1, 2, %o1
754   - stb %g3, [%o0]
755   - sub %o2, 2, %o2
756   - ldub [%o1 - 1], %g3
757   - add %o0, 2, %o0
758   - stb %g3, [%o0 - 1]
  389 + ldub [%i1], %g3
  390 + add %i1, 2, %i1
  391 + stb %g3, [%i0]
  392 + sub %i2, 2, %i2
  393 + ldub [%i1 - 1], %g3
  394 + add %i0, 2, %i0
  395 + stb %g3, [%i0 - 1]
759 396 61:
760   - and %o1, 3, %g2
761   - and %o2, 0xc, %g3
762   - and %o1, -4, %o1
  397 + and %i1, 3, %g2
  398 + and %i2, 0xc, %g3
  399 + and %i1, -4, %i1
763 400 cmp %g3, 4
764 401 sll %g2, 3, %g4
765 402 mov 32, %g2
766 403 be 4f
767   - sub %g2, %g4, %g7
  404 + sub %g2, %g4, %l0
768 405  
769 406 blu 3f
770 407 cmp %g3, 0x8
771 408  
772 409 be 2f
773   - srl %o2, 2, %g3
  410 + srl %i2, 2, %g3
774 411  
775   - ld [%o1], %o3
776   - add %o0, -8, %o0
777   - ld [%o1 + 4], %o4
  412 + ld [%i1], %i3
  413 + add %i0, -8, %i0
  414 + ld [%i1 + 4], %i4
778 415 b 8f
779 416 add %g3, 1, %g3
780 417 2:
781   - ld [%o1], %o4
782   - add %o0, -12, %o0
783   - ld [%o1 + 4], %o5
  418 + ld [%i1], %i4
  419 + add %i0, -12, %i0
  420 + ld [%i1 + 4], %i5
784 421 add %g3, 2, %g3
785 422 b 9f
786   - add %o1, -4, %o1
  423 + add %i1, -4, %i1
787 424 3:
788   - ld [%o1], %g1
789   - add %o0, -4, %o0
790   - ld [%o1 + 4], %o3
791   - srl %o2, 2, %g3
  425 + ld [%i1], %g1
  426 + add %i0, -4, %i0
  427 + ld [%i1 + 4], %i3
  428 + srl %i2, 2, %g3
792 429 b 7f
793   - add %o1, 4, %o1
  430 + add %i1, 4, %i1
794 431 4:
795   - ld [%o1], %o5
796   - cmp %o2, 7
797   - ld [%o1 + 4], %g1
798   - srl %o2, 2, %g3
  432 + ld [%i1], %i5
  433 + cmp %i2, 7
  434 + ld [%i1 + 4], %g1
  435 + srl %i2, 2, %g3
799 436 bleu 10f
800   - add %o1, 8, %o1
  437 + add %i1, 8, %i1
801 438  
802   - ld [%o1], %o3
  439 + ld [%i1], %i3
803 440 add %g3, -1, %g3
804 441 5:
805   - sll %o5, %g4, %g2
806   - srl %g1, %g7, %g5
  442 + sll %i5, %g4, %g2
  443 + srl %g1, %l0, %g5
807 444 or %g2, %g5, %g2
808   - st %g2, [%o0]
  445 + st %g2, [%i0]
809 446 7:
810   - ld [%o1 + 4], %o4
  447 + ld [%i1 + 4], %i4
811 448 sll %g1, %g4, %g2
812   - srl %o3, %g7, %g5
  449 + srl %i3, %l0, %g5
813 450 or %g2, %g5, %g2
814   - st %g2, [%o0 + 4]
  451 + st %g2, [%i0 + 4]
815 452 8:
816   - ld [%o1 + 8], %o5
817   - sll %o3, %g4, %g2
818   - srl %o4, %g7, %g5
  453 + ld [%i1 + 8], %i5
  454 + sll %i3, %g4, %g2
  455 + srl %i4, %l0, %g5
819 456 or %g2, %g5, %g2
820   - st %g2, [%o0 + 8]
  457 + st %g2, [%i0 + 8]
821 458 9:
822   - ld [%o1 + 12], %g1
823   - sll %o4, %g4, %g2
824   - srl %o5, %g7, %g5
  459 + ld [%i1 + 12], %g1
  460 + sll %i4, %g4, %g2
  461 + srl %i5, %l0, %g5
825 462 addcc %g3, -4, %g3
826 463 or %g2, %g5, %g2
827   - add %o1, 16, %o1
828   - st %g2, [%o0 + 12]
829   - add %o0, 16, %o0
  464 + add %i1, 16, %i1
  465 + st %g2, [%i0 + 12]
  466 + add %i0, 16, %i0
830 467 bne,a 5b
831   - ld [%o1], %o3
  468 + ld [%i1], %i3
832 469 10:
833   - sll %o5, %g4, %g2
834   - srl %g1, %g7, %g5
835   - srl %g7, 3, %g3
  470 + sll %i5, %g4, %g2
  471 + srl %g1, %l0, %g5
  472 + srl %l0, 3, %g3
836 473 or %g2, %g5, %g2
837   - sub %o1, %g3, %o1
838   - andcc %o2, 2, %g0
839   - st %g2, [%o0]
  474 + sub %i1, %g3, %i1
  475 + andcc %i2, 2, %g0
  476 + st %g2, [%i0]
840 477 be 1f
841   - andcc %o2, 1, %g0
  478 + andcc %i2, 1, %g0
842 479  
843   - ldub [%o1], %g2
844   - add %o1, 2, %o1
845   - stb %g2, [%o0 + 4]
846   - add %o0, 2, %o0
847   - ldub [%o1 - 1], %g2
848   - stb %g2, [%o0 + 3]
  480 + ldub [%i1], %g2
  481 + add %i1, 2, %i1
  482 + stb %g2, [%i0 + 4]
  483 + add %i0, 2, %i0
  484 + ldub [%i1 - 1], %g2
  485 + stb %g2, [%i0 + 3]
849 486 1:
850 487 be 1f
851 488 nop
852   - ldub [%o1], %g2
853   - stb %g2, [%o0 + 4]
  489 + ldub [%i1], %g2
  490 + stb %g2, [%i0 + 4]
854 491 1:
855   - retl
856   - RETL_INSN
  492 + ret
  493 + restore %g7, %g0, %o0
857 494  
858   -#ifdef FASTER_NONALIGNED
859   -
860   -87: /* faster_nonaligned */
861   -
862   - andcc %o1, 3, %g0
863   - be 3f
864   - andcc %o1, 1, %g0
865   -
866   - be 4f
867   - andcc %o1, 2, %g0
868   -
869   - ldub [%o1], %g2
870   - add %o1, 1, %o1
871   - stb %g2, [%o0]
872   - sub %o2, 1, %o2
873   - bne 3f
874   - add %o0, 1, %o0
875   -4:
876   - lduh [%o1], %g2
877   - add %o1, 2, %o1
878   - srl %g2, 8, %g3
879   - sub %o2, 2, %o2
880   - stb %g3, [%o0]
881   - add %o0, 2, %o0
882   - stb %g2, [%o0 - 1]
883   -3:
884   - andcc %o1, 4, %g0
885   -
886   - bne 2f
887   - cmp %o5, 1
888   -
889   - ld [%o1], %o4
890   - srl %o4, 24, %g2
891   - stb %g2, [%o0]
892   - srl %o4, 16, %g3
893   - stb %g3, [%o0 + 1]
894   - srl %o4, 8, %g2
895   - stb %g2, [%o0 + 2]
896   - sub %o2, 4, %o2
897   - stb %o4, [%o0 + 3]
898   - add %o1, 4, %o1
899   - add %o0, 4, %o0
900   -2:
901   - be 33f
902   - cmp %o5, 2
903   - be 32f
904   - sub %o2, 4, %o2
905   -31:
906   - ld [%o1], %g2
907   - add %o1, 4, %o1
908   - srl %g2, 24, %g3
909   - and %o0, 7, %g5
910   - stb %g3, [%o0]
911   - cmp %g5, 7
912   - sll %g2, 8, %g1
913   - add %o0, 4, %o0
914   - be 41f
915   - and %o2, 0xffffffc0, %o3
916   - ld [%o0 - 7], %o4
917   -4:
918   - SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
919   - SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
920   - SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
921   - SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
922   - subcc %o3, 64, %o3
923   - add %o1, 64, %o1
924   - bne 4b
925   - add %o0, 64, %o0
926   -
927   - andcc %o2, 0x30, %o3
928   - be,a 1f
929   - srl %g1, 16, %g2
930   -4:
931   - SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
932   - subcc %o3, 16, %o3
933   - add %o1, 16, %o1
934   - bne 4b
935   - add %o0, 16, %o0
936   -
937   - srl %g1, 16, %g2
938   -1:
939   - st %o4, [%o0 - 7]
940   - sth %g2, [%o0 - 3]
941   - srl %g1, 8, %g4
942   - b 88f
943   - stb %g4, [%o0 - 1]
944   -32:
945   - ld [%o1], %g2
946   - add %o1, 4, %o1
947   - srl %g2, 16, %g3
948   - and %o0, 7, %g5
949   - sth %g3, [%o0]
950   - cmp %g5, 6
951   - sll %g2, 16, %g1
952   - add %o0, 4, %o0
953   - be 42f
954   - and %o2, 0xffffffc0, %o3
955   - ld [%o0 - 6], %o4
956   -4:
957   - SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
958   - SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
959   - SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
960   - SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
961   - subcc %o3, 64, %o3
962   - add %o1, 64, %o1
963   - bne 4b
964   - add %o0, 64, %o0
965   -
966   - andcc %o2, 0x30, %o3
967   - be,a 1f
968   - srl %g1, 16, %g2
969   -4:
970   - SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
971   - subcc %o3, 16, %o3
972   - add %o1, 16, %o1
973   - bne 4b
974   - add %o0, 16, %o0
975   -
976   - srl %g1, 16, %g2
977   -1:
978   - st %o4, [%o0 - 6]
979   - b 88f
980   - sth %g2, [%o0 - 2]
981   -33:
982   - ld [%o1], %g2
983   - sub %o2, 4, %o2
984   - srl %g2, 24, %g3
985   - and %o0, 7, %g5
986   - stb %g3, [%o0]
987   - cmp %g5, 5
988   - srl %g2, 8, %g4
989   - sll %g2, 24, %g1
990   - sth %g4, [%o0 + 1]
991   - add %o1, 4, %o1
992   - be 43f
993   - and %o2, 0xffffffc0, %o3
994   -
995   - ld [%o0 - 1], %o4
996   - add %o0, 4, %o0
997   -4:
998   - SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, -1)
999   - SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, -1)
1000   - SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, -1)
1001   - SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, -1)
1002   - subcc %o3, 64, %o3
1003   - add %o1, 64, %o1
1004   - bne 4b
1005   - add %o0, 64, %o0
1006   -
1007   - andcc %o2, 0x30, %o3
1008   - be,a 1f
1009   - srl %g1, 24, %g2
1010   -4:
1011   - SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, -1)
1012   - subcc %o3, 16, %o3
1013   - add %o1, 16, %o1
1014   - bne 4b
1015   - add %o0, 16, %o0
1016   -
1017   - srl %g1, 24, %g2
1018   -1:
1019   - st %o4, [%o0 - 5]
1020   - b 88f
1021   - stb %g2, [%o0 - 1]
1022   -41:
1023   - SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
1024   - SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
1025   - SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
1026   - SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
1027   - subcc %o3, 64, %o3
1028   - add %o1, 64, %o1
1029   - bne 41b
1030   - add %o0, 64, %o0
1031   -
1032   - andcc %o2, 0x30, %o3
1033   - be,a 1f
1034   - srl %g1, 16, %g2
1035   -4:
1036   - SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
1037   - subcc %o3, 16, %o3
1038   - add %o1, 16, %o1
1039   - bne 4b
1040   - add %o0, 16, %o0
1041   -
1042   - srl %g1, 16, %g2
1043   -1:
1044   - sth %g2, [%o0 - 3]
1045   - srl %g1, 8, %g4
1046   - b 88f
1047   - stb %g4, [%o0 - 1]
1048   -43:
1049   - SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, 3)
1050   - SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, 3)
1051   - SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, 3)
1052   - SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, 3)
1053   - subcc %o3, 64, %o3
1054   - add %o1, 64, %o1
1055   - bne 43b
1056   - add %o0, 64, %o0
1057   -
1058   - andcc %o2, 0x30, %o3
1059   - be,a 1f
1060   - srl %g1, 24, %g2
1061   -4:
1062   - SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, 3)
1063   - subcc %o3, 16, %o3
1064   - add %o1, 16, %o1
1065   - bne 4b
1066   - add %o0, 16, %o0
1067   -
1068   - srl %g1, 24, %g2
1069   -1:
1070   - stb %g2, [%o0 + 3]
1071   - b 88f
1072   - add %o0, 4, %o0
1073   -42:
1074   - SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
1075   - SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
1076   - SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
1077   - SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
1078   - subcc %o3, 64, %o3
1079   - add %o1, 64, %o1
1080   - bne 42b
1081   - add %o0, 64, %o0
1082   -
1083   - andcc %o2, 0x30, %o3
1084   - be,a 1f
1085   - srl %g1, 16, %g2
1086   -4:
1087   - SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
1088   - subcc %o3, 16, %o3
1089   - add %o1, 16, %o1
1090   - bne 4b
1091   - add %o0, 16, %o0
1092   -
1093   - srl %g1, 16, %g2
1094   -1:
1095   - sth %g2, [%o0 - 2]
1096   -
1097   - /* Fall through */
1098   -
1099   -#endif /* FASTER_NONALIGNED */
1100   -
1101 495 88: /* short_end */
1102 496  
1103 497 and %o2, 0xe, %o3
... ... @@ -1127,7 +521,7 @@
1127 521 stb %g2, [%o0]
1128 522 1:
1129 523 retl
1130   - RETL_INSN
  524 + mov %g7, %o0
1131 525  
1132 526 90: /* short_aligned_end */
1133 527 bne 88b