Power8でPowerPCを実行しているときにendianessの問題を追跡しようとしています。ビッグエンディアンはOK、リトルエンディアンはいくつかの問題を抱えています。ベクトル変数を128ビットのvsx値として出力する方法は?
以下uint8x16_p8
は、__vector unsigned char
のtypedef
です。 GDBはそれがメモリレイアウトを使用している値を出力する場合
1110 uint8x16_p8 r5 = (uint8x16_p8)VectorLoadKey(s_mask);
(gdb)
1112 for (unsigned int i=0; i<rounds-2; ++i)
(gdb) p r5
$1 = {0xc, 0xf, 0xe, 0xd, 0xc, 0xf, 0xe, 0xd, 0xc, 0xf, 0xe, 0xd, 0xc, 0xf,
0xe, 0xd}
::私は見リトルエンディアンのマシン上
1110 uint8x16_p8 r5 = (uint8x16_p8)VectorLoadKey(s_mask);
(gdb)
1112 for (unsigned int i=0; i<rounds-2; ++i)
(gdb) p r5
$1 = {0xd, 0xe, 0xf, 0xc, 0xd, 0xe, 0xf, 0xc, 0xd, 0xe, 0xf, 0xc, 0xd, 0xe,
0xf, 0xc}
:私は見ビッグエンディアンのマシン上
(gdb) ptype r5
type = unsigned char __attribute__ ((vector_size(16)))
(gdb)
私はvsxレジスタにロードされているときに128ビットの整数値を表示する必要があります。 vsxレジスタの値は重要な値であり、常にビッグエンディアンです。もしvsxの値に違いがあるなら、私はメモリからのロード中にベクトルを並べ替える必要があることを知っています。また
、GDBはuint128_t
をサポートするためには表示されません。
(gdb) p *(uint128_t)r5
No symbol "uint128_t" in current context.
どのように私は、GDBは、VSXレジスタ値(とないメモリレイアウト値)を印刷していますか?
GDBのもう1つの問題は、「ここ」という形式を逆アセンブルすることができないため、レジスタをどこに印刷するのかわかりません。例えば、disass .
は(それが関数の開始のように見える)(それは構文エラーになります)「ここから分解」しない、と私はどこ$pc
を使用すると、分解されていません。
(gdb) disass $pc
Dump of assembler code for function Rijndael_UncheckedSetKey_POWER8(...):
0x00000000104b82c8 <+0>: lis r2,4213
0x00000000104b82cc <+4>: addi r2,r2,-29952
0x00000000104b82d0 <+8>: mflr r0
0x00000000104b82d4 <+12>: std r0,16(r1)
0x00000000104b82d8 <+16>: std r31,-8(r1)
0x00000000104b82dc <+20>: stdu r1,-272(r1)
0x00000000104b82e0 <+24>: mr r31,r1
0x00000000104b82e4 <+28>: std r3,208(r31)
0x00000000104b82e8 <+32>: std r4,216(r31)
0x00000000104b82ec <+36>: std r5,224(r31)
0x00000000104b82f0 <+40>: std r6,232(r31)
0x00000000104b82f4 <+44>: mr r9,r7
0x00000000104b82f8 <+48>: stw r9,240(r31)
0x00000000104b82fc <+52>: ld r9,216(r31)
0x00000000104b8300 <+56>: cmpdi cr7,r9,16
0x00000000104b8304 <+60>: bne cr7,0x104b8548 <Rijndael_UncheckedSetKey_POWER8(...)+640>
0x00000000104b8308 <+64>: ld r9,208(r31)
0x00000000104b830c <+68>: std r9,32(r31)
---Type <return> to continue, or q <return> to quit---
...
ありがとうございます。リトルエンディアンのLinuxマシンであるGCC112で動作するようです。残念ながら、それはビッグエンディアンのAIXマシンであるGCC119では動作しません。 GCC119は "エラー: '__uint128_t'はこのスコープで宣言されていません」と文句を言います*。しかし、それは前進するのに十分であるはずです。 – jww