diff options
author | Vineet Gupta <vgupta@synopsys.com> | 2015-07-20 05:05:03 -0400 |
---|---|---|
committer | Vineet Gupta <vgupta@synopsys.com> | 2015-07-20 10:44:37 -0400 |
commit | 262137bca7cfbe690f8e904822b68f720998324a (patch) | |
tree | e7c6262fb497f520bc17aab450ea8743450461e1 | |
parent | 21481f2cfef9a79d3676916ef9424b1a7794776c (diff) |
ARCv2: lib: memset: Don't assume 64-bit load/stores
There are configurations which may not have LDD/STD
Signed-off-by: Claudiu Zissulescu <claziss@synopsys.com>
Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
-rw-r--r-- | arch/arc/lib/memset-archs.S | 43 |
1 files changed, 36 insertions, 7 deletions
diff --git a/arch/arc/lib/memset-archs.S b/arch/arc/lib/memset-archs.S index 92d573c734b5..365b18364815 100644 --- a/arch/arc/lib/memset-archs.S +++ b/arch/arc/lib/memset-archs.S | |||
@@ -10,12 +10,6 @@ | |||
10 | 10 | ||
11 | #undef PREALLOC_NOT_AVAIL | 11 | #undef PREALLOC_NOT_AVAIL |
12 | 12 | ||
13 | #ifdef PREALLOC_NOT_AVAIL | ||
14 | #define PREWRITE(A,B) prefetchw [(A),(B)] | ||
15 | #else | ||
16 | #define PREWRITE(A,B) prealloc [(A),(B)] | ||
17 | #endif | ||
18 | |||
19 | ENTRY(memset) | 13 | ENTRY(memset) |
20 | prefetchw [r0] ; Prefetch the write location | 14 | prefetchw [r0] ; Prefetch the write location |
21 | mov.f 0, r2 | 15 | mov.f 0, r2 |
@@ -51,9 +45,15 @@ ENTRY(memset) | |||
51 | 45 | ||
52 | ;;; Convert len to Dwords, unfold x8 | 46 | ;;; Convert len to Dwords, unfold x8 |
53 | lsr.f lp_count, lp_count, 6 | 47 | lsr.f lp_count, lp_count, 6 |
48 | |||
54 | lpnz @.Lset64bytes | 49 | lpnz @.Lset64bytes |
55 | ;; LOOP START | 50 | ;; LOOP START |
56 | PREWRITE(r3, 64) ;Prefetch the next write location | 51 | #ifdef PREALLOC_NOT_AVAIL |
52 | prefetchw [r3, 64] ;Prefetch the next write location | ||
53 | #else | ||
54 | prealloc [r3, 64] | ||
55 | #endif | ||
56 | #ifdef CONFIG_ARC_HAS_LL64 | ||
57 | std.ab r4, [r3, 8] | 57 | std.ab r4, [r3, 8] |
58 | std.ab r4, [r3, 8] | 58 | std.ab r4, [r3, 8] |
59 | std.ab r4, [r3, 8] | 59 | std.ab r4, [r3, 8] |
@@ -62,16 +62,45 @@ ENTRY(memset) | |||
62 | std.ab r4, [r3, 8] | 62 | std.ab r4, [r3, 8] |
63 | std.ab r4, [r3, 8] | 63 | std.ab r4, [r3, 8] |
64 | std.ab r4, [r3, 8] | 64 | std.ab r4, [r3, 8] |
65 | #else | ||
66 | st.ab r4, [r3, 4] | ||
67 | st.ab r4, [r3, 4] | ||
68 | st.ab r4, [r3, 4] | ||
69 | st.ab r4, [r3, 4] | ||
70 | st.ab r4, [r3, 4] | ||
71 | st.ab r4, [r3, 4] | ||
72 | st.ab r4, [r3, 4] | ||
73 | st.ab r4, [r3, 4] | ||
74 | st.ab r4, [r3, 4] | ||
75 | st.ab r4, [r3, 4] | ||
76 | st.ab r4, [r3, 4] | ||
77 | st.ab r4, [r3, 4] | ||
78 | st.ab r4, [r3, 4] | ||
79 | st.ab r4, [r3, 4] | ||
80 | st.ab r4, [r3, 4] | ||
81 | st.ab r4, [r3, 4] | ||
82 | #endif | ||
65 | .Lset64bytes: | 83 | .Lset64bytes: |
66 | 84 | ||
67 | lsr.f lp_count, r2, 5 ;Last remaining max 124 bytes | 85 | lsr.f lp_count, r2, 5 ;Last remaining max 124 bytes |
68 | lpnz .Lset32bytes | 86 | lpnz .Lset32bytes |
69 | ;; LOOP START | 87 | ;; LOOP START |
70 | prefetchw [r3, 32] ;Prefetch the next write location | 88 | prefetchw [r3, 32] ;Prefetch the next write location |
89 | #ifdef CONFIG_ARC_HAS_LL64 | ||
71 | std.ab r4, [r3, 8] | 90 | std.ab r4, [r3, 8] |
72 | std.ab r4, [r3, 8] | 91 | std.ab r4, [r3, 8] |
73 | std.ab r4, [r3, 8] | 92 | std.ab r4, [r3, 8] |
74 | std.ab r4, [r3, 8] | 93 | std.ab r4, [r3, 8] |
94 | #else | ||
95 | st.ab r4, [r3, 4] | ||
96 | st.ab r4, [r3, 4] | ||
97 | st.ab r4, [r3, 4] | ||
98 | st.ab r4, [r3, 4] | ||
99 | st.ab r4, [r3, 4] | ||
100 | st.ab r4, [r3, 4] | ||
101 | st.ab r4, [r3, 4] | ||
102 | st.ab r4, [r3, 4] | ||
103 | #endif | ||
75 | .Lset32bytes: | 104 | .Lset32bytes: |
76 | 105 | ||
77 | and.f lp_count, r2, 0x1F ;Last remaining 31 bytes | 106 | and.f lp_count, r2, 0x1F ;Last remaining 31 bytes |