Chenghui Pan
Chenghui Pan
@chenglulu326 @xry111 @xen0n @ChenghuaXu @SixWeining
> 复数类型需要特殊考虑吗? > > 在目前的非向量调用惯例中复数直接当成有两个浮点成员的结构体,会用两个 FPR,但是 CPUCFG word 2 bit 8 预留了“复数向量指令”,而且好像 (?) 即使没有专用的复数向量指令而只用一般向量指令,用向量寄存器传复数也是有好处的 (至少加减法就简化成一条指令)。 > > 另外可以学 RISC-V 在二进制文件中打标记以防止不小心把 ABI 不兼容的东西链接起来:https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/master/riscv-elf.adoc#dynamic-linking 复数之前还没有考虑过,感觉可以试一试 ELF标记的话,目前主要考虑到系统大部分可能不会用vecarg来编译,所以暂时没有打标记,不过目前好像除非两个有向量调用的object,一边开vecarg、一边不开/向量开关对不上的时候会出问题,其他时候好像暂时没有遇到爆炸的情况 不过之前准备在代码里如果出现了“有向量参数,vecarg开了,向量没开”的情况下给出警告,因为代码需要改动的地方比较多还没有做出来
> 另外还有 __int128 要不要走向量寄存器,因为我们向量指令集自带 128 位加减法,虽然我还没算清楚用向量指令做 128 位乘除会不会比一般做法快…… 感觉可能要同时实现一下相关的128位操作,现在的运算依然还是用标量指令做的,如果走向量寄存器的话现在可能还涉及到取回标量寄存器去做运算的情况? 另外我发现之前的代码关于-mvecarg和vecarg attribute的实现有点问题(两者变成and的关系了,预想的是or的关系),稍微修复了一下。
> 复数类型需要特殊考虑吗? > > 在目前的非向量调用惯例中复数直接当成有两个浮点成员的结构体,会用两个 FPR,但是 CPUCFG word 2 bit 8 预留了“复数向量指令”,而且好像 (?) 即使没有专用的复数向量指令而只用一般向量指令,用向量寄存器传复数也是有好处的 (至少加减法就简化成一条指令)。 最近尝试了以下似乎不太好实现 如果在loongarch_get_arg_info对复数参数返回单个V2DF寄存器的话,GCC确实会尝试用vec_concat:DC来把参数放到寄存器里,但是寄存器的模式是V2DF,导致set表达式dest和src的模式不一致,结果在emit_move_insn里会导致ICE,gdb定位到的地方大概这样: ``` Breakpoint 1, emit_move_insn (x=0x7ffff6f74540, y=0x7ffff6f74648) at /home/panchenghui/upstream/gcc/gcc/expr.cc:4606 4606 gcc_assert (mode != BLKmode...