diff options
Diffstat (limited to 'firmware/common/memcpy_a.S')
-rw-r--r-- | firmware/common/memcpy_a.S | 256 |
1 files changed, 0 insertions, 256 deletions
diff --git a/firmware/common/memcpy_a.S b/firmware/common/memcpy_a.S index 3de319903e..9f6c813be3 100644 --- a/firmware/common/memcpy_a.S +++ b/firmware/common/memcpy_a.S | |||
@@ -18,11 +18,7 @@ | |||
18 | ****************************************************************************/ | 18 | ****************************************************************************/ |
19 | #include "config.h" | 19 | #include "config.h" |
20 | 20 | ||
21 | #ifdef CPU_ARM | ||
22 | .section .icode,"ax",%progbits | ||
23 | #else | ||
24 | .section .icode,"ax",@progbits | 21 | .section .icode,"ax",@progbits |
25 | #endif | ||
26 | 22 | ||
27 | #if CONFIG_CPU == SH7034 | 23 | #if CONFIG_CPU == SH7034 |
28 | .align 2 | 24 | .align 2 |
@@ -879,256 +875,4 @@ __memcpy_fwd_entry: | |||
879 | 875 | ||
880 | .end: | 876 | .end: |
881 | .size memcpy,.end-memcpy | 877 | .size memcpy,.end-memcpy |
882 | #elif defined(CPU_ARM) | ||
883 | /* | ||
884 | * linux/arch/arm/lib/memcpy.S and copy_template.S | ||
885 | * | ||
886 | * Author: Nicolas Pitre | ||
887 | * Created: Sep 28, 2005 | ||
888 | * Copyright: MontaVista Software, Inc. | ||
889 | * | ||
890 | * This program is free software; you can redistribute it and/or modify | ||
891 | * it under the terms of the GNU General Public License version 2 as | ||
892 | * published by the Free Software Foundation. | ||
893 | */ | ||
894 | |||
895 | .macro ldr1w ptr reg abort | ||
896 | ldr \reg, [\ptr], #4 | ||
897 | .endm | ||
898 | |||
899 | .macro ldr4w ptr reg1 reg2 reg3 reg4 abort | ||
900 | ldmia \ptr!, {\reg1, \reg2, \reg3, \reg4} | ||
901 | .endm | ||
902 | |||
903 | .macro ldr8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort | ||
904 | ldmia \ptr!, {\reg1, \reg2, \reg3, \reg4, \reg5, \reg6, \reg7, \reg8} | ||
905 | .endm | ||
906 | |||
907 | .macro ldr1b ptr reg cond=al abort | ||
908 | ldr\cond\()b \reg, [\ptr], #1 | ||
909 | .endm | ||
910 | |||
911 | .macro str1w ptr reg abort | ||
912 | str \reg, [\ptr], #4 | ||
913 | .endm | ||
914 | |||
915 | .macro str8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort | ||
916 | stmia \ptr!, {\reg1, \reg2, \reg3, \reg4, \reg5, \reg6, \reg7, \reg8} | ||
917 | .endm | ||
918 | |||
919 | .macro str1b ptr reg cond=al abort | ||
920 | str\cond\()b \reg, [\ptr], #1 | ||
921 | .endm | ||
922 | |||
923 | .macro enter reg1 reg2 | ||
924 | stmdb sp!, {r0, \reg1, \reg2} | ||
925 | .endm | ||
926 | |||
927 | .macro exit reg1 reg2 | ||
928 | ldmfd sp!, {r0, \reg1, \reg2} | ||
929 | .endm | ||
930 | |||
931 | .text | ||
932 | |||
933 | /* Prototype: void *memcpy(void *dest, const void *src, size_t n); */ | ||
934 | |||
935 | .global memcpy | ||
936 | .type memcpy,%function | ||
937 | memcpy: | ||
938 | |||
939 | /* | ||
940 | * This can be used to enable code to cacheline align the source pointer. | ||
941 | * Experiments on tested architectures (StrongARM and XScale) didn't show | ||
942 | * this a worthwhile thing to do. That might be different in the future. | ||
943 | */ | ||
944 | //#define CALGN(code...) code | ||
945 | #define CALGN(code...) | ||
946 | #define PLD(code...) | ||
947 | |||
948 | enter r4, lr | ||
949 | |||
950 | subs r2, r2, #4 | ||
951 | blt 8f | ||
952 | ands ip, r0, #3 | ||
953 | PLD( pld [r1, #0] ) | ||
954 | bne 9f | ||
955 | ands ip, r1, #3 | ||
956 | bne 10f | ||
957 | |||
958 | 1: subs r2, r2, #(28) | ||
959 | stmfd sp!, {r5 - r8} | ||
960 | blt 5f | ||
961 | |||
962 | CALGN( ands ip, r1, #31 ) | ||
963 | CALGN( rsb r3, ip, #32 ) | ||
964 | CALGN( sbcnes r4, r3, r2 ) @ C is always set here | ||
965 | CALGN( bcs 2f ) | ||
966 | CALGN( adr r4, 6f ) | ||
967 | CALGN( subs r2, r2, r3 ) @ C gets set | ||
968 | CALGN( add pc, r4, ip ) | ||
969 | |||
970 | PLD( pld [r1, #0] ) | ||
971 | 2: PLD( subs r2, r2, #96 ) | ||
972 | PLD( pld [r1, #28] ) | ||
973 | PLD( blt 4f ) | ||
974 | PLD( pld [r1, #60] ) | ||
975 | PLD( pld [r1, #92] ) | ||
976 | |||
977 | 3: PLD( pld [r1, #124] ) | ||
978 | 4: ldr8w r1, r3, r4, r5, r6, r7, r8, ip, lr, abort=20f | ||
979 | subs r2, r2, #32 | ||
980 | str8w r0, r3, r4, r5, r6, r7, r8, ip, lr, abort=20f | ||
981 | bge 3b | ||
982 | PLD( cmn r2, #96 ) | ||
983 | PLD( bge 4b ) | ||
984 | |||
985 | 5: ands ip, r2, #28 | ||
986 | rsb ip, ip, #32 | ||
987 | addne pc, pc, ip @ C is always clear here | ||
988 | b 7f | ||
989 | 6: nop | ||
990 | ldr1w r1, r3, abort=20f | ||
991 | ldr1w r1, r4, abort=20f | ||
992 | ldr1w r1, r5, abort=20f | ||
993 | ldr1w r1, r6, abort=20f | ||
994 | ldr1w r1, r7, abort=20f | ||
995 | ldr1w r1, r8, abort=20f | ||
996 | ldr1w r1, lr, abort=20f | ||
997 | |||
998 | add pc, pc, ip | ||
999 | nop | ||
1000 | nop | ||
1001 | str1w r0, r3, abort=20f | ||
1002 | str1w r0, r4, abort=20f | ||
1003 | str1w r0, r5, abort=20f | ||
1004 | str1w r0, r6, abort=20f | ||
1005 | str1w r0, r7, abort=20f | ||
1006 | str1w r0, r8, abort=20f | ||
1007 | str1w r0, lr, abort=20f | ||
1008 | |||
1009 | CALGN( bcs 2b ) | ||
1010 | |||
1011 | 7: ldmfd sp!, {r5 - r8} | ||
1012 | |||
1013 | 8: movs r2, r2, lsl #31 | ||
1014 | ldr1b r1, r3, ne, abort=21f | ||
1015 | ldr1b r1, r4, cs, abort=21f | ||
1016 | ldr1b r1, ip, cs, abort=21f | ||
1017 | str1b r0, r3, ne, abort=21f | ||
1018 | str1b r0, r4, cs, abort=21f | ||
1019 | str1b r0, ip, cs, abort=21f | ||
1020 | |||
1021 | exit r4, pc | ||
1022 | |||
1023 | 9: rsb ip, ip, #4 | ||
1024 | cmp ip, #2 | ||
1025 | ldr1b r1, r3, gt, abort=21f | ||
1026 | ldr1b r1, r4, ge, abort=21f | ||
1027 | ldr1b r1, lr, abort=21f | ||
1028 | str1b r0, r3, gt, abort=21f | ||
1029 | str1b r0, r4, ge, abort=21f | ||
1030 | subs r2, r2, ip | ||
1031 | str1b r0, lr, abort=21f | ||
1032 | blt 8b | ||
1033 | ands ip, r1, #3 | ||
1034 | beq 1b | ||
1035 | |||
1036 | 10: bic r1, r1, #3 | ||
1037 | cmp ip, #2 | ||
1038 | ldr1w r1, lr, abort=21f | ||
1039 | beq 17f | ||
1040 | bgt 18f | ||
1041 | |||
1042 | |||
1043 | .macro forward_copy_shift pull push | ||
1044 | |||
1045 | subs r2, r2, #28 | ||
1046 | blt 14f | ||
1047 | |||
1048 | CALGN( ands ip, r1, #31 ) | ||
1049 | CALGN( rsb ip, ip, #32 ) | ||
1050 | CALGN( sbcnes r4, ip, r2 ) @ C is always set here | ||
1051 | CALGN( subcc r2, r2, ip ) | ||
1052 | CALGN( bcc 15f ) | ||
1053 | |||
1054 | 11: stmfd sp!, {r5 - r9} | ||
1055 | |||
1056 | PLD( pld [r1, #0] ) | ||
1057 | PLD( subs r2, r2, #96 ) | ||
1058 | PLD( pld [r1, #28] ) | ||
1059 | PLD( blt 13f ) | ||
1060 | PLD( pld [r1, #60] ) | ||
1061 | PLD( pld [r1, #92] ) | ||
1062 | |||
1063 | 12: PLD( pld [r1, #124] ) | ||
1064 | 13: ldr4w r1, r4, r5, r6, r7, abort=19f | ||
1065 | mov r3, lr, pull #\pull | ||
1066 | subs r2, r2, #32 | ||
1067 | ldr4w r1, r8, r9, ip, lr, abort=19f | ||
1068 | orr r3, r3, r4, push #\push | ||
1069 | mov r4, r4, pull #\pull | ||
1070 | orr r4, r4, r5, push #\push | ||
1071 | mov r5, r5, pull #\pull | ||
1072 | orr r5, r5, r6, push #\push | ||
1073 | mov r6, r6, pull #\pull | ||
1074 | orr r6, r6, r7, push #\push | ||
1075 | mov r7, r7, pull #\pull | ||
1076 | orr r7, r7, r8, push #\push | ||
1077 | mov r8, r8, pull #\pull | ||
1078 | orr r8, r8, r9, push #\push | ||
1079 | mov r9, r9, pull #\pull | ||
1080 | orr r9, r9, ip, push #\push | ||
1081 | mov ip, ip, pull #\pull | ||
1082 | orr ip, ip, lr, push #\push | ||
1083 | str8w r0, r3, r4, r5, r6, r7, r8, r9, ip, , abort=19f | ||
1084 | bge 12b | ||
1085 | PLD( cmn r2, #96 ) | ||
1086 | PLD( bge 13b ) | ||
1087 | |||
1088 | ldmfd sp!, {r5 - r9} | ||
1089 | |||
1090 | 14: ands ip, r2, #28 | ||
1091 | beq 16f | ||
1092 | |||
1093 | 15: mov r3, lr, pull #\pull | ||
1094 | ldr1w r1, lr, abort=21f | ||
1095 | subs ip, ip, #4 | ||
1096 | orr r3, r3, lr, push #\push | ||
1097 | str1w r0, r3, abort=21f | ||
1098 | bgt 15b | ||
1099 | CALGN( cmp r2, #0 ) | ||
1100 | CALGN( bge 11b ) | ||
1101 | |||
1102 | 16: sub r1, r1, #(\push / 8) | ||
1103 | b 8b | ||
1104 | |||
1105 | .endm | ||
1106 | |||
1107 | |||
1108 | forward_copy_shift pull=8 push=24 | ||
1109 | |||
1110 | 17: forward_copy_shift pull=16 push=16 | ||
1111 | |||
1112 | 18: forward_copy_shift pull=24 push=8 | ||
1113 | |||
1114 | |||
1115 | /* | ||
1116 | * Abort preanble and completion macros. | ||
1117 | * If a fixup handler is required then those macros must surround it. | ||
1118 | * It is assumed that the fixup code will handle the private part of | ||
1119 | * the exit macro. | ||
1120 | */ | ||
1121 | |||
1122 | .macro copy_abort_preamble | ||
1123 | 19: ldmfd sp!, {r5 - r9} | ||
1124 | b 21f | ||
1125 | 20: ldmfd sp!, {r5 - r8} | ||
1126 | 21: | ||
1127 | .endm | ||
1128 | |||
1129 | .macro copy_abort_end | ||
1130 | ldmfd sp!, {r4, pc} | ||
1131 | .endm | ||
1132 | end: | ||
1133 | .size memcpy,.end-memcpy | ||
1134 | #endif | 878 | #endif |