1 /* Copyright (C) 2012-2018 Free Software Foundation, Inc.
3 This file is part of GCC.
5 GCC is free software; you can redistribute it and/or modify it
6 under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3, or (at your option)
10 GCC is distributed in the hope that it will be useful, but WITHOUT
11 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
13 License for more details.
15 Under Section 7 of GPL version 3, you are granted additional
16 permissions described in the GCC Runtime Library Exception, version
17 3.1, as published by the Free Software Foundation.
19 You should have received a copy of the GNU General Public License and
20 a copy of the GCC Runtime Library Exception along with this program;
21 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
22 <http://www.gnu.org/licenses/>. */
24 /* This file must be kept in sync with newlib/libc/machine/visium/memcpy.c */
29 #define INST_BARRIER __asm__ __volatile__ ("":::"memory");
31 #define MOVE_32_OBJECTS(in,out) \
110 #define MOVE_16_OBJECTS(in,out) \
153 #define MOVE_12_OBJECTS(in,out) \
187 #define MOVE_11_OBJECTS(in,out) \
219 #define MOVE_10_OBJECTS(in,out) \
248 #define MOVE_9_OBJECTS(in,out) \
275 #define MOVE_8_OBJECTS(in,out) \
300 #define MOVE_7_OBJECTS(in,out) \
323 #define MOVE_6_OBJECTS(in,out) \
345 #define MOVE_5_OBJECTS(in,out) \
365 #define MOVE_4_OBJECTS(in,out) \
381 #define MOVE_3_OBJECTS(in,out) \
395 #define MOVE_2_OBJECTS(in,out) \
407 #define MOVE_1_OBJECT(in,out) \
419 __int_memcpy (void *__restrict s1
, const void *__restrict s2
, size_t n
)
428 /* This code currently give a stall for any value with a 1->2 in the low 5
429 bits, i.e. 1,2, 33,34 ? not acceptable! */
430 switch (value
& 0x1f)
435 MOVE_1_OBJECT (in
, out
);
438 MOVE_2_OBJECTS (in
, out
);
441 MOVE_3_OBJECTS (in
, out
);
444 MOVE_4_OBJECTS (in
, out
);
447 MOVE_5_OBJECTS (in
, out
);
450 MOVE_6_OBJECTS (in
, out
);
453 MOVE_7_OBJECTS (in
, out
);
456 MOVE_8_OBJECTS (in
, out
);
459 MOVE_9_OBJECTS (in
, out
);
462 MOVE_10_OBJECTS (in
, out
);
465 MOVE_11_OBJECTS (in
, out
);
468 MOVE_12_OBJECTS (in
, out
);
471 MOVE_9_OBJECTS (in
, out
);
472 MOVE_4_OBJECTS (in
, out
);
475 MOVE_12_OBJECTS (in
, out
);
476 MOVE_2_OBJECTS (in
, out
);
479 MOVE_11_OBJECTS (in
, out
);
480 MOVE_4_OBJECTS (in
, out
);
483 MOVE_16_OBJECTS (in
, out
);
486 MOVE_11_OBJECTS (in
, out
);
487 MOVE_6_OBJECTS (in
, out
);
490 MOVE_9_OBJECTS (in
, out
);
491 MOVE_9_OBJECTS (in
, out
);
494 MOVE_16_OBJECTS (in
, out
);
495 MOVE_3_OBJECTS (in
, out
);
498 MOVE_16_OBJECTS (in
, out
);
499 MOVE_4_OBJECTS (in
, out
);
502 MOVE_16_OBJECTS (in
, out
);
503 MOVE_5_OBJECTS (in
, out
);
506 MOVE_16_OBJECTS (in
, out
);
507 MOVE_6_OBJECTS (in
, out
);
510 MOVE_16_OBJECTS (in
, out
);
511 MOVE_7_OBJECTS (in
, out
);
514 MOVE_16_OBJECTS (in
, out
);
515 MOVE_8_OBJECTS (in
, out
);
518 MOVE_16_OBJECTS (in
, out
);
519 MOVE_9_OBJECTS (in
, out
);
522 MOVE_16_OBJECTS (in
, out
);
523 MOVE_10_OBJECTS (in
, out
);
526 MOVE_16_OBJECTS (in
, out
);
527 MOVE_11_OBJECTS (in
, out
);
530 MOVE_16_OBJECTS (in
, out
);
531 MOVE_8_OBJECTS (in
, out
);
532 MOVE_4_OBJECTS (in
, out
);
535 MOVE_16_OBJECTS (in
, out
);
536 MOVE_9_OBJECTS (in
, out
);
537 MOVE_4_OBJECTS (in
, out
);
540 MOVE_16_OBJECTS (in
, out
);
541 MOVE_12_OBJECTS (in
, out
);
542 MOVE_2_OBJECTS (in
, out
);
545 MOVE_16_OBJECTS (in
, out
);
546 MOVE_11_OBJECTS (in
, out
);
547 MOVE_4_OBJECTS (in
, out
);
551 /* This loop governs the asmptoptic behaviour of this algorithm, for long
554 for (loop_var
= 0; loop_var
< count
; loop_var
++)
555 MOVE_32_OBJECTS (in
, out
);
559 __shrt_int_memcpy (void *__restrict s1
, const void *__restrict s2
, size_t n
)
563 const short int *in
= s2
;
568 /* This code currently give a stall for any value with a 1->2 in the low 5
569 bits, i.e. 1,2, 33,34 ? not acceptable! */
570 switch (value
& 0x1f)
575 MOVE_1_OBJECT (in
, out
);
578 MOVE_2_OBJECTS (in
, out
);
581 MOVE_3_OBJECTS (in
, out
);
584 MOVE_4_OBJECTS (in
, out
);
587 MOVE_5_OBJECTS (in
, out
);
590 MOVE_6_OBJECTS (in
, out
);
593 MOVE_7_OBJECTS (in
, out
);
596 MOVE_8_OBJECTS (in
, out
);
599 MOVE_9_OBJECTS (in
, out
);
602 MOVE_10_OBJECTS (in
, out
);
605 MOVE_11_OBJECTS (in
, out
);
608 MOVE_12_OBJECTS (in
, out
);
611 MOVE_9_OBJECTS (in
, out
);
612 MOVE_4_OBJECTS (in
, out
);
615 MOVE_12_OBJECTS (in
, out
);
616 MOVE_2_OBJECTS (in
, out
);
619 MOVE_11_OBJECTS (in
, out
);
620 MOVE_4_OBJECTS (in
, out
);
623 MOVE_16_OBJECTS (in
, out
);
626 MOVE_11_OBJECTS (in
, out
);
627 MOVE_6_OBJECTS (in
, out
);
630 MOVE_9_OBJECTS (in
, out
);
631 MOVE_9_OBJECTS (in
, out
);
634 MOVE_16_OBJECTS (in
, out
);
635 MOVE_3_OBJECTS (in
, out
);
638 MOVE_16_OBJECTS (in
, out
);
639 MOVE_4_OBJECTS (in
, out
);
642 MOVE_16_OBJECTS (in
, out
);
643 MOVE_5_OBJECTS (in
, out
);
646 MOVE_16_OBJECTS (in
, out
);
647 MOVE_6_OBJECTS (in
, out
);
650 MOVE_16_OBJECTS (in
, out
);
651 MOVE_7_OBJECTS (in
, out
);
654 MOVE_16_OBJECTS (in
, out
);
655 MOVE_8_OBJECTS (in
, out
);
658 MOVE_16_OBJECTS (in
, out
);
659 MOVE_9_OBJECTS (in
, out
);
662 MOVE_16_OBJECTS (in
, out
);
663 MOVE_10_OBJECTS (in
, out
);
666 MOVE_16_OBJECTS (in
, out
);
667 MOVE_11_OBJECTS (in
, out
);
670 MOVE_16_OBJECTS (in
, out
);
671 MOVE_8_OBJECTS (in
, out
);
672 MOVE_4_OBJECTS (in
, out
);
675 MOVE_16_OBJECTS (in
, out
);
676 MOVE_9_OBJECTS (in
, out
);
677 MOVE_4_OBJECTS (in
, out
);
680 MOVE_16_OBJECTS (in
, out
);
681 MOVE_12_OBJECTS (in
, out
);
682 MOVE_2_OBJECTS (in
, out
);
685 MOVE_16_OBJECTS (in
, out
);
686 MOVE_11_OBJECTS (in
, out
);
687 MOVE_4_OBJECTS (in
, out
);
691 /* This loop governs the asmptoptic behaviour of this algorithm, for long
694 for (loop_var
= 0; loop_var
< count
; loop_var
++)
695 MOVE_32_OBJECTS (in
, out
);
700 __byte_memcpy (void *__restrict s1
, const void *__restrict s2
, size_t n
)
709 /* This code currently give a stall for any value with a 1->2 in the low 5
710 bits, i.e. 1,2, 33,34 ? not acceptable! */
711 switch (value
& 0x1f)
716 MOVE_1_OBJECT (in
, out
);
719 MOVE_2_OBJECTS (in
, out
);
722 MOVE_3_OBJECTS (in
, out
);
725 MOVE_4_OBJECTS (in
, out
);
728 MOVE_5_OBJECTS (in
, out
);
731 MOVE_6_OBJECTS (in
, out
);
734 MOVE_7_OBJECTS (in
, out
);
737 MOVE_8_OBJECTS (in
, out
);
740 MOVE_9_OBJECTS (in
, out
);
743 MOVE_10_OBJECTS (in
, out
);
746 MOVE_11_OBJECTS (in
, out
);
749 MOVE_12_OBJECTS (in
, out
);
752 MOVE_9_OBJECTS (in
, out
);
753 MOVE_4_OBJECTS (in
, out
);
756 MOVE_12_OBJECTS (in
, out
);
757 MOVE_2_OBJECTS (in
, out
);
760 MOVE_11_OBJECTS (in
, out
);
761 MOVE_4_OBJECTS (in
, out
);
764 MOVE_16_OBJECTS (in
, out
);
767 MOVE_11_OBJECTS (in
, out
);
768 MOVE_6_OBJECTS (in
, out
);
771 MOVE_9_OBJECTS (in
, out
);
772 MOVE_9_OBJECTS (in
, out
);
775 MOVE_16_OBJECTS (in
, out
);
776 MOVE_3_OBJECTS (in
, out
);
779 MOVE_16_OBJECTS (in
, out
);
780 MOVE_4_OBJECTS (in
, out
);
783 MOVE_16_OBJECTS (in
, out
);
784 MOVE_5_OBJECTS (in
, out
);
787 MOVE_16_OBJECTS (in
, out
);
788 MOVE_6_OBJECTS (in
, out
);
791 MOVE_16_OBJECTS (in
, out
);
792 MOVE_7_OBJECTS (in
, out
);
795 MOVE_16_OBJECTS (in
, out
);
796 MOVE_8_OBJECTS (in
, out
);
799 MOVE_16_OBJECTS (in
, out
);
800 MOVE_9_OBJECTS (in
, out
);
803 MOVE_16_OBJECTS (in
, out
);
804 MOVE_10_OBJECTS (in
, out
);
807 MOVE_16_OBJECTS (in
, out
);
808 MOVE_11_OBJECTS (in
, out
);
811 MOVE_16_OBJECTS (in
, out
);
812 MOVE_8_OBJECTS (in
, out
);
813 MOVE_4_OBJECTS (in
, out
);
816 MOVE_16_OBJECTS (in
, out
);
817 MOVE_9_OBJECTS (in
, out
);
818 MOVE_4_OBJECTS (in
, out
);
821 MOVE_16_OBJECTS (in
, out
);
822 MOVE_12_OBJECTS (in
, out
);
823 MOVE_2_OBJECTS (in
, out
);
826 MOVE_16_OBJECTS (in
, out
);
827 MOVE_11_OBJECTS (in
, out
);
828 MOVE_4_OBJECTS (in
, out
);
832 /* This loop governs the asmptoptic behaviour of this algorithm, for long
835 for (loop_var
= 0; loop_var
< count
; loop_var
++)
836 MOVE_32_OBJECTS (in
, out
);
840 /* Exposed interface. */
842 #ifndef __VISIUM_ARCH_BMI__
845 __long_int_memcpy (void *__restrict s1
, const void *__restrict s2
, size_t n
)
847 __int_memcpy (s1
, s2
, n
);
850 #endif /* !__VISIUM_ARCH_BMI__ */
853 __wrd_memcpy (void *__restrict s1
, const void *__restrict s2
, size_t n
)
855 __shrt_int_memcpy (s1
, s2
, n
);
859 __byt_memcpy (void *__restrict s1
, const void *__restrict s2
, size_t n
)
861 __byte_memcpy (s1
, s2
, n
);