diff options
author | Clifford Wolf <clifford@clifford.at> | 2015-06-07 07:29:13 +0200 |
---|---|---|
committer | Clifford Wolf <clifford@clifford.at> | 2015-06-07 07:29:13 +0200 |
commit | 491cd5e15dc3f96d177493d2e23edc356dcc648e (patch) | |
tree | d307b076ad53fa189cc015ff3f80e7dbba2e909b /dhrystone/stdlib.c | |
parent | 44ea992fed0d66730d6bdeba740bda53c9e7349f (diff) | |
download | picorv32-491cd5e15dc3f96d177493d2e23edc356dcc648e.tar.gz picorv32-491cd5e15dc3f96d177493d2e23edc356dcc648e.zip |
Using libc assembler code in dhrystone stdlib.c
Diffstat (limited to 'dhrystone/stdlib.c')
-rw-r--r-- | dhrystone/stdlib.c | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/dhrystone/stdlib.c b/dhrystone/stdlib.c index 4229aa2..2ff7ba3 100644 --- a/dhrystone/stdlib.c +++ b/dhrystone/stdlib.c @@ -38,12 +38,97 @@ char *malloc(int size) return p; } +#if 0 void *memcpy(char *dest, const char *src, int n) { while (n--) *(dest++) = *(src++); } +#else +/* copy&paste from disassembled libc */ +asm ( +" .global memcpy; " +" memcpy: xor a5,a1,a0; " +" slli a4,a5,0x1e; " +" add a7,a0,a2; " +" bnez a4,.M1; " +" li a5,3; " +" bleu a2,a5,.M2; " +" slli a5,a0,0x1e; " +" bnez a5,.M3; " +" andi a6,a7,-4; " +" addi a5,a6,-32; " +" mv a4,a0; " +" bltu a0,a5,.M4; " +" .M9: mv a3,a1; " +" mv a5,a4; " +" bleu a6,a4,.M5; " +" .M6: lw a2,0(a3); " +" addi a5,a5,4; " +" addi a3,a3,4; " +" sw a2,-4(a5); " +" bltu a5,a6,.M6; " +" not a5,a4; " +" add a6,a5,a6; " +" andi a6,a6,-4; " +" addi a6,a6,4; " +" add a4,a4,a6; " +" add a1,a1,a6; " +" .M5: bltu a4,a7,.M7; " +" .M11: ret; " +" .M3: mv a4,a0; " +" .M8: lbu a5,0(a1); " +" addi a4,a4,1; " +" addi a1,a1,1; " +" sb a5,-1(a4); " +" slli a5,a4,0x1e; " +" bnez a5,.M8; " +" andi a6,a7,-4; " +" addi a5,a6,-32; " +" bleu a5,a4,.M9; " +" .M4: lw t6,0(a1); " +" lw t5,4(a1); " +" lw t4,8(a1); " +" lw t3,12(a1); " +" lw t2,16(a1); " +" lw t1,20(a1); " +" lw t0,24(a1); " +" lw a2,28(a1); " +" addi a1,a1,36; " +" addi a4,a4,36; " +" lw a3,-4(a1); " +" sw t6,-36(a4); " +" sw t5,-32(a4); " +" sw t4,-28(a4); " +" sw t3,-24(a4); " +" sw t2,-20(a4); " +" sw t1,-16(a4); " +" sw t0,-12(a4); " +" sw a2,-8(a4); " +" sw a3,-4(a4); " +" bltu a4,a5,.M4; " +" j .M9; " +" .M1: mv a4,a0; " +" bleu a7,a0,.M10; " +" .M7: lbu a5,0(a1); " +" addi a4,a4,1; " +" addi a1,a1,1; " +" sb a5,-1(a4); " +" bltu a4,a7,.M7; " +" .M12: ret; " +" .M2: mv a4,a0; " +" bleu a7,a0,.M11; " +" lbu a5,0(a1); " +" addi a4,a4,1; " +" addi a1,a1,1; " +" sb a5,-1(a4); " +" bltu a4,a7,.M7; " +" j .M12; " +" .M10: ret; " +); +#endif +#if 0 char *strcpy(char *dest, const char *src) { char *ret = dest; @@ -53,7 +138,55 @@ char *strcpy(char *dest, const char *src) while (*(src++)); return ret; } +#else +/* copy&paste from disassembled libc */ +asm ( +" .global strcpy; " +" strcpy: or a5,a0,a1; " +" slli a4,a5,0x1e; " +" bnez a4,.S1; " +" lw a4,0(a1); " +" lui a3,0x7f7f8; " +" addi a3,a3,-129; " +" and a5,a4,a3; " +" add a5,a5,a3; " +" or a7,a4,a3; " +" or a7,a7,a5; " +" li a5,-1; " +" mv a2,a0; " +" bne a7,a5,.S2; " +" .S3: addi a2,a2,4; " +" addi a1,a1,4; " +" sw a4,-4(a2); " +" lw a4,0(a1); " +" and a5,a4,a3; " +" or a6,a4,a3; " +" add a5,a5,a3; " +" or a5,a6,a5; " +" beq a5,a7,.S3; " +" .S2: lbu a5,0(a1); " +" lbu a4,1(a1); " +" lbu a3,2(a1); " +" sb a5,0(a2); " +" beqz a5,.S4; " +" sb a4,1(a2); " +" beqz a4,.S4; " +" sb a3,2(a2); " +" bnez a3,.S5; " +" .S4: ret; " +" .S5: sb zero,3(a2); " +" ret; " +" .S1: mv a5,a0; " +" .S6: lbu a4,0(a1); " +" addi a5,a5,1; " +" addi a1,a1,1; " +" sb a4,-1(a5); " +" bnez a4,.S6; " +" ret; " +); +#endif +#if 0 int strcmp(const char *s1, const char *s2) { // printf("[strcmp()]"); @@ -67,6 +200,81 @@ int strcmp(const char *s1, const char *s2) s1++, s2++; } } +#else +/* copy&paste from disassembled libc */ +asm ( +" .global strcmp; " +" strcmp: or a4,a0,a1; " +" li t2,-1; " +" andi a4,a4,3; " +" bnez a4,.K1; " +" lui t3,0x7f7f8; " +" addi t3,t3,-129; " +" .K6: lw a2,0(a0); " +" lw a3,0(a1); " +" and t0,a2,t3; " +" or t1,a2,t3; " +" add t0,t0,t3; " +" or t0,t0,t1; " +" bne t0,t2,.K2; " +" bne a2,a3,.K3; " +" lw a2,4(a0); " +" lw a3,4(a1); " +" and t0,a2,t3; " +" or t1,a2,t3; " +" add t0,t0,t3; " +" or t0,t0,t1; " +" bne t0,t2,.K4; " +" bne a2,a3,.K3; " +" lw a2,8(a0); " +" lw a3,8(a1); " +" and t0,a2,t3; " +" or t1,a2,t3; " +" add t0,t0,t3; " +" or t0,t0,t1; " +" bne t0,t2,.K5; " +" addi a0,a0,12; " +" addi a1,a1,12; " +" beq a2,a3,.K6; " +" .K3: slli a4,a2,0x10; " +" slli a5,a3,0x10; " +" bne a4,a5,.K7; " +" srli a4,a2,0x10; " +" srli a5,a3,0x10; " +" sub a0,a4,a5; " +" andi a1,a0,255; " +" bnez a1,.K8; " +" ret; " +" .K7: srli a4,a4,0x10; " +" srli a5,a5,0x10; " +" sub a0,a4,a5; " +" andi a1,a0,255; " +" bnez a1,.K8; " +" ret; " +" .K8: andi a4,a4,255; " +" andi a5,a5,255; " +" sub a0,a4,a5; " +" ret; " +" .K1: lbu a2,0(a0); " +" lbu a3,0(a1); " +" addi a0,a0,1; " +" addi a1,a1,1; " +" bne a2,a3,.K9; " +" bnez a2,.K1; " +" .K9: sub a0,a2,a3; " +" ret; " +" .K4: addi a0,a0,4; " +" addi a1,a1,4; " +" .K2: bne a2,a3,.K1; " +" li a0,0; " +" ret; " +" .K5: addi a0,a0,8; " +" addi a1,a1,8; " +" bne a2,a3,.K1; " +" li a0,0; " +" ret; " +); +#endif static void printf_c(int c) { |