目次: GCC
前回(2020年5月25日の日記参照)にてdefine_insnを追加しましたが、エラーが出ました。引き続きエラーを見ます。
// gcc/config/riscv/riscv.c
/* Return the appropriate instructions to move SRC into DEST. Assume
that SRC is operand 1 and DEST is operand 0. */
const char *
riscv_output_move (rtx dest, rtx src)
{
enum rtx_code dest_code, src_code;
machine_mode mode;
bool dbl_p;
...
if (dest_code == REG && FP_REG_P (REGNO (dest)))
{
if (src_code == MEM)
return dbl_p ? "fld\t%0,%1" : "flw\t%0,%1";
}
gcc_unreachable (); //★★ここに到達している
}
RTLに対応するアセンブラを出力する場所のようです。ベクトル型には当然対応していません。ひとまず浮動小数点のムーブ、ロード、ストアを真似して追加します。
// gcc/config/riscv/riscv.c
/* Return the appropriate instructions to move SRC into DEST. Assume
that SRC is operand 1 and DEST is operand 0. */
const char *
riscv_output_move (rtx dest, rtx src)
{
enum rtx_code dest_code, src_code;
machine_mode mode;
bool dbl_p;
...
if (src_code == REG && VP_REG_P (REGNO (src)))
{
if (dest_code == REG && VP_REG_P (REGNO (dest)))
return "vmv.v\t%0,%1"; //★★ムーブ
if (dest_code == MEM)
return "vsw.v\t%1,%0"; //★★ストア
}
if (dest_code == REG && VP_REG_P (REGNO (dest)))
{
if (src_code == MEM)
return "vlw.v\t%0,%1"; //★★ロード
}
gcc_unreachable ();
}
やっとエラーが出なくなりました。本当に長かったです。
typedef int __v64si __attribute__((__vector_size__(256)));
void _start()
{
int b[100];
__v64si v1;
__asm__ volatile ("vlw.v %0, %1\n" : "=&v"(v1) : "A"(b[10]));
}
$ riscv32-unknown-elf-gcc -Wall -march=rv32gcv b.c -O0 -nostdlib -g $ riscv32-unknown-elf-objdump -drS a.out ... __asm__ volatile ("vlw.v %0, %1\n" : "=&v"(v1) : "A"(b[10])); 10076: e8840713 addi a4,s0,-376 1007a: 12076007 vlw.v v0,(a4) 1007e: 0207e027 vsw.v v0,(a5) } 10082: 0001 nop 10084: 3ac12403 lw s0,940(sp) 10088: 3b010113 addi sp,sp,944 1008c: 8082 ret
それらしいバイナリも出力されています。
ベクトルレジスタが1つしか使用されていなくて寂しいので、サンプルコードを変更してvlw.vを複数書きます。するとまたエラーが出ます。
typedef int __v64si __attribute__((__vector_size__(256)));
void _start()
{
int b[100];
__v64si v1, v2;
__asm__ volatile ("vlw.v %0, %1\n" : "=&v"(v1) : "A"(b[10]));
__asm__ volatile ("vlw.v %0, %1\n" : "=&v"(v2) : "A"(b[20]));
}
$ riscv32-unknown-elf-gcc -Wall -march=rv32gcv b.c -O0 -nostdlib -g /tmp/ccsg5iId.s: Assembler messages: /tmp/ccsg5iId.s:38: Error: illegal operands `vsw.v v0,256(a5)'
コンパイラはエラーを出していませんが、アセンブラがエラーを出しています。どうも変なオペランドが出力されているようです。うーん、惜しい。アセンブラを見ると、
...
.loc 1 8 2
addi a4,s0,-376
#APP
# 8 "b.c" 1
vlw.v v0, 0(a4)
# 0 "" 2
#NO_APP
vsw.v v0,256(a5) #★★この命令でエラー(オフセットを使っている)
.loc 1 9 2
addi a4,s0,-336
#APP
# 9 "b.c" 1
vlw.v v0, 0(a4)
# 0 "" 2
#NO_APP
vsw.v v0,0(a5) #★★この命令はOK(オフセットを使っていない)
.loc 1 10 1
nop
lw s0,1196(sp)
...
スカラ演算用のlw, sw命令とオペランドの制約が異なり、vlw.v, vsw.v命令はオフセット付きアドレスをオペランドに取れません。コンパイラはオフセット付きアドレスをオペランドに出力しないように抑制する必要があります。続きはまた今度。
< | 2020 | > | ||||
<< | < | 05 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | - | - | - | 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | - | - | - | - | - | - |
合計:
本日:
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2023.
Powered by PHP 8.2.15.
using GD bundled (2.1.0 compatible)(png support.)