dmd/changelog/vector-operation-support.dd
2020-07-15 12:53:56 +02:00

91 lines
4.7 KiB
Text

Usage of vector types and operations on an unsupported `-mcpu=` will now error
Previously, the compiler accepted the following code as being supported by all
`-mcpu=` types on both OSX 32-bit and all 64-bit targets.
---
__vector(long[4]) x; // AVX type
x += 1; // AVX2 operation
---
In this release, all `__vector` types and operations now check the current CPU
being targeted for, and will issue an error if there is insufficient support.
This also allows for conditional compilation using `__traits(compiles)` to
probe which operations are supported at compile-time.
---
static if (__traits(compiles, long4))
{
// Compiled in if `-mcpu=avx` or higher
}
static if (__traits(compiles, { int4 x; x += 1; }))
{
// Compiled in if `-mcpu=baseline` or higher
}
static if (__traits(compiles, { int4 x; x *= 1; }))
{
// Compiled in if `-mcpu=avx` or higher
}
static if (__traits(compiles, { int8 x; x += 1; }))
{
// Compiled in if `-mcpu=avx2` or higher
}
---
The following tables describe what minimum `-mcpu=` level is required.
$(TABLE2 Minimum Required `-mcpu=` for 128-bit Vector Types
$(THEAD void16,byte16,ubyte16,short8,ushort8,int4,uint4,long2,ulong2,float4,double2)
$(TROW baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline)
)
$(TABLE2 Minimum Required `-mcpu=` for 128-bit Vector Operators,
$(THEAD Operator,byte16,ubyte16,short8,ushort8,int4,uint4,long2,ulong2,float4,double2)
$(TROW +,baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline)
$(TROW -,baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline)
$(TROW *,$(NDASH),$(NDASH),baseline,baseline,avx,avx,$(NDASH),$(NDASH),baseline,baseline)
$(TROW /,$(NDASH),$(NDASH),$(NDASH),$(NDASH),$(NDASH),$(NDASH),$(NDASH),$(NDASH),baseline,baseline)
$(TROW $(CODE_AMP),baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline,$(NDASH),$(NDASH))
$(TROW |,baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline,$(NDASH),$(NDASH))
$(TROW $(D ^),baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline,$(NDASH),$(NDASH))
$(TROW +=,baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline)
$(TROW -=,baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline)
$(TROW *=,$(NDASH),$(NDASH),baseline,baseline,avx,avx,$(NDASH),$(NDASH),baseline,baseline)
$(TROW /=,$(NDASH),$(NDASH),$(NDASH),$(NDASH),$(NDASH),$(NDASH),$(NDASH),$(NDASH),baseline,baseline)
$(TROW $(CODE_AMP)=,baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline,$(NDASH),$(NDASH))
$(TROW |=,baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline,$(NDASH),$(NDASH))
$(TROW $(D ^=),baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline,$(NDASH),$(NDASH))
$(TROW $(I unary)$(D ~),baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline,$(NDASH),$(NDASH))
$(TROW $(I unary)+,baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline)
$(TROW $(I unary)-,baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline)
)
$(TABLE2 Minimum Required `-mcpu=` for 256-bit Vector Types
$(THEAD void32,byte32,ubyte32,short16,ushort16,int8,uint8,long4,ulong4,float8,double4)
$(TROW avx,avx,avx,avx,avx,avx,avx,avx,avx,avx,avx)
)
$(TABLE2 Minimum Required `-mcpu=` for 256-bit Vector Operators,
$(THEAD Operator,byte32,ubyte32,short16,ushort16,int8,uint8,long4,ulong4,float8,double4)
$(TROW +,avx2,avx2,avx2,avx2,avx2,avx2,avx2,avx2,avx,avx)
$(TROW -,avx2,avx2,avx2,avx2,avx2,avx2,avx2,avx2,avx,avx)
$(TROW *,$(NDASH),$(NDASH),avx2,avx2,avx2,avx2,$(NDASH),$(NDASH),avx,avx)
$(TROW /,$(NDASH),$(NDASH),$(NDASH),$(NDASH),$(NDASH),$(NDASH),$(NDASH),$(NDASH),avx,avx)
$(TROW $(CODE_AMP),avx2,avx2,avx2,avx2,avx2,avx2,avx2,avx2,$(NDASH),$(NDASH))
$(TROW |,avx2,avx2,avx2,avx2,avx2,avx2,avx2,avx2,$(NDASH),$(NDASH))
$(TROW $(D ^),avx2,avx2,avx2,avx2,avx2,avx2,avx2,avx2,$(NDASH),$(NDASH))
$(TROW +=,avx2,avx2,avx2,avx2,avx2,avx2,avx2,avx2,avx,avx)
$(TROW -=,avx2,avx2,avx2,avx2,avx2,avx2,avx2,avx2,avx,avx)
$(TROW *=,$(NDASH),$(NDASH),avx2,avx2,avx2,avx2,$(NDASH),$(NDASH),avx,avx)
$(TROW /=,$(NDASH),$(NDASH),$(NDASH),$(NDASH),$(NDASH),$(NDASH),$(NDASH),$(NDASH),avx,avx)
$(TROW $(CODE_AMP)=,avx2,avx2,avx2,avx2,avx2,avx2,avx2,avx2,$(NDASH),$(NDASH))
$(TROW |=,avx2,avx2,avx2,avx2,avx2,avx2,avx2,avx2,$(NDASH),$(NDASH))
$(TROW $(D ^=),avx2,avx2,avx2,avx2,avx2,avx2,avx2,avx2,$(NDASH),$(NDASH))
$(TROW $(I unary)$(D ~),avx2,avx2,avx2,avx2,avx2,avx2,avx2,avx2,$(NDASH),$(NDASH))
$(TROW $(I unary)+,baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline,baseline)
$(TROW $(I unary)-,avx2,avx2,avx2,avx2,avx2,avx2,avx2,avx2,avx,avx)
)