mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
163 lines
6.6 KiB
C
163 lines
6.6 KiB
C
// #target: x64-darwin
|
|
|
|
import libc;
|
|
|
|
func void testf()
|
|
{
|
|
float[<4>] y = { 0, 2, 3, 0 };
|
|
int[<4>] w = !y;
|
|
libc::printf("Notf %d %d %d %d\n", w[0], w[1], w[2], w[3]);
|
|
}
|
|
|
|
func void testi()
|
|
{
|
|
int[<4>] y = { 1, 2, 3, 4 };
|
|
int[<4>] z = { 2, 3, 13, -100 };
|
|
int[<4>] w;
|
|
w = y & z;
|
|
libc::printf("And %d %d %d %d\n", w[0], w[1], w[2], w[3]);
|
|
w = y | z;
|
|
libc::printf("Or %d %d %d %d\n", w[0], w[1], w[2], w[3]);
|
|
w = y ^ z;
|
|
libc::printf("Xor %d %d %d %d\n", w[0], w[1], w[2], w[3]);
|
|
w = ~y;
|
|
libc::printf("BitNeg %d %d %d %d\n", w[0], w[1], w[2], w[3]);
|
|
w = -y;
|
|
libc::printf("Neg %d %d %d %d\n", w[0], w[1], w[2], w[3]);
|
|
w = !y;
|
|
w = { -1, 13, 0, 0 };
|
|
w = !w;
|
|
libc::printf("Not %d %d %d %d\n", w[0], w[1], w[2], w[3]);
|
|
}
|
|
|
|
func void main()
|
|
{
|
|
testf();
|
|
testi();
|
|
}
|
|
|
|
/* #expect: vector_bit.ll
|
|
|
|
; Function Attrs: nounwind
|
|
define void @vector_bit.testf() #0 {
|
|
entry:
|
|
%y = alloca <4 x float>, align 16
|
|
%w = alloca <4 x i32>, align 16
|
|
store <4 x float> <float 0.000000e+00, float 2.000000e+00, float 3.000000e+00, float 0.000000e+00>, <4 x float>* %y, align 16
|
|
%0 = load <4 x float>, <4 x float>* %y, align 16
|
|
%not = fcmp une <4 x float> %0, zeroinitializer
|
|
%1 = sext <4 x i1> %not to <4 x i32>
|
|
store <4 x i32> %1, <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 ([18 x i8], [18 x i8]* @.str, i32 0, i32 0), i32 %3, i32 %5, i32 %7, i32 %9)
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define void @vector_bit.testi() #0 {
|
|
entry:
|
|
%y = alloca <4 x i32>, align 16
|
|
%z = alloca <4 x i32>, align 16
|
|
%w = 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 3, i32 13, i32 -100>, <4 x i32>* %z, align 16
|
|
store <4 x i32> zeroinitializer, <4 x i32>* %w, align 16
|
|
%0 = load <4 x i32>, <4 x i32>* %y, align 16
|
|
%1 = load <4 x i32>, <4 x i32>* %z, align 16
|
|
%and = and <4 x i32> %0, %1
|
|
store <4 x i32> %and, <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 ([17 x i8], [17 x i8]* @.str.1, 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
|
|
%or = or <4 x i32> %11, %12
|
|
store <4 x i32> %or, <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 ([16 x i8], [16 x i8]* @.str.2, 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
|
|
%xor = xor <4 x i32> %22, %23
|
|
store <4 x i32> %xor, <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 ([17 x i8], [17 x i8]* @.str.3, i32 0, i32 0), i32 %25, i32 %27, i32 %29, i32 %31)
|
|
%33 = load <4 x i32>, <4 x i32>* %y, align 16
|
|
%bnot = xor <4 x i32> %33, <i32 -1, i32 -1, i32 -1, i32 -1>
|
|
store <4 x i32> %bnot, <4 x i32>* %w, align 16
|
|
%34 = load <4 x i32>, <4 x i32>* %w, align 16
|
|
%35 = extractelement <4 x i32> %34, i64 0
|
|
%36 = load <4 x i32>, <4 x i32>* %w, align 16
|
|
%37 = extractelement <4 x i32> %36, i64 1
|
|
%38 = load <4 x i32>, <4 x i32>* %w, align 16
|
|
%39 = extractelement <4 x i32> %38, i64 2
|
|
%40 = load <4 x i32>, <4 x i32>* %w, align 16
|
|
%41 = extractelement <4 x i32> %40, i64 3
|
|
%42 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.4, i32 0, i32 0), i32 %35, i32 %37, i32 %39, i32 %41)
|
|
%43 = load <4 x i32>, <4 x i32>* %y, align 16
|
|
%44 = load <4 x i32>, <4 x i32>* %y, align 16
|
|
%neg = sub <4 x i32> zeroinitializer, %44
|
|
store <4 x i32> %neg, <4 x i32>* %w, align 16
|
|
%45 = load <4 x i32>, <4 x i32>* %w, align 16
|
|
%46 = extractelement <4 x i32> %45, i64 0
|
|
%47 = load <4 x i32>, <4 x i32>* %w, align 16
|
|
%48 = extractelement <4 x i32> %47, i64 1
|
|
%49 = load <4 x i32>, <4 x i32>* %w, align 16
|
|
%50 = extractelement <4 x i32> %49, i64 2
|
|
%51 = load <4 x i32>, <4 x i32>* %w, align 16
|
|
%52 = extractelement <4 x i32> %51, i64 3
|
|
%53 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.5, i32 0, i32 0), i32 %46, i32 %48, i32 %50, i32 %52)
|
|
%54 = load <4 x i32>, <4 x i32>* %y, align 16
|
|
%not = icmp eq <4 x i32> %54, zeroinitializer
|
|
%55 = sext <4 x i1> %not to <4 x i32>
|
|
store <4 x i32> %55, <4 x i32>* %w, align 16
|
|
store <4 x i32> <i32 -1, i32 13, i32 0, i32 0>, <4 x i32>* %w, align 16
|
|
%56 = load <4 x i32>, <4 x i32>* %w, align 16
|
|
%not1 = icmp eq <4 x i32> %56, zeroinitializer
|
|
%57 = sext <4 x i1> %not1 to <4 x i32>
|
|
store <4 x i32> %57, <4 x i32>* %w, align 16
|
|
%58 = load <4 x i32>, <4 x i32>* %w, align 16
|
|
%59 = extractelement <4 x i32> %58, i64 0
|
|
%60 = load <4 x i32>, <4 x i32>* %w, align 16
|
|
%61 = extractelement <4 x i32> %60, i64 1
|
|
%62 = load <4 x i32>, <4 x i32>* %w, align 16
|
|
%63 = extractelement <4 x i32> %62, i64 2
|
|
%64 = load <4 x i32>, <4 x i32>* %w, align 16
|
|
%65 = extractelement <4 x i32> %64, i64 3
|
|
%66 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.6, i32 0, i32 0), i32 %59, i32 %61, i32 %63, i32 %65)
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define void @main() #0 {
|
|
entry:
|
|
call void @vector_bit.testf()
|
|
call void @vector_bit.testi()
|
|
ret void
|
|
}
|