/*
* gdb print xmm0
*/
(gdb) p/d $xmm0
$2 = {v4_float = {0, 13, 0, 0}, v2_double = {4489598, 0}, v16_int8 = {102, 102, 102, -74, 95, 32, 81, 65, 0, 0,
0, 0, 0, 0, 0, 0}, v8_int16 = {26214, -18842, 8287, 16721, 0, 0, 0, 0}, v4_int32 = {-1234803098,
1095835743, 0, 0}, v2_int64 = {4706578681033025126, 0}, uint128 = 4706578681033025126}
(gdb) p/f $xmm0
$3 = {v4_float = {-3.43322745e-06, 13.0704031, 0, 0}, v2_double = {4489598.8499999996, 0}, v16_int8 = {102,
102, 102, -74, 95, 32, 81, 65, 0, 0, 0, 0, 0, 0, 0, 0}, v8_int16 = {26214, -18842, 8287, 16721, 0, 0, 0,
0}, v4_int32 = {-3.43322745e-06, 13.0704031, 0, 0}, v2_int64 = {4489598.8499999996, 0},
uint128 = 1.71564184048696179356e-4932}
p/x $xmm0
$6 = {v4_float = {0x0, 0xd, 0x0, 0x0}, v2_double = {0x44817e, 0x0}, v16_int8 = {0x66, 0x66, 0x66, 0xb6, 0x5f,
0x20, 0x51, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v8_int16 = {0x6666, 0xb666, 0x205f, 0x4151, 0x0,
0x0, 0x0, 0x0}, v4_int32 = {0xb6666666, 0x4151205f, 0x0, 0x0}, v2_int64 = {0x4151205fb6666666, 0x0},
uint128 = 0x4151205fb6666666}
/* 使用gdb查看最后结果: */
.section .data
value1: .float 12.12, 34.89, 56.23, 78.45
value2: .float 31.12, 57.124, 234.23, 67.246
.section .text
.globl _main
_main:
enter $0, $0
movups value1, %xmm0
movups value2, %xmm1
addps %xmm0, %xmm1
movups value2, %xmm1
maxps %xmm0, %xmm1
leave
ret
编译时加-g参数加入调试信息,调用addps后查看xmm1寄存器的结果,命令如下:
(gdb) print $xmm1
$1 = {v4_float = {43.2400017, 92.0139999, 290.459991, 145.695999},
v2_double = {26419069594869.762, 1245245520236216.2}, v16_int8 = {-61, -11,
44, 66, 43, 7, -72, 66, -31, 58, -111, 67, 45, -78, 17, 67}, v8_int16 = {
-2621, 16940, 1835, 17080, 15073, 17297, -19923, 17169}, v4_int32 = {
1110242755, 1119356715, 1133591265, 1125233197}, v2_int64 = {
4807600484593235395, 4832839782622116577},
uint128 = 0x4311b22d43913ae142b8072b422cf5c3}
(gdb)
调用加法指令之后,四组和都存储在xmm1寄存器中,
gdb查看时由于不知道如何解析xmm1寄存器的内容,因为可能是单精度,也可能是双精度或者不同宽度的整数,
所以只能按不同的解析方式全部显示,查看v4_float即四个单精度浮点数的显示。