свежак kgp для мелко-ricsv'ов. хост x86_64-linux-gnu_haswell-avx2.
по просьбе мосье Nikolay_Po туда где нужно втащен fence.i. привентивно добавлена поддержка
QuingKe V3F/V5F и соответсивенно ch32v415/416/417 предварительно выяснилось что для QingKeV4F инструкции fence fence.tso fence.i не являются затычками:
как донес мосье Nikolay_Po в самом свежем пакете поддержки WCH видно что они вставили "зачем то" fence.i ... ну ладно, добавил для ch32v3xxx подлержку расширения zifencei. ранее эта инструкция была в составе базового набра I на ряду с
fence fence.tso. потом ее оттуда убрали в расширение - как писано. изза того что возможно разная трактовка и разная аппаратная реализация в зависимости от модели памяти, которая не является частью riscv .
проверил на ch32v303
riscv32-kgp-elf-g++ ....... -mcpu=ch32v303 -mcmodel=medlow -mabi=ilp32f .....
__ais__ void fence() { asm volatile ("fence") ; }
__ais__ void fence_tso() { asm volatile ("fence.tso"); }
__ais__ void fence_i( ){ asm volatile ("fence.i") ; }
int main(void)
{
fence();
fence_i();
fence_tso();
con < "main start..." <<= con.endl ;
...
выход кодогенератора
int main(void)
{
262e: 7179 addi sp,sp,-48
2630: d606 sw ra,44(sp)
2632: d422 sw s0,40(sp)
2634: d226 sw s1,36(sp)
__ais__ void fence() { asm volatile ("fence") ; }
2636: 0ff0000f fence
__ais__ void fence_i( ){ asm volatile ("fence.i") ; }
263a: 0000100f fence.i
__ais__ void fence_tso() { asm volatile ("fence.tso"); }
263e: 8330000f fence.tso
inline auto & operator < ( const char* val ) { io_t::accsess_barier(); append(val); return *this; }
2642: c9dfd0ef jal 2de <io_v303_tt<ch32v3xx::dma1_channel2_t, 2048u, ch32v3xx::dma1_channel3_t, 1024u, ch32v3xx::usart3_t, 921600u, &(freertos_console_io_gpio_init()), &(freertos_console_io_gpio_deinit())>::accsess_barier()>
2646: 20001437 lui s0,0x20001
264a: 65b1 lui a1,0xc
таким образом для компиллера ядро QingKeV4F иметь расширение zifencei.
к слову fence.tso отправляет QingKeV4F в hard fault
что я думаю об этом.... - судя по всему исходя из того что конвейер в v4 3-стадийный то скорее всего затычки там в виде аппаратных нопов, ну может что то они там дергают очень тонкое но нам не видно. в v4j есть кэш инструкций... тут скорее всего оно что то делает полезное, но в остальных - там нечего делать этим инструкциям.
QingKeV3F/V5F доделаем когда доки на нех хоть чето будет. щас будет работать.. но непонятно ест ли дополнительная придурь кроме imafcb и какая стоимость инструкций. пока занес по аналогии как v4f.
http://klen.org/Files/DevTools/kgcc/x86_64-kgp-linux-gnu_haswell-avx2/riscv32-kgp-elf/riscv32-kgp-elf_@_x86_64-kgp-linux-gnu_has well-avx2_20250711_actinidia.tar.7z