首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何打印向量变量作为其128位vsx值?

如何打印向量变量作为其128位vsx值?
EN

Stack Overflow用户
提问于 2017-09-21 01:31:26
回答 1查看 377关注 0票数 1

在PowerPC和Power8上运行时,我正试图跟踪一个无安全性问题。大末倒置,小恩典有麻烦了。

uint8x16_p8下面是__vector unsigned chartypedef。在一台大的终端机器上,我看到:

代码语言:javascript
复制
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}

在一台小小的endian机器上,我看到:

代码语言:javascript
复制
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}

当gdb使用内存布局打印值时:

代码语言:javascript
复制
(gdb) ptype r5
type = unsigned char __attribute__ ((vector_size(16)))
(gdb)

我希望在vsx寄存器中加载128位整数值。vsx寄存器值是一个重要的值,它始终是大端。如果vsx值有差异,那么我知道我需要在从内存加载时更改一个向量。

而且,GDB似乎不支持uint128_t

代码语言:javascript
复制
(gdb) p *(uint128_t)r5
No symbol "uint128_t" in current context.

如何让GDB打印vsx寄存器值(而不是内存布局值)?

GDB的另一个问题是,它不能在“这里”分解表单,所以我找不到打印寄存器的位置。例如,disass .不“从这里反汇编”(它会导致语法错误),而使用$pc不会在我所在的地方反汇编(看起来像函数的开始):

代码语言:javascript
复制
(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---
...
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-21 02:38:08

试试由gcc和gdb支持的__int128_t

代码语言:javascript
复制
#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标量打印为正常值:

代码语言:javascript
复制
[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
$1 = 0x00000003000000020000000100000000
(gdb) 

或者,如果您知道使用的是哪个寄存器,只需使用$<reg>符号直接打印寄存器值:

代码语言:javascript
复制
(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}}

但是,请记住,对标量的转换可能会影响寄存器值;如果不确定,请检查反汇编。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46334009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档