GCC Erweiterte ASM Syntax: Last 128-Bit-Speicherstelle als Quelle
Frage
GCC generiert diesen Code für den shuffle () unter:
movaps xmm0,XMMWORD PTR [rip+0x125]
pshufb xmm4,xmm0
Im Idealfall sollte dies sein:
pshufb xmm4,XMMWORD PTR [rip+0x125]
Was ist die erweiterte ASM Syntax diesen einzelnen Befehl zu generieren?
Vielen Dank, Adam
PS: Der Kommentar gesetzt intrinsische erzeugt den optimalen Code für dieses Beispiel. Das funktioniert nicht im Allgemeinen.
(GCC wahrscheinlich unnötig Register Kopien in Gegenwart von globalen Registervariablen zu erzeugen ist)#include <stdint.h>
typedef int8_t xmm_t __attribute__ ((vector_size (16)));
const xmm_t xmm_shuf={128, 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15};
register xmm_t xmm __asm__("xmm4");
#define NTL ".intel_syntax noprefix\n"
#define ATT ".att_syntax\n"
void shuffle() {
//xmm=__builtin_ia32_pshufb128(xmm, xmm_shuf);
__asm__(NTL"pshufb %0, %1\n"ATT : "=x" (xmm) : "x" (xmm_shuf));
}
int main() {
}
$ gcc -Os -std = gnu99 -msse4.1 -flax-Vektor-Umwandlungen pshufb_128bit_constant.c && objdump -d -m i386: x86-64: Intel a.out | weniger
0000000000400494 <shuffle>:
400494: 0f 28 05 25 01 00 00 movaps xmm0,XMMWORD PTR [rip+0x125] # 4005c0 <xmm_shuf+0x10>
40049b: 66 0f 38 00 e0 pshufb xmm4,xmm0
4004a0: c3 ret
Lösung
Ändern Sie die Einschränkung des Eingangsoperanden zu "xm"
, so dass die Speicherplätze zusätzlich zu SSE-Register erlaubt sind.
Allerdings, wenn ich es getestet, der Compiler erzeugte Code, der nicht gut mit Inteler Syntax nicht sitzen. Also, am Ende, das ist, was ich verwenden:
__asm__("pshufb %1, %0" : "+x" (xmm) : "xm" (xmm_shuf));