к вопросу о RISC-V, GD32VF103, итд... подсобрал тулсы riscv32imac-kgp-elf, можно попробывать! вчера позавчера очень актуально оттопились по это теме
http://caxapa.ru/760263.html, спасибо Evgeny_CD!
подсобрал тулсы как обычно binutils (bu+gdb) gcc/g++ newlib
собрано под прицел на процессоры rv32imac Bamblebee которые используют GD32VF103, если ничего не втыкать компиллеру по поводу архитектуры то по умолчанию настроил -march=rv32imac -mabi=ilp32 -mcmodel=medlow
попытался выяснить есть операция целочисленного деления или нет, я ее не внес, если окажется она есть в этой, мне еще непонятной, реализации risc-v то можете тупо воткнуть -mdiv и Ваш код заюзает инструкции цел. деления, а я пересоберу пакет с поддержкой деления.
klen.org/Files/DevTools/x86_64-kgp-linux-gnu/riscv32imac-kgp-elf_@_x86_64_avx_kgp-linux-gnu_20190903_LUPINE.tar.7z
хост процессор не ниже ivy c avx
собранно в свежей xubuntu системе поэтому может на взлететь на старых где используется glibc версии ниже 2.29
последние два пункта сильно ограничат возможность заиспытать данное творение но если у кого то проканает то я спущу эти требования до уровня "чтоб работало везде" для следующей сборке (гиморно это - сборка для быстрых процов.. сборка для компиляции "на наручных часах"), сначала надо убедится в правильности концепции в целом и необходимости пыжытся на данную тему ;)
с risc-v я только начал знакомится но уже по выходному коду (инструкциям) вижу что у этих изобретателей risc-v и в мыслях даже небыло имень хоть один транзистор на котором бы они не сэкономили при имплементации :) но тут в защиту - модульная ISA - можно ненапрягаясь и не разламывая ничего концептуального добавить быстрые инструкции под ситуацию. да... fpga просто плачат по этой ISA
вот пример что на выходе вылезло:
src:
char c (const char a, const char b) {return (a+b)/(a-b) ;}
short s (const short a, const short b) {return (a+b)/(a-b) ;}
int i (const int a, const int b) {return (a+b)/(a-b) ;}
float f (const float a, const float b) {return (a+b)/(a-b) ;}
double d (const double a, const double b){return (a+b)/(a-b) ;}
riscv32-kgp-elf-gcc -mdiv -Os -S ./a.c -o a.s
.file "a.c"
.option nopic
.attribute arch, "rv32i2p0_m2p0_a2p0_c2p0"
.attribute unaligned_access, 0
.attribute stack_align, 16
.text
.align 1
.globl c
.type c, @function
c:
add a5,a0,a1
sub a0,a0,a1
div a0,a5,a0
andi a0,a0,0xff
ret
.size c, .-c
.align 1
.globl s
.type s, @function
s:
add a5,a0,a1
sub a0,a0,a1
div a0,a5,a0
slli a0,a0,16
srai a0,a0,16
ret
.size s, .-s
.align 1
.globl i
.type i, @function
i:
add a5,a0,a1
sub a0,a0,a1
div a0,a5,a0
ret
.size i, .-i
.globl __addsf3
.globl __subsf3
.globl __divsf3
.align 1
.globl f
.type f, @function
f:
addi sp,sp,-16
sw ra,12(sp)
sw s0,8(sp)
sw s1,4(sp)
sw s2,0(sp)
mv s1,a0
mv s2,a1
call __addsf3
mv s0,a0
mv a1,s2
mv a0,s1
call __subsf3
mv a1,a0
mv a0,s0
call __divsf3
lw ra,12(sp)
lw s0,8(sp)
lw s1,4(sp)
lw s2,0(sp)
addi sp,sp,16
jr ra
.size f, .-f
.globl __adddf3
.globl __subdf3
.globl __divdf3
.align 1
.globl d
.type d, @function
d:
addi sp,sp,-32
sw ra,28(sp)
sw s0,24(sp)
sw s1,20(sp)
sw s2,16(sp)
sw s3,12(sp)
sw s4,8(sp)
sw s5,4(sp)
mv s3,a0
mv s2,a1
mv s5,a2
mv s4,a3
call __adddf3
mv s1,a0
mv s0,a1
mv a2,s5
mv a3,s4
mv a0,s3
mv a1,s2
call __subdf3
mv a2,a0
mv a3,a1
mv a0,s1
mv a1,s0
call __divdf3
lw ra,28(sp)
lw s0,24(sp)
lw s1,20(sp)
lw s2,16(sp)
lw s3,12(sp)
lw s4,8(sp)
lw s5,4(sp)
addi sp,sp,32
jr ra
.size d, .-d
.ident "GCC: (Klen's GNU package (KGP) for target::riscv32imac(ilp32)-kgp-elf @ host::x86_64-kgp-linux-gnu, << LUPINE >>) 10.0.0 20190902 (experimental)"
riscv32-kgp-elf-gcc -Os -S ./a.c -o a.s
.file "a.c"
.option nopic
.attribute arch, "rv32i2p0_m2p0_a2p0_c2p0"
.attribute unaligned_access, 0
.attribute stack_align, 16
.text
.align 1
.globl c
.type c, @function
c:
add a5,a0,a1
sub a0,a0,a1
div a0,a5,a0
andi a0,a0,0xff
ret
.size c, .-c
.align 1
.globl s
.type s, @function
s:
add a5,a0,a1
sub a0,a0,a1
div a0,a5,a0
slli a0,a0,16
srai a0,a0,16
ret
.size s, .-s
.align 1
.globl i
.type i, @function
i:
add a5,a0,a1
sub a0,a0,a1
div a0,a5,a0
ret
.size i, .-i
.globl __addsf3
.globl __subsf3
.globl __divsf3
.align 1
.globl f
.type f, @function
f:
addi sp,sp,-16
sw ra,12(sp)
sw s0,8(sp)
sw s1,4(sp)
sw s2,0(sp)
mv s1,a0
mv s2,a1
call __addsf3
mv s0,a0
mv a1,s2
mv a0,s1
call __subsf3
mv a1,a0
mv a0,s0
call __divsf3
lw ra,12(sp)
lw s0,8(sp)
lw s1,4(sp)
lw s2,0(sp)
addi sp,sp,16
jr ra
.size f, .-f
.globl __adddf3
.globl __subdf3
.globl __divdf3
.align 1
.globl d
.type d, @function
d:
addi sp,sp,-32
sw ra,28(sp)
sw s0,24(sp)
sw s1,20(sp)
sw s2,16(sp)
sw s3,12(sp)
sw s4,8(sp)
sw s5,4(sp)
mv s3,a0
mv s2,a1
mv s5,a2
mv s4,a3
call __adddf3
mv s1,a0
mv s0,a1
mv a2,s5
mv a3,s4
mv a0,s3
mv a1,s2
call __subdf3
mv a2,a0
mv a3,a1
mv a0,s1
mv a1,s0
call __divdf3
lw ra,28(sp)
lw s0,24(sp)
lw s1,20(sp)
lw s2,16(sp)
lw s3,12(sp)
lw s4,8(sp)
lw s5,4(sp)
addi sp,sp,32
jr ra
.size d, .-d
.ident "GCC: (Klen's GNU package (KGP) for target::riscv32imac(ilp32)-kgp-elf @ host::x86_64-kgp-linux-gnu, << LUPINE >>) 10.0.0 20190902 (experimental)"
riscv32-kgp-elf-gcc -S ./a.c -o a.s
asm:
.file "a.c"
.option nopic
.attribute arch, "rv32i2p0_m2p0_a2p0_c2p0"
.attribute unaligned_access, 0
.attribute stack_align, 16
.text
.align 1
.globl c
.type c, @function
c:
addi sp,sp,-32
sw s0,28(sp)
addi s0,sp,32
mv a5,a0
mv a4,a1
sb a5,-17(s0)
mv a5,a4
sb a5,-18(s0)
lbu a4,-17(s0)
lbu a5,-18(s0)
add a4,a4,a5
lbu a3,-17(s0)
lbu a5,-18(s0)
sub a5,a3,a5
div a5,a4,a5
andi a5,a5,0xff
mv a0,a5
lw s0,28(sp)
addi sp,sp,32
jr ra
.size c, .-c
.align 1
.globl s
.type s, @function
s:
addi sp,sp,-32
sw s0,28(sp)
addi s0,sp,32
mv a5,a0
mv a4,a1
sh a5,-18(s0)
mv a5,a4
sh a5,-20(s0)
lh a4,-18(s0)
lh a5,-20(s0)
add a4,a4,a5
lh a3,-18(s0)
lh a5,-20(s0)
sub a5,a3,a5
div a5,a4,a5
slli a5,a5,16
srai a5,a5,16
mv a0,a5
lw s0,28(sp)
addi sp,sp,32
jr ra
.size s, .-s
.align 1
.globl i
.type i, @function
i:
addi sp,sp,-32
sw s0,28(sp)
addi s0,sp,32
sw a0,-20(s0)
sw a1,-24(s0)
lw a4,-20(s0)
lw a5,-24(s0)
add a4,a4,a5
lw a3,-20(s0)
lw a5,-24(s0)
sub a5,a3,a5
div a5,a4,a5
mv a0,a5
lw s0,28(sp)
addi sp,sp,32
jr ra
.size i, .-i
.globl __addsf3
.globl __subsf3
.globl __divsf3
.align 1
.globl f
.type f, @function
f:
addi sp,sp,-32
sw ra,28(sp)
sw s0,24(sp)
sw s1,20(sp)
addi s0,sp,32
sw a0,-20(s0)
sw a1,-24(s0)
lw a1,-24(s0)
lw a0,-20(s0)
call __addsf3
mv a5,a0
mv s1,a5
lw a1,-24(s0)
lw a0,-20(s0)
call __subsf3
mv a5,a0
mv a1,a5
mv a0,s1
call __divsf3
mv a5,a0
mv a0,a5
lw ra,28(sp)
lw s0,24(sp)
lw s1,20(sp)
addi sp,sp,32
jr ra
.size f, .-f
.globl __adddf3
.globl __subdf3
.globl __divdf3
.align 1
.globl d
.type d, @function
d:
addi sp,sp,-32
sw ra,28(sp)
sw s0,24(sp)
sw s2,20(sp)
sw s3,16(sp)
addi s0,sp,32
sw a0,-24(s0)
sw a1,-20(s0)
sw a2,-32(s0)
sw a3,-28(s0)
lw a2,-32(s0)
lw a3,-28(s0)
lw a0,-24(s0)
lw a1,-20(s0)
call __adddf3
mv a4,a0
mv a5,a1
mv s2,a4
mv s3,a5
lw a2,-32(s0)
lw a3,-28(s0)
lw a0,-24(s0)
lw a1,-20(s0)
call __subdf3
mv a4,a0
mv a5,a1
mv a2,a4
mv a3,a5
mv a0,s2
mv a1,s3
call __divdf3
mv a4,a0
mv a5,a1
mv a0,a4
mv a1,a5
lw ra,28(sp)
lw s0,24(sp)
lw s2,20(sp)
lw s3,16(sp)
addi sp,sp,32
jr ra
.size d, .-d
.ident "GCC: (Klen's GNU package (KGP) for target::riscv32imac(ilp32)-kgp-elf @ host::x86_64-kgp-linux-gnu, << LUPINE >>) 10.0.0 20190902 (experimental)"