2017-09-21 17 views
1

Power8でPowerPCを実行しているときにendianessの問題を追跡しようとしています。ビッグエンディアンはOK、リトルエンディアンはいくつかの問題を抱えています。ベクトル変数を128ビットのvsx値として出力する方法は?

以下uint8x16_p8は、__vector unsigned chartypedefです。 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--- 
... 

答えて

1

は、__int128_tをお試しくださいgccの& GDBによってサポートされている。そして、

#include <stdint.h> 

int main(void) 
{ 
    __uint128_t s; 
    vector int v = { 0, 1, 2, 3 }; 

    s = (__uint128_t)v; 

    (void)s; 

    return 0; 
} 

、あなたは正常値としてご__uint128_tスカラーを印刷することができる必要があります:

[[email protected] ~]$ gdb -quiet ./test 
Reading symbols from ./test...done. 
(gdb) break test.c:12 
Breakpoint 1 at 0x100005ec: file test.c, line 12. 
(gdb) run 
Starting program: /home/jk/test 

Breakpoint 1, main() at test.c:12 
12  return 0; 
(gdb) print s 
$1 = 0x00000003000000020000000100000000 
(gdb) 
スカラーへのキャストは、レジスタ値に影響を与える可能性があることに注意してください、しかし

(gdb) p $vs0 
$5 = {uint128 = 0x00000003000000020000000100000000, v2_double = { 
    2.1219957909652723e-314, 6.3659873738839482e-314}, v4_float = {0, 
    1.40129846e-45, 2.80259693e-45, 4.20389539e-45}, v4_int32 = {0, 1, 2, 3}, 
    v8_int16 = {0, 0, 1, 0, 2, 0, 3, 0}, v16_int8 = {0, 0, 0, 0, 1, 0, 0, 0, 2, 
    0, 0, 0, 3, 0, 0, 0}} 

;:あなたが使用されているどのレジスタ知っていれば0

それとも、単に$<reg>表記を使用して、直接レジスタ値を印刷不明な場合は分解を確認してください。

+0

ありがとうございます。リトルエンディアンのLinuxマシンであるGCC112で動作するようです。残念ながら、それはビッグエンディアンのAIXマシンであるGCC119では動作しません。 GCC119は "エラー: '__uint128_t'はこのスコープで宣言されていません」と文句を言います*。しかし、それは前進するのに十分であるはずです。 – jww

関連する問題