Skip to content

Commit c4253c7

Browse files
aratajewigcbot
authored andcommitted
Support for SPV_EXT_shader_atomic_float_min_max
1 parent e1c04fd commit c4253c7

File tree

5 files changed

+294
-0
lines changed

5 files changed

+294
-0
lines changed

IGC/AdaptorOCL/SPIRV/SPIRVInternal.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,8 @@ _SPIRV_OP(OpAtomicStore)
305305
_SPIRV_OP(OpAtomicUMax)
306306
_SPIRV_OP(OpAtomicUMin)
307307
_SPIRV_OP(OpAtomicXor)
308+
_SPIRV_OP(OpAtomicFMinEXT)
309+
_SPIRV_OP(OpAtomicFMaxEXT)
308310
_SPIRV_OP(OpAtomicFAddEXT)
309311
_SPIRV_OP(OpDot)
310312
_SPIRV_OP(OpGroupAsyncCopy)

IGC/AdaptorOCL/SPIRV/libSPIRV/SPIRVInstruction.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1852,6 +1852,9 @@ _SPIRV_OP(AtomicXor, true, 7)
18521852
#define _SPIRV_OP(x, ...) \
18531853
typedef SPIRVInstTemplate<SPIRVInstTemplateBase, Op##x, __VA_ARGS__> \
18541854
SPIRV##x;
1855+
// SPV_EXT_shader_atomic_float_min_max
1856+
_SPIRV_OP(AtomicFMinEXT, true, 7)
1857+
_SPIRV_OP(AtomicFMaxEXT, true, 7)
18551858
// SPV_EXT_shader_atomic_float_add
18561859
_SPIRV_OP(AtomicFAddEXT, true, 7)
18571860
#undef _SPIRV_OP

IGC/AdaptorOCL/SPIRV/libSPIRV/SPIRVOpCodeEnum.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,9 @@ _SPIRV_OP(SubgroupImageMediaBlockWriteINTEL, 5581)
379379
_SPIRV_OP(AsmTargetINTEL, 5609)
380380
_SPIRV_OP(AsmINTEL, 5610)
381381
_SPIRV_OP(AsmCallINTEL, 5611)
382+
// SPV_EXT_shader_atomic_float_min_max
383+
_SPIRV_OP(AtomicFMinEXT, 5614)
384+
_SPIRV_OP(AtomicFMaxEXT, 5615)
382385
// optimization_hints
383386
_SPIRV_OP(AssumeTrueINTEL, 5630)
384387
_SPIRV_OP(ExpectINTEL, 5631)

IGC/BiFModule/Headers/spirv.h

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4119,6 +4119,51 @@ double __builtin_spirv_OpAtomicFAddEXT_p4f64_i32_i32_f64(volatile generic double
41194119
#endif // __OPENCL_C_VERSION__ >= CL_VERSION_2_0
41204120
#endif // defined(cl_khr_fp64)
41214121

4122+
// SPV_EXT_shader_atomic_float_min_max
4123+
#if defined(cl_khr_fp16)
4124+
half __builtin_spirv_OpAtomicFMinEXT_p0f16_i32_i32_f16(volatile private half* Pointer, uint Scope, uint Semantics, half Value);
4125+
half __builtin_spirv_OpAtomicFMinEXT_p1f16_i32_i32_f16(volatile global half* Pointer, uint Scope, uint Semantics, half Value);
4126+
half __builtin_spirv_OpAtomicFMinEXT_p3f16_i32_i32_f16(volatile local half* Pointer, uint Scope, uint Semantics, half Value);
4127+
#endif // defined(cl_khr_fp16)
4128+
float __builtin_spirv_OpAtomicFMinEXT_p0f32_i32_i32_f32(volatile private float* Pointer, uint Scope, uint Semantics, float Value);
4129+
float __builtin_spirv_OpAtomicFMinEXT_p1f32_i32_i32_f32(volatile global float* Pointer, uint Scope, uint Semantics, float Value);
4130+
float __builtin_spirv_OpAtomicFMinEXT_p3f32_i32_i32_f32(volatile local float* Pointer, uint Scope, uint Semantics, float Value);
4131+
#if defined(cl_khr_fp64)
4132+
double __builtin_spirv_OpAtomicFMinEXT_p0f64_i32_i32_f64(volatile private double* Pointer, uint Scope, uint Semantics, double Value);
4133+
double __builtin_spirv_OpAtomicFMinEXT_p1f64_i32_i32_f64(volatile global double* Pointer, uint Scope, uint Semantics, double Value);
4134+
double __builtin_spirv_OpAtomicFMinEXT_p3f64_i32_i32_f64(volatile local double* Pointer, uint Scope, uint Semantics, double Value);
4135+
#endif // defined(cl_khr_fp64)
4136+
#if (__OPENCL_C_VERSION__ >= CL_VERSION_2_0)
4137+
#if defined(cl_khr_fp16)
4138+
half __builtin_spirv_OpAtomicFMinEXT_p4f16_i32_i32_f16(volatile generic half* Pointer, uint Scope, uint Semantics, half Value);
4139+
#endif // defined(cl_khr_fp16)
4140+
float __builtin_spirv_OpAtomicFMinEXT_p4f32_i32_i32_f32(volatile generic float* Pointer, uint Scope, uint Semantics, float Value);
4141+
#if defined(cl_khr_fp64)
4142+
double __builtin_spirv_OpAtomicFMinEXT_p4f64_i32_i32_f64(volatile generic double* Pointer, uint Scope, uint Semantics, double Value);
4143+
#endif // defined(cl_khr_fp64)
4144+
#endif // __OPENCL_C_VERSION__ >= CL_VERSION_2_0
4145+
#if defined(cl_khr_fp16)
4146+
half __builtin_spirv_OpAtomicFMaxEXT_p0f16_i32_i32_f16(volatile private half *Pointer, uint Scope, uint Semantics, half Value);
4147+
half __builtin_spirv_OpAtomicFMaxEXT_p1f16_i32_i32_f16(volatile global half *Pointer, uint Scope, uint Semantics, half Value);
4148+
half __builtin_spirv_OpAtomicFMaxEXT_p3f16_i32_i32_f16(volatile local half *Pointer, uint Scope, uint Semantics, half Value);
4149+
#endif // defined(cl_khr_fp16)
4150+
float __builtin_spirv_OpAtomicFMaxEXT_p0f32_i32_i32_f32(volatile private float* Pointer, uint Scope, uint Semantics, float Value);
4151+
float __builtin_spirv_OpAtomicFMaxEXT_p1f32_i32_i32_f32(volatile global float* Pointer, uint Scope, uint Semantics, float Value);
4152+
float __builtin_spirv_OpAtomicFMaxEXT_p3f32_i32_i32_f32(volatile local float* Pointer, uint Scope, uint Semantics, float Value);
4153+
#if defined(cl_khr_fp64)
4154+
double __builtin_spirv_OpAtomicFMaxEXT_p0f64_i32_i32_f64(volatile private double* Pointer, uint Scope, uint Semantics, double Value);
4155+
double __builtin_spirv_OpAtomicFMaxEXT_p1f64_i32_i32_f64(volatile global double* Pointer, uint Scope, uint Semantics, double Value);
4156+
double __builtin_spirv_OpAtomicFMaxEXT_p3f64_i32_i32_f64(volatile local double* Pointer, uint Scope, uint Semantics, double Value);
4157+
#endif // defined(cl_khr_fp64)
4158+
#if (__OPENCL_C_VERSION__ >= CL_VERSION_2_0)
4159+
#if defined(cl_khr_fp16)
4160+
half __builtin_spirv_OpAtomicFMaxEXT_p4f16_i32_i32_f16(volatile generic half *Pointer, uint Scope, uint Semantics, half Value);
4161+
#endif // defined(cl_khr_fp16)
4162+
float __builtin_spirv_OpAtomicFMaxEXT_p4f32_i32_i32_f32(volatile generic float* Pointer, uint Scope, uint Semantics, float Value);
4163+
#if defined(cl_khr_fp64)
4164+
double __builtin_spirv_OpAtomicFMaxEXT_p4f64_i32_i32_f64(volatile generic double* Pointer, uint Scope, uint Semantics, double Value);
4165+
#endif // defined(cl_khr_fp64)
4166+
#endif // __OPENCL_C_VERSION__ >= CL_VERSION_2_0
41224167

41234168
// Barrier Instructions
41244169

IGC/BiFModule/Implementation/atomics.cl

Lines changed: 241 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1743,6 +1743,247 @@ double __builtin_spirv_OpAtomicFAddEXT_p4f64_i32_i32_f64( volatile __generic dou
17431743
}
17441744
#endif // (__OPENCL_C_VERSION__ >= CL_VERSION_2_0)
17451745

1746+
half __builtin_spirv_OpAtomicFMinEXT_p0f16_i32_i32_f16(volatile private half* Pointer, uint Scope, uint Semantics, half Value)
1747+
{
1748+
half orig = *Pointer;
1749+
*Pointer = (orig < Value) ? orig : Value;
1750+
return orig;
1751+
}
1752+
1753+
half __builtin_spirv_OpAtomicFMinEXT_p1f16_i32_i32_f16(volatile global half* Pointer, uint Scope, uint Semantics, half Value)
1754+
{
1755+
half orig;
1756+
FENCE_PRE_OP(Scope, Semantics, true)
1757+
SPINLOCK_START(global)
1758+
orig = *Pointer;
1759+
*Pointer = (orig < Value) ? orig : Value;
1760+
SPINLOCK_END(global)
1761+
FENCE_POST_OP(Scope, Semantics, true)
1762+
return orig;
1763+
}
1764+
1765+
half __builtin_spirv_OpAtomicFMinEXT_p3f16_i32_i32_f16(volatile local half* Pointer, uint Scope, uint Semantics, half Value)
1766+
{
1767+
half orig;
1768+
FENCE_PRE_OP(Scope, Semantics, false)
1769+
SPINLOCK_START(local)
1770+
orig = *Pointer;
1771+
*Pointer = (orig < Value) ? orig : Value;
1772+
SPINLOCK_END(local)
1773+
FENCE_POST_OP(Scope, Semantics, false)
1774+
return orig;
1775+
}
1776+
1777+
#if (__OPENCL_C_VERSION__ >= CL_VERSION_2_0)
1778+
half __builtin_spirv_OpAtomicFMinEXT_p4f16_i32_i32_f16(volatile generic half* Pointer, uint Scope, uint Semantics, half Value)
1779+
{
1780+
if (__builtin_spirv_OpGenericCastToPtrExplicit_p3i8_p4i8_i32(__builtin_astype((Pointer), __generic void*), StorageWorkgroup))
1781+
{
1782+
return __builtin_spirv_OpAtomicFMinEXT_p3f16_i32_i32_f16((__local half*)Pointer, Scope, Semantics, Value);
1783+
}
1784+
else
1785+
{
1786+
return __builtin_spirv_OpAtomicFMinEXT_p1f16_i32_i32_f16((__global half*)Pointer, Scope, Semantics, Value);
1787+
}
1788+
}
1789+
#endif // (__OPENCL_C_VERSION__ >= CL_VERSION_2_0)
1790+
1791+
float __builtin_spirv_OpAtomicFMinEXT_p0f32_i32_i32_f32(volatile private float* Pointer, uint Scope, uint Semantics, float Value)
1792+
{
1793+
float orig = *Pointer;
1794+
*Pointer = (orig < Value) ? orig : Value;
1795+
return orig;
1796+
}
1797+
1798+
float __builtin_spirv_OpAtomicFMinEXT_p1f32_i32_i32_f32(volatile global float* Pointer, uint Scope, uint Semantics, float Value)
1799+
{
1800+
atomic_operation_1op_as_float(__builtin_IB_atomic_min_global_f32, float, Pointer, Scope, Semantics, Value, true);
1801+
}
1802+
1803+
float __builtin_spirv_OpAtomicFMinEXT_p3f32_i32_i32_f32(volatile local float* Pointer, uint Scope, uint Semantics, float Value)
1804+
{
1805+
atomic_operation_1op_as_float(__builtin_IB_atomic_min_local_f32, float, Pointer, Scope, Semantics, Value, false);
1806+
}
1807+
1808+
#if (__OPENCL_C_VERSION__ >= CL_VERSION_2_0)
1809+
float __builtin_spirv_OpAtomicFMinEXT_p4f32_i32_i32_f32(volatile generic float* Pointer, uint Scope, uint Semantics, float Value)
1810+
{
1811+
if (__builtin_spirv_OpGenericCastToPtrExplicit_p3i8_p4i8_i32(__builtin_astype((Pointer), __generic void*), StorageWorkgroup))
1812+
{
1813+
return __builtin_spirv_OpAtomicFMinEXT_p3f32_i32_i32_f32((__local float*)Pointer, Scope, Semantics, Value);
1814+
}
1815+
else
1816+
{
1817+
return __builtin_spirv_OpAtomicFMinEXT_p1f32_i32_i32_f32((__global float*)Pointer, Scope, Semantics, Value);
1818+
}
1819+
}
1820+
#endif // (__OPENCL_C_VERSION__ >= CL_VERSION_2_0)
1821+
1822+
double __builtin_spirv_OpAtomicFMinEXT_p0f64_i32_i32_f64(volatile private double* Pointer, uint Scope, uint Semantics, double Value)
1823+
{
1824+
double orig = *Pointer;
1825+
*Pointer = (orig < Value) ? orig : Value;
1826+
return orig;
1827+
}
1828+
1829+
double __builtin_spirv_OpAtomicFMinEXT_p1f64_i32_i32_f64(volatile global double* Pointer, uint Scope, uint Semantics, double Value)
1830+
{
1831+
double orig;
1832+
FENCE_PRE_OP(Scope, Semantics, true)
1833+
SPINLOCK_START(global)
1834+
orig = *Pointer;
1835+
*Pointer = (orig < Value) ? orig : Value;
1836+
SPINLOCK_END(global)
1837+
FENCE_POST_OP(Scope, Semantics, true)
1838+
return orig;
1839+
}
1840+
1841+
double __builtin_spirv_OpAtomicFMinEXT_p3f64_i32_i32_f64(volatile local double* Pointer, uint Scope, uint Semantics, double Value)
1842+
{
1843+
double orig;
1844+
FENCE_PRE_OP(Scope, Semantics, false)
1845+
SPINLOCK_START(local)
1846+
orig = *Pointer;
1847+
*Pointer = (orig < Value) ? orig : Value;
1848+
SPINLOCK_END(local)
1849+
FENCE_POST_OP(Scope, Semantics, false)
1850+
return orig;
1851+
}
1852+
1853+
#if (__OPENCL_C_VERSION__ >= CL_VERSION_2_0)
1854+
double __builtin_spirv_OpAtomicFMinEXT_p4f64_i32_i32_f64(volatile generic double* Pointer, uint Scope, uint Semantics, double Value)
1855+
{
1856+
if (__builtin_spirv_OpGenericCastToPtrExplicit_p3i8_p4i8_i32(__builtin_astype((Pointer), __generic void*), StorageWorkgroup))
1857+
{
1858+
return __builtin_spirv_OpAtomicFMinEXT_p3f64_i32_i32_f64((__local double*)Pointer, Scope, Semantics, Value);
1859+
}
1860+
else
1861+
{
1862+
return __builtin_spirv_OpAtomicFMinEXT_p1f64_i32_i32_f64((__global double*)Pointer, Scope, Semantics, Value);
1863+
}
1864+
}
1865+
#endif // (__OPENCL_C_VERSION__ >= CL_VERSION_2_0)
1866+
1867+
half __builtin_spirv_OpAtomicFMaxEXT_p0f16_i32_i32_f16(volatile private half* Pointer, uint Scope, uint Semantics, half Value)
1868+
{
1869+
half orig = *Pointer;
1870+
*Pointer = (orig > Value) ? orig : Value;
1871+
return orig;
1872+
}
1873+
1874+
half __builtin_spirv_OpAtomicFMaxEXT_p1f16_i32_i32_f16(volatile global half* Pointer, uint Scope, uint Semantics, half Value)
1875+
{
1876+
half orig;
1877+
FENCE_PRE_OP(Scope, Semantics, true)
1878+
SPINLOCK_START(global)
1879+
orig = *Pointer;
1880+
*Pointer = (orig > Value) ? orig : Value;
1881+
SPINLOCK_END(global)
1882+
FENCE_POST_OP(Scope, Semantics, true)
1883+
return orig;
1884+
}
1885+
1886+
half __builtin_spirv_OpAtomicFMaxEXT_p3f16_i32_i32_f16(volatile local half* Pointer, uint Scope, uint Semantics, half Value)
1887+
{
1888+
half orig;
1889+
FENCE_PRE_OP(Scope, Semantics, false)
1890+
SPINLOCK_START(local)
1891+
orig = *Pointer;
1892+
*Pointer = (orig > Value) ? orig : Value;
1893+
SPINLOCK_END(local)
1894+
FENCE_POST_OP(Scope, Semantics, false)
1895+
return orig;
1896+
}
1897+
1898+
#if (__OPENCL_C_VERSION__ >= CL_VERSION_2_0)
1899+
half __builtin_spirv_OpAtomicFMaxEXT_p4f16_i32_i32_f16(volatile generic half* Pointer, uint Scope, uint Semantics, half Value)
1900+
{
1901+
if (__builtin_spirv_OpGenericCastToPtrExplicit_p3i8_p4i8_i32(__builtin_astype((Pointer), __generic void*), StorageWorkgroup))
1902+
{
1903+
return __builtin_spirv_OpAtomicFMaxEXT_p3f16_i32_i32_f16((__local half*)Pointer, Scope, Semantics, Value);
1904+
}
1905+
else
1906+
{
1907+
return __builtin_spirv_OpAtomicFMaxEXT_p1f16_i32_i32_f16((__global half*)Pointer, Scope, Semantics, Value);
1908+
}
1909+
}
1910+
#endif // (__OPENCL_C_VERSION__ >= CL_VERSION_2_0)
1911+
1912+
float __builtin_spirv_OpAtomicFMaxEXT_p0f32_i32_i32_f32(volatile private float* Pointer, uint Scope, uint Semantics, float Value)
1913+
{
1914+
float orig = *Pointer;
1915+
*Pointer = (orig > Value) ? orig : Value;
1916+
return orig;
1917+
}
1918+
1919+
float __builtin_spirv_OpAtomicFMaxEXT_p1f32_i32_i32_f32(volatile global float* Pointer, uint Scope, uint Semantics, float Value)
1920+
{
1921+
atomic_operation_1op_as_float(__builtin_IB_atomic_max_global_f32, float, Pointer, Scope, Semantics, Value, true);
1922+
}
1923+
1924+
float __builtin_spirv_OpAtomicFMaxEXT_p3f32_i32_i32_f32(volatile local float* Pointer, uint Scope, uint Semantics, float Value)
1925+
{
1926+
atomic_operation_1op_as_float(__builtin_IB_atomic_max_local_f32, float, Pointer, Scope, Semantics, Value, false);
1927+
}
1928+
1929+
#if (__OPENCL_C_VERSION__ >= CL_VERSION_2_0)
1930+
float __builtin_spirv_OpAtomicFMaxEXT_p4f32_i32_i32_f32(volatile generic float* Pointer, uint Scope, uint Semantics, float Value)
1931+
{
1932+
if (__builtin_spirv_OpGenericCastToPtrExplicit_p3i8_p4i8_i32(__builtin_astype((Pointer), __generic void*), StorageWorkgroup))
1933+
{
1934+
return __builtin_spirv_OpAtomicFMaxEXT_p3f32_i32_i32_f32((__local float*)Pointer, Scope, Semantics, Value);
1935+
}
1936+
else
1937+
{
1938+
return __builtin_spirv_OpAtomicFMaxEXT_p1f32_i32_i32_f32((__global float*)Pointer, Scope, Semantics, Value);
1939+
}
1940+
}
1941+
#endif // (__OPENCL_C_VERSION__ >= CL_VERSION_2_0)
1942+
1943+
double __builtin_spirv_OpAtomicFMaxEXT_p0f64_i32_i32_f64(volatile private double* Pointer, uint Scope, uint Semantics, double Value)
1944+
{
1945+
double orig = *Pointer;
1946+
*Pointer = (orig > Value) ? orig : Value;
1947+
return orig;
1948+
}
1949+
1950+
double __builtin_spirv_OpAtomicFMaxEXT_p1f64_i32_i32_f64(volatile global double* Pointer, uint Scope, uint Semantics, double Value)
1951+
{
1952+
double orig;
1953+
FENCE_PRE_OP(Scope, Semantics, true)
1954+
SPINLOCK_START(global)
1955+
orig = *Pointer;
1956+
*Pointer = (orig > Value) ? orig : Value;
1957+
SPINLOCK_END(global)
1958+
FENCE_POST_OP(Scope, Semantics, true)
1959+
return orig;
1960+
}
1961+
1962+
double __builtin_spirv_OpAtomicFMaxEXT_p3f64_i32_i32_f64(volatile local double* Pointer, uint Scope, uint Semantics, double Value)
1963+
{
1964+
double orig;
1965+
FENCE_PRE_OP(Scope, Semantics, false)
1966+
SPINLOCK_START(local)
1967+
orig = *Pointer;
1968+
*Pointer = (orig > Value) ? orig : Value;
1969+
SPINLOCK_END(local)
1970+
FENCE_POST_OP(Scope, Semantics, false)
1971+
return orig;
1972+
}
1973+
1974+
#if (__OPENCL_C_VERSION__ >= CL_VERSION_2_0)
1975+
double __builtin_spirv_OpAtomicFMaxEXT_p4f64_i32_i32_f64(volatile generic double* Pointer, uint Scope, uint Semantics, double Value)
1976+
{
1977+
if (__builtin_spirv_OpGenericCastToPtrExplicit_p3i8_p4i8_i32(__builtin_astype((Pointer), __generic void*), StorageWorkgroup))
1978+
{
1979+
return __builtin_spirv_OpAtomicFMaxEXT_p3f64_i32_i32_f64((__local double*)Pointer, Scope, Semantics, Value);
1980+
}
1981+
else
1982+
{
1983+
return __builtin_spirv_OpAtomicFMaxEXT_p1f64_i32_i32_f64((__global double*)Pointer, Scope, Semantics, Value);
1984+
}
1985+
}
1986+
#endif // (__OPENCL_C_VERSION__ >= CL_VERSION_2_0)
17461987

17471988
#undef ATOMIC_FLAG_FALSE
17481989
#undef ATOMIC_FLAG_TRUE

0 commit comments

Comments
 (0)