ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
16 июля
1529837
klen (11.07.2025 20:24, просмотров: 576)
свежак 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