如何打印一个向量变量作为它的 128 位 vsx 值?
How to print a vector variable as its 128-bit vsx value?
我正在尝试找出在带有 Power8 的 PowerPC 上 运行 时的字节顺序问题。大端没问题,小端有点问题。
uint8x16_p8
下面是 __vector unsigned char
的 typedef
。在大端机器上我看到:
1110 uint8x16_p8 r5 = (uint8x16_p8)VectorLoadKey(s_mask);
(gdb)
1112 for (unsigned int i=0; i<rounds-2; ++i)
(gdb) p r5
= {0xd, 0xe, 0xf, 0xc, 0xd, 0xe, 0xf, 0xc, 0xd, 0xe, 0xf, 0xc, 0xd, 0xe,
0xf, 0xc}
在一台小端机器上我看到:
1110 uint8x16_p8 r5 = (uint8x16_p8)VectorLoadKey(s_mask);
(gdb)
1112 for (unsigned int i=0; i<rounds-2; ++i)
(gdb) p r5
= {0xc, 0xf, 0xe, 0xd, 0xc, 0xf, 0xe, 0xd, 0xc, 0xf, 0xe, 0xd, 0xc, 0xf,
0xe, 0xd}
当 gdb 打印它使用内存布局的值时:
(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 的另一个问题是,它不能反汇编表格"here",所以我找不到打印寄存器的位置。例如,disass .
不会"disassemble from here"(会导致语法错误),使用$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---
...
尝试__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
标量打印为正常值:
[jk@p8 ~]$ 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
= 0x00000003000000020000000100000000
(gdb)
或者,如果您知道使用了哪个寄存器,则直接打印寄存器值,使用 $<reg>
表示法:
(gdb) p $vs0
= {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}}
但是,请记住转换为标量可能会影响寄存器值;如果您不确定,请检查反汇编。
我正在尝试找出在带有 Power8 的 PowerPC 上 运行 时的字节顺序问题。大端没问题,小端有点问题。
uint8x16_p8
下面是 __vector unsigned char
的 typedef
。在大端机器上我看到:
1110 uint8x16_p8 r5 = (uint8x16_p8)VectorLoadKey(s_mask);
(gdb)
1112 for (unsigned int i=0; i<rounds-2; ++i)
(gdb) p r5
= {0xd, 0xe, 0xf, 0xc, 0xd, 0xe, 0xf, 0xc, 0xd, 0xe, 0xf, 0xc, 0xd, 0xe,
0xf, 0xc}
在一台小端机器上我看到:
1110 uint8x16_p8 r5 = (uint8x16_p8)VectorLoadKey(s_mask);
(gdb)
1112 for (unsigned int i=0; i<rounds-2; ++i)
(gdb) p r5
= {0xc, 0xf, 0xe, 0xd, 0xc, 0xf, 0xe, 0xd, 0xc, 0xf, 0xe, 0xd, 0xc, 0xf,
0xe, 0xd}
当 gdb 打印它使用内存布局的值时:
(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 的另一个问题是,它不能反汇编表格"here",所以我找不到打印寄存器的位置。例如,disass .
不会"disassemble from here"(会导致语法错误),使用$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---
...
尝试__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
标量打印为正常值:
[jk@p8 ~]$ 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
= 0x00000003000000020000000100000000
(gdb)
或者,如果您知道使用了哪个寄存器,则直接打印寄存器值,使用 $<reg>
表示法:
(gdb) p $vs0
= {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}}
但是,请记住转换为标量可能会影响寄存器值;如果您不确定,请检查反汇编。