Я пытаюсь перенести некоторый код ASM на C/C++, используя встроенные модули. код ASM содержит:
+ # Unpack a-h data from the packed vector to a vector register each
+
+ vsldoi 10, 9, 9, 12
+ vsldoi 11, 9, 9, 8
+ vsldoi 12, 9, 9, 4
Я не могу найти встроенную версию для vec_vsldoi
. При поиске на сайте IBM я получаю 0 результатов а>. Я думаю vec_sldw
близок, но принимает 3 аргумента вместо 4.
Мой первый вопрос, есть ли встроенный для vec_vsldoi
? если нет, используем ли мы vec_sldw
или что-то еще?
Мы поддерживаем GCC 4.8 в дополнение к XL C/C++. GCC, похоже, не имеет обоих внутренних свойств. Думаю, у меня есть замена, но у меня есть свои оговорки. Тестовая программа показывает, что ассемблер может собрать vsldoi
.
// GCC 4.8 is missing vec_sldw and vec_vsldoi
#if defined(XLC_VERSION)
# define VEC_VSLDOI(a,b,c) vec_vsldoi(a,b,c)
#elif defined(GCC_VERSION)
# define VEC_VSLDOI(a,b,c) VEC_VSLDOI_TEMPLATE<c>(a,b)
template<unsigned int C>
uint8x16_p8 VEC_VSLDOI_TEMPLATE(uint8x16_p8 a, const uint8x16_p8& b)
{
uint8x16_p8 r;
__asm
(
"vsldoi %0, %1, %2, %3 \t\n"
: "=v" (t) : "v" (a), "v" (b), "I" (C) : "cc"
);
return r;
}
#endif
Мой второй вопрос: верен ли расширенный GCC ASM, или мы должны делать что-то еще?