Commit df06c27e authored by Al Viro's avatar Al Viro

sparc32: switch __bzero() away from range exception table entries

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 5f99d338
...@@ -27,35 +27,44 @@ ...@@ -27,35 +27,44 @@
.text; \ .text; \
.align 4 .align 4
#define EXT(start,end,handler) \ #define STORE(source, base, offset, n) \
98: std source, [base + offset + n]; \
.section .fixup,ALLOC,EXECINSTR; \
.align 4; \
99: ba 30f; \
sub %o3, n - offset, %o3; \
.section __ex_table,ALLOC; \ .section __ex_table,ALLOC; \
.align 4; \ .align 4; \
.word start, 0, end, handler; \ .word 98b, 99b; \
.text; \ .text; \
.align 4 .align 4;
#define STORE_LAST(source, base, offset, n) \
EX(std source, [base - offset - n], \
add %o1, offset + n);
/* Please don't change these macros, unless you change the logic /* Please don't change these macros, unless you change the logic
* in the .fixup section below as well. * in the .fixup section below as well.
* Store 64 bytes at (BASE + OFFSET) using value SOURCE. */ * Store 64 bytes at (BASE + OFFSET) using value SOURCE. */
#define ZERO_BIG_BLOCK(base, offset, source) \ #define ZERO_BIG_BLOCK(base, offset, source) \
std source, [base + offset + 0x00]; \ STORE(source, base, offset, 0x00); \
std source, [base + offset + 0x08]; \ STORE(source, base, offset, 0x08); \
std source, [base + offset + 0x10]; \ STORE(source, base, offset, 0x10); \
std source, [base + offset + 0x18]; \ STORE(source, base, offset, 0x18); \
std source, [base + offset + 0x20]; \ STORE(source, base, offset, 0x20); \
std source, [base + offset + 0x28]; \ STORE(source, base, offset, 0x28); \
std source, [base + offset + 0x30]; \ STORE(source, base, offset, 0x30); \
std source, [base + offset + 0x38]; STORE(source, base, offset, 0x38);
#define ZERO_LAST_BLOCKS(base, offset, source) \ #define ZERO_LAST_BLOCKS(base, offset, source) \
std source, [base - offset - 0x38]; \ STORE_LAST(source, base, offset, 0x38); \
std source, [base - offset - 0x30]; \ STORE_LAST(source, base, offset, 0x30); \
std source, [base - offset - 0x28]; \ STORE_LAST(source, base, offset, 0x28); \
std source, [base - offset - 0x20]; \ STORE_LAST(source, base, offset, 0x20); \
std source, [base - offset - 0x18]; \ STORE_LAST(source, base, offset, 0x18); \
std source, [base - offset - 0x10]; \ STORE_LAST(source, base, offset, 0x10); \
std source, [base - offset - 0x08]; \ STORE_LAST(source, base, offset, 0x08); \
std source, [base - offset - 0x00]; STORE_LAST(source, base, offset, 0x00);
.text .text
.align 4 .align 4
...@@ -120,8 +129,6 @@ __bzero: ...@@ -120,8 +129,6 @@ __bzero:
ZERO_BIG_BLOCK(%o0, 0x00, %g2) ZERO_BIG_BLOCK(%o0, 0x00, %g2)
subcc %o3, 128, %o3 subcc %o3, 128, %o3
ZERO_BIG_BLOCK(%o0, 0x40, %g2) ZERO_BIG_BLOCK(%o0, 0x40, %g2)
11:
EXT(10b, 11b, 20f)
bne 10b bne 10b
add %o0, 128, %o0 add %o0, 128, %o0
...@@ -136,7 +143,6 @@ __bzero: ...@@ -136,7 +143,6 @@ __bzero:
jmp %o4 jmp %o4
add %o0, %o2, %o0 add %o0, %o2, %o0
12:
ZERO_LAST_BLOCKS(%o0, 0x48, %g2) ZERO_LAST_BLOCKS(%o0, 0x48, %g2)
ZERO_LAST_BLOCKS(%o0, 0x08, %g2) ZERO_LAST_BLOCKS(%o0, 0x08, %g2)
13: 13:
...@@ -182,24 +188,10 @@ __bzero: ...@@ -182,24 +188,10 @@ __bzero:
.section .fixup,#alloc,#execinstr .section .fixup,#alloc,#execinstr
.align 4 .align 4
20: 30:
cmp %g2, 8 and %o1, 0x7f, %o1
bleu 1f
and %o1, 0x7f, %o1
sub %g2, 9, %g2
add %o3, 64, %o3
1:
sll %g2, 3, %g2
add %o3, %o1, %o0
retl
sub %o0, %g2, %o0
21:
mov 8, %o0
and %o1, 7, %o1
sub %o0, %g2, %o0
sll %o0, 3, %o0
retl retl
add %o0, %o1, %o0 add %o3, %o1, %o0
.globl __bzero_end .globl __bzero_end
__bzero_end: __bzero_end:
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment