// #target: macos-x64
// #opt: --x86cpu=sse4
module test;

alias Mm256 = float[<8>];
struct St256 {
  Mm256 m;
}

St256 x38;
Mm256 x37;

extern fn void f38(St256 x);
extern fn void f37(Mm256 x);
fn void f39() { f38(x38); f37(x37); }

// The two next tests make sure that the struct below is passed
// in the same way regardless of avx being used

// CHECK: declare void @func40(%struct.t128* byval(%struct.t128) align 16)

alias Mm128 = float[<4>];
struct Two128 {
  Mm128 m;
  Mm128 n;
}

extern fn void func40(Two128 s);
fn void func41(Two128 s) {
  func40(s);
}

struct Atwo128 {
  Mm128[2] array;
}

struct Sa {
  Atwo128 x;
}

extern fn void func42(Sa s);
fn void func43(Sa s) {
  func42(s);
}


/* #expect: test.ll

declare void @f38(ptr byval(%St256) align 32)
declare void @f37(ptr byval(<8 x float>) align 32)

declare void @func40(ptr byval(%Two128) align 16)
define void @test.func41(ptr byval(%Two128) align 16 %0)

declare void @func42(ptr byval(%Sa) align 16)
define void @test.func43(ptr byval(%Sa) align 16 %0)
