ulongの上位32ビットと下位32ビ...
 
通知
すべてクリア

ulongの上位32ビットと下位32ビットを交換するプログラムのコンパイルエラー


遠藤克浩
(@katsuhiro-endo)
New Member
結合: 7年前
投稿: 4
Topic starter  

慶應の遠藤です。

以下のデバイスプログラムをコンパイルしようとすると、エラーが発生します。

ulong pzc_rand(ulong vv){
  ulong x= vv<<32;
  vv = x + (vv>>32);
  return vv;
}

コンパイルエラーメッセージ

/opt/pzsdk.ver4.0//bin/llc -march=pz64 -mcpu=sc2 -O3 obj/kernel.o -o obj/kernel.pzs
LLVMPZ ver.3.6.2.462
PEZY ISA.ver3 64bit
LLVM ERROR: Cannot select: 0x24dc3b0: i64 = rotl 0x24e58a0, 0x24dc080 [ORD=4] [ID=5]
0x24e58a0: i64,ch = CopyFromReg 0x249afd0, 0x24da900 [ORD=1] [ID=4]
0x24da900: i64 = Register %vreg0 [ID=1]
0x24dc080: i64 = Constant<32> [ID=2]
In function: _Z8pzc_randy
make[2]: *** [obj/kernel.pzs] エラー 1

また、次のように書き換えたプログラムはコンパイル可能でした。

ulong pzc_rand(ulong vv){
  ulong x= vv<<32;
  x=x+1; //追加
  vv = x + (vv>>32);
  return vv;
}

エラーメッセージから推測するに、実際には存在しない、.rotl命令がLLVMによって吐かれているのかもしれません。

コンパイラのバグでしょうか?

よろしくお願いいたします。


引用
ishikawa
(@ishikawa)
Eminent Member Admin
結合: 9年前
投稿: 21
 

不具合のご報告大変ありがとうございます。

ご指摘の通りこれはLLVMの不具合となります。sdk.ver4.0で発生しているものですが、sdk.ver4.1では修正されております。

また書き換えられたコードはrotパターンからはずれるために、おそらく問題なくコンパイルされるのだと思われます。

 

sdk.ver4.1はなるべく早い時期にリリースする予定ですので、可能でしたらsdk.ver4.1までお待ちいただけますと幸いです。

#もしも緊急の理由にてsdk.ver4.0で対応が必要な場合は、別途パッチを当てることは可能と思われますので、ご連絡頂ければと思います。

 

なお直接は関係しないのですが、pzc_rand()は返り値を返すようになっていますが、通常はpzc_をつけた関数は返り値なしで、かつホストから呼び出される関数のみにして頂く方が好ましいです。(カーネル内部から呼び出す際には問題はないと思いますが、この関数をホストから呼び出してしまった場合の挙動は不明です)


返信引用
遠藤克浩
(@katsuhiro-endo)
New Member
結合: 7年前
投稿: 4
Topic starter  

ご返信ありがとうございます。

現在、次のようなコードにて対応しております。

ulong pzc_rand(ulong vv){
  ulong x= vv<<32;
  ulong y= vv>>32;
  asm volatile ("i64.or %0 %1 %2":"=r"(vv):"r"(x),"r"(y));
  return vv;
}

 

ありがとうございます。


返信引用