Предполагая, что у вас есть только AVX (т. е. нет AVX2), вы можете сделать что-то вроде этого:
float extract_float(const __m128 v, const int i)
{
float x;
_MM_EXTRACT_FLOAT(x, v, i);
return x;
}
void print(const __m128 v)
{
print(extract_float(v, 0));
print(extract_float(v, 1));
print(extract_float(v, 2));
print(extract_float(v, 3));
}
void print(const __m256 v)
{
print(_mm256_extractf128_ps(v, 0));
print(_mm256_extractf128_ps(v, 1));
}
Однако я думаю, что, вероятно, просто использовал бы союз:
union U256f {
__m256 v;
float a[8];
};
void print(const __m256 v)
{
const U256f u = { v };
for (int i = 0; i < 8; ++i)
print(u.a[i]);
}
Предположим, что у Вас есть a std::wstring str
. Следующее должно работать в gdb:
call printf("%ls", str._M_data())
(-l опция в printf делает это длинной строкой, и я полагаю, что Вам нужно"call
"оператор, потому что обычному gdb printf не нравится та опция.)
Я провел некоторое исследование, и это - gdb PR716, PR1998, PR2264. По-видимому, это - часто требуемая опция, которая еще не реализована.
вызов printf% ls
работает только иногда, но чтобы заставить его работать вообще в gdb 6.3, вам потребуется приведение void
и перевод строки \ n
показано здесь:
call (void)printf("\"%ls\"\n",str.c_str())
вот более надежная команда, которую вы можете поместить в свой .gdbinit, которая также показывает не-ASCII кодовые точки:
define wc_print echo " set $c = (wchar_t*)$arg0 while ( *$c ) if ( *$c > 0x7f ) printf "[%x]", *$c else printf "%c", *$c end set $c++ end echo "\n end
просто введите wc
(сокращение от wc_print
) с помощью std :: wstring
или wchar_t *
.
Подробнее см. http://www.firstobject.com/wchar_t-gdb. htm