blob: 9e90c15deb602383af04ec331bf9c862e5022a64 [file] [log] [blame]
// { dg-additional-options "-mavx" { target avx_runtime } }
// { dg-do compile { target { avx_runtime || vect_sizes_16B_8B } } }
module gcc.simd;
alias int4 = __vector(int[4]);
alias short8 = __vector(short[8]);
alias float4 = __vector(float[4]);
alias byte16 = __vector(byte[16]);
struct fake4 { int[4] v; }
enum f = fake4();
void test_load_store()
{
loadUnaligned!int(null); // { dg-warning "mismatch in return type" }
loadUnaligned!double(null); // { dg-warning "mismatch in return type" }
loadUnaligned!int4(null);
loadUnaligned!short8(null);
loadUnaligned!float4(null);
loadUnaligned!byte16(null);
loadUnaligned!fake4(null); // { dg-warning "mismatch in return type" }
storeUnaligned!int(null, 1); // { dg-warning "mismatch in return type" }
storeUnaligned!double(null, 1); // { dg-warning "mismatch in return type" }
storeUnaligned!int4(null, 1);
storeUnaligned!short8(null, 1);
storeUnaligned!float4(null, 1);
storeUnaligned!byte16(null, 1);
storeUnaligned!fake4(null, f); // { dg-warning "mismatch in return type" }
}
void test_shuffle()
{
shuffle!(int, int, int)(0, 0, 0); // { dg-warning "mismatch in return type" }
shuffle!(double, int, int)(0, 0, 0); // { dg-warning "mismatch in return type" }
shuffle!(fake4, int, int)(f, 0, 0); // { dg-warning "mismatch in return type" }
shuffle!(int4, int, int)(0, 0, 0); // { dg-warning "mismatch in argument 2" }
shuffle!(int4, double, int)(0, 0, 0); // { dg-warning "mismatch in argument 2" }
shuffle!(int4, fake4, int)(0, f, 0); // { dg-warning "mismatch in argument 2" }
shuffle!(int4, int4, int)(0, 0, 0); // { dg-warning "mismatch in argument 3" }
shuffle!(int4, int4, double)(0, 0, 0); // { dg-warning "mismatch in argument 3" }
shuffle!(int4, int4, fake4)(0, 0, f); // { dg-warning "mismatch in argument 3" }
shuffle!(int4, int4, int4)(0, 0, 0);
shuffle!(int4, short8, int4)(0, 0, 0); // { dg-error "mismatch in argument 2" }
shuffle!(int4, float4, int4)(0, 0, 0); // { dg-error "mismatch in argument 2" }
shuffle!(int4, byte16, int4)(0, 0, 0); // { dg-error "mismatch in argument 2" }
shuffle!(int4, int4, short8)(0, 0, 0); // { dg-error "mismatch in argument 3" }
shuffle!(int4, int4, float4)(0, 0, 0); // { dg-error "mismatch in argument 3" }
shuffle!(int4, int4, byte16)(0, 0, 0); // { dg-error "mismatch in argument 3" }
shuffle!(float4, int4, int4)(0, 0, 0); // { dg-error "mismatch in argument 2" }
shuffle!(float4, short8, int4)(0, 0, 0); // { dg-error "mismatch in argument 2" }
shuffle!(float4, float4, int4)(0, 0, 0);
shuffle!(float4, byte16, int4)(0, 0, 0); // { dg-error "mismatch in argument 2" }
shuffle!(float4, float4, short8)(0, 0, 0); // { dg-error "mismatch in argument 3" }
shuffle!(float4, float4, float4)(0, 0, 0); // { dg-error "mismatch in argument 3" }
shuffle!(float4, float4, byte16)(0, 0, 0); // { dg-error "mismatch in argument 3" }
shuffle!(short8, int4, int4)(0, 0, 0); // { dg-error "mismatch in argument 2" }
shuffle!(short8, short8, int4)(0, 0, 0); // { dg-error "mismatch in argument 3" }
shuffle!(short8, float4, int4)(0, 0, 0); // { dg-error "mismatch in argument 2" }
shuffle!(short8, byte16, int4)(0, 0, 0); // { dg-error "mismatch in argument 2" }
shuffle!(short8, short8, short8)(0, 0, 0);
shuffle!(short8, short8, float4)(0, 0, 0); // { dg-error "mismatch in argument 3" }
shuffle!(short8, short8, byte16)(0, 0, 0); // { dg-error "mismatch in argument 3" }
shuffle!(byte16, int4, int4)(0, 0, 0); // { dg-error "mismatch in argument 2" }
shuffle!(byte16, short8, int4)(0, 0, 0); // { dg-error "mismatch in argument 2" }
shuffle!(byte16, float4, int4)(0, 0, 0); // { dg-error "mismatch in argument 2" }
shuffle!(byte16, byte16, int4)(0, 0, 0); // { dg-error "mismatch in argument 3" }
shuffle!(byte16, byte16, short8)(0, 0, 0); // { dg-error "mismatch in argument 3" }
shuffle!(byte16, byte16, float4)(0, 0, 0); // { dg-error "mismatch in argument 3" }
shuffle!(byte16, byte16, byte16)(0, 0, 0);
}
void test_shufflevector()
{
shufflevector!(int, int4, int)(0, 0, 0); // { dg-warning "mismatch in argument 1" }
shufflevector!(double, int4, int)(0, 0, 0); // { dg-warning "mismatch in argument 1" }
shufflevector!(fake4, int4, int)(f, 0, 0); // { dg-warning "mismatch in argument 1" }
shufflevector!(int4, int, int)(0, 0, 0); // { dg-warning "mismatch in argument 2" }
shufflevector!(int4, double, int)(0, 0, 0); // { dg-warning "mismatch in argument 2" }
shufflevector!(int4, int4, int)(0, 0, 0);
shufflevector!(int4, short8, int)(0, 0, 0); // { dg-error "mismatch in argument 2" }
shufflevector!(int4, float4, int)(0, 0, 0); // { dg-error "mismatch in argument 2" }
shufflevector!(int4, byte16, int)(0, 0, 0); // { dg-error "mismatch in argument 2" }
shufflevector!(int4, fake4, int)(0, f, 0); // { dg-warning "mismatch in argument 2" }
shufflevector!(int4, int4, double)(0, 0, 0); // { dg-warning "mismatch in argument 3" }
shufflevector!(int4, int4, int4)(0, 0, 0); // { dg-warning "mismatch in argument 3" }
shufflevector!(int4, int4, short8)(0, 0, 0); // { dg-warning "mismatch in argument 3" }
shufflevector!(int4, int4, float4)(0, 0, 0); // { dg-warning "mismatch in argument 3" }
shufflevector!(int4, int4, byte16)(0, 0, 0); // { dg-warning "mismatch in argument 3" }
shufflevector!(int4, int4, int, double)(0, 0, 0, 0); // { dg-warning "mismatch in argument 4" }
shufflevector!(int4, int4, int, int, double, int)(0, 0, 0, 0, 0, 0); // { dg-warning "mismatch in argument 5" }
shufflevector!(int4, int4, int, int, int, double)(0, 0, 0, 0, 0, 0); // { dg-warning "mismatch in argument 6" }
int i;
shufflevector!(int4, int4, int)(0, 0, i); // { dg-error "argument .i. cannot be read at compile time" }
shufflevector!(int4, int4, int)(0, 0, -1u); // { dg-error "element index .-1. is out of bounds" }
shufflevector!(int4, int4, int)(0, 0, 8); // { dg-error "element index .8. is out of bounds" }
}
void test_convertvector()
{
convertvector!(int, int)(0); // { dg-warning "mismatch in return type" }
convertvector!(double, int)(0); // { dg-warning "mismatch in return type" }
convertvector!(fake4, int)(0); // { dg-warning "mismatch in return type" }
convertvector!(int4, int)(0); // { dg-warning "mismatch in argument 1" }
convertvector!(int4, double)(0); // { dg-warning "mismatch in argument 1" }
convertvector!(int4, int4)(0);
convertvector!(int4, short8)(0); // { dg-error "mismatch in argument 1" }
convertvector!(int4, float4)(0);
convertvector!(int4, byte16)(0); // { dg-error "mismatch in argument 1" }
convertvector!(int4, fake4)(f); // { dg-warning "mismatch in argument 1" }
convertvector!(short8, int)(0); // { dg-warning "mismatch in argument 1" }
convertvector!(short8, double)(0); // { dg-warning "mismatch in argument 1" }
convertvector!(short8, int4)(0); // { dg-error "mismatch in argument 1" }
convertvector!(short8, short8)(0);
convertvector!(short8, float4)(0); // { dg-error "mismatch in argument 1" }
convertvector!(short8, byte16)(0); // { dg-error "mismatch in argument 1" }
convertvector!(short8, fake4)(f); // { dg-warning "mismatch in argument 1" }
convertvector!(float4, int)(0); // { dg-warning "mismatch in argument 1" }
convertvector!(float4, double)(0); // { dg-warning "mismatch in argument 1" }
convertvector!(float4, int4)(0);
convertvector!(float4, short8)(0); // { dg-error "mismatch in argument 1" }
convertvector!(float4, float4)(0);
convertvector!(float4, byte16)(0); // { dg-error "mismatch in argument 1" }
convertvector!(float4, fake4)(f); // { dg-warning "mismatch in argument 1" }
convertvector!(byte16, int)(0); // { dg-warning "mismatch in argument 1" }
convertvector!(byte16, double)(0); // { dg-warning "mismatch in argument 1" }
convertvector!(byte16, int4)(0); // { dg-error "mismatch in argument 1" }
convertvector!(byte16, short8)(0); // { dg-error "mismatch in argument 1" }
convertvector!(byte16, float4)(0); // { dg-error "mismatch in argument 1" }
convertvector!(byte16, byte16)(0);
convertvector!(byte16, fake4)(f); // { dg-warning "mismatch in argument 1" }
}
void test_blendvector()
{
blendvector!(int, int, int)(0, 0, 0); // { dg-warning "mismatch in return type" }
blendvector!(double, int, int)(0, 0, 0); // { dg-warning "mismatch in return type" }
blendvector!(fake4, int, int)(f, 0, 0); // { dg-warning "mismatch in return type" }
blendvector!(int4, int, int)(0, 0, 0); // { dg-warning "mismatch in argument 2" }
blendvector!(int4, double, int)(0, 0, 0); // { dg-warning "mismatch in argument 2" }
blendvector!(int4, fake4, int)(0, f, 0); // { dg-warning "mismatch in argument 2" }
blendvector!(int4, int4, int)(0, 0, 0); // { dg-warning "mismatch in argument 3" }
blendvector!(int4, int4, double)(0, 0, 0); // { dg-warning "mismatch in argument 3" }
blendvector!(int4, int4, fake4)(0, 0, f); // { dg-warning "mismatch in argument 3" }
blendvector!(int4, int4, int4)(0, 0, 0);
blendvector!(int4, short8, int4)(0, 0, 0); // { dg-error "mismatch in argument 2" }
blendvector!(int4, float4, int4)(0, 0, 0); // { dg-error "mismatch in argument 2" }
blendvector!(int4, byte16, int4)(0, 0, 0); // { dg-error "mismatch in argument 2" }
blendvector!(int4, int4, short8)(0, 0, 0); // { dg-error "mismatch in argument 3" }
blendvector!(int4, int4, float4)(0, 0, 0); // { dg-error "mismatch in argument 3" }
blendvector!(int4, int4, byte16)(0, 0, 0); // { dg-error "mismatch in argument 3" }
blendvector!(float4, int4, int4)(0, 0, 0); // { dg-error "mismatch in argument 2" }
blendvector!(float4, short8, int4)(0, 0, 0); // { dg-error "mismatch in argument 2" }
blendvector!(float4, float4, int4)(0, 0, 0);
blendvector!(float4, byte16, int4)(0, 0, 0); // { dg-error "mismatch in argument 2" }
blendvector!(float4, float4, short8)(0, 0, 0); // { dg-error "mismatch in argument 3" }
blendvector!(float4, float4, float4)(0, 0, 0); // { dg-error "mismatch in argument 3" }
blendvector!(float4, float4, byte16)(0, 0, 0); // { dg-error "mismatch in argument 3" }
blendvector!(short8, int4, int4)(0, 0, 0); // { dg-error "mismatch in argument 2" }
blendvector!(short8, short8, int4)(0, 0, 0); // { dg-error "mismatch in argument 3" }
blendvector!(short8, float4, int4)(0, 0, 0); // { dg-error "mismatch in argument 2" }
blendvector!(short8, byte16, int4)(0, 0, 0); // { dg-error "mismatch in argument 2" }
blendvector!(short8, short8, short8)(0, 0, 0);
blendvector!(short8, short8, float4)(0, 0, 0); // { dg-error "mismatch in argument 3" }
blendvector!(short8, short8, byte16)(0, 0, 0); // { dg-error "mismatch in argument 3" }
blendvector!(byte16, int4, int4)(0, 0, 0); // { dg-error "mismatch in argument 2" }
blendvector!(byte16, short8, int4)(0, 0, 0); // { dg-error "mismatch in argument 2" }
blendvector!(byte16, float4, int4)(0, 0, 0); // { dg-error "mismatch in argument 2" }
blendvector!(byte16, byte16, int4)(0, 0, 0); // { dg-error "mismatch in argument 3" }
blendvector!(byte16, byte16, short8)(0, 0, 0); // { dg-error "mismatch in argument 3" }
blendvector!(byte16, byte16, float4)(0, 0, 0); // { dg-error "mismatch in argument 3" }
blendvector!(byte16, byte16, byte16)(0, 0, 0);
}
void test_comparison()
{
equalMask!int(0, 0); // { dg-warning "mismatch in return type" }
equalMask!double(0, 0); // { dg-warning "mismatch in return type" }
equalMask!int4(0, 0);
equalMask!short8(0, 0);
equalMask!float4(0, 0);
equalMask!byte16(0, 0);
equalMask!fake4(f, f); // { dg-warning "mismatch in return type" }
notEqualMask!int(0, 0); // { dg-warning "mismatch in return type" }
notEqualMask!double(0, 0); // { dg-warning "mismatch in return type" }
notEqualMask!int4(0, 0);
notEqualMask!short8(0, 0);
notEqualMask!float4(0, 0);
notEqualMask!byte16(0, 0);
notEqualMask!fake4(f, f); // { dg-warning "mismatch in return type" }
greaterMask!int(0, 0); // { dg-warning "mismatch in return type" }
greaterMask!double(0, 0); // { dg-warning "mismatch in return type" }
greaterMask!int4(0, 0);
greaterMask!short8(0, 0);
greaterMask!float4(0, 0);
greaterMask!byte16(0, 0);
greaterMask!fake4(f, f); // { dg-warning "mismatch in return type" }
greaterOrEqualMask!int(0, 0); // { dg-warning "mismatch in return type" }
greaterOrEqualMask!double(0, 0); // { dg-warning "mismatch in return type" }
greaterOrEqualMask!int4(0, 0);
greaterOrEqualMask!short8(0, 0);
greaterOrEqualMask!float4(0, 0);
greaterOrEqualMask!byte16(0, 0);
greaterOrEqualMask!fake4(f, f); // { dg-warning "mismatch in return type" }
}
// The following declarations of the simd intrinsics are without any guards
// to verify `d/intrinsics.cc` is doing checks to prevent invalid lowerings.
V loadUnaligned(V)(const V*);
V storeUnaligned(V)(V*, V);
V0 shuffle(V0, V1, M)(V0, V1, M);
// Use overloads to test different argument positions.
template E(V) { alias typeof(V.array[0]) E; }
enum isV(T) = is(T : __vector(V[N]), V, size_t N);
__vector(E!V1[M.length]) shufflevector(V1, V2, M...)(V1, V2, M) if (isV!V1 && !isV!V2);
__vector(E!V2[M.length]) shufflevector(V1, V2, M...)(V1, V2, M) if (isV!V2 && !isV!V1);
__vector(E!V1[M.length]) shufflevector(V1, V2, M...)(V1, V2, M) if (isV!V1 && isV!V2);
V convertvector(V, T)(T);
V0 blendvector(V0, V1, M)(V0, V1, M);
V equalMask(V)(V, V);
V notEqualMask(V)(V, V);
V greaterMask(V)(V, V);
V greaterOrEqualMask(V)(V, V);