core.simd
Встроенные SIMD-интринсики
- Источник
- core/simd.d
- Лицензия:
- Лицензия Boost 1.0.
- Авторы:
- Уолтер Брайт,
- шаблон Vector(T)
-
Создать тип вектора.
- Параметры
- T = один из double[2], float[4], void[16], byte[16], ubyte[16], short[8], ushort[8], int[4], uint[4], long[2], ulong[2]. Для векторов 256 бит, один из double[4], float[8], void[32], byte[32], ubyte[32], short[16], ushort[16], int[8], uint[8], long[4], ulong[4]
- псевдоним void16 = __vector(void[16]);
- псевдоним double2 = __vector(double[2]);
- псевдоним float4 = __vector(float[4]);
- псевдоним byte16 = __vector(byte[16]);
- псевдоним ubyte16 = __vector(ubyte[16]);
- псевдоним short8 = __vector(short[8]);
- псевдоним ushort8 = __vector(ushort[8]);
- псевдоним int4 = __vector(int[4]);
- псевдоним uint4 = __vector(uint[4]);
- псевдоним long2 = __vector(long[2]);
- псевдоним ulong2 = __vector(ulong[2]);
- перечисление XMM: int;
-
XMM-коды операций, которые соответствуют следующим:
код xmm1,xmm2/mem
и не имеют побочных эффектов (т.е. не записывают в память). - чистая nothrow @nogc @safe void16 __simd(XMM opcode, void16 op1, void16 op2);
-
Генерировать инструкцию с двумя операндами с 128-битными операндами XMM.
Это магическая функция компилятора — она не ведет себя как обычная функция D.
- Параметры
- opcode = любой из кодов операций XMM; он должен быть константой времени компиляции op1 = первый операнд op2 = второй операнд
- Возвращаемое значение:
- результат opcode
- Примеры:
-
float4 a; a = cast(float4)__simd(XMM.PXOR, a, a);
- чистая nothrow @nogc @safe void16 __simd(XMM opcode, void16 op1);
-
Унарные SIMD-инструкции.
- чистая nothrow @nogc @safe void16 __simd(XMM opcode, double d);
- чистая nothrow @nogc @safe void16 __simd(XMM opcode, float f);
-
- Примеры:
-
float4 a; a = cast(float4)__simd(XMM.LODSS, a);
- чистая nothrow @nogc @safe void16 __simd(XMM opcode, void16 op1, void16 op2, ubyte imm8);
-
Для инструкций: CMPPD, CMPSS, CMPSD, CMPPS, PSHUFD, PSHUFHW, PSHUFLW, BLENDPD, BLENDPS, DPPD, DPPS, MPSADBW, PBLENDW, ROUNDPD, ROUNDPS, ROUNDSD, ROUNDSS
- Параметры
- opcode = любой из вышеперечисленных кодов операций XMM; он должен быть константой времени компиляции op1 = первый операнд op2 = второй операнд imm8 = третий операнд; он должен быть константой времени компиляции
- Возвращаемое значение:
- результат opcode
- Примеры:
-
float4 a; a = cast(float4)__simd(XMM.CMPPD, a, a, 0x7A);
- чистая nothrow @nogc @safe void16 __simd_ib(XMM opcode, void16 op1, ubyte imm8);
-
Для инструкций с версией imm8: PSLLD, PSLLQ, PSLLW, PSRAD, PSRAW, PSRLD, PSRLQ, PSRLW, PSRLDQ, PSLLDQ
- Параметры
- opcode = любой из XMM-кодов операций; он должен быть константой времени компиляции op1 = первый операнд imm8 = второй операнд; он должен быть константой времени компиляции
- Возвращаемое значение:
- результат opcode
- Примеры:
-
float4 a; a = cast(float4) __simd_ib(XMM.PSRLQ, a, 0x7A);
- чистая nothrow @nogc @safe void16 __simd_sto(XMM opcode, void16 op1, void16 op2);
-
Для операций "сохранения" вида: op1 op= op2
- Возвращаемое значение:
- op2 Эти операции не могут быть помечены как чистые, так как semantic() их не проверяет.
- чистая nothrow @nogc @safe void16 __simd_sto(XMM opcode, double op1, void16 op2);
- чистая nothrow @nogc @safe void16 __simd_sto(XMM opcode, float op1, void16 op2);
-
- Примеры:
-
void16 a; float f = 1; double d = 1; cast(void)__simd_sto(XMM.STOUPS, a, a); cast(void)__simd_sto(XMM.STOUPS, f, a); cast(void)__simd_sto(XMM.STOUPS, d, a);
- void prefetch(bool writeFetch, ubyte locality)(const(void)* address);
-
Выдать инструкцию префеча.
- Параметры:
const(void)* addressадрес для предварительной выборки writeFetch true для префеча записи, false для префеча чтения locality 0..3 (0 означает наименьшую локальность, 3 — наибольшую)
- Примечание
- Карты Intel:
writeFetch locality Инструкция false 0 prefetchnta false 1 prefetch2 false 2 prefetch1 false 3 prefetch0 true 0 prefetchw true 1 prefetchw true 2 prefetchw true 3 prefetchw - V loadUnaligned(V)(const V* p)
Ограничения: если (is(V == void16) || is(V == byte16) || is(V == ubyte16) || is(V == short8) || is(V == ushort8) || is(V == int4) || is(V == uint4) || is(V == long2) || is(V == ulong2) || is(V == double2) || is(V == float4)); -
Загрузить невыровненный вектор из адреса. Это встроенная функция компилятора.
- Параметры:
V* pуказатель на вектор
- Возвращаемое значение:
- вектор
- V storeUnaligned(V)(V* p, V value)
Ограничения: если (is(V == void16) || is(V == byte16) || is(V == ubyte16) || is(V == short8) || is(V == ushort8) || is(V == int4) || is(V == uint4) || is(V == long2) || is(V == ulong2) || is(V == double2) || is(V == float4)); -
Сохранить вектор по невыровненному адресу. Это встроенная функция компилятора.
- Параметры:
V* pуказатель на вектор V valueзначение для сохранения
- Возвращаемое значение:
- значение
© 1999–2021 The D Language Foundation
Licensed under the Boost License 1.0.
https://dlang.org/phobos/core_simd.html