// #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> , <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> , <4 x i32>* %y, align 16 store <4 x i32> , <4 x i32>* %z, align 16 %0 = bitcast <4 x i32>* %w to i8* call void @llvm.memset.p0i8.i64(i8* align 16 %0, i8 0, i64 16, i1 false) %1 = load <4 x i32>, <4 x i32>* %y, align 16 %2 = load <4 x i32>, <4 x i32>* %z, align 16 %and = and <4 x i32> %1, %2 store <4 x i32> %and, <4 x i32>* %w, align 16 %3 = load <4 x i32>, <4 x i32>* %w, align 16 %4 = extractelement <4 x i32> %3, i64 0 %5 = load <4 x i32>, <4 x i32>* %w, align 16 %6 = extractelement <4 x i32> %5, i64 1 %7 = load <4 x i32>, <4 x i32>* %w, align 16 %8 = extractelement <4 x i32> %7, i64 2 %9 = load <4 x i32>, <4 x i32>* %w, align 16 %10 = extractelement <4 x i32> %9, i64 3 %11 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.1, i32 0, i32 0), i32 %4, i32 %6, i32 %8, i32 %10) %12 = load <4 x i32>, <4 x i32>* %y, align 16 %13 = load <4 x i32>, <4 x i32>* %z, align 16 %or = or <4 x i32> %12, %13 store <4 x i32> %or, <4 x i32>* %w, align 16 %14 = load <4 x i32>, <4 x i32>* %w, align 16 %15 = extractelement <4 x i32> %14, i64 0 %16 = load <4 x i32>, <4 x i32>* %w, align 16 %17 = extractelement <4 x i32> %16, i64 1 %18 = load <4 x i32>, <4 x i32>* %w, align 16 %19 = extractelement <4 x i32> %18, i64 2 %20 = load <4 x i32>, <4 x i32>* %w, align 16 %21 = extractelement <4 x i32> %20, i64 3 %22 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.2, i32 0, i32 0), i32 %15, i32 %17, i32 %19, i32 %21) %23 = load <4 x i32>, <4 x i32>* %y, align 16 %24 = load <4 x i32>, <4 x i32>* %z, align 16 %xor = xor <4 x i32> %23, %24 store <4 x i32> %xor, <4 x i32>* %w, align 16 %25 = load <4 x i32>, <4 x i32>* %w, align 16 %26 = extractelement <4 x i32> %25, i64 0 %27 = load <4 x i32>, <4 x i32>* %w, align 16 %28 = extractelement <4 x i32> %27, i64 1 %29 = load <4 x i32>, <4 x i32>* %w, align 16 %30 = extractelement <4 x i32> %29, i64 2 %31 = load <4 x i32>, <4 x i32>* %w, align 16 %32 = extractelement <4 x i32> %31, i64 3 %33 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.3, i32 0, i32 0), i32 %26, i32 %28, i32 %30, i32 %32) %34 = load <4 x i32>, <4 x i32>* %y, align 16 %bnot = xor <4 x i32> %34, store <4 x i32> %bnot, <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 ([20 x i8], [20 x i8]* @.str.4, i32 0, i32 0), i32 %36, i32 %38, i32 %40, i32 %42) %44 = load <4 x i32>, <4 x i32>* %y, align 16 %45 = load <4 x i32>, <4 x i32>* %y, align 16 %neg = sub <4 x i32> zeroinitializer, %45 store <4 x i32> %neg, <4 x i32>* %w, align 16 %46 = load <4 x i32>, <4 x i32>* %w, align 16 %47 = extractelement <4 x i32> %46, i64 0 %48 = load <4 x i32>, <4 x i32>* %w, align 16 %49 = extractelement <4 x i32> %48, i64 1 %50 = load <4 x i32>, <4 x i32>* %w, align 16 %51 = extractelement <4 x i32> %50, i64 2 %52 = load <4 x i32>, <4 x i32>* %w, align 16 %53 = extractelement <4 x i32> %52, i64 3 %54 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.5, i32 0, i32 0), i32 %47, i32 %49, i32 %51, i32 %53) %55 = load <4 x i32>, <4 x i32>* %y, align 16 %not = icmp eq <4 x i32> %55, zeroinitializer %56 = sext <4 x i1> %not to <4 x i32> store <4 x i32> %56, <4 x i32>* %w, align 16 store <4 x i32> , <4 x i32>* %w, align 16 %57 = load <4 x i32>, <4 x i32>* %w, align 16 %not1 = icmp eq <4 x i32> %57, zeroinitializer %58 = sext <4 x i1> %not1 to <4 x i32> 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 ([17 x i8], [17 x i8]* @.str.6, i32 0, i32 0), i32 %60, i32 %62, i32 %64, i32 %66) ret void } ; Function Attrs: nounwind define void @main() #0 { entry: call void @vector_bit.testf() call void @vector_bit.testi() ret void }