mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
Added initial (incomplete) support for vectors.
This commit is contained in:
committed by
Christoffer Lerno
parent
0a4f35154a
commit
020eba720b
52
test/test_suite/vector/vector_init.c3t
Normal file
52
test/test_suite/vector/vector_init.c3t
Normal file
@@ -0,0 +1,52 @@
|
||||
int[<4>] baz = { 1, 4, 5, 7 };
|
||||
|
||||
func void main()
|
||||
{
|
||||
int[<4>] foo = { 1, 2, 3, 4 };
|
||||
int z = foo[0];
|
||||
foo[2] = z + 1;
|
||||
int[<4>] bar = {};
|
||||
int[<4>] bar2 = { 1, z, 3, 4 };
|
||||
int[<4>] bar3 = { [1] = z };
|
||||
int[<4>] bar4 = { [0..3] = z };
|
||||
}
|
||||
|
||||
/* #expect: vector_init.ll
|
||||
|
||||
@vector_init.baz = global <4 x i32> <i32 1, i32 4, i32 5, i32 7>, align 16
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define void @main() #0 {
|
||||
entry:
|
||||
%foo = alloca <4 x i32>, align 16
|
||||
%z = alloca i32, align 4
|
||||
%bar = alloca <4 x i32>, align 16
|
||||
%bar2 = alloca <4 x i32>, align 16
|
||||
%bar3 = alloca <4 x i32>, align 16
|
||||
%bar4 = alloca <4 x i32>, align 16
|
||||
store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, <4 x i32>* %foo, align 16
|
||||
%0 = load <4 x i32>, <4 x i32>* %foo, align 16
|
||||
%1 = extractelement <4 x i32> %0, i64 0
|
||||
store i32 %1, i32* %z, align 4
|
||||
%2 = load <4 x i32>, <4 x i32>* %foo, align 16
|
||||
%3 = load i32, i32* %z, align 4
|
||||
%add = add i32 %3, 1
|
||||
%elemset = insertelement <4 x i32> %2, i32 %add, i64 2
|
||||
store <4 x i32> %elemset, <4 x i32>* %foo, align 16
|
||||
store <4 x i32> zeroinitializer, <4 x i32>* %bar, align 16
|
||||
%4 = load i32, i32* %z, align 4
|
||||
%5 = insertelement <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>, i32 %4, i64 1
|
||||
%6 = insertelement <4 x i32> %5, i32 3, i64 2
|
||||
%7 = insertelement <4 x i32> %6, i32 4, i64 3
|
||||
store <4 x i32> %7, <4 x i32>* %bar2, align 16
|
||||
%8 = load i32, i32* %z, align 4
|
||||
%9 = insertelement <4 x i32> zeroinitializer, i32 %8, i64 1
|
||||
store <4 x i32> %9, <4 x i32>* %bar3, align 16
|
||||
%10 = load i32, i32* %z, align 4
|
||||
%11 = insertelement <4 x i32> zeroinitializer, i32 %10, i64 0
|
||||
%12 = insertelement <4 x i32> %11, i32 %10, i64 1
|
||||
%13 = insertelement <4 x i32> %12, i32 %10, i64 2
|
||||
%14 = insertelement <4 x i32> %13, i32 %10, i64 3
|
||||
store <4 x i32> %14, <4 x i32>* %bar4, align 16
|
||||
ret void
|
||||
}
|
||||
288
test/test_suite/vector/vector_ops.c3t
Normal file
288
test/test_suite/vector/vector_ops.c3t
Normal file
@@ -0,0 +1,288 @@
|
||||
import libc;
|
||||
|
||||
func void testf()
|
||||
{
|
||||
float[<4>] y = { 1, 2, 3, 4 };
|
||||
float[<4>] z = { 2, 2, 2, -100 };
|
||||
float[<4>] w = y + z;
|
||||
libc::printf("%f %f %f %f\n", w[0], w[1], w[2], w[3]);
|
||||
w = y * z;
|
||||
libc::printf("%f %f %f %f\n", w[0], w[1], w[2], w[3]);
|
||||
w = y / z;
|
||||
libc::printf("%f %f %f %f\n", w[0], w[1], w[2], w[3]);
|
||||
w = y - z;
|
||||
libc::printf("%f %f %f %f\n", w[0], w[1], w[2], w[3]);
|
||||
int[<4>] ww = y < z;
|
||||
libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]);
|
||||
}
|
||||
|
||||
func void testb()
|
||||
{
|
||||
bool[<4>] d = { true, false, true, true };
|
||||
}
|
||||
|
||||
func void testi()
|
||||
{
|
||||
int[<4>] y = { 1, 2, 3, 4 };
|
||||
int[<4>] z = { 2, 2, 2, -100 };
|
||||
int[<4>] w = y + z;
|
||||
libc::printf("%d %d %d %d\n", w[0], w[1], w[2], w[3]);
|
||||
w = y * z;
|
||||
libc::printf("%d %d %d %d\n", w[0], w[1], w[2], w[3]);
|
||||
w = y / z;
|
||||
libc::printf("%d %d %d %d\n", w[0], w[1], w[2], w[3]);
|
||||
w = y - z;
|
||||
libc::printf("%d %d %d %d\n", w[0], w[1], w[2], w[3]);
|
||||
w = z >> y;
|
||||
libc::printf("%d %d %d %d\n", w[0], w[1], w[2], w[3]);
|
||||
w = z << y;
|
||||
libc::printf("%d %d %d %d\n", w[0], w[1], w[2], w[3]);
|
||||
w = z > y;
|
||||
libc::printf("%d %d %d %d\n", w[0], w[1], w[2], w[3]);
|
||||
uint[<4>] uz = { 2, 6, 2, 1 };
|
||||
w = uz > y;
|
||||
libc::printf("%d %d %d %d\n", w[0], w[1], w[2], w[3]);
|
||||
}
|
||||
|
||||
func void main()
|
||||
{
|
||||
testf();
|
||||
testi();
|
||||
testb();
|
||||
}
|
||||
|
||||
/* #expect: vector_ops.ll
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define void @vector_ops.testf() #0 {
|
||||
entry:
|
||||
%y = alloca <4 x float>, align 16
|
||||
%z = alloca <4 x float>, align 16
|
||||
%w = alloca <4 x float>, align 16
|
||||
%ww = alloca <4 x i32>, align 16
|
||||
store <4 x float> <float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00>, <4 x float>* %y, align 16
|
||||
store <4 x float> <float 2.000000e+00, float 2.000000e+00, float 2.000000e+00, float -1.000000e+02>, <4 x float>* %z, align 16
|
||||
%0 = load <4 x float>, <4 x float>* %y, align 16
|
||||
%1 = load <4 x float>, <4 x float>* %z, align 16
|
||||
%fadd = fadd <4 x float> %0, %1
|
||||
store <4 x float> %fadd, <4 x float>* %w, align 16
|
||||
%2 = load <4 x float>, <4 x float>* %w, align 16
|
||||
%3 = extractelement <4 x float> %2, i64 0
|
||||
%fpfpext = fpext float %3 to double
|
||||
%4 = load <4 x float>, <4 x float>* %w, align 16
|
||||
%5 = extractelement <4 x float> %4, i64 1
|
||||
%fpfpext1 = fpext float %5 to double
|
||||
%6 = load <4 x float>, <4 x float>* %w, align 16
|
||||
%7 = extractelement <4 x float> %6, i64 2
|
||||
%fpfpext2 = fpext float %7 to double
|
||||
%8 = load <4 x float>, <4 x float>* %w, align 16
|
||||
%9 = extractelement <4 x float> %8, i64 3
|
||||
%fpfpext3 = fpext float %9 to double
|
||||
%10 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str, i32 0, i32 0), double %fpfpext, double %fpfpext1, double %fpfpext2, double %fpfpext3)
|
||||
%11 = load <4 x float>, <4 x float>* %y, align 16
|
||||
%12 = load <4 x float>, <4 x float>* %z, align 16
|
||||
%fmul = fmul <4 x float> %11, %12
|
||||
store <4 x float> %fmul, <4 x float>* %w, align 16
|
||||
%13 = load <4 x float>, <4 x float>* %w, align 16
|
||||
%14 = extractelement <4 x float> %13, i64 0
|
||||
%fpfpext4 = fpext float %14 to double
|
||||
%15 = load <4 x float>, <4 x float>* %w, align 16
|
||||
%16 = extractelement <4 x float> %15, i64 1
|
||||
%fpfpext5 = fpext float %16 to double
|
||||
%17 = load <4 x float>, <4 x float>* %w, align 16
|
||||
%18 = extractelement <4 x float> %17, i64 2
|
||||
%fpfpext6 = fpext float %18 to double
|
||||
%19 = load <4 x float>, <4 x float>* %w, align 16
|
||||
%20 = extractelement <4 x float> %19, i64 3
|
||||
%fpfpext7 = fpext float %20 to double
|
||||
%21 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.1, i32 0, i32 0), double %fpfpext4, double %fpfpext5, double %fpfpext6, double %fpfpext7)
|
||||
%22 = load <4 x float>, <4 x float>* %y, align 16
|
||||
%23 = load <4 x float>, <4 x float>* %z, align 16
|
||||
%fdiv = fdiv <4 x float> %22, %23
|
||||
store <4 x float> %fdiv, <4 x float>* %w, align 16
|
||||
%24 = load <4 x float>, <4 x float>* %w, align 16
|
||||
%25 = extractelement <4 x float> %24, i64 0
|
||||
%fpfpext8 = fpext float %25 to double
|
||||
%26 = load <4 x float>, <4 x float>* %w, align 16
|
||||
%27 = extractelement <4 x float> %26, i64 1
|
||||
%fpfpext9 = fpext float %27 to double
|
||||
%28 = load <4 x float>, <4 x float>* %w, align 16
|
||||
%29 = extractelement <4 x float> %28, i64 2
|
||||
%fpfpext10 = fpext float %29 to double
|
||||
%30 = load <4 x float>, <4 x float>* %w, align 16
|
||||
%31 = extractelement <4 x float> %30, i64 3
|
||||
%fpfpext11 = fpext float %31 to double
|
||||
%32 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.2, i32 0, i32 0), double %fpfpext8, double %fpfpext9, double %fpfpext10, double %fpfpext11)
|
||||
%33 = load <4 x float>, <4 x float>* %y, align 16
|
||||
%34 = load <4 x float>, <4 x float>* %z, align 16
|
||||
%fsub = fsub <4 x float> %33, %34
|
||||
store <4 x float> %fsub, <4 x float>* %w, align 16
|
||||
%35 = load <4 x float>, <4 x float>* %w, align 16
|
||||
%36 = extractelement <4 x float> %35, i64 0
|
||||
%fpfpext12 = fpext float %36 to double
|
||||
%37 = load <4 x float>, <4 x float>* %w, align 16
|
||||
%38 = extractelement <4 x float> %37, i64 1
|
||||
%fpfpext13 = fpext float %38 to double
|
||||
%39 = load <4 x float>, <4 x float>* %w, align 16
|
||||
%40 = extractelement <4 x float> %39, i64 2
|
||||
%fpfpext14 = fpext float %40 to double
|
||||
%41 = load <4 x float>, <4 x float>* %w, align 16
|
||||
%42 = extractelement <4 x float> %41, i64 3
|
||||
%fpfpext15 = fpext float %42 to double
|
||||
%43 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.3, i32 0, i32 0), double %fpfpext12, double %fpfpext13, double %fpfpext14, double %fpfpext15)
|
||||
%44 = load <4 x float>, <4 x float>* %y, align 16
|
||||
%45 = load <4 x float>, <4 x float>* %z, align 16
|
||||
%lt = fcmp olt <4 x float> %44, %45
|
||||
%46 = sext <4 x i1> %lt to <4 x i32>
|
||||
store <4 x i32> %46, <4 x i32>* %ww, align 16
|
||||
%47 = load <4 x i32>, <4 x i32>* %ww, align 16
|
||||
%48 = extractelement <4 x i32> %47, i64 0
|
||||
%49 = load <4 x i32>, <4 x i32>* %ww, align 16
|
||||
%50 = extractelement <4 x i32> %49, i64 1
|
||||
%51 = load <4 x i32>, <4 x i32>* %ww, align 16
|
||||
%52 = extractelement <4 x i32> %51, i64 2
|
||||
%53 = load <4 x i32>, <4 x i32>* %ww, align 16
|
||||
%54 = extractelement <4 x i32> %53, i64 3
|
||||
%55 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.4, i32 0, i32 0), i32 %48, i32 %50, i32 %52, i32 %54)
|
||||
ret void
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define void @vector_ops.testb() #0 {
|
||||
entry:
|
||||
%d = alloca <4 x i8>, align 4
|
||||
store <4 x i8> <i8 1, i8 0, i8 1, i8 1>, <4 x i8>* %d, align 4
|
||||
ret void
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define void @vector_ops.testi() #0 {
|
||||
entry:
|
||||
%y = alloca <4 x i32>, align 16
|
||||
%z = alloca <4 x i32>, align 16
|
||||
%w = alloca <4 x i32>, align 16
|
||||
%uz = alloca <4 x i32>, align 16
|
||||
store <4 x i32> <i32 1, i32 2, i32 3, i32 4>, <4 x i32>* %y, align 16
|
||||
store <4 x i32> <i32 2, i32 2, i32 2, i32 -100>, <4 x i32>* %z, align 16
|
||||
%0 = load <4 x i32>, <4 x i32>* %y, align 16
|
||||
%1 = load <4 x i32>, <4 x i32>* %z, align 16
|
||||
%add = add <4 x i32> %0, %1
|
||||
store <4 x i32> %add, <4 x i32>* %w, align 16
|
||||
%2 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%3 = extractelement <4 x i32> %2, i64 0
|
||||
%4 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%5 = extractelement <4 x i32> %4, i64 1
|
||||
%6 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%7 = extractelement <4 x i32> %6, i64 2
|
||||
%8 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%9 = extractelement <4 x i32> %8, i64 3
|
||||
%10 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.5, i32 0, i32 0), i32 %3, i32 %5, i32 %7, i32 %9)
|
||||
%11 = load <4 x i32>, <4 x i32>* %y, align 16
|
||||
%12 = load <4 x i32>, <4 x i32>* %z, align 16
|
||||
%mul = mul <4 x i32> %11, %12
|
||||
store <4 x i32> %mul, <4 x i32>* %w, align 16
|
||||
%13 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%14 = extractelement <4 x i32> %13, i64 0
|
||||
%15 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%16 = extractelement <4 x i32> %15, i64 1
|
||||
%17 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%18 = extractelement <4 x i32> %17, i64 2
|
||||
%19 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%20 = extractelement <4 x i32> %19, i64 3
|
||||
%21 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.6, i32 0, i32 0), i32 %14, i32 %16, i32 %18, i32 %20)
|
||||
%22 = load <4 x i32>, <4 x i32>* %y, align 16
|
||||
%23 = load <4 x i32>, <4 x i32>* %z, align 16
|
||||
%sdiv = sdiv <4 x i32> %22, %23
|
||||
store <4 x i32> %sdiv, <4 x i32>* %w, align 16
|
||||
%24 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%25 = extractelement <4 x i32> %24, i64 0
|
||||
%26 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%27 = extractelement <4 x i32> %26, i64 1
|
||||
%28 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%29 = extractelement <4 x i32> %28, i64 2
|
||||
%30 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%31 = extractelement <4 x i32> %30, i64 3
|
||||
%32 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.7, i32 0, i32 0), i32 %25, i32 %27, i32 %29, i32 %31)
|
||||
%33 = load <4 x i32>, <4 x i32>* %y, align 16
|
||||
%34 = load <4 x i32>, <4 x i32>* %z, align 16
|
||||
%sub = sub <4 x i32> %33, %34
|
||||
store <4 x i32> %sub, <4 x i32>* %w, align 16
|
||||
%35 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%36 = extractelement <4 x i32> %35, i64 0
|
||||
%37 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%38 = extractelement <4 x i32> %37, i64 1
|
||||
%39 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%40 = extractelement <4 x i32> %39, i64 2
|
||||
%41 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%42 = extractelement <4 x i32> %41, i64 3
|
||||
%43 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.8, i32 0, i32 0), i32 %36, i32 %38, i32 %40, i32 %42)
|
||||
%44 = load <4 x i32>, <4 x i32>* %z, align 16
|
||||
%45 = load <4 x i32>, <4 x i32>* %y, align 16
|
||||
%ashr = ashr <4 x i32> %44, %45
|
||||
%46 = freeze <4 x i32> %ashr
|
||||
store <4 x i32> %46, <4 x i32>* %w, align 16
|
||||
%47 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%48 = extractelement <4 x i32> %47, i64 0
|
||||
%49 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%50 = extractelement <4 x i32> %49, i64 1
|
||||
%51 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%52 = extractelement <4 x i32> %51, i64 2
|
||||
%53 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%54 = extractelement <4 x i32> %53, i64 3
|
||||
%55 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.9, i32 0, i32 0), i32 %48, i32 %50, i32 %52, i32 %54)
|
||||
%56 = load <4 x i32>, <4 x i32>* %z, align 16
|
||||
%57 = load <4 x i32>, <4 x i32>* %y, align 16
|
||||
%shl = shl <4 x i32> %56, %57
|
||||
%58 = freeze <4 x i32> %shl
|
||||
store <4 x i32> %58, <4 x i32>* %w, align 16
|
||||
%59 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%60 = extractelement <4 x i32> %59, i64 0
|
||||
%61 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%62 = extractelement <4 x i32> %61, i64 1
|
||||
%63 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%64 = extractelement <4 x i32> %63, i64 2
|
||||
%65 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%66 = extractelement <4 x i32> %65, i64 3
|
||||
%67 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.10, i32 0, i32 0), i32 %60, i32 %62, i32 %64, i32 %66)
|
||||
%68 = load <4 x i32>, <4 x i32>* %z, align 16
|
||||
%69 = load <4 x i32>, <4 x i32>* %y, align 16
|
||||
%gt = icmp sgt <4 x i32> %68, %69
|
||||
%70 = sext <4 x i1> %gt to <4 x i32>
|
||||
store <4 x i32> %70, <4 x i32>* %w, align 16
|
||||
%71 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%72 = extractelement <4 x i32> %71, i64 0
|
||||
%73 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%74 = extractelement <4 x i32> %73, i64 1
|
||||
%75 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%76 = extractelement <4 x i32> %75, i64 2
|
||||
%77 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%78 = extractelement <4 x i32> %77, i64 3
|
||||
%79 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.11, i32 0, i32 0), i32 %72, i32 %74, i32 %76, i32 %78)
|
||||
store <4 x i32> <i32 2, i32 6, i32 2, i32 1>, <4 x i32>* %uz, align 16
|
||||
%80 = load <4 x i32>, <4 x i32>* %uz, align 16
|
||||
%81 = load <4 x i32>, <4 x i32>* %y, align 16
|
||||
%lt = icmp slt <4 x i32> %81, %80
|
||||
%check = icmp slt <4 x i32> %80, zeroinitializer
|
||||
%siui-lt = or <4 x i1> %check, %lt
|
||||
%82 = sext <4 x i1> %siui-lt to <4 x i32>
|
||||
store <4 x i32> %82, <4 x i32>* %w, align 16
|
||||
%83 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%84 = extractelement <4 x i32> %83, i64 0
|
||||
%85 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%86 = extractelement <4 x i32> %85, i64 1
|
||||
%87 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%88 = extractelement <4 x i32> %87, i64 2
|
||||
%89 = load <4 x i32>, <4 x i32>* %w, align 16
|
||||
%90 = extractelement <4 x i32> %89, i64 3
|
||||
%91 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.12, i32 0, i32 0), i32 %84, i32 %86, i32 %88, i32 %90)
|
||||
ret void
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define void @main() #0 {
|
||||
entry:
|
||||
call void @vector_ops.testf()
|
||||
call void @vector_ops.testi()
|
||||
call void @vector_ops.testb()
|
||||
ret void
|
||||
}
|
||||
Reference in New Issue
Block a user