diff --git a/src/compiler/enums.h b/src/compiler/enums.h index 052e04f9f..159ffc85f 100644 --- a/src/compiler/enums.h +++ b/src/compiler/enums.h @@ -889,6 +889,12 @@ typedef enum BUILTIN_TRAP, BUILTIN_TRUNC, BUILTIN_UNREACHABLE, + BUILTIN_VECCOMPLT, + BUILTIN_VECCOMPLE, + BUILTIN_VECCOMPGT, + BUILTIN_VECCOMPGE, + BUILTIN_VECCOMPEQ, + BUILTIN_VECCOMPNE, BUILTIN_VOLATILE_LOAD, BUILTIN_VOLATILE_STORE, diff --git a/src/compiler/llvm_codegen_builtins.c b/src/compiler/llvm_codegen_builtins.c index 82e3ffcd9..3a35feb45 100644 --- a/src/compiler/llvm_codegen_builtins.c +++ b/src/compiler/llvm_codegen_builtins.c @@ -437,6 +437,83 @@ static void llvm_emit_wrap_builtin(GenContext *c, BEValue *result_value, Expr *e llvm_value_set(result_value, res, expr->type); } +static void llvm_emit_veccomp(GenContext *c, BEValue *value, Expr *expr, BuiltinFunction fn) +{ + Expr **args = expr->call_expr.arguments; + unsigned count = vec_size(args); + assert(count == 2); + + LLVMValueRef mask; + llvm_emit_expr(c, value, args[0]); + llvm_value_rvalue(c, value); + LLVMValueRef lhs_value = value->value; + llvm_emit_expr(c, value, args[1]); + llvm_value_rvalue(c, value); + LLVMValueRef rhs_value = value->value; + LLVMValueRef res; + if (type_flat_is_floatlike(args[0]->type)) + { + switch (fn) + { + case BUILTIN_VECCOMPEQ: + // Unordered? + res = LLVMBuildFCmp(c->builder, LLVMRealOEQ, lhs_value, rhs_value, "eq"); + break; + case BUILTIN_VECCOMPNE: + // Unordered? + res = LLVMBuildFCmp(c->builder, LLVMRealONE, lhs_value, rhs_value, "neq"); + break; + case BUILTIN_VECCOMPGE: + res = LLVMBuildFCmp(c->builder, LLVMRealOGE, lhs_value, rhs_value, "ge"); + break; + case BUILTIN_VECCOMPGT: + res = LLVMBuildFCmp(c->builder, LLVMRealOGT, lhs_value, rhs_value, "gt"); + break; + case BUILTIN_VECCOMPLE: + res = LLVMBuildFCmp(c->builder, LLVMRealOLE, lhs_value, rhs_value, "le"); + break; + case BUILTIN_VECCOMPLT: + res = LLVMBuildFCmp(c->builder, LLVMRealOLT, lhs_value, rhs_value, "lt"); + break; + default: + UNREACHABLE + } + } + else + { + bool is_signed = type_is_signed(value->type); + switch (fn) + { + case BUILTIN_VECCOMPEQ: + // Unordered? + res = LLVMBuildICmp(c->builder, LLVMIntEQ, lhs_value, rhs_value, "eq"); + break; + case BUILTIN_VECCOMPNE: + // Unordered? + res = LLVMBuildICmp(c->builder, LLVMIntNE, lhs_value, rhs_value, "neq"); + break; + case BUILTIN_VECCOMPGE: + res = LLVMBuildICmp(c->builder, is_signed ? LLVMIntSGE : LLVMIntUGE, lhs_value, rhs_value, "ge"); + break; + case BUILTIN_VECCOMPGT: + res = LLVMBuildICmp(c->builder, is_signed ? LLVMIntSGT : LLVMIntUGT, lhs_value, rhs_value, "gt"); + break; + case BUILTIN_VECCOMPLE: + res = LLVMBuildICmp(c->builder, is_signed ? LLVMIntSLE : LLVMIntULE, lhs_value, rhs_value, "le"); + break; + case BUILTIN_VECCOMPLT: + res = LLVMBuildICmp(c->builder, is_signed ? LLVMIntSLT : LLVMIntULT, lhs_value, rhs_value, "lt"); + break; + default: + UNREACHABLE + } + } + Type *result_type = type_get_vector_bool(value->type); + res = LLVMBuildSExt(c->builder, res, llvm_get_type(c, result_type), ""); + llvm_value_set(value, res, result_type); + return; + +} void llvm_emit_builtin_call(GenContext *c, BEValue *result_value, Expr *expr) { BuiltinFunction func = exprptr(expr->call_expr.function)->builtin_expr.builtin; @@ -458,6 +535,14 @@ void llvm_emit_builtin_call(GenContext *c, BEValue *result_value, Expr *expr) llvm_value_set(result_value, value, expr->type); return; } + case BUILTIN_VECCOMPLT: + case BUILTIN_VECCOMPLE: + case BUILTIN_VECCOMPNE: + case BUILTIN_VECCOMPEQ: + case BUILTIN_VECCOMPGT: + case BUILTIN_VECCOMPGE: + llvm_emit_veccomp(c, result_value, expr, func); + return; case BUILTIN_REVERSE: llvm_emit_reverse(c, result_value, expr); return; diff --git a/src/compiler/llvm_codegen_expr.c b/src/compiler/llvm_codegen_expr.c index dcec81f8a..56435dd6f 100644 --- a/src/compiler/llvm_codegen_expr.c +++ b/src/compiler/llvm_codegen_expr.c @@ -38,7 +38,8 @@ static inline void llvm_emit_vararg_parameter(GenContext *c, BEValue *value, Typ static inline void llvm_emit_variant(GenContext *c, BEValue *value, Expr *expr); static inline void llvm_emit_vector_initializer_list(GenContext *c, BEValue *value, Expr *expr); static inline void llvm_extract_bitvalue_from_array(GenContext *c, BEValue *be_value, Decl *member, Decl *parent_decl); -static void llvm_convert_vector_comparison(GenContext *c, BEValue *be_value, LLVMValueRef val, Type *vector_type); +static void llvm_convert_vector_comparison(GenContext *c, BEValue *be_value, LLVMValueRef val, Type *vector_type, + bool is_equals); static void llvm_emit_any_pointer(GenContext *c, BEValue *any, BEValue *pointer); static void llvm_emit_binary(GenContext *c, BEValue *be_value, Expr *expr, BEValue *lhs_loaded, BinaryOp binary_op); static void llvm_emit_call_expr(GenContext *c, BEValue *result_value, Expr *expr, BEValue *target); @@ -178,15 +179,17 @@ BEValue llvm_emit_assign_expr(GenContext *c, BEValue *ref, Expr *expr, LLVMValue return value; } - - - - -static void llvm_convert_vector_comparison(GenContext *c, BEValue *be_value, LLVMValueRef val, Type *vector_type) +static void llvm_convert_vector_comparison(GenContext *c, BEValue *be_value, LLVMValueRef val, Type *vector_type, + bool is_equals) { - Type *result_type = type_get_vector_bool(vector_type); - val = LLVMBuildSExt(c->builder, val, llvm_get_type(c, result_type), ""); - llvm_value_set(be_value, val, result_type); + unsigned bits = vector_type->array.len; + LLVMTypeRef llvm_type = LLVMTypeOf(val); + if (bits <= 64) + { + } + unsigned intrinsic = is_equals ? intrinsic_id.vector_reduce_and : intrinsic_id.vector_reduce_or; + LLVMValueRef result = llvm_emit_call_intrinsic(c, intrinsic, &llvm_type, 1, &val, 1); + llvm_value_set_bool(be_value, result); } static LLVMValueRef llvm_emit_coerce_alignment(GenContext *c, BEValue *be_value, LLVMTypeRef coerce_type, AlignSize target_alignment, AlignSize *resulting_alignment) @@ -3042,7 +3045,7 @@ void llvm_emit_int_comp_raw(GenContext *c, BEValue *result, Type *lhs_type, Type } if (vector_type) { - llvm_convert_vector_comparison(c, result, value, lhs_type); + llvm_convert_vector_comparison(c, result, value, lhs_type, binary_op == BINARYOP_EQ); return; } llvm_value_set_bool(result, value); @@ -3083,7 +3086,7 @@ void llvm_emit_int_comp_raw(GenContext *c, BEValue *result, Type *lhs_type, Type { if (vector_type) { - llvm_convert_vector_comparison(c, result, comp_value, lhs_type); + llvm_convert_vector_comparison(c, result, comp_value, lhs_type, binary_op == BINARYOP_EQ); return; } llvm_value_set_bool(result, comp_value); @@ -3129,7 +3132,7 @@ void llvm_emit_int_comp_raw(GenContext *c, BEValue *result, Type *lhs_type, Type } if (vector_type) { - llvm_convert_vector_comparison(c, result, comp_value, lhs_type); + llvm_convert_vector_comparison(c, result, comp_value, lhs_type, BINARYOP_EQ == binary_op); return; } llvm_value_set_bool(result, comp_value); @@ -3271,6 +3274,7 @@ static void llvm_emit_subarray_comp(GenContext *c, BEValue *be_value, BEValue *l } + static void llvm_emit_float_comp(GenContext *c, BEValue *be_value, BEValue *lhs, BEValue *rhs, BinaryOp binary_op, Type *vector_type) { llvm_value_rvalue(c, lhs); @@ -3305,7 +3309,7 @@ static void llvm_emit_float_comp(GenContext *c, BEValue *be_value, BEValue *lhs, } if (vector_type) { - llvm_convert_vector_comparison(c, be_value, val, vector_type); + llvm_convert_vector_comparison(c, be_value, val, vector_type, BINARYOP_EQ == binary_op); return; } llvm_value_set_bool(be_value, val); diff --git a/src/compiler/sema_builtins.c b/src/compiler/sema_builtins.c index adbf856cc..1c293cb62 100644 --- a/src/compiler/sema_builtins.c +++ b/src/compiler/sema_builtins.c @@ -316,6 +316,18 @@ bool sema_expr_analyse_builtin_call(SemaContext *context, Expr *expr) return false; } break; + case BUILTIN_VECCOMPGE: + case BUILTIN_VECCOMPEQ: + case BUILTIN_VECCOMPLE: + case BUILTIN_VECCOMPGT: + case BUILTIN_VECCOMPLT: + case BUILTIN_VECCOMPNE: + if (!sema_check_builtin_args(args, + (BuiltinArg[]) { BA_VEC, BA_VEC }, + arg_count)) return false; + if (!sema_check_builtin_args_match(args, 2)) return false; + rtype = type_get_vector_bool(args[0]->type); + break; case BUILTIN_OVERFLOW_ADD: case BUILTIN_OVERFLOW_MUL: case BUILTIN_OVERFLOW_SUB: @@ -612,6 +624,12 @@ static inline unsigned builtin_expected_args(BuiltinFunction func) case BUILTIN_SAT_SHL: case BUILTIN_SAT_SUB: case BUILTIN_VOLATILE_STORE: + case BUILTIN_VECCOMPNE: + case BUILTIN_VECCOMPLT: + case BUILTIN_VECCOMPLE: + case BUILTIN_VECCOMPGE: + case BUILTIN_VECCOMPGT: + case BUILTIN_VECCOMPEQ: return 2; case BUILTIN_FMA: case BUILTIN_FSHL: diff --git a/src/compiler/sema_expr.c b/src/compiler/sema_expr.c index d91f6fab3..efc53fa42 100644 --- a/src/compiler/sema_expr.c +++ b/src/compiler/sema_expr.c @@ -4949,6 +4949,11 @@ static bool sema_expr_analyse_comp(SemaContext *context, Expr *expr, Expr *left, if (left_type->type_kind == TYPE_VECTOR && right_type->type_kind == TYPE_VECTOR) { + if (!is_equality_type_op) + { + SEMA_ERROR(expr, "Vector types can only be tested for equality, for other comparison, use vector comparison functions."); + return false; + } if (left_type->array.len == right_type->array.len) { Type *left_vec = type_vector_type(left_type); @@ -5019,8 +5024,7 @@ DONE: // 8. Set the type to bool - Type *return_type = left_type->type_kind == TYPE_VECTOR ? type_get_vector_bool(left_type) : type_bool; - expr->type = type_add_optional(return_type, IS_OPTIONAL(left) || IS_OPTIONAL(right)); + expr->type = type_add_optional(type_bool, IS_OPTIONAL(left) || IS_OPTIONAL(right)); return true; } diff --git a/src/compiler/symtab.c b/src/compiler/symtab.c index 21fa69f69..04d45ce18 100644 --- a/src/compiler/symtab.c +++ b/src/compiler/symtab.c @@ -248,6 +248,12 @@ void symtab_init(uint32_t capacity) builtin_list[BUILTIN_SYSCLOCK] = KW_DEF("sysclock"); builtin_list[BUILTIN_TRAP] = KW_DEF("trap"); builtin_list[BUILTIN_TRUNC] = KW_DEF("trunc"); + builtin_list[BUILTIN_VECCOMPLT] = KW_DEF("veccomplt"); + builtin_list[BUILTIN_VECCOMPLE] = KW_DEF("veccomple"); + builtin_list[BUILTIN_VECCOMPGT] = KW_DEF("veccompgt"); + builtin_list[BUILTIN_VECCOMPGE] = KW_DEF("veccompge"); + builtin_list[BUILTIN_VECCOMPEQ] = KW_DEF("veccompeq"); + builtin_list[BUILTIN_VECCOMPNE] = KW_DEF("veccompne"); builtin_list[BUILTIN_UNREACHABLE] = KW_DEF("unreachable"); builtin_list[BUILTIN_VOLATILE_LOAD] = KW_DEF("volatile_load"); builtin_list[BUILTIN_VOLATILE_STORE] = KW_DEF("volatile_store"); diff --git a/src/compiler/types.c b/src/compiler/types.c index 6304c7de7..894337392 100644 --- a/src/compiler/types.c +++ b/src/compiler/types.c @@ -439,7 +439,6 @@ bool type_is_ordered(Type *type) case TYPE_POINTER: case TYPE_BOOL: case TYPE_ENUM: - case TYPE_VECTOR: return true; case TYPE_TYPEDEF: type = type->canonical; diff --git a/src/version.h b/src/version.h index 71e4bb12a..93a40ed90 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define COMPILER_VERSION "0.3.118" \ No newline at end of file +#define COMPILER_VERSION "0.3.120" \ No newline at end of file diff --git a/test/test_suite/vector/vector_ops.c3t b/test/test_suite/vector/vector_ops.c3t deleted file mode 100644 index 3f295095d..000000000 --- a/test/test_suite/vector/vector_ops.c3t +++ /dev/null @@ -1,654 +0,0 @@ -// #target: macos-x64 -import libc; - -fn 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]); - ww = y <= z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y > z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y >= z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y == z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y != z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); -} - -fn void testb() -{ - bool[<4>] y = { true, false, true, true }; - bool[<4>] z = { false, false, true, true }; - ichar[<4>] ww = y < z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y <= z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y > z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y >= z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y == z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y != z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); -} - -fn 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]); - 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]); - 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]); - w = uz >= y; - libc::printf("%d %d %d %d\n", w[0], w[1], w[2], w[3]); - w = uz < y; - libc::printf("%d %d %d %d\n", w[0], w[1], w[2], w[3]); - w = uz <= y; - libc::printf("%d %d %d %d\n", w[0], w[1], w[2], w[3]); - w = uz == y; - libc::printf("%d %d %d %d\n", w[0], w[1], w[2], w[3]); - w = uz != y; - libc::printf("%d %d %d %d\n", w[0], w[1], w[2], w[3]); -} - -fn 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> , <4 x float>* %y, align 16 - store <4 x float> , <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) - %56 = load <4 x float>, <4 x float>* %y, align 16 - %57 = load <4 x float>, <4 x float>* %z, align 16 - %le = fcmp ole <4 x float> %56, %57 - %58 = sext <4 x i1> %le to <4 x i32> - store <4 x i32> %58, <4 x i32>* %ww, align 16 - %59 = load <4 x i32>, <4 x i32>* %ww, align 16 - %60 = extractelement <4 x i32> %59, i64 0 - %61 = load <4 x i32>, <4 x i32>* %ww, align 16 - %62 = extractelement <4 x i32> %61, i64 1 - %63 = load <4 x i32>, <4 x i32>* %ww, align 16 - %64 = extractelement <4 x i32> %63, i64 2 - %65 = load <4 x i32>, <4 x i32>* %ww, 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.5, i32 0, i32 0), i32 %60, i32 %62, i32 %64, i32 %66) - %68 = load <4 x float>, <4 x float>* %y, align 16 - %69 = load <4 x float>, <4 x float>* %z, align 16 - %gt = fcmp ogt <4 x float> %68, %69 - %70 = sext <4 x i1> %gt to <4 x i32> - store <4 x i32> %70, <4 x i32>* %ww, align 16 - %71 = load <4 x i32>, <4 x i32>* %ww, align 16 - %72 = extractelement <4 x i32> %71, i64 0 - %73 = load <4 x i32>, <4 x i32>* %ww, align 16 - %74 = extractelement <4 x i32> %73, i64 1 - %75 = load <4 x i32>, <4 x i32>* %ww, align 16 - %76 = extractelement <4 x i32> %75, i64 2 - %77 = load <4 x i32>, <4 x i32>* %ww, 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.6, i32 0, i32 0), i32 %72, i32 %74, i32 %76, i32 %78) - %80 = load <4 x float>, <4 x float>* %y, align 16 - %81 = load <4 x float>, <4 x float>* %z, align 16 - %ge = fcmp oge <4 x float> %80, %81 - %82 = sext <4 x i1> %ge to <4 x i32> - store <4 x i32> %82, <4 x i32>* %ww, align 16 - %83 = load <4 x i32>, <4 x i32>* %ww, align 16 - %84 = extractelement <4 x i32> %83, i64 0 - %85 = load <4 x i32>, <4 x i32>* %ww, align 16 - %86 = extractelement <4 x i32> %85, i64 1 - %87 = load <4 x i32>, <4 x i32>* %ww, align 16 - %88 = extractelement <4 x i32> %87, i64 2 - %89 = load <4 x i32>, <4 x i32>* %ww, 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.7, i32 0, i32 0), i32 %84, i32 %86, i32 %88, i32 %90) - %92 = load <4 x float>, <4 x float>* %y, align 16 - %93 = load <4 x float>, <4 x float>* %z, align 16 - %eq = fcmp oeq <4 x float> %92, %93 - %94 = sext <4 x i1> %eq to <4 x i32> - store <4 x i32> %94, <4 x i32>* %ww, align 16 - %95 = load <4 x i32>, <4 x i32>* %ww, align 16 - %96 = extractelement <4 x i32> %95, i64 0 - %97 = load <4 x i32>, <4 x i32>* %ww, align 16 - %98 = extractelement <4 x i32> %97, i64 1 - %99 = load <4 x i32>, <4 x i32>* %ww, align 16 - %100 = extractelement <4 x i32> %99, i64 2 - %101 = load <4 x i32>, <4 x i32>* %ww, align 16 - %102 = extractelement <4 x i32> %101, i64 3 - %103 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.8, i32 0, i32 0), i32 %96, i32 %98, i32 %100, i32 %102) - %104 = load <4 x float>, <4 x float>* %y, align 16 - %105 = load <4 x float>, <4 x float>* %z, align 16 - %neq = fcmp one <4 x float> %104, %105 - %106 = sext <4 x i1> %neq to <4 x i32> - store <4 x i32> %106, <4 x i32>* %ww, align 16 - %107 = load <4 x i32>, <4 x i32>* %ww, align 16 - %108 = extractelement <4 x i32> %107, i64 0 - %109 = load <4 x i32>, <4 x i32>* %ww, align 16 - %110 = extractelement <4 x i32> %109, i64 1 - %111 = load <4 x i32>, <4 x i32>* %ww, align 16 - %112 = extractelement <4 x i32> %111, i64 2 - %113 = load <4 x i32>, <4 x i32>* %ww, align 16 - %114 = extractelement <4 x i32> %113, i64 3 - %115 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.9, i32 0, i32 0), i32 %108, i32 %110, i32 %112, i32 %114) - ret void -} - -; Function Attrs: nounwind -define void @vector_ops_testb() #0 { -entry: - %y = alloca <4 x i8>, align 4 - %z = alloca <4 x i8>, align 4 - %ww = alloca <4 x i8>, align 4 - store <4 x i8> , <4 x i8>* %y, align 4 - store <4 x i8> , <4 x i8>* %z, align 4 - %0 = load <4 x i8>, <4 x i8>* %y, align 4 - %1 = load <4 x i8>, <4 x i8>* %z, align 4 - %lt = icmp ult <4 x i8> %0, %1 - %2 = sext <4 x i1> %lt to <4 x i8> - store <4 x i8> %2, <4 x i8>* %ww, align 4 - %3 = load <4 x i8>, <4 x i8>* %ww, align 4 - %4 = extractelement <4 x i8> %3, i64 0 - %sisiext = sext i8 %4 to i32 - %5 = load <4 x i8>, <4 x i8>* %ww, align 4 - %6 = extractelement <4 x i8> %5, i64 1 - %sisiext1 = sext i8 %6 to i32 - %7 = load <4 x i8>, <4 x i8>* %ww, align 4 - %8 = extractelement <4 x i8> %7, i64 2 - %sisiext2 = sext i8 %8 to i32 - %9 = load <4 x i8>, <4 x i8>* %ww, align 4 - %10 = extractelement <4 x i8> %9, i64 3 - %sisiext3 = sext i8 %10 to i32 - %11 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.10, i32 0, i32 0), i32 %sisiext, i32 %sisiext1, i32 %sisiext2, i32 %sisiext3) - %12 = load <4 x i8>, <4 x i8>* %y, align 4 - %13 = load <4 x i8>, <4 x i8>* %z, align 4 - %le = icmp ule <4 x i8> %12, %13 - %14 = sext <4 x i1> %le to <4 x i8> - store <4 x i8> %14, <4 x i8>* %ww, align 4 - %15 = load <4 x i8>, <4 x i8>* %ww, align 4 - %16 = extractelement <4 x i8> %15, i64 0 - %sisiext4 = sext i8 %16 to i32 - %17 = load <4 x i8>, <4 x i8>* %ww, align 4 - %18 = extractelement <4 x i8> %17, i64 1 - %sisiext5 = sext i8 %18 to i32 - %19 = load <4 x i8>, <4 x i8>* %ww, align 4 - %20 = extractelement <4 x i8> %19, i64 2 - %sisiext6 = sext i8 %20 to i32 - %21 = load <4 x i8>, <4 x i8>* %ww, align 4 - %22 = extractelement <4 x i8> %21, i64 3 - %sisiext7 = sext i8 %22 to i32 - %23 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.11, i32 0, i32 0), i32 %sisiext4, i32 %sisiext5, i32 %sisiext6, i32 %sisiext7) - %24 = load <4 x i8>, <4 x i8>* %y, align 4 - %25 = load <4 x i8>, <4 x i8>* %z, align 4 - %gt = icmp ugt <4 x i8> %24, %25 - %26 = sext <4 x i1> %gt to <4 x i8> - store <4 x i8> %26, <4 x i8>* %ww, align 4 - %27 = load <4 x i8>, <4 x i8>* %ww, align 4 - %28 = extractelement <4 x i8> %27, i64 0 - %sisiext8 = sext i8 %28 to i32 - %29 = load <4 x i8>, <4 x i8>* %ww, align 4 - %30 = extractelement <4 x i8> %29, i64 1 - %sisiext9 = sext i8 %30 to i32 - %31 = load <4 x i8>, <4 x i8>* %ww, align 4 - %32 = extractelement <4 x i8> %31, i64 2 - %sisiext10 = sext i8 %32 to i32 - %33 = load <4 x i8>, <4 x i8>* %ww, align 4 - %34 = extractelement <4 x i8> %33, i64 3 - %sisiext11 = sext i8 %34 to i32 - %35 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.12, i32 0, i32 0), i32 %sisiext8, i32 %sisiext9, i32 %sisiext10, i32 %sisiext11) - %36 = load <4 x i8>, <4 x i8>* %y, align 4 - %37 = load <4 x i8>, <4 x i8>* %z, align 4 - %ge = icmp uge <4 x i8> %36, %37 - %38 = sext <4 x i1> %ge to <4 x i8> - store <4 x i8> %38, <4 x i8>* %ww, align 4 - %39 = load <4 x i8>, <4 x i8>* %ww, align 4 - %40 = extractelement <4 x i8> %39, i64 0 - %sisiext12 = sext i8 %40 to i32 - %41 = load <4 x i8>, <4 x i8>* %ww, align 4 - %42 = extractelement <4 x i8> %41, i64 1 - %sisiext13 = sext i8 %42 to i32 - %43 = load <4 x i8>, <4 x i8>* %ww, align 4 - %44 = extractelement <4 x i8> %43, i64 2 - %sisiext14 = sext i8 %44 to i32 - %45 = load <4 x i8>, <4 x i8>* %ww, align 4 - %46 = extractelement <4 x i8> %45, i64 3 - %sisiext15 = sext i8 %46 to i32 - %47 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.13, i32 0, i32 0), i32 %sisiext12, i32 %sisiext13, i32 %sisiext14, i32 %sisiext15) - %48 = load <4 x i8>, <4 x i8>* %y, align 4 - %49 = load <4 x i8>, <4 x i8>* %z, align 4 - %eq = icmp eq <4 x i8> %48, %49 - %50 = sext <4 x i1> %eq to <4 x i8> - store <4 x i8> %50, <4 x i8>* %ww, align 4 - %51 = load <4 x i8>, <4 x i8>* %ww, align 4 - %52 = extractelement <4 x i8> %51, i64 0 - %sisiext16 = sext i8 %52 to i32 - %53 = load <4 x i8>, <4 x i8>* %ww, align 4 - %54 = extractelement <4 x i8> %53, i64 1 - %sisiext17 = sext i8 %54 to i32 - %55 = load <4 x i8>, <4 x i8>* %ww, align 4 - %56 = extractelement <4 x i8> %55, i64 2 - %sisiext18 = sext i8 %56 to i32 - %57 = load <4 x i8>, <4 x i8>* %ww, align 4 - %58 = extractelement <4 x i8> %57, i64 3 - %sisiext19 = sext i8 %58 to i32 - %59 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.14, i32 0, i32 0), i32 %sisiext16, i32 %sisiext17, i32 %sisiext18, i32 %sisiext19) - %60 = load <4 x i8>, <4 x i8>* %y, align 4 - %61 = load <4 x i8>, <4 x i8>* %z, align 4 - %neq = icmp ne <4 x i8> %60, %61 - %62 = sext <4 x i1> %neq to <4 x i8> - store <4 x i8> %62, <4 x i8>* %ww, align 4 - %63 = load <4 x i8>, <4 x i8>* %ww, align 4 - %64 = extractelement <4 x i8> %63, i64 0 - %sisiext20 = sext i8 %64 to i32 - %65 = load <4 x i8>, <4 x i8>* %ww, align 4 - %66 = extractelement <4 x i8> %65, i64 1 - %sisiext21 = sext i8 %66 to i32 - %67 = load <4 x i8>, <4 x i8>* %ww, align 4 - %68 = extractelement <4 x i8> %67, i64 2 - %sisiext22 = sext i8 %68 to i32 - %69 = load <4 x i8>, <4 x i8>* %ww, align 4 - %70 = extractelement <4 x i8> %69, i64 3 - %sisiext23 = sext i8 %70 to i32 - %71 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.15, i32 0, i32 0), i32 %sisiext20, i32 %sisiext21, i32 %sisiext22, i32 %sisiext23) - 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> , <4 x i32>* %y, align 16 - store <4 x i32> , <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.16, 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.17, 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.18, 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.19, 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.20, 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.21, 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.22, i32 0, i32 0), i32 %72, i32 %74, i32 %76, i32 %78) - %80 = load <4 x i32>, <4 x i32>* %z, align 16 - %81 = load <4 x i32>, <4 x i32>* %y, align 16 - %ge = icmp sge <4 x i32> %80, %81 - %82 = sext <4 x i1> %ge 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.23, i32 0, i32 0), i32 %84, i32 %86, i32 %88, i32 %90) - %92 = load <4 x i32>, <4 x i32>* %z, align 16 - %93 = load <4 x i32>, <4 x i32>* %y, align 16 - %lt = icmp slt <4 x i32> %92, %93 - %94 = sext <4 x i1> %lt to <4 x i32> - store <4 x i32> %94, <4 x i32>* %w, align 16 - %95 = load <4 x i32>, <4 x i32>* %w, align 16 - %96 = extractelement <4 x i32> %95, i64 0 - %97 = load <4 x i32>, <4 x i32>* %w, align 16 - %98 = extractelement <4 x i32> %97, i64 1 - %99 = load <4 x i32>, <4 x i32>* %w, align 16 - %100 = extractelement <4 x i32> %99, i64 2 - %101 = load <4 x i32>, <4 x i32>* %w, align 16 - %102 = extractelement <4 x i32> %101, i64 3 - %103 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.24, i32 0, i32 0), i32 %96, i32 %98, i32 %100, i32 %102) - %104 = load <4 x i32>, <4 x i32>* %z, align 16 - %105 = load <4 x i32>, <4 x i32>* %y, align 16 - %le = icmp sle <4 x i32> %104, %105 - %106 = sext <4 x i1> %le to <4 x i32> - store <4 x i32> %106, <4 x i32>* %w, align 16 - %107 = load <4 x i32>, <4 x i32>* %w, align 16 - %108 = extractelement <4 x i32> %107, i64 0 - %109 = load <4 x i32>, <4 x i32>* %w, align 16 - %110 = extractelement <4 x i32> %109, i64 1 - %111 = load <4 x i32>, <4 x i32>* %w, align 16 - %112 = extractelement <4 x i32> %111, i64 2 - %113 = load <4 x i32>, <4 x i32>* %w, align 16 - %114 = extractelement <4 x i32> %113, i64 3 - %115 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.25, i32 0, i32 0), i32 %108, i32 %110, i32 %112, i32 %114) - %116 = load <4 x i32>, <4 x i32>* %z, align 16 - %117 = load <4 x i32>, <4 x i32>* %y, align 16 - %eq = icmp eq <4 x i32> %116, %117 - %118 = sext <4 x i1> %eq to <4 x i32> - store <4 x i32> %118, <4 x i32>* %w, align 16 - %119 = load <4 x i32>, <4 x i32>* %w, align 16 - %120 = extractelement <4 x i32> %119, i64 0 - %121 = load <4 x i32>, <4 x i32>* %w, align 16 - %122 = extractelement <4 x i32> %121, i64 1 - %123 = load <4 x i32>, <4 x i32>* %w, align 16 - %124 = extractelement <4 x i32> %123, i64 2 - %125 = load <4 x i32>, <4 x i32>* %w, align 16 - %126 = extractelement <4 x i32> %125, i64 3 - %127 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.26, i32 0, i32 0), i32 %120, i32 %122, i32 %124, i32 %126) - %128 = load <4 x i32>, <4 x i32>* %z, align 16 - %129 = load <4 x i32>, <4 x i32>* %y, align 16 - %neq = icmp ne <4 x i32> %128, %129 - %130 = sext <4 x i1> %neq to <4 x i32> - store <4 x i32> %130, <4 x i32>* %w, align 16 - %131 = load <4 x i32>, <4 x i32>* %w, align 16 - %132 = extractelement <4 x i32> %131, i64 0 - %133 = load <4 x i32>, <4 x i32>* %w, align 16 - %134 = extractelement <4 x i32> %133, i64 1 - %135 = load <4 x i32>, <4 x i32>* %w, align 16 - %136 = extractelement <4 x i32> %135, i64 2 - %137 = load <4 x i32>, <4 x i32>* %w, align 16 - %138 = extractelement <4 x i32> %137, i64 3 - %139 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.27, i32 0, i32 0), i32 %132, i32 %134, i32 %136, i32 %138) - store <4 x i32> , <4 x i32>* %uz, align 16 - %140 = load <4 x i32>, <4 x i32>* %uz, align 16 - %141 = load <4 x i32>, <4 x i32>* %y, align 16 - %lt1 = icmp slt <4 x i32> %141, %140 - %check = icmp slt <4 x i32> %140, zeroinitializer - %siui-lt = or <4 x i1> %check, %lt1 - %142 = sext <4 x i1> %siui-lt to <4 x i32> - store <4 x i32> %142, <4 x i32>* %w, align 16 - %143 = load <4 x i32>, <4 x i32>* %w, align 16 - %144 = extractelement <4 x i32> %143, i64 0 - %145 = load <4 x i32>, <4 x i32>* %w, align 16 - %146 = extractelement <4 x i32> %145, i64 1 - %147 = load <4 x i32>, <4 x i32>* %w, align 16 - %148 = extractelement <4 x i32> %147, i64 2 - %149 = load <4 x i32>, <4 x i32>* %w, align 16 - %150 = extractelement <4 x i32> %149, i64 3 - %151 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.28, i32 0, i32 0), i32 %144, i32 %146, i32 %148, i32 %150) - %152 = load <4 x i32>, <4 x i32>* %uz, align 16 - %153 = load <4 x i32>, <4 x i32>* %y, align 16 - %le2 = icmp sle <4 x i32> %153, %152 - %check3 = icmp slt <4 x i32> %152, zeroinitializer - %siui-le = or <4 x i1> %check3, %le2 - %154 = sext <4 x i1> %siui-le to <4 x i32> - store <4 x i32> %154, <4 x i32>* %w, align 16 - %155 = load <4 x i32>, <4 x i32>* %w, align 16 - %156 = extractelement <4 x i32> %155, i64 0 - %157 = load <4 x i32>, <4 x i32>* %w, align 16 - %158 = extractelement <4 x i32> %157, i64 1 - %159 = load <4 x i32>, <4 x i32>* %w, align 16 - %160 = extractelement <4 x i32> %159, i64 2 - %161 = load <4 x i32>, <4 x i32>* %w, align 16 - %162 = extractelement <4 x i32> %161, i64 3 - %163 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.29, i32 0, i32 0), i32 %156, i32 %158, i32 %160, i32 %162) - %164 = load <4 x i32>, <4 x i32>* %uz, align 16 - %165 = load <4 x i32>, <4 x i32>* %y, align 16 - %gt4 = icmp sgt <4 x i32> %165, %164 - %check5 = icmp sge <4 x i32> %164, zeroinitializer - %siui-gt = and <4 x i1> %check5, %gt4 - %166 = sext <4 x i1> %siui-gt to <4 x i32> - store <4 x i32> %166, <4 x i32>* %w, align 16 - %167 = load <4 x i32>, <4 x i32>* %w, align 16 - %168 = extractelement <4 x i32> %167, i64 0 - %169 = load <4 x i32>, <4 x i32>* %w, align 16 - %170 = extractelement <4 x i32> %169, i64 1 - %171 = load <4 x i32>, <4 x i32>* %w, align 16 - %172 = extractelement <4 x i32> %171, i64 2 - %173 = load <4 x i32>, <4 x i32>* %w, align 16 - %174 = extractelement <4 x i32> %173, i64 3 - %175 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.30, i32 0, i32 0), i32 %168, i32 %170, i32 %172, i32 %174) - %176 = load <4 x i32>, <4 x i32>* %uz, align 16 - %177 = load <4 x i32>, <4 x i32>* %y, align 16 - %ge6 = icmp sge <4 x i32> %177, %176 - %check7 = icmp sge <4 x i32> %176, zeroinitializer - %siui-ge = and <4 x i1> %check7, %ge6 - %178 = sext <4 x i1> %siui-ge to <4 x i32> - store <4 x i32> %178, <4 x i32>* %w, align 16 - %179 = load <4 x i32>, <4 x i32>* %w, align 16 - %180 = extractelement <4 x i32> %179, i64 0 - %181 = load <4 x i32>, <4 x i32>* %w, align 16 - %182 = extractelement <4 x i32> %181, i64 1 - %183 = load <4 x i32>, <4 x i32>* %w, align 16 - %184 = extractelement <4 x i32> %183, i64 2 - %185 = load <4 x i32>, <4 x i32>* %w, align 16 - %186 = extractelement <4 x i32> %185, i64 3 - %187 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.31, i32 0, i32 0), i32 %180, i32 %182, i32 %184, i32 %186) - %188 = load <4 x i32>, <4 x i32>* %uz, align 16 - %189 = load <4 x i32>, <4 x i32>* %y, align 16 - %eq8 = icmp eq <4 x i32> %189, %188 - %check9 = icmp sge <4 x i32> %189, zeroinitializer - %siui-eq = and <4 x i1> %check9, %eq8 - %190 = sext <4 x i1> %siui-eq to <4 x i32> - store <4 x i32> %190, <4 x i32>* %w, align 16 - %191 = load <4 x i32>, <4 x i32>* %w, align 16 - %192 = extractelement <4 x i32> %191, i64 0 - %193 = load <4 x i32>, <4 x i32>* %w, align 16 - %194 = extractelement <4 x i32> %193, i64 1 - %195 = load <4 x i32>, <4 x i32>* %w, align 16 - %196 = extractelement <4 x i32> %195, i64 2 - %197 = load <4 x i32>, <4 x i32>* %w, align 16 - %198 = extractelement <4 x i32> %197, i64 3 - %199 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.32, i32 0, i32 0), i32 %192, i32 %194, i32 %196, i32 %198) - %200 = load <4 x i32>, <4 x i32>* %uz, align 16 - %201 = load <4 x i32>, <4 x i32>* %y, align 16 - %neq10 = icmp ne <4 x i32> %201, %200 - %check11 = icmp slt <4 x i32> %201, zeroinitializer - %siui-ne = or <4 x i1> %check11, %neq10 - %202 = sext <4 x i1> %siui-ne to <4 x i32> - store <4 x i32> %202, <4 x i32>* %w, align 16 - %203 = load <4 x i32>, <4 x i32>* %w, align 16 - %204 = extractelement <4 x i32> %203, i64 0 - %205 = load <4 x i32>, <4 x i32>* %w, align 16 - %206 = extractelement <4 x i32> %205, i64 1 - %207 = load <4 x i32>, <4 x i32>* %w, align 16 - %208 = extractelement <4 x i32> %207, i64 2 - %209 = load <4 x i32>, <4 x i32>* %w, align 16 - %210 = extractelement <4 x i32> %209, i64 3 - %211 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.33, i32 0, i32 0), i32 %204, i32 %206, i32 %208, i32 %210) - ret void -} \ No newline at end of file diff --git a/test/test_suite/vector/vector_ops2.c3t b/test/test_suite/vector/vector_ops2.c3t index dc6bdf209..f895878df 100644 --- a/test/test_suite/vector/vector_ops2.c3t +++ b/test/test_suite/vector/vector_ops2.c3t @@ -8,709 +8,97 @@ fn 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]); - ww = y <= z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y > z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y >= z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y == z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y != z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); } -fn void testb() -{ - bool[<4>] y = { true, false, true, true }; - bool[<4>] z = { false, false, true, true }; - ichar[<4>] ww = y < z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y <= z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y > z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y >= z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y == z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y != z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); -} fn 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]); + int[<4>] w = y / z; 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]); - 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]); - 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]); - w = uz >= y; - libc::printf("%d %d %d %d\n", w[0], w[1], w[2], w[3]); - w = uz < y; - libc::printf("%d %d %d %d\n", w[0], w[1], w[2], w[3]); - w = uz <= y; - libc::printf("%d %d %d %d\n", w[0], w[1], w[2], w[3]); - w = uz == y; - libc::printf("%d %d %d %d\n", w[0], w[1], w[2], w[3]); - w = uz != y; - libc::printf("%d %d %d %d\n", w[0], w[1], w[2], w[3]); -} - -fn void main() -{ - testf(); - testi(); - testb(); } /* #expect: test.ll -define void @test_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> , <4 x float>* %y, align 16 - store <4 x float> , <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 - %24 = call <4 x float> @llvm.fabs.v4f32(<4 x float> %23) - %25 = call float @llvm.vector.reduce.fmin.v4f32(<4 x float> %24) - %zero = fcmp ueq float %25, 0.000000e+00 + %4 = call <4 x float> @llvm.fabs.v4f32(<4 x float> %3) + %5 = call float @llvm.vector.reduce.fmin.v4f32(<4 x float> %4) + %zero = fcmp ueq float %5, 0.000000e+00 br i1 %zero, label %panic, label %checkok panic: ; preds = %entry - %26 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 - call void %26(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.panic_msg, i64 0, i64 0), i64 17, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.file, i64 0, i64 0), i64 14, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.func, i64 0, i64 0), i64 5, i32 12) + %6 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 + call void %6(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.panic_msg, i64 0, i64 0), i64 17, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.file, i64 0, i64 0), i64 14, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.func, i64 0, i64 0), i64 5, i32 9) br label %checkok checkok: ; preds = %panic, %entry - %fdiv = fdiv <4 x float> %22, %23 + %fdiv = fdiv <4 x float> %2, %3 store <4 x float> %fdiv, <4 x float>* %w, align 16 - %27 = load <4 x float>, <4 x float>* %w, align 16 - %28 = extractelement <4 x float> %27, i64 0 - %fpfpext8 = fpext float %28 to double - %29 = load <4 x float>, <4 x float>* %w, align 16 - %30 = extractelement <4 x float> %29, i64 1 - %fpfpext9 = fpext float %30 to double - %31 = load <4 x float>, <4 x float>* %w, align 16 - %32 = extractelement <4 x float> %31, i64 2 - %fpfpext10 = fpext float %32 to double - %33 = load <4 x float>, <4 x float>* %w, align 16 - %34 = extractelement <4 x float> %33, i64 3 - %fpfpext11 = fpext float %34 to double - %35 = 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) - %36 = load <4 x float>, <4 x float>* %y, align 16 - %37 = load <4 x float>, <4 x float>* %z, align 16 - %fsub = fsub <4 x float> %36, %37 - store <4 x float> %fsub, <4 x float>* %w, align 16 - %38 = load <4 x float>, <4 x float>* %w, align 16 - %39 = extractelement <4 x float> %38, i64 0 - %fpfpext12 = fpext float %39 to double - %40 = load <4 x float>, <4 x float>* %w, align 16 - %41 = extractelement <4 x float> %40, i64 1 - %fpfpext13 = fpext float %41 to double - %42 = load <4 x float>, <4 x float>* %w, align 16 - %43 = extractelement <4 x float> %42, i64 2 - %fpfpext14 = fpext float %43 to double - %44 = load <4 x float>, <4 x float>* %w, align 16 - %45 = extractelement <4 x float> %44, i64 3 - %fpfpext15 = fpext float %45 to double - %46 = 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) - %47 = load <4 x float>, <4 x float>* %y, align 16 - %48 = load <4 x float>, <4 x float>* %z, align 16 - %lt = fcmp olt <4 x float> %47, %48 - %49 = sext <4 x i1> %lt to <4 x i32> - store <4 x i32> %49, <4 x i32>* %ww, align 16 - %50 = load <4 x i32>, <4 x i32>* %ww, align 16 - %51 = extractelement <4 x i32> %50, i64 0 - %52 = load <4 x i32>, <4 x i32>* %ww, align 16 - %53 = extractelement <4 x i32> %52, i64 1 - %54 = load <4 x i32>, <4 x i32>* %ww, align 16 - %55 = extractelement <4 x i32> %54, i64 2 - %56 = load <4 x i32>, <4 x i32>* %ww, align 16 - %57 = extractelement <4 x i32> %56, i64 3 - %58 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.4, i32 0, i32 0), i32 %51, i32 %53, i32 %55, i32 %57) - %59 = load <4 x float>, <4 x float>* %y, align 16 - %60 = load <4 x float>, <4 x float>* %z, align 16 - %le = fcmp ole <4 x float> %59, %60 - %61 = sext <4 x i1> %le to <4 x i32> - store <4 x i32> %61, <4 x i32>* %ww, align 16 - %62 = load <4 x i32>, <4 x i32>* %ww, align 16 - %63 = extractelement <4 x i32> %62, i64 0 - %64 = load <4 x i32>, <4 x i32>* %ww, align 16 - %65 = extractelement <4 x i32> %64, i64 1 - %66 = load <4 x i32>, <4 x i32>* %ww, align 16 - %67 = extractelement <4 x i32> %66, i64 2 - %68 = load <4 x i32>, <4 x i32>* %ww, align 16 - %69 = extractelement <4 x i32> %68, i64 3 - %70 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.5, i32 0, i32 0), i32 %63, i32 %65, i32 %67, i32 %69) - %71 = load <4 x float>, <4 x float>* %y, align 16 - %72 = load <4 x float>, <4 x float>* %z, align 16 - %gt = fcmp ogt <4 x float> %71, %72 - %73 = sext <4 x i1> %gt to <4 x i32> - store <4 x i32> %73, <4 x i32>* %ww, align 16 - %74 = load <4 x i32>, <4 x i32>* %ww, align 16 - %75 = extractelement <4 x i32> %74, i64 0 - %76 = load <4 x i32>, <4 x i32>* %ww, align 16 - %77 = extractelement <4 x i32> %76, i64 1 - %78 = load <4 x i32>, <4 x i32>* %ww, align 16 - %79 = extractelement <4 x i32> %78, i64 2 - %80 = load <4 x i32>, <4 x i32>* %ww, align 16 - %81 = extractelement <4 x i32> %80, i64 3 - %82 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.6, i32 0, i32 0), i32 %75, i32 %77, i32 %79, i32 %81) - %83 = load <4 x float>, <4 x float>* %y, align 16 - %84 = load <4 x float>, <4 x float>* %z, align 16 - %ge = fcmp oge <4 x float> %83, %84 - %85 = sext <4 x i1> %ge to <4 x i32> - store <4 x i32> %85, <4 x i32>* %ww, align 16 - %86 = load <4 x i32>, <4 x i32>* %ww, align 16 - %87 = extractelement <4 x i32> %86, i64 0 - %88 = load <4 x i32>, <4 x i32>* %ww, align 16 - %89 = extractelement <4 x i32> %88, i64 1 - %90 = load <4 x i32>, <4 x i32>* %ww, align 16 - %91 = extractelement <4 x i32> %90, i64 2 - %92 = load <4 x i32>, <4 x i32>* %ww, align 16 - %93 = extractelement <4 x i32> %92, i64 3 - %94 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.7, i32 0, i32 0), i32 %87, i32 %89, i32 %91, i32 %93) - %95 = load <4 x float>, <4 x float>* %y, align 16 - %96 = load <4 x float>, <4 x float>* %z, align 16 - %eq = fcmp oeq <4 x float> %95, %96 - %97 = sext <4 x i1> %eq to <4 x i32> - store <4 x i32> %97, <4 x i32>* %ww, align 16 - %98 = load <4 x i32>, <4 x i32>* %ww, align 16 - %99 = extractelement <4 x i32> %98, i64 0 - %100 = load <4 x i32>, <4 x i32>* %ww, align 16 - %101 = extractelement <4 x i32> %100, i64 1 - %102 = load <4 x i32>, <4 x i32>* %ww, align 16 - %103 = extractelement <4 x i32> %102, i64 2 - %104 = load <4 x i32>, <4 x i32>* %ww, align 16 - %105 = extractelement <4 x i32> %104, i64 3 - %106 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.8, i32 0, i32 0), i32 %99, i32 %101, i32 %103, i32 %105) - %107 = load <4 x float>, <4 x float>* %y, align 16 - %108 = load <4 x float>, <4 x float>* %z, align 16 - %neq = fcmp one <4 x float> %107, %108 - %109 = sext <4 x i1> %neq to <4 x i32> - store <4 x i32> %109, <4 x i32>* %ww, align 16 - %110 = load <4 x i32>, <4 x i32>* %ww, align 16 - %111 = extractelement <4 x i32> %110, i64 0 - %112 = load <4 x i32>, <4 x i32>* %ww, align 16 - %113 = extractelement <4 x i32> %112, i64 1 - %114 = load <4 x i32>, <4 x i32>* %ww, align 16 - %115 = extractelement <4 x i32> %114, i64 2 - %116 = load <4 x i32>, <4 x i32>* %ww, align 16 - %117 = extractelement <4 x i32> %116, i64 3 - %118 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.9, i32 0, i32 0), i32 %111, i32 %113, i32 %115, i32 %117) - ret void -} -; Function Attrs: nounwind -define void @test_testb() #0 { -entry: - %y = alloca <4 x i8>, align 4 - %z = alloca <4 x i8>, align 4 - %ww = alloca <4 x i8>, align 4 - store <4 x i8> , <4 x i8>* %y, align 4 - store <4 x i8> , <4 x i8>* %z, align 4 - %0 = load <4 x i8>, <4 x i8>* %y, align 4 - %1 = load <4 x i8>, <4 x i8>* %z, align 4 - %lt = icmp ult <4 x i8> %0, %1 - %2 = sext <4 x i1> %lt to <4 x i8> - store <4 x i8> %2, <4 x i8>* %ww, align 4 - %3 = load <4 x i8>, <4 x i8>* %ww, align 4 - %4 = extractelement <4 x i8> %3, i64 0 - %sisiext = sext i8 %4 to i32 - %5 = load <4 x i8>, <4 x i8>* %ww, align 4 - %6 = extractelement <4 x i8> %5, i64 1 - %sisiext1 = sext i8 %6 to i32 - %7 = load <4 x i8>, <4 x i8>* %ww, align 4 - %8 = extractelement <4 x i8> %7, i64 2 - %sisiext2 = sext i8 %8 to i32 - %9 = load <4 x i8>, <4 x i8>* %ww, align 4 - %10 = extractelement <4 x i8> %9, i64 3 - %sisiext3 = sext i8 %10 to i32 - %11 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.10, i32 0, i32 0), i32 %sisiext, i32 %sisiext1, i32 %sisiext2, i32 %sisiext3) - %12 = load <4 x i8>, <4 x i8>* %y, align 4 - %13 = load <4 x i8>, <4 x i8>* %z, align 4 - %le = icmp ule <4 x i8> %12, %13 - %14 = sext <4 x i1> %le to <4 x i8> - store <4 x i8> %14, <4 x i8>* %ww, align 4 - %15 = load <4 x i8>, <4 x i8>* %ww, align 4 - %16 = extractelement <4 x i8> %15, i64 0 - %sisiext4 = sext i8 %16 to i32 - %17 = load <4 x i8>, <4 x i8>* %ww, align 4 - %18 = extractelement <4 x i8> %17, i64 1 - %sisiext5 = sext i8 %18 to i32 - %19 = load <4 x i8>, <4 x i8>* %ww, align 4 - %20 = extractelement <4 x i8> %19, i64 2 - %sisiext6 = sext i8 %20 to i32 - %21 = load <4 x i8>, <4 x i8>* %ww, align 4 - %22 = extractelement <4 x i8> %21, i64 3 - %sisiext7 = sext i8 %22 to i32 - %23 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.11, i32 0, i32 0), i32 %sisiext4, i32 %sisiext5, i32 %sisiext6, i32 %sisiext7) - %24 = load <4 x i8>, <4 x i8>* %y, align 4 - %25 = load <4 x i8>, <4 x i8>* %z, align 4 - %gt = icmp ugt <4 x i8> %24, %25 - %26 = sext <4 x i1> %gt to <4 x i8> - store <4 x i8> %26, <4 x i8>* %ww, align 4 - %27 = load <4 x i8>, <4 x i8>* %ww, align 4 - %28 = extractelement <4 x i8> %27, i64 0 - %sisiext8 = sext i8 %28 to i32 - %29 = load <4 x i8>, <4 x i8>* %ww, align 4 - %30 = extractelement <4 x i8> %29, i64 1 - %sisiext9 = sext i8 %30 to i32 - %31 = load <4 x i8>, <4 x i8>* %ww, align 4 - %32 = extractelement <4 x i8> %31, i64 2 - %sisiext10 = sext i8 %32 to i32 - %33 = load <4 x i8>, <4 x i8>* %ww, align 4 - %34 = extractelement <4 x i8> %33, i64 3 - %sisiext11 = sext i8 %34 to i32 - %35 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.12, i32 0, i32 0), i32 %sisiext8, i32 %sisiext9, i32 %sisiext10, i32 %sisiext11) - %36 = load <4 x i8>, <4 x i8>* %y, align 4 - %37 = load <4 x i8>, <4 x i8>* %z, align 4 - %ge = icmp uge <4 x i8> %36, %37 - %38 = sext <4 x i1> %ge to <4 x i8> - store <4 x i8> %38, <4 x i8>* %ww, align 4 - %39 = load <4 x i8>, <4 x i8>* %ww, align 4 - %40 = extractelement <4 x i8> %39, i64 0 - %sisiext12 = sext i8 %40 to i32 - %41 = load <4 x i8>, <4 x i8>* %ww, align 4 - %42 = extractelement <4 x i8> %41, i64 1 - %sisiext13 = sext i8 %42 to i32 - %43 = load <4 x i8>, <4 x i8>* %ww, align 4 - %44 = extractelement <4 x i8> %43, i64 2 - %sisiext14 = sext i8 %44 to i32 - %45 = load <4 x i8>, <4 x i8>* %ww, align 4 - %46 = extractelement <4 x i8> %45, i64 3 - %sisiext15 = sext i8 %46 to i32 - %47 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.13, i32 0, i32 0), i32 %sisiext12, i32 %sisiext13, i32 %sisiext14, i32 %sisiext15) - %48 = load <4 x i8>, <4 x i8>* %y, align 4 - %49 = load <4 x i8>, <4 x i8>* %z, align 4 - %eq = icmp eq <4 x i8> %48, %49 - %50 = sext <4 x i1> %eq to <4 x i8> - store <4 x i8> %50, <4 x i8>* %ww, align 4 - %51 = load <4 x i8>, <4 x i8>* %ww, align 4 - %52 = extractelement <4 x i8> %51, i64 0 - %sisiext16 = sext i8 %52 to i32 - %53 = load <4 x i8>, <4 x i8>* %ww, align 4 - %54 = extractelement <4 x i8> %53, i64 1 - %sisiext17 = sext i8 %54 to i32 - %55 = load <4 x i8>, <4 x i8>* %ww, align 4 - %56 = extractelement <4 x i8> %55, i64 2 - %sisiext18 = sext i8 %56 to i32 - %57 = load <4 x i8>, <4 x i8>* %ww, align 4 - %58 = extractelement <4 x i8> %57, i64 3 - %sisiext19 = sext i8 %58 to i32 - %59 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.14, i32 0, i32 0), i32 %sisiext16, i32 %sisiext17, i32 %sisiext18, i32 %sisiext19) - %60 = load <4 x i8>, <4 x i8>* %y, align 4 - %61 = load <4 x i8>, <4 x i8>* %z, align 4 - %neq = icmp ne <4 x i8> %60, %61 - %62 = sext <4 x i1> %neq to <4 x i8> - store <4 x i8> %62, <4 x i8>* %ww, align 4 - %63 = load <4 x i8>, <4 x i8>* %ww, align 4 - %64 = extractelement <4 x i8> %63, i64 0 - %sisiext20 = sext i8 %64 to i32 - %65 = load <4 x i8>, <4 x i8>* %ww, align 4 - %66 = extractelement <4 x i8> %65, i64 1 - %sisiext21 = sext i8 %66 to i32 - %67 = load <4 x i8>, <4 x i8>* %ww, align 4 - %68 = extractelement <4 x i8> %67, i64 2 - %sisiext22 = sext i8 %68 to i32 - %69 = load <4 x i8>, <4 x i8>* %ww, align 4 - %70 = extractelement <4 x i8> %69, i64 3 - %sisiext23 = sext i8 %70 to i32 - %71 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.15, i32 0, i32 0), i32 %sisiext20, i32 %sisiext21, i32 %sisiext22, i32 %sisiext23) - ret void -} - -; Function Attrs: nounwind -define void @test_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> , <4 x i32>* %y, align 16 - store <4 x i32> , <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.16, 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.17, 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 - %24 = call i32 @llvm.vector.reduce.umin.v4i32(<4 x i32> %23) - %zero = icmp eq i32 %24, 0 + %2 = call i32 @llvm.vector.reduce.umin.v4i32(<4 x i32> %1) + %zero = icmp eq i32 %2, 0 br i1 %zero, label %panic, label %checkok panic: ; preds = %entry - %25 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 - call void %25(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.panic_msg.18, i64 0, i64 0), i64 17, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.file.19, i64 0, i64 0), i64 14, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.func.20, i64 0, i64 0), i64 5, i32 56) + %3 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 + call void %3(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.panic_msg.1, i64 0, i64 0), i64 17, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.file.2, i64 0, i64 0), i64 14, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.func.3, i64 0, i64 0), i64 5, i32 17) br label %checkok checkok: ; preds = %panic, %entry - %sdiv = sdiv <4 x i32> %22, %23 + %sdiv = sdiv <4 x i32> %0, %1 store <4 x i32> %sdiv, <4 x i32>* %w, align 16 - %26 = load <4 x i32>, <4 x i32>* %w, align 16 - %27 = extractelement <4 x i32> %26, i64 0 - %28 = load <4 x i32>, <4 x i32>* %w, align 16 - %29 = extractelement <4 x i32> %28, i64 1 - %30 = load <4 x i32>, <4 x i32>* %w, align 16 - %31 = extractelement <4 x i32> %30, i64 2 - %32 = load <4 x i32>, <4 x i32>* %w, align 16 - %33 = extractelement <4 x i32> %32, i64 3 - %34 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.21, i32 0, i32 0), i32 %27, i32 %29, i32 %31, i32 %33) - %35 = load <4 x i32>, <4 x i32>* %y, align 16 - %36 = load <4 x i32>, <4 x i32>* %z, align 16 - %sub = sub <4 x i32> %35, %36 - store <4 x i32> %sub, <4 x i32>* %w, align 16 - %37 = load <4 x i32>, <4 x i32>* %w, align 16 - %38 = extractelement <4 x i32> %37, i64 0 - %39 = load <4 x i32>, <4 x i32>* %w, align 16 - %40 = extractelement <4 x i32> %39, i64 1 - %41 = load <4 x i32>, <4 x i32>* %w, align 16 - %42 = extractelement <4 x i32> %41, i64 2 - %43 = load <4 x i32>, <4 x i32>* %w, align 16 - %44 = extractelement <4 x i32> %43, i64 3 - %45 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.22, i32 0, i32 0), i32 %38, i32 %40, i32 %42, i32 %44) - %46 = load <4 x i32>, <4 x i32>* %z, align 16 - %47 = load <4 x i32>, <4 x i32>* %y, align 16 - %48 = call i32 @llvm.vector.reduce.smin.v4i32(<4 x i32> %47) - %shift_underflow = icmp slt i32 %48, 0 + %4 = load <4 x i32>, <4 x i32>* %z, align 16 + %5 = load <4 x i32>, <4 x i32>* %y, align 16 + %6 = call i32 @llvm.vector.reduce.smin.v4i32(<4 x i32> %5) + %shift_underflow = icmp slt i32 %6, 0 br i1 %shift_underflow, label %panic1, label %checkok2 panic1: ; preds = %checkok - %49 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 - call void %49(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.panic_msg.23, i64 0, i64 0), i64 26, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.file.24, i64 0, i64 0), i64 14, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.func.25, i64 0, i64 0), i64 5, i32 60) + %7 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 + call void %7(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.panic_msg.4, i64 0, i64 0), i64 26, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.file.5, i64 0, i64 0), i64 14, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.func.6, i64 0, i64 0), i64 5, i32 18) br label %checkok2 checkok2: ; preds = %panic1, %checkok - %50 = call i32 @llvm.vector.reduce.smax.v4i32(<4 x i32> %47) - %shift_exceeds = icmp sge i32 %50, 32 + %8 = call i32 @llvm.vector.reduce.smax.v4i32(<4 x i32> %5) + %shift_exceeds = icmp sge i32 %8, 32 br i1 %shift_exceeds, label %panic3, label %checkok4 panic3: ; preds = %checkok2 - %51 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 - call void %51(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.panic_msg.26, i64 0, i64 0), i64 26, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.file.27, i64 0, i64 0), i64 14, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.func.28, i64 0, i64 0), i64 5, i32 60) + %9 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 + call void %9(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.panic_msg.7, i64 0, i64 0), i64 26, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.file.8, i64 0, i64 0), i64 14, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.func.9, i64 0, i64 0), i64 5, i32 18) br label %checkok4 checkok4: ; preds = %panic3, %checkok2 - %ashr = ashr <4 x i32> %46, %47 - %52 = freeze <4 x i32> %ashr - store <4 x i32> %52, <4 x i32>* %w, align 16 - %53 = load <4 x i32>, <4 x i32>* %w, align 16 - %54 = extractelement <4 x i32> %53, i64 0 - %55 = load <4 x i32>, <4 x i32>* %w, align 16 - %56 = extractelement <4 x i32> %55, i64 1 - %57 = load <4 x i32>, <4 x i32>* %w, align 16 - %58 = extractelement <4 x i32> %57, i64 2 - %59 = load <4 x i32>, <4 x i32>* %w, align 16 - %60 = extractelement <4 x i32> %59, i64 3 - %61 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.29, i32 0, i32 0), i32 %54, i32 %56, i32 %58, i32 %60) - %62 = load <4 x i32>, <4 x i32>* %z, align 16 - %63 = load <4 x i32>, <4 x i32>* %y, align 16 - %64 = call i32 @llvm.vector.reduce.smin.v4i32(<4 x i32> %63) - %shift_underflow5 = icmp slt i32 %64, 0 + %ashr = ashr <4 x i32> %4, %5 + %10 = freeze <4 x i32> %ashr + store <4 x i32> %10, <4 x i32>* %w, align 16 + %11 = load <4 x i32>, <4 x i32>* %z, align 16 + %12 = load <4 x i32>, <4 x i32>* %y, align 16 + %13 = call i32 @llvm.vector.reduce.smin.v4i32(<4 x i32> %12) + %shift_underflow5 = icmp slt i32 %13, 0 br i1 %shift_underflow5, label %panic6, label %checkok7 panic6: ; preds = %checkok4 - %65 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 - call void %65(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.panic_msg.30, i64 0, i64 0), i64 26, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.file.31, i64 0, i64 0), i64 14, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.func.32, i64 0, i64 0), i64 5, i32 62) + %14 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 + call void %14(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.panic_msg.10, i64 0, i64 0), i64 26, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.file.11, i64 0, i64 0), i64 14, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.func.12, i64 0, i64 0), i64 5, i32 19) br label %checkok7 checkok7: ; preds = %panic6, %checkok4 - %66 = call i32 @llvm.vector.reduce.smax.v4i32(<4 x i32> %63) - %shift_exceeds8 = icmp sge i32 %66, 32 + %15 = call i32 @llvm.vector.reduce.smax.v4i32(<4 x i32> %12) + %shift_exceeds8 = icmp sge i32 %15, 32 br i1 %shift_exceeds8, label %panic9, label %checkok10 panic9: ; preds = %checkok7 - %67 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 - call void %67(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.panic_msg.33, i64 0, i64 0), i64 26, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.file.34, i64 0, i64 0), i64 14, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.func.35, i64 0, i64 0), i64 5, i32 62) + %16 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 + call void %16(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.panic_msg.13, i64 0, i64 0), i64 26, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.file.14, i64 0, i64 0), i64 14, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.func.15, i64 0, i64 0), i64 5, i32 19) br label %checkok10 checkok10: ; preds = %panic9, %checkok7 - %shl = shl <4 x i32> %62, %63 - %68 = freeze <4 x i32> %shl - store <4 x i32> %68, <4 x i32>* %w, align 16 - %69 = load <4 x i32>, <4 x i32>* %w, align 16 - %70 = extractelement <4 x i32> %69, i64 0 - %71 = load <4 x i32>, <4 x i32>* %w, align 16 - %72 = extractelement <4 x i32> %71, i64 1 - %73 = load <4 x i32>, <4 x i32>* %w, align 16 - %74 = extractelement <4 x i32> %73, i64 2 - %75 = load <4 x i32>, <4 x i32>* %w, align 16 - %76 = extractelement <4 x i32> %75, i64 3 - %77 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.36, i32 0, i32 0), i32 %70, i32 %72, i32 %74, i32 %76) - %78 = load <4 x i32>, <4 x i32>* %z, align 16 - %79 = load <4 x i32>, <4 x i32>* %y, align 16 - %gt = icmp sgt <4 x i32> %78, %79 - %80 = sext <4 x i1> %gt to <4 x i32> - store <4 x i32> %80, <4 x i32>* %w, align 16 - %81 = load <4 x i32>, <4 x i32>* %w, align 16 - %82 = extractelement <4 x i32> %81, i64 0 - %83 = load <4 x i32>, <4 x i32>* %w, align 16 - %84 = extractelement <4 x i32> %83, i64 1 - %85 = load <4 x i32>, <4 x i32>* %w, align 16 - %86 = extractelement <4 x i32> %85, i64 2 - %87 = load <4 x i32>, <4 x i32>* %w, align 16 - %88 = extractelement <4 x i32> %87, i64 3 - %89 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.37, i32 0, i32 0), i32 %82, i32 %84, i32 %86, i32 %88) - %90 = load <4 x i32>, <4 x i32>* %z, align 16 - %91 = load <4 x i32>, <4 x i32>* %y, align 16 - %ge = icmp sge <4 x i32> %90, %91 - %92 = sext <4 x i1> %ge to <4 x i32> - store <4 x i32> %92, <4 x i32>* %w, align 16 - %93 = load <4 x i32>, <4 x i32>* %w, align 16 - %94 = extractelement <4 x i32> %93, i64 0 - %95 = load <4 x i32>, <4 x i32>* %w, align 16 - %96 = extractelement <4 x i32> %95, i64 1 - %97 = load <4 x i32>, <4 x i32>* %w, align 16 - %98 = extractelement <4 x i32> %97, i64 2 - %99 = load <4 x i32>, <4 x i32>* %w, align 16 - %100 = extractelement <4 x i32> %99, i64 3 - %101 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.38, i32 0, i32 0), i32 %94, i32 %96, i32 %98, i32 %100) - %102 = load <4 x i32>, <4 x i32>* %z, align 16 - %103 = load <4 x i32>, <4 x i32>* %y, align 16 - %lt = icmp slt <4 x i32> %102, %103 - %104 = sext <4 x i1> %lt to <4 x i32> - store <4 x i32> %104, <4 x i32>* %w, align 16 - %105 = load <4 x i32>, <4 x i32>* %w, align 16 - %106 = extractelement <4 x i32> %105, i64 0 - %107 = load <4 x i32>, <4 x i32>* %w, align 16 - %108 = extractelement <4 x i32> %107, i64 1 - %109 = load <4 x i32>, <4 x i32>* %w, align 16 - %110 = extractelement <4 x i32> %109, i64 2 - %111 = load <4 x i32>, <4 x i32>* %w, align 16 - %112 = extractelement <4 x i32> %111, i64 3 - %113 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.39, i32 0, i32 0), i32 %106, i32 %108, i32 %110, i32 %112) - %114 = load <4 x i32>, <4 x i32>* %z, align 16 - %115 = load <4 x i32>, <4 x i32>* %y, align 16 - %le = icmp sle <4 x i32> %114, %115 - %116 = sext <4 x i1> %le to <4 x i32> - store <4 x i32> %116, <4 x i32>* %w, align 16 - %117 = load <4 x i32>, <4 x i32>* %w, align 16 - %118 = extractelement <4 x i32> %117, i64 0 - %119 = load <4 x i32>, <4 x i32>* %w, align 16 - %120 = extractelement <4 x i32> %119, i64 1 - %121 = load <4 x i32>, <4 x i32>* %w, align 16 - %122 = extractelement <4 x i32> %121, i64 2 - %123 = load <4 x i32>, <4 x i32>* %w, align 16 - %124 = extractelement <4 x i32> %123, i64 3 - %125 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.40, i32 0, i32 0), i32 %118, i32 %120, i32 %122, i32 %124) - %126 = load <4 x i32>, <4 x i32>* %z, align 16 - %127 = load <4 x i32>, <4 x i32>* %y, align 16 - %eq = icmp eq <4 x i32> %126, %127 - %128 = sext <4 x i1> %eq to <4 x i32> - store <4 x i32> %128, <4 x i32>* %w, align 16 - %129 = load <4 x i32>, <4 x i32>* %w, align 16 - %130 = extractelement <4 x i32> %129, i64 0 - %131 = load <4 x i32>, <4 x i32>* %w, align 16 - %132 = extractelement <4 x i32> %131, i64 1 - %133 = load <4 x i32>, <4 x i32>* %w, align 16 - %134 = extractelement <4 x i32> %133, i64 2 - %135 = load <4 x i32>, <4 x i32>* %w, align 16 - %136 = extractelement <4 x i32> %135, i64 3 - %137 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.41, i32 0, i32 0), i32 %130, i32 %132, i32 %134, i32 %136) - %138 = load <4 x i32>, <4 x i32>* %z, align 16 - %139 = load <4 x i32>, <4 x i32>* %y, align 16 - %neq = icmp ne <4 x i32> %138, %139 - %140 = sext <4 x i1> %neq to <4 x i32> - store <4 x i32> %140, <4 x i32>* %w, align 16 - %141 = load <4 x i32>, <4 x i32>* %w, align 16 - %142 = extractelement <4 x i32> %141, i64 0 - %143 = load <4 x i32>, <4 x i32>* %w, align 16 - %144 = extractelement <4 x i32> %143, i64 1 - %145 = load <4 x i32>, <4 x i32>* %w, align 16 - %146 = extractelement <4 x i32> %145, i64 2 - %147 = load <4 x i32>, <4 x i32>* %w, align 16 - %148 = extractelement <4 x i32> %147, i64 3 - %149 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.42, i32 0, i32 0), i32 %142, i32 %144, i32 %146, i32 %148) - store <4 x i32> , <4 x i32>* %uz, align 16 - %150 = load <4 x i32>, <4 x i32>* %uz, align 16 - %151 = load <4 x i32>, <4 x i32>* %y, align 16 - %lt11 = icmp slt <4 x i32> %151, %150 - %check = icmp slt <4 x i32> %150, zeroinitializer - %siui-lt = or <4 x i1> %check, %lt11 - %152 = sext <4 x i1> %siui-lt to <4 x i32> - store <4 x i32> %152, <4 x i32>* %w, align 16 - %153 = load <4 x i32>, <4 x i32>* %w, align 16 - %154 = extractelement <4 x i32> %153, i64 0 - %155 = load <4 x i32>, <4 x i32>* %w, align 16 - %156 = extractelement <4 x i32> %155, i64 1 - %157 = load <4 x i32>, <4 x i32>* %w, align 16 - %158 = extractelement <4 x i32> %157, i64 2 - %159 = load <4 x i32>, <4 x i32>* %w, align 16 - %160 = extractelement <4 x i32> %159, i64 3 - %161 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.43, i32 0, i32 0), i32 %154, i32 %156, i32 %158, i32 %160) - %162 = load <4 x i32>, <4 x i32>* %uz, align 16 - %163 = load <4 x i32>, <4 x i32>* %y, align 16 - %le12 = icmp sle <4 x i32> %163, %162 - %check13 = icmp slt <4 x i32> %162, zeroinitializer - %siui-le = or <4 x i1> %check13, %le12 - %164 = sext <4 x i1> %siui-le to <4 x i32> - store <4 x i32> %164, <4 x i32>* %w, align 16 - %165 = load <4 x i32>, <4 x i32>* %w, align 16 - %166 = extractelement <4 x i32> %165, i64 0 - %167 = load <4 x i32>, <4 x i32>* %w, align 16 - %168 = extractelement <4 x i32> %167, i64 1 - %169 = load <4 x i32>, <4 x i32>* %w, align 16 - %170 = extractelement <4 x i32> %169, i64 2 - %171 = load <4 x i32>, <4 x i32>* %w, align 16 - %172 = extractelement <4 x i32> %171, i64 3 - %173 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.44, i32 0, i32 0), i32 %166, i32 %168, i32 %170, i32 %172) - %174 = load <4 x i32>, <4 x i32>* %uz, align 16 - %175 = load <4 x i32>, <4 x i32>* %y, align 16 - %gt14 = icmp sgt <4 x i32> %175, %174 - %check15 = icmp sge <4 x i32> %174, zeroinitializer - %siui-gt = and <4 x i1> %check15, %gt14 - %176 = sext <4 x i1> %siui-gt to <4 x i32> - store <4 x i32> %176, <4 x i32>* %w, align 16 - %177 = load <4 x i32>, <4 x i32>* %w, align 16 - %178 = extractelement <4 x i32> %177, i64 0 - %179 = load <4 x i32>, <4 x i32>* %w, align 16 - %180 = extractelement <4 x i32> %179, i64 1 - %181 = load <4 x i32>, <4 x i32>* %w, align 16 - %182 = extractelement <4 x i32> %181, i64 2 - %183 = load <4 x i32>, <4 x i32>* %w, align 16 - %184 = extractelement <4 x i32> %183, i64 3 - %185 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.45, i32 0, i32 0), i32 %178, i32 %180, i32 %182, i32 %184) - %186 = load <4 x i32>, <4 x i32>* %uz, align 16 - %187 = load <4 x i32>, <4 x i32>* %y, align 16 - %ge16 = icmp sge <4 x i32> %187, %186 - %check17 = icmp sge <4 x i32> %186, zeroinitializer - %siui-ge = and <4 x i1> %check17, %ge16 - %188 = sext <4 x i1> %siui-ge to <4 x i32> - store <4 x i32> %188, <4 x i32>* %w, align 16 - %189 = load <4 x i32>, <4 x i32>* %w, align 16 - %190 = extractelement <4 x i32> %189, i64 0 - %191 = load <4 x i32>, <4 x i32>* %w, align 16 - %192 = extractelement <4 x i32> %191, i64 1 - %193 = load <4 x i32>, <4 x i32>* %w, align 16 - %194 = extractelement <4 x i32> %193, i64 2 - %195 = load <4 x i32>, <4 x i32>* %w, align 16 - %196 = extractelement <4 x i32> %195, i64 3 - %197 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.46, i32 0, i32 0), i32 %190, i32 %192, i32 %194, i32 %196) - %198 = load <4 x i32>, <4 x i32>* %uz, align 16 - %199 = load <4 x i32>, <4 x i32>* %y, align 16 - %eq18 = icmp eq <4 x i32> %199, %198 - %check19 = icmp sge <4 x i32> %199, zeroinitializer - %siui-eq = and <4 x i1> %check19, %eq18 - %200 = sext <4 x i1> %siui-eq to <4 x i32> - store <4 x i32> %200, <4 x i32>* %w, align 16 - %201 = load <4 x i32>, <4 x i32>* %w, align 16 - %202 = extractelement <4 x i32> %201, i64 0 - %203 = load <4 x i32>, <4 x i32>* %w, align 16 - %204 = extractelement <4 x i32> %203, i64 1 - %205 = load <4 x i32>, <4 x i32>* %w, align 16 - %206 = extractelement <4 x i32> %205, i64 2 - %207 = load <4 x i32>, <4 x i32>* %w, align 16 - %208 = extractelement <4 x i32> %207, i64 3 - %209 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.47, i32 0, i32 0), i32 %202, i32 %204, i32 %206, i32 %208) - %210 = load <4 x i32>, <4 x i32>* %uz, align 16 - %211 = load <4 x i32>, <4 x i32>* %y, align 16 - %neq20 = icmp ne <4 x i32> %211, %210 - %check21 = icmp slt <4 x i32> %211, zeroinitializer - %siui-ne = or <4 x i1> %check21, %neq20 - %212 = sext <4 x i1> %siui-ne to <4 x i32> - store <4 x i32> %212, <4 x i32>* %w, align 16 - %213 = load <4 x i32>, <4 x i32>* %w, align 16 - %214 = extractelement <4 x i32> %213, i64 0 - %215 = load <4 x i32>, <4 x i32>* %w, align 16 - %216 = extractelement <4 x i32> %215, i64 1 - %217 = load <4 x i32>, <4 x i32>* %w, align 16 - %218 = extractelement <4 x i32> %217, i64 2 - %219 = load <4 x i32>, <4 x i32>* %w, align 16 - %220 = extractelement <4 x i32> %219, i64 3 - %221 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.48, i32 0, i32 0), i32 %214, i32 %216, i32 %218, i32 %220) + %shl = shl <4 x i32> %11, %12 + %17 = freeze <4 x i32> %shl + store <4 x i32> %17, <4 x i32>* %w, align 16 ret void -} \ No newline at end of file +} + diff --git a/test/test_suite2/vector/vector_ops.c3t b/test/test_suite2/vector/vector_ops.c3t deleted file mode 100644 index d9a445907..000000000 --- a/test/test_suite2/vector/vector_ops.c3t +++ /dev/null @@ -1,654 +0,0 @@ -// #target: macos-x64 -import libc; - -fn 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]); - ww = y <= z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y > z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y >= z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y == z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y != z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); -} - -fn void testb() -{ - bool[<4>] y = { true, false, true, true }; - bool[<4>] z = { false, false, true, true }; - ichar[<4>] ww = y < z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y <= z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y > z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y >= z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y == z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y != z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); -} - -fn 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]); - 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]); - 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]); - w = uz >= y; - libc::printf("%d %d %d %d\n", w[0], w[1], w[2], w[3]); - w = uz < y; - libc::printf("%d %d %d %d\n", w[0], w[1], w[2], w[3]); - w = uz <= y; - libc::printf("%d %d %d %d\n", w[0], w[1], w[2], w[3]); - w = uz == y; - libc::printf("%d %d %d %d\n", w[0], w[1], w[2], w[3]); - w = uz != y; - libc::printf("%d %d %d %d\n", w[0], w[1], w[2], w[3]); -} - -fn 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> , ptr %y, align 16 - store <4 x float> , ptr %z, align 16 - %0 = load <4 x float>, ptr %y, align 16 - %1 = load <4 x float>, ptr %z, align 16 - %fadd = fadd <4 x float> %0, %1 - store <4 x float> %fadd, ptr %w, align 16 - %2 = load <4 x float>, ptr %w, align 16 - %3 = extractelement <4 x float> %2, i64 0 - %fpfpext = fpext float %3 to double - %4 = load <4 x float>, ptr %w, align 16 - %5 = extractelement <4 x float> %4, i64 1 - %fpfpext1 = fpext float %5 to double - %6 = load <4 x float>, ptr %w, align 16 - %7 = extractelement <4 x float> %6, i64 2 - %fpfpext2 = fpext float %7 to double - %8 = load <4 x float>, ptr %w, align 16 - %9 = extractelement <4 x float> %8, i64 3 - %fpfpext3 = fpext float %9 to double - %10 = call i32 (ptr, ...) @printf(ptr @.str, double %fpfpext, double %fpfpext1, double %fpfpext2, double %fpfpext3) - %11 = load <4 x float>, ptr %y, align 16 - %12 = load <4 x float>, ptr %z, align 16 - %fmul = fmul <4 x float> %11, %12 - store <4 x float> %fmul, ptr %w, align 16 - %13 = load <4 x float>, ptr %w, align 16 - %14 = extractelement <4 x float> %13, i64 0 - %fpfpext4 = fpext float %14 to double - %15 = load <4 x float>, ptr %w, align 16 - %16 = extractelement <4 x float> %15, i64 1 - %fpfpext5 = fpext float %16 to double - %17 = load <4 x float>, ptr %w, align 16 - %18 = extractelement <4 x float> %17, i64 2 - %fpfpext6 = fpext float %18 to double - %19 = load <4 x float>, ptr %w, align 16 - %20 = extractelement <4 x float> %19, i64 3 - %fpfpext7 = fpext float %20 to double - %21 = call i32 (ptr, ...) @printf(ptr @.str.1, double %fpfpext4, double %fpfpext5, double %fpfpext6, double %fpfpext7) - %22 = load <4 x float>, ptr %y, align 16 - %23 = load <4 x float>, ptr %z, align 16 - %fdiv = fdiv <4 x float> %22, %23 - store <4 x float> %fdiv, ptr %w, align 16 - %24 = load <4 x float>, ptr %w, align 16 - %25 = extractelement <4 x float> %24, i64 0 - %fpfpext8 = fpext float %25 to double - %26 = load <4 x float>, ptr %w, align 16 - %27 = extractelement <4 x float> %26, i64 1 - %fpfpext9 = fpext float %27 to double - %28 = load <4 x float>, ptr %w, align 16 - %29 = extractelement <4 x float> %28, i64 2 - %fpfpext10 = fpext float %29 to double - %30 = load <4 x float>, ptr %w, align 16 - %31 = extractelement <4 x float> %30, i64 3 - %fpfpext11 = fpext float %31 to double - %32 = call i32 (ptr, ...) @printf(ptr @.str.2, double %fpfpext8, double %fpfpext9, double %fpfpext10, double %fpfpext11) - %33 = load <4 x float>, ptr %y, align 16 - %34 = load <4 x float>, ptr %z, align 16 - %fsub = fsub <4 x float> %33, %34 - store <4 x float> %fsub, ptr %w, align 16 - %35 = load <4 x float>, ptr %w, align 16 - %36 = extractelement <4 x float> %35, i64 0 - %fpfpext12 = fpext float %36 to double - %37 = load <4 x float>, ptr %w, align 16 - %38 = extractelement <4 x float> %37, i64 1 - %fpfpext13 = fpext float %38 to double - %39 = load <4 x float>, ptr %w, align 16 - %40 = extractelement <4 x float> %39, i64 2 - %fpfpext14 = fpext float %40 to double - %41 = load <4 x float>, ptr %w, align 16 - %42 = extractelement <4 x float> %41, i64 3 - %fpfpext15 = fpext float %42 to double - %43 = call i32 (ptr, ...) @printf(ptr @.str.3, double %fpfpext12, double %fpfpext13, double %fpfpext14, double %fpfpext15) - %44 = load <4 x float>, ptr %y, align 16 - %45 = load <4 x float>, ptr %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, ptr %ww, align 16 - %47 = load <4 x i32>, ptr %ww, align 16 - %48 = extractelement <4 x i32> %47, i64 0 - %49 = load <4 x i32>, ptr %ww, align 16 - %50 = extractelement <4 x i32> %49, i64 1 - %51 = load <4 x i32>, ptr %ww, align 16 - %52 = extractelement <4 x i32> %51, i64 2 - %53 = load <4 x i32>, ptr %ww, align 16 - %54 = extractelement <4 x i32> %53, i64 3 - %55 = call i32 (ptr, ...) @printf(ptr @.str.4, i32 %48, i32 %50, i32 %52, i32 %54) - %56 = load <4 x float>, ptr %y, align 16 - %57 = load <4 x float>, ptr %z, align 16 - %le = fcmp ole <4 x float> %56, %57 - %58 = sext <4 x i1> %le to <4 x i32> - store <4 x i32> %58, ptr %ww, align 16 - %59 = load <4 x i32>, ptr %ww, align 16 - %60 = extractelement <4 x i32> %59, i64 0 - %61 = load <4 x i32>, ptr %ww, align 16 - %62 = extractelement <4 x i32> %61, i64 1 - %63 = load <4 x i32>, ptr %ww, align 16 - %64 = extractelement <4 x i32> %63, i64 2 - %65 = load <4 x i32>, ptr %ww, align 16 - %66 = extractelement <4 x i32> %65, i64 3 - %67 = call i32 (ptr, ...) @printf(ptr @.str.5, i32 %60, i32 %62, i32 %64, i32 %66) - %68 = load <4 x float>, ptr %y, align 16 - %69 = load <4 x float>, ptr %z, align 16 - %gt = fcmp ogt <4 x float> %68, %69 - %70 = sext <4 x i1> %gt to <4 x i32> - store <4 x i32> %70, ptr %ww, align 16 - %71 = load <4 x i32>, ptr %ww, align 16 - %72 = extractelement <4 x i32> %71, i64 0 - %73 = load <4 x i32>, ptr %ww, align 16 - %74 = extractelement <4 x i32> %73, i64 1 - %75 = load <4 x i32>, ptr %ww, align 16 - %76 = extractelement <4 x i32> %75, i64 2 - %77 = load <4 x i32>, ptr %ww, align 16 - %78 = extractelement <4 x i32> %77, i64 3 - %79 = call i32 (ptr, ...) @printf(ptr @.str.6, i32 %72, i32 %74, i32 %76, i32 %78) - %80 = load <4 x float>, ptr %y, align 16 - %81 = load <4 x float>, ptr %z, align 16 - %ge = fcmp oge <4 x float> %80, %81 - %82 = sext <4 x i1> %ge to <4 x i32> - store <4 x i32> %82, ptr %ww, align 16 - %83 = load <4 x i32>, ptr %ww, align 16 - %84 = extractelement <4 x i32> %83, i64 0 - %85 = load <4 x i32>, ptr %ww, align 16 - %86 = extractelement <4 x i32> %85, i64 1 - %87 = load <4 x i32>, ptr %ww, align 16 - %88 = extractelement <4 x i32> %87, i64 2 - %89 = load <4 x i32>, ptr %ww, align 16 - %90 = extractelement <4 x i32> %89, i64 3 - %91 = call i32 (ptr, ...) @printf(ptr @.str.7, i32 %84, i32 %86, i32 %88, i32 %90) - %92 = load <4 x float>, ptr %y, align 16 - %93 = load <4 x float>, ptr %z, align 16 - %eq = fcmp oeq <4 x float> %92, %93 - %94 = sext <4 x i1> %eq to <4 x i32> - store <4 x i32> %94, ptr %ww, align 16 - %95 = load <4 x i32>, ptr %ww, align 16 - %96 = extractelement <4 x i32> %95, i64 0 - %97 = load <4 x i32>, ptr %ww, align 16 - %98 = extractelement <4 x i32> %97, i64 1 - %99 = load <4 x i32>, ptr %ww, align 16 - %100 = extractelement <4 x i32> %99, i64 2 - %101 = load <4 x i32>, ptr %ww, align 16 - %102 = extractelement <4 x i32> %101, i64 3 - %103 = call i32 (ptr, ...) @printf(ptr @.str.8, i32 %96, i32 %98, i32 %100, i32 %102) - %104 = load <4 x float>, ptr %y, align 16 - %105 = load <4 x float>, ptr %z, align 16 - %neq = fcmp one <4 x float> %104, %105 - %106 = sext <4 x i1> %neq to <4 x i32> - store <4 x i32> %106, ptr %ww, align 16 - %107 = load <4 x i32>, ptr %ww, align 16 - %108 = extractelement <4 x i32> %107, i64 0 - %109 = load <4 x i32>, ptr %ww, align 16 - %110 = extractelement <4 x i32> %109, i64 1 - %111 = load <4 x i32>, ptr %ww, align 16 - %112 = extractelement <4 x i32> %111, i64 2 - %113 = load <4 x i32>, ptr %ww, align 16 - %114 = extractelement <4 x i32> %113, i64 3 - %115 = call i32 (ptr, ...) @printf(ptr @.str.9, i32 %108, i32 %110, i32 %112, i32 %114) - ret void -} - - -define void @vector_ops_testb() #0 { -entry: - %y = alloca <4 x i8>, align 4 - %z = alloca <4 x i8>, align 4 - %ww = alloca <4 x i8>, align 4 - store <4 x i8> , ptr %y, align 4 - store <4 x i8> , ptr %z, align 4 - %0 = load <4 x i8>, ptr %y, align 4 - %1 = load <4 x i8>, ptr %z, align 4 - %lt = icmp ult <4 x i8> %0, %1 - %2 = sext <4 x i1> %lt to <4 x i8> - store <4 x i8> %2, ptr %ww, align 4 - %3 = load <4 x i8>, ptr %ww, align 4 - %4 = extractelement <4 x i8> %3, i64 0 - %sisiext = sext i8 %4 to i32 - %5 = load <4 x i8>, ptr %ww, align 4 - %6 = extractelement <4 x i8> %5, i64 1 - %sisiext1 = sext i8 %6 to i32 - %7 = load <4 x i8>, ptr %ww, align 4 - %8 = extractelement <4 x i8> %7, i64 2 - %sisiext2 = sext i8 %8 to i32 - %9 = load <4 x i8>, ptr %ww, align 4 - %10 = extractelement <4 x i8> %9, i64 3 - %sisiext3 = sext i8 %10 to i32 - %11 = call i32 (ptr, ...) @printf(ptr @.str.10, i32 %sisiext, i32 %sisiext1, i32 %sisiext2, i32 %sisiext3) - %12 = load <4 x i8>, ptr %y, align 4 - %13 = load <4 x i8>, ptr %z, align 4 - %le = icmp ule <4 x i8> %12, %13 - %14 = sext <4 x i1> %le to <4 x i8> - store <4 x i8> %14, ptr %ww, align 4 - %15 = load <4 x i8>, ptr %ww, align 4 - %16 = extractelement <4 x i8> %15, i64 0 - %sisiext4 = sext i8 %16 to i32 - %17 = load <4 x i8>, ptr %ww, align 4 - %18 = extractelement <4 x i8> %17, i64 1 - %sisiext5 = sext i8 %18 to i32 - %19 = load <4 x i8>, ptr %ww, align 4 - %20 = extractelement <4 x i8> %19, i64 2 - %sisiext6 = sext i8 %20 to i32 - %21 = load <4 x i8>, ptr %ww, align 4 - %22 = extractelement <4 x i8> %21, i64 3 - %sisiext7 = sext i8 %22 to i32 - %23 = call i32 (ptr, ...) @printf(ptr @.str.11, i32 %sisiext4, i32 %sisiext5, i32 %sisiext6, i32 %sisiext7) - %24 = load <4 x i8>, ptr %y, align 4 - %25 = load <4 x i8>, ptr %z, align 4 - %gt = icmp ugt <4 x i8> %24, %25 - %26 = sext <4 x i1> %gt to <4 x i8> - store <4 x i8> %26, ptr %ww, align 4 - %27 = load <4 x i8>, ptr %ww, align 4 - %28 = extractelement <4 x i8> %27, i64 0 - %sisiext8 = sext i8 %28 to i32 - %29 = load <4 x i8>, ptr %ww, align 4 - %30 = extractelement <4 x i8> %29, i64 1 - %sisiext9 = sext i8 %30 to i32 - %31 = load <4 x i8>, ptr %ww, align 4 - %32 = extractelement <4 x i8> %31, i64 2 - %sisiext10 = sext i8 %32 to i32 - %33 = load <4 x i8>, ptr %ww, align 4 - %34 = extractelement <4 x i8> %33, i64 3 - %sisiext11 = sext i8 %34 to i32 - %35 = call i32 (ptr, ...) @printf(ptr @.str.12, i32 %sisiext8, i32 %sisiext9, i32 %sisiext10, i32 %sisiext11) - %36 = load <4 x i8>, ptr %y, align 4 - %37 = load <4 x i8>, ptr %z, align 4 - %ge = icmp uge <4 x i8> %36, %37 - %38 = sext <4 x i1> %ge to <4 x i8> - store <4 x i8> %38, ptr %ww, align 4 - %39 = load <4 x i8>, ptr %ww, align 4 - %40 = extractelement <4 x i8> %39, i64 0 - %sisiext12 = sext i8 %40 to i32 - %41 = load <4 x i8>, ptr %ww, align 4 - %42 = extractelement <4 x i8> %41, i64 1 - %sisiext13 = sext i8 %42 to i32 - %43 = load <4 x i8>, ptr %ww, align 4 - %44 = extractelement <4 x i8> %43, i64 2 - %sisiext14 = sext i8 %44 to i32 - %45 = load <4 x i8>, ptr %ww, align 4 - %46 = extractelement <4 x i8> %45, i64 3 - %sisiext15 = sext i8 %46 to i32 - %47 = call i32 (ptr, ...) @printf(ptr @.str.13, i32 %sisiext12, i32 %sisiext13, i32 %sisiext14, i32 %sisiext15) - %48 = load <4 x i8>, ptr %y, align 4 - %49 = load <4 x i8>, ptr %z, align 4 - %eq = icmp eq <4 x i8> %48, %49 - %50 = sext <4 x i1> %eq to <4 x i8> - store <4 x i8> %50, ptr %ww, align 4 - %51 = load <4 x i8>, ptr %ww, align 4 - %52 = extractelement <4 x i8> %51, i64 0 - %sisiext16 = sext i8 %52 to i32 - %53 = load <4 x i8>, ptr %ww, align 4 - %54 = extractelement <4 x i8> %53, i64 1 - %sisiext17 = sext i8 %54 to i32 - %55 = load <4 x i8>, ptr %ww, align 4 - %56 = extractelement <4 x i8> %55, i64 2 - %sisiext18 = sext i8 %56 to i32 - %57 = load <4 x i8>, ptr %ww, align 4 - %58 = extractelement <4 x i8> %57, i64 3 - %sisiext19 = sext i8 %58 to i32 - %59 = call i32 (ptr, ...) @printf(ptr @.str.14, i32 %sisiext16, i32 %sisiext17, i32 %sisiext18, i32 %sisiext19) - %60 = load <4 x i8>, ptr %y, align 4 - %61 = load <4 x i8>, ptr %z, align 4 - %neq = icmp ne <4 x i8> %60, %61 - %62 = sext <4 x i1> %neq to <4 x i8> - store <4 x i8> %62, ptr %ww, align 4 - %63 = load <4 x i8>, ptr %ww, align 4 - %64 = extractelement <4 x i8> %63, i64 0 - %sisiext20 = sext i8 %64 to i32 - %65 = load <4 x i8>, ptr %ww, align 4 - %66 = extractelement <4 x i8> %65, i64 1 - %sisiext21 = sext i8 %66 to i32 - %67 = load <4 x i8>, ptr %ww, align 4 - %68 = extractelement <4 x i8> %67, i64 2 - %sisiext22 = sext i8 %68 to i32 - %69 = load <4 x i8>, ptr %ww, align 4 - %70 = extractelement <4 x i8> %69, i64 3 - %sisiext23 = sext i8 %70 to i32 - %71 = call i32 (ptr, ...) @printf(ptr @.str.15, i32 %sisiext20, i32 %sisiext21, i32 %sisiext22, i32 %sisiext23) - 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> , ptr %y, align 16 - store <4 x i32> , ptr %z, align 16 - %0 = load <4 x i32>, ptr %y, align 16 - %1 = load <4 x i32>, ptr %z, align 16 - %add = add <4 x i32> %0, %1 - store <4 x i32> %add, ptr %w, align 16 - %2 = load <4 x i32>, ptr %w, align 16 - %3 = extractelement <4 x i32> %2, i64 0 - %4 = load <4 x i32>, ptr %w, align 16 - %5 = extractelement <4 x i32> %4, i64 1 - %6 = load <4 x i32>, ptr %w, align 16 - %7 = extractelement <4 x i32> %6, i64 2 - %8 = load <4 x i32>, ptr %w, align 16 - %9 = extractelement <4 x i32> %8, i64 3 - %10 = call i32 (ptr, ...) @printf(ptr @.str.16, i32 %3, i32 %5, i32 %7, i32 %9) - %11 = load <4 x i32>, ptr %y, align 16 - %12 = load <4 x i32>, ptr %z, align 16 - %mul = mul <4 x i32> %11, %12 - store <4 x i32> %mul, ptr %w, align 16 - %13 = load <4 x i32>, ptr %w, align 16 - %14 = extractelement <4 x i32> %13, i64 0 - %15 = load <4 x i32>, ptr %w, align 16 - %16 = extractelement <4 x i32> %15, i64 1 - %17 = load <4 x i32>, ptr %w, align 16 - %18 = extractelement <4 x i32> %17, i64 2 - %19 = load <4 x i32>, ptr %w, align 16 - %20 = extractelement <4 x i32> %19, i64 3 - %21 = call i32 (ptr, ...) @printf(ptr @.str.17, i32 %14, i32 %16, i32 %18, i32 %20) - %22 = load <4 x i32>, ptr %y, align 16 - %23 = load <4 x i32>, ptr %z, align 16 - %sdiv = sdiv <4 x i32> %22, %23 - store <4 x i32> %sdiv, ptr %w, align 16 - %24 = load <4 x i32>, ptr %w, align 16 - %25 = extractelement <4 x i32> %24, i64 0 - %26 = load <4 x i32>, ptr %w, align 16 - %27 = extractelement <4 x i32> %26, i64 1 - %28 = load <4 x i32>, ptr %w, align 16 - %29 = extractelement <4 x i32> %28, i64 2 - %30 = load <4 x i32>, ptr %w, align 16 - %31 = extractelement <4 x i32> %30, i64 3 - %32 = call i32 (ptr, ...) @printf(ptr @.str.18, i32 %25, i32 %27, i32 %29, i32 %31) - %33 = load <4 x i32>, ptr %y, align 16 - %34 = load <4 x i32>, ptr %z, align 16 - %sub = sub <4 x i32> %33, %34 - store <4 x i32> %sub, ptr %w, align 16 - %35 = load <4 x i32>, ptr %w, align 16 - %36 = extractelement <4 x i32> %35, i64 0 - %37 = load <4 x i32>, ptr %w, align 16 - %38 = extractelement <4 x i32> %37, i64 1 - %39 = load <4 x i32>, ptr %w, align 16 - %40 = extractelement <4 x i32> %39, i64 2 - %41 = load <4 x i32>, ptr %w, align 16 - %42 = extractelement <4 x i32> %41, i64 3 - %43 = call i32 (ptr, ...) @printf(ptr @.str.19, i32 %36, i32 %38, i32 %40, i32 %42) - %44 = load <4 x i32>, ptr %z, align 16 - %45 = load <4 x i32>, ptr %y, align 16 - %ashr = ashr <4 x i32> %44, %45 - %46 = freeze <4 x i32> %ashr - store <4 x i32> %46, ptr %w, align 16 - %47 = load <4 x i32>, ptr %w, align 16 - %48 = extractelement <4 x i32> %47, i64 0 - %49 = load <4 x i32>, ptr %w, align 16 - %50 = extractelement <4 x i32> %49, i64 1 - %51 = load <4 x i32>, ptr %w, align 16 - %52 = extractelement <4 x i32> %51, i64 2 - %53 = load <4 x i32>, ptr %w, align 16 - %54 = extractelement <4 x i32> %53, i64 3 - %55 = call i32 (ptr, ...) @printf(ptr @.str.20, i32 %48, i32 %50, i32 %52, i32 %54) - %56 = load <4 x i32>, ptr %z, align 16 - %57 = load <4 x i32>, ptr %y, align 16 - %shl = shl <4 x i32> %56, %57 - %58 = freeze <4 x i32> %shl - store <4 x i32> %58, ptr %w, align 16 - %59 = load <4 x i32>, ptr %w, align 16 - %60 = extractelement <4 x i32> %59, i64 0 - %61 = load <4 x i32>, ptr %w, align 16 - %62 = extractelement <4 x i32> %61, i64 1 - %63 = load <4 x i32>, ptr %w, align 16 - %64 = extractelement <4 x i32> %63, i64 2 - %65 = load <4 x i32>, ptr %w, align 16 - %66 = extractelement <4 x i32> %65, i64 3 - %67 = call i32 (ptr, ...) @printf(ptr @.str.21, i32 %60, i32 %62, i32 %64, i32 %66) - %68 = load <4 x i32>, ptr %z, align 16 - %69 = load <4 x i32>, ptr %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, ptr %w, align 16 - %71 = load <4 x i32>, ptr %w, align 16 - %72 = extractelement <4 x i32> %71, i64 0 - %73 = load <4 x i32>, ptr %w, align 16 - %74 = extractelement <4 x i32> %73, i64 1 - %75 = load <4 x i32>, ptr %w, align 16 - %76 = extractelement <4 x i32> %75, i64 2 - %77 = load <4 x i32>, ptr %w, align 16 - %78 = extractelement <4 x i32> %77, i64 3 - %79 = call i32 (ptr, ...) @printf(ptr @.str.22, i32 %72, i32 %74, i32 %76, i32 %78) - %80 = load <4 x i32>, ptr %z, align 16 - %81 = load <4 x i32>, ptr %y, align 16 - %ge = icmp sge <4 x i32> %80, %81 - %82 = sext <4 x i1> %ge to <4 x i32> - store <4 x i32> %82, ptr %w, align 16 - %83 = load <4 x i32>, ptr %w, align 16 - %84 = extractelement <4 x i32> %83, i64 0 - %85 = load <4 x i32>, ptr %w, align 16 - %86 = extractelement <4 x i32> %85, i64 1 - %87 = load <4 x i32>, ptr %w, align 16 - %88 = extractelement <4 x i32> %87, i64 2 - %89 = load <4 x i32>, ptr %w, align 16 - %90 = extractelement <4 x i32> %89, i64 3 - %91 = call i32 (ptr, ...) @printf(ptr @.str.23, i32 %84, i32 %86, i32 %88, i32 %90) - %92 = load <4 x i32>, ptr %z, align 16 - %93 = load <4 x i32>, ptr %y, align 16 - %lt = icmp slt <4 x i32> %92, %93 - %94 = sext <4 x i1> %lt to <4 x i32> - store <4 x i32> %94, ptr %w, align 16 - %95 = load <4 x i32>, ptr %w, align 16 - %96 = extractelement <4 x i32> %95, i64 0 - %97 = load <4 x i32>, ptr %w, align 16 - %98 = extractelement <4 x i32> %97, i64 1 - %99 = load <4 x i32>, ptr %w, align 16 - %100 = extractelement <4 x i32> %99, i64 2 - %101 = load <4 x i32>, ptr %w, align 16 - %102 = extractelement <4 x i32> %101, i64 3 - %103 = call i32 (ptr, ...) @printf(ptr @.str.24, i32 %96, i32 %98, i32 %100, i32 %102) - %104 = load <4 x i32>, ptr %z, align 16 - %105 = load <4 x i32>, ptr %y, align 16 - %le = icmp sle <4 x i32> %104, %105 - %106 = sext <4 x i1> %le to <4 x i32> - store <4 x i32> %106, ptr %w, align 16 - %107 = load <4 x i32>, ptr %w, align 16 - %108 = extractelement <4 x i32> %107, i64 0 - %109 = load <4 x i32>, ptr %w, align 16 - %110 = extractelement <4 x i32> %109, i64 1 - %111 = load <4 x i32>, ptr %w, align 16 - %112 = extractelement <4 x i32> %111, i64 2 - %113 = load <4 x i32>, ptr %w, align 16 - %114 = extractelement <4 x i32> %113, i64 3 - %115 = call i32 (ptr, ...) @printf(ptr @.str.25, i32 %108, i32 %110, i32 %112, i32 %114) - %116 = load <4 x i32>, ptr %z, align 16 - %117 = load <4 x i32>, ptr %y, align 16 - %eq = icmp eq <4 x i32> %116, %117 - %118 = sext <4 x i1> %eq to <4 x i32> - store <4 x i32> %118, ptr %w, align 16 - %119 = load <4 x i32>, ptr %w, align 16 - %120 = extractelement <4 x i32> %119, i64 0 - %121 = load <4 x i32>, ptr %w, align 16 - %122 = extractelement <4 x i32> %121, i64 1 - %123 = load <4 x i32>, ptr %w, align 16 - %124 = extractelement <4 x i32> %123, i64 2 - %125 = load <4 x i32>, ptr %w, align 16 - %126 = extractelement <4 x i32> %125, i64 3 - %127 = call i32 (ptr, ...) @printf(ptr @.str.26, i32 %120, i32 %122, i32 %124, i32 %126) - %128 = load <4 x i32>, ptr %z, align 16 - %129 = load <4 x i32>, ptr %y, align 16 - %neq = icmp ne <4 x i32> %128, %129 - %130 = sext <4 x i1> %neq to <4 x i32> - store <4 x i32> %130, ptr %w, align 16 - %131 = load <4 x i32>, ptr %w, align 16 - %132 = extractelement <4 x i32> %131, i64 0 - %133 = load <4 x i32>, ptr %w, align 16 - %134 = extractelement <4 x i32> %133, i64 1 - %135 = load <4 x i32>, ptr %w, align 16 - %136 = extractelement <4 x i32> %135, i64 2 - %137 = load <4 x i32>, ptr %w, align 16 - %138 = extractelement <4 x i32> %137, i64 3 - %139 = call i32 (ptr, ...) @printf(ptr @.str.27, i32 %132, i32 %134, i32 %136, i32 %138) - store <4 x i32> , ptr %uz, align 16 - %140 = load <4 x i32>, ptr %uz, align 16 - %141 = load <4 x i32>, ptr %y, align 16 - %lt1 = icmp slt <4 x i32> %141, %140 - %check = icmp slt <4 x i32> %140, zeroinitializer - %siui-lt = or <4 x i1> %check, %lt1 - %142 = sext <4 x i1> %siui-lt to <4 x i32> - store <4 x i32> %142, ptr %w, align 16 - %143 = load <4 x i32>, ptr %w, align 16 - %144 = extractelement <4 x i32> %143, i64 0 - %145 = load <4 x i32>, ptr %w, align 16 - %146 = extractelement <4 x i32> %145, i64 1 - %147 = load <4 x i32>, ptr %w, align 16 - %148 = extractelement <4 x i32> %147, i64 2 - %149 = load <4 x i32>, ptr %w, align 16 - %150 = extractelement <4 x i32> %149, i64 3 - %151 = call i32 (ptr, ...) @printf(ptr @.str.28, i32 %144, i32 %146, i32 %148, i32 %150) - %152 = load <4 x i32>, ptr %uz, align 16 - %153 = load <4 x i32>, ptr %y, align 16 - %le2 = icmp sle <4 x i32> %153, %152 - %check3 = icmp slt <4 x i32> %152, zeroinitializer - %siui-le = or <4 x i1> %check3, %le2 - %154 = sext <4 x i1> %siui-le to <4 x i32> - store <4 x i32> %154, ptr %w, align 16 - %155 = load <4 x i32>, ptr %w, align 16 - %156 = extractelement <4 x i32> %155, i64 0 - %157 = load <4 x i32>, ptr %w, align 16 - %158 = extractelement <4 x i32> %157, i64 1 - %159 = load <4 x i32>, ptr %w, align 16 - %160 = extractelement <4 x i32> %159, i64 2 - %161 = load <4 x i32>, ptr %w, align 16 - %162 = extractelement <4 x i32> %161, i64 3 - %163 = call i32 (ptr, ...) @printf(ptr @.str.29, i32 %156, i32 %158, i32 %160, i32 %162) - %164 = load <4 x i32>, ptr %uz, align 16 - %165 = load <4 x i32>, ptr %y, align 16 - %gt4 = icmp sgt <4 x i32> %165, %164 - %check5 = icmp sge <4 x i32> %164, zeroinitializer - %siui-gt = and <4 x i1> %check5, %gt4 - %166 = sext <4 x i1> %siui-gt to <4 x i32> - store <4 x i32> %166, ptr %w, align 16 - %167 = load <4 x i32>, ptr %w, align 16 - %168 = extractelement <4 x i32> %167, i64 0 - %169 = load <4 x i32>, ptr %w, align 16 - %170 = extractelement <4 x i32> %169, i64 1 - %171 = load <4 x i32>, ptr %w, align 16 - %172 = extractelement <4 x i32> %171, i64 2 - %173 = load <4 x i32>, ptr %w, align 16 - %174 = extractelement <4 x i32> %173, i64 3 - %175 = call i32 (ptr, ...) @printf(ptr @.str.30, i32 %168, i32 %170, i32 %172, i32 %174) - %176 = load <4 x i32>, ptr %uz, align 16 - %177 = load <4 x i32>, ptr %y, align 16 - %ge6 = icmp sge <4 x i32> %177, %176 - %check7 = icmp sge <4 x i32> %176, zeroinitializer - %siui-ge = and <4 x i1> %check7, %ge6 - %178 = sext <4 x i1> %siui-ge to <4 x i32> - store <4 x i32> %178, ptr %w, align 16 - %179 = load <4 x i32>, ptr %w, align 16 - %180 = extractelement <4 x i32> %179, i64 0 - %181 = load <4 x i32>, ptr %w, align 16 - %182 = extractelement <4 x i32> %181, i64 1 - %183 = load <4 x i32>, ptr %w, align 16 - %184 = extractelement <4 x i32> %183, i64 2 - %185 = load <4 x i32>, ptr %w, align 16 - %186 = extractelement <4 x i32> %185, i64 3 - %187 = call i32 (ptr, ...) @printf(ptr @.str.31, i32 %180, i32 %182, i32 %184, i32 %186) - %188 = load <4 x i32>, ptr %uz, align 16 - %189 = load <4 x i32>, ptr %y, align 16 - %eq8 = icmp eq <4 x i32> %189, %188 - %check9 = icmp sge <4 x i32> %189, zeroinitializer - %siui-eq = and <4 x i1> %check9, %eq8 - %190 = sext <4 x i1> %siui-eq to <4 x i32> - store <4 x i32> %190, ptr %w, align 16 - %191 = load <4 x i32>, ptr %w, align 16 - %192 = extractelement <4 x i32> %191, i64 0 - %193 = load <4 x i32>, ptr %w, align 16 - %194 = extractelement <4 x i32> %193, i64 1 - %195 = load <4 x i32>, ptr %w, align 16 - %196 = extractelement <4 x i32> %195, i64 2 - %197 = load <4 x i32>, ptr %w, align 16 - %198 = extractelement <4 x i32> %197, i64 3 - %199 = call i32 (ptr, ...) @printf(ptr @.str.32, i32 %192, i32 %194, i32 %196, i32 %198) - %200 = load <4 x i32>, ptr %uz, align 16 - %201 = load <4 x i32>, ptr %y, align 16 - %neq10 = icmp ne <4 x i32> %201, %200 - %check11 = icmp slt <4 x i32> %201, zeroinitializer - %siui-ne = or <4 x i1> %check11, %neq10 - %202 = sext <4 x i1> %siui-ne to <4 x i32> - store <4 x i32> %202, ptr %w, align 16 - %203 = load <4 x i32>, ptr %w, align 16 - %204 = extractelement <4 x i32> %203, i64 0 - %205 = load <4 x i32>, ptr %w, align 16 - %206 = extractelement <4 x i32> %205, i64 1 - %207 = load <4 x i32>, ptr %w, align 16 - %208 = extractelement <4 x i32> %207, i64 2 - %209 = load <4 x i32>, ptr %w, align 16 - %210 = extractelement <4 x i32> %209, i64 3 - %211 = call i32 (ptr, ...) @printf(ptr @.str.33, i32 %204, i32 %206, i32 %208, i32 %210) - ret void -} \ No newline at end of file diff --git a/test/test_suite2/vector/vector_ops2.c3t b/test/test_suite2/vector/vector_ops2.c3t index 6d964ad3a..e0fef8f84 100644 --- a/test/test_suite2/vector/vector_ops2.c3t +++ b/test/test_suite2/vector/vector_ops2.c3t @@ -8,709 +8,47 @@ fn 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]); - ww = y <= z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y > z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y >= z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y == z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y != z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); } -fn void testb() -{ - bool[<4>] y = { true, false, true, true }; - bool[<4>] z = { false, false, true, true }; - ichar[<4>] ww = y < z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y <= z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y > z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y >= z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y == z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); - ww = y != z; - libc::printf("%d %d %d %d\n", ww[0], ww[1], ww[2], ww[3]); -} fn 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]); + int[<4>] w = y / z; 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]); - 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]); - 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]); - w = uz >= y; - libc::printf("%d %d %d %d\n", w[0], w[1], w[2], w[3]); - w = uz < y; - libc::printf("%d %d %d %d\n", w[0], w[1], w[2], w[3]); - w = uz <= y; - libc::printf("%d %d %d %d\n", w[0], w[1], w[2], w[3]); - w = uz == y; - libc::printf("%d %d %d %d\n", w[0], w[1], w[2], w[3]); - w = uz != y; - libc::printf("%d %d %d %d\n", w[0], w[1], w[2], w[3]); -} - -fn void main() -{ - testf(); - testi(); - testb(); } /* #expect: test.ll +; Function Attrs: nounwind define void @test_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> , ptr %y, align 16 store <4 x float> , ptr %z, align 16 %0 = load <4 x float>, ptr %y, align 16 %1 = load <4 x float>, ptr %z, align 16 %fadd = fadd <4 x float> %0, %1 store <4 x float> %fadd, ptr %w, align 16 - %2 = load <4 x float>, ptr %w, align 16 - %3 = extractelement <4 x float> %2, i64 0 - %fpfpext = fpext float %3 to double - %4 = load <4 x float>, ptr %w, align 16 - %5 = extractelement <4 x float> %4, i64 1 - %fpfpext1 = fpext float %5 to double - %6 = load <4 x float>, ptr %w, align 16 - %7 = extractelement <4 x float> %6, i64 2 - %fpfpext2 = fpext float %7 to double - %8 = load <4 x float>, ptr %w, align 16 - %9 = extractelement <4 x float> %8, i64 3 - %fpfpext3 = fpext float %9 to double - %10 = call i32 (ptr, ...) @printf(ptr @.str, double %fpfpext, double %fpfpext1, double %fpfpext2, double %fpfpext3) - %11 = load <4 x float>, ptr %y, align 16 - %12 = load <4 x float>, ptr %z, align 16 - %fmul = fmul <4 x float> %11, %12 - store <4 x float> %fmul, ptr %w, align 16 - %13 = load <4 x float>, ptr %w, align 16 - %14 = extractelement <4 x float> %13, i64 0 - %fpfpext4 = fpext float %14 to double - %15 = load <4 x float>, ptr %w, align 16 - %16 = extractelement <4 x float> %15, i64 1 - %fpfpext5 = fpext float %16 to double - %17 = load <4 x float>, ptr %w, align 16 - %18 = extractelement <4 x float> %17, i64 2 - %fpfpext6 = fpext float %18 to double - %19 = load <4 x float>, ptr %w, align 16 - %20 = extractelement <4 x float> %19, i64 3 - %fpfpext7 = fpext float %20 to double - %21 = call i32 (ptr, ...) @printf(ptr @.str.1, double %fpfpext4, double %fpfpext5, double %fpfpext6, double %fpfpext7) - %22 = load <4 x float>, ptr %y, align 16 - %23 = load <4 x float>, ptr %z, align 16 - %24 = call <4 x float> @llvm.fabs.v4f32(<4 x float> %23) - %25 = call float @llvm.vector.reduce.fmin.v4f32(<4 x float> %24) - %zero = fcmp ueq float %25, 0.000000e+00 + %2 = load <4 x float>, ptr %y, align 16 + %3 = load <4 x float>, ptr %z, align 16 + %4 = call <4 x float> @llvm.fabs.v4f32(<4 x float> %3) + %5 = call float @llvm.vector.reduce.fmin.v4f32(<4 x float> %4) + %zero = fcmp ueq float %5, 0.000000e+00 br i1 %zero, label %panic, label %checkok panic: ; preds = %entry - %26 = load ptr, ptr @std_core_builtin_panic, align 8 - call void %26(ptr @.panic_msg, i64 17, ptr @.file, i64 14, ptr @.func, i64 5, i32 12) + %6 = load ptr, ptr @std_core_builtin_panic, align 8 + call void %6(ptr @.panic_msg, i64 17, ptr @.file, i64 14, ptr @.func, i64 5, i32 9) br label %checkok checkok: ; preds = %panic, %entry - %fdiv = fdiv <4 x float> %22, %23 + %fdiv = fdiv <4 x float> %2, %3 store <4 x float> %fdiv, ptr %w, align 16 - %27 = load <4 x float>, ptr %w, align 16 - %28 = extractelement <4 x float> %27, i64 0 - %fpfpext8 = fpext float %28 to double - %29 = load <4 x float>, ptr %w, align 16 - %30 = extractelement <4 x float> %29, i64 1 - %fpfpext9 = fpext float %30 to double - %31 = load <4 x float>, ptr %w, align 16 - %32 = extractelement <4 x float> %31, i64 2 - %fpfpext10 = fpext float %32 to double - %33 = load <4 x float>, ptr %w, align 16 - %34 = extractelement <4 x float> %33, i64 3 - %fpfpext11 = fpext float %34 to double - %35 = call i32 (ptr, ...) @printf(ptr @.str.2, double %fpfpext8, double %fpfpext9, double %fpfpext10, double %fpfpext11) - %36 = load <4 x float>, ptr %y, align 16 - %37 = load <4 x float>, ptr %z, align 16 - %fsub = fsub <4 x float> %36, %37 - store <4 x float> %fsub, ptr %w, align 16 - %38 = load <4 x float>, ptr %w, align 16 - %39 = extractelement <4 x float> %38, i64 0 - %fpfpext12 = fpext float %39 to double - %40 = load <4 x float>, ptr %w, align 16 - %41 = extractelement <4 x float> %40, i64 1 - %fpfpext13 = fpext float %41 to double - %42 = load <4 x float>, ptr %w, align 16 - %43 = extractelement <4 x float> %42, i64 2 - %fpfpext14 = fpext float %43 to double - %44 = load <4 x float>, ptr %w, align 16 - %45 = extractelement <4 x float> %44, i64 3 - %fpfpext15 = fpext float %45 to double - %46 = call i32 (ptr, ...) @printf(ptr @.str.3, double %fpfpext12, double %fpfpext13, double %fpfpext14, double %fpfpext15) - %47 = load <4 x float>, ptr %y, align 16 - %48 = load <4 x float>, ptr %z, align 16 - %lt = fcmp olt <4 x float> %47, %48 - %49 = sext <4 x i1> %lt to <4 x i32> - store <4 x i32> %49, ptr %ww, align 16 - %50 = load <4 x i32>, ptr %ww, align 16 - %51 = extractelement <4 x i32> %50, i64 0 - %52 = load <4 x i32>, ptr %ww, align 16 - %53 = extractelement <4 x i32> %52, i64 1 - %54 = load <4 x i32>, ptr %ww, align 16 - %55 = extractelement <4 x i32> %54, i64 2 - %56 = load <4 x i32>, ptr %ww, align 16 - %57 = extractelement <4 x i32> %56, i64 3 - %58 = call i32 (ptr, ...) @printf(ptr @.str.4, i32 %51, i32 %53, i32 %55, i32 %57) - %59 = load <4 x float>, ptr %y, align 16 - %60 = load <4 x float>, ptr %z, align 16 - %le = fcmp ole <4 x float> %59, %60 - %61 = sext <4 x i1> %le to <4 x i32> - store <4 x i32> %61, ptr %ww, align 16 - %62 = load <4 x i32>, ptr %ww, align 16 - %63 = extractelement <4 x i32> %62, i64 0 - %64 = load <4 x i32>, ptr %ww, align 16 - %65 = extractelement <4 x i32> %64, i64 1 - %66 = load <4 x i32>, ptr %ww, align 16 - %67 = extractelement <4 x i32> %66, i64 2 - %68 = load <4 x i32>, ptr %ww, align 16 - %69 = extractelement <4 x i32> %68, i64 3 - %70 = call i32 (ptr, ...) @printf(ptr @.str.5, i32 %63, i32 %65, i32 %67, i32 %69) - %71 = load <4 x float>, ptr %y, align 16 - %72 = load <4 x float>, ptr %z, align 16 - %gt = fcmp ogt <4 x float> %71, %72 - %73 = sext <4 x i1> %gt to <4 x i32> - store <4 x i32> %73, ptr %ww, align 16 - %74 = load <4 x i32>, ptr %ww, align 16 - %75 = extractelement <4 x i32> %74, i64 0 - %76 = load <4 x i32>, ptr %ww, align 16 - %77 = extractelement <4 x i32> %76, i64 1 - %78 = load <4 x i32>, ptr %ww, align 16 - %79 = extractelement <4 x i32> %78, i64 2 - %80 = load <4 x i32>, ptr %ww, align 16 - %81 = extractelement <4 x i32> %80, i64 3 - %82 = call i32 (ptr, ...) @printf(ptr @.str.6, i32 %75, i32 %77, i32 %79, i32 %81) - %83 = load <4 x float>, ptr %y, align 16 - %84 = load <4 x float>, ptr %z, align 16 - %ge = fcmp oge <4 x float> %83, %84 - %85 = sext <4 x i1> %ge to <4 x i32> - store <4 x i32> %85, ptr %ww, align 16 - %86 = load <4 x i32>, ptr %ww, align 16 - %87 = extractelement <4 x i32> %86, i64 0 - %88 = load <4 x i32>, ptr %ww, align 16 - %89 = extractelement <4 x i32> %88, i64 1 - %90 = load <4 x i32>, ptr %ww, align 16 - %91 = extractelement <4 x i32> %90, i64 2 - %92 = load <4 x i32>, ptr %ww, align 16 - %93 = extractelement <4 x i32> %92, i64 3 - %94 = call i32 (ptr, ...) @printf(ptr @.str.7, i32 %87, i32 %89, i32 %91, i32 %93) - %95 = load <4 x float>, ptr %y, align 16 - %96 = load <4 x float>, ptr %z, align 16 - %eq = fcmp oeq <4 x float> %95, %96 - %97 = sext <4 x i1> %eq to <4 x i32> - store <4 x i32> %97, ptr %ww, align 16 - %98 = load <4 x i32>, ptr %ww, align 16 - %99 = extractelement <4 x i32> %98, i64 0 - %100 = load <4 x i32>, ptr %ww, align 16 - %101 = extractelement <4 x i32> %100, i64 1 - %102 = load <4 x i32>, ptr %ww, align 16 - %103 = extractelement <4 x i32> %102, i64 2 - %104 = load <4 x i32>, ptr %ww, align 16 - %105 = extractelement <4 x i32> %104, i64 3 - %106 = call i32 (ptr, ...) @printf(ptr @.str.8, i32 %99, i32 %101, i32 %103, i32 %105) - %107 = load <4 x float>, ptr %y, align 16 - %108 = load <4 x float>, ptr %z, align 16 - %neq = fcmp one <4 x float> %107, %108 - %109 = sext <4 x i1> %neq to <4 x i32> - store <4 x i32> %109, ptr %ww, align 16 - %110 = load <4 x i32>, ptr %ww, align 16 - %111 = extractelement <4 x i32> %110, i64 0 - %112 = load <4 x i32>, ptr %ww, align 16 - %113 = extractelement <4 x i32> %112, i64 1 - %114 = load <4 x i32>, ptr %ww, align 16 - %115 = extractelement <4 x i32> %114, i64 2 - %116 = load <4 x i32>, ptr %ww, align 16 - %117 = extractelement <4 x i32> %116, i64 3 - %118 = call i32 (ptr, ...) @printf(ptr @.str.9, i32 %111, i32 %113, i32 %115, i32 %117) - ret void -} - -; Function Attrs: nounwind -define void @test_testb() #0 { -entry: - %y = alloca <4 x i8>, align 4 - %z = alloca <4 x i8>, align 4 - %ww = alloca <4 x i8>, align 4 - store <4 x i8> , ptr %y, align 4 - store <4 x i8> , ptr %z, align 4 - %0 = load <4 x i8>, ptr %y, align 4 - %1 = load <4 x i8>, ptr %z, align 4 - %lt = icmp ult <4 x i8> %0, %1 - %2 = sext <4 x i1> %lt to <4 x i8> - store <4 x i8> %2, ptr %ww, align 4 - %3 = load <4 x i8>, ptr %ww, align 4 - %4 = extractelement <4 x i8> %3, i64 0 - %sisiext = sext i8 %4 to i32 - %5 = load <4 x i8>, ptr %ww, align 4 - %6 = extractelement <4 x i8> %5, i64 1 - %sisiext1 = sext i8 %6 to i32 - %7 = load <4 x i8>, ptr %ww, align 4 - %8 = extractelement <4 x i8> %7, i64 2 - %sisiext2 = sext i8 %8 to i32 - %9 = load <4 x i8>, ptr %ww, align 4 - %10 = extractelement <4 x i8> %9, i64 3 - %sisiext3 = sext i8 %10 to i32 - %11 = call i32 (ptr, ...) @printf(ptr @.str.10, i32 %sisiext, i32 %sisiext1, i32 %sisiext2, i32 %sisiext3) - %12 = load <4 x i8>, ptr %y, align 4 - %13 = load <4 x i8>, ptr %z, align 4 - %le = icmp ule <4 x i8> %12, %13 - %14 = sext <4 x i1> %le to <4 x i8> - store <4 x i8> %14, ptr %ww, align 4 - %15 = load <4 x i8>, ptr %ww, align 4 - %16 = extractelement <4 x i8> %15, i64 0 - %sisiext4 = sext i8 %16 to i32 - %17 = load <4 x i8>, ptr %ww, align 4 - %18 = extractelement <4 x i8> %17, i64 1 - %sisiext5 = sext i8 %18 to i32 - %19 = load <4 x i8>, ptr %ww, align 4 - %20 = extractelement <4 x i8> %19, i64 2 - %sisiext6 = sext i8 %20 to i32 - %21 = load <4 x i8>, ptr %ww, align 4 - %22 = extractelement <4 x i8> %21, i64 3 - %sisiext7 = sext i8 %22 to i32 - %23 = call i32 (ptr, ...) @printf(ptr @.str.11, i32 %sisiext4, i32 %sisiext5, i32 %sisiext6, i32 %sisiext7) - %24 = load <4 x i8>, ptr %y, align 4 - %25 = load <4 x i8>, ptr %z, align 4 - %gt = icmp ugt <4 x i8> %24, %25 - %26 = sext <4 x i1> %gt to <4 x i8> - store <4 x i8> %26, ptr %ww, align 4 - %27 = load <4 x i8>, ptr %ww, align 4 - %28 = extractelement <4 x i8> %27, i64 0 - %sisiext8 = sext i8 %28 to i32 - %29 = load <4 x i8>, ptr %ww, align 4 - %30 = extractelement <4 x i8> %29, i64 1 - %sisiext9 = sext i8 %30 to i32 - %31 = load <4 x i8>, ptr %ww, align 4 - %32 = extractelement <4 x i8> %31, i64 2 - %sisiext10 = sext i8 %32 to i32 - %33 = load <4 x i8>, ptr %ww, align 4 - %34 = extractelement <4 x i8> %33, i64 3 - %sisiext11 = sext i8 %34 to i32 - %35 = call i32 (ptr, ...) @printf(ptr @.str.12, i32 %sisiext8, i32 %sisiext9, i32 %sisiext10, i32 %sisiext11) - %36 = load <4 x i8>, ptr %y, align 4 - %37 = load <4 x i8>, ptr %z, align 4 - %ge = icmp uge <4 x i8> %36, %37 - %38 = sext <4 x i1> %ge to <4 x i8> - store <4 x i8> %38, ptr %ww, align 4 - %39 = load <4 x i8>, ptr %ww, align 4 - %40 = extractelement <4 x i8> %39, i64 0 - %sisiext12 = sext i8 %40 to i32 - %41 = load <4 x i8>, ptr %ww, align 4 - %42 = extractelement <4 x i8> %41, i64 1 - %sisiext13 = sext i8 %42 to i32 - %43 = load <4 x i8>, ptr %ww, align 4 - %44 = extractelement <4 x i8> %43, i64 2 - %sisiext14 = sext i8 %44 to i32 - %45 = load <4 x i8>, ptr %ww, align 4 - %46 = extractelement <4 x i8> %45, i64 3 - %sisiext15 = sext i8 %46 to i32 - %47 = call i32 (ptr, ...) @printf(ptr @.str.13, i32 %sisiext12, i32 %sisiext13, i32 %sisiext14, i32 %sisiext15) - %48 = load <4 x i8>, ptr %y, align 4 - %49 = load <4 x i8>, ptr %z, align 4 - %eq = icmp eq <4 x i8> %48, %49 - %50 = sext <4 x i1> %eq to <4 x i8> - store <4 x i8> %50, ptr %ww, align 4 - %51 = load <4 x i8>, ptr %ww, align 4 - %52 = extractelement <4 x i8> %51, i64 0 - %sisiext16 = sext i8 %52 to i32 - %53 = load <4 x i8>, ptr %ww, align 4 - %54 = extractelement <4 x i8> %53, i64 1 - %sisiext17 = sext i8 %54 to i32 - %55 = load <4 x i8>, ptr %ww, align 4 - %56 = extractelement <4 x i8> %55, i64 2 - %sisiext18 = sext i8 %56 to i32 - %57 = load <4 x i8>, ptr %ww, align 4 - %58 = extractelement <4 x i8> %57, i64 3 - %sisiext19 = sext i8 %58 to i32 - %59 = call i32 (ptr, ...) @printf(ptr @.str.14, i32 %sisiext16, i32 %sisiext17, i32 %sisiext18, i32 %sisiext19) - %60 = load <4 x i8>, ptr %y, align 4 - %61 = load <4 x i8>, ptr %z, align 4 - %neq = icmp ne <4 x i8> %60, %61 - %62 = sext <4 x i1> %neq to <4 x i8> - store <4 x i8> %62, ptr %ww, align 4 - %63 = load <4 x i8>, ptr %ww, align 4 - %64 = extractelement <4 x i8> %63, i64 0 - %sisiext20 = sext i8 %64 to i32 - %65 = load <4 x i8>, ptr %ww, align 4 - %66 = extractelement <4 x i8> %65, i64 1 - %sisiext21 = sext i8 %66 to i32 - %67 = load <4 x i8>, ptr %ww, align 4 - %68 = extractelement <4 x i8> %67, i64 2 - %sisiext22 = sext i8 %68 to i32 - %69 = load <4 x i8>, ptr %ww, align 4 - %70 = extractelement <4 x i8> %69, i64 3 - %sisiext23 = sext i8 %70 to i32 - %71 = call i32 (ptr, ...) @printf(ptr @.str.15, i32 %sisiext20, i32 %sisiext21, i32 %sisiext22, i32 %sisiext23) - ret void -} - -; Function Attrs: nounwind -define void @test_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> , ptr %y, align 16 - store <4 x i32> , ptr %z, align 16 - %0 = load <4 x i32>, ptr %y, align 16 - %1 = load <4 x i32>, ptr %z, align 16 - %add = add <4 x i32> %0, %1 - store <4 x i32> %add, ptr %w, align 16 - %2 = load <4 x i32>, ptr %w, align 16 - %3 = extractelement <4 x i32> %2, i64 0 - %4 = load <4 x i32>, ptr %w, align 16 - %5 = extractelement <4 x i32> %4, i64 1 - %6 = load <4 x i32>, ptr %w, align 16 - %7 = extractelement <4 x i32> %6, i64 2 - %8 = load <4 x i32>, ptr %w, align 16 - %9 = extractelement <4 x i32> %8, i64 3 - %10 = call i32 (ptr, ...) @printf(ptr @.str.16, i32 %3, i32 %5, i32 %7, i32 %9) - %11 = load <4 x i32>, ptr %y, align 16 - %12 = load <4 x i32>, ptr %z, align 16 - %mul = mul <4 x i32> %11, %12 - store <4 x i32> %mul, ptr %w, align 16 - %13 = load <4 x i32>, ptr %w, align 16 - %14 = extractelement <4 x i32> %13, i64 0 - %15 = load <4 x i32>, ptr %w, align 16 - %16 = extractelement <4 x i32> %15, i64 1 - %17 = load <4 x i32>, ptr %w, align 16 - %18 = extractelement <4 x i32> %17, i64 2 - %19 = load <4 x i32>, ptr %w, align 16 - %20 = extractelement <4 x i32> %19, i64 3 - %21 = call i32 (ptr, ...) @printf(ptr @.str.17, i32 %14, i32 %16, i32 %18, i32 %20) - %22 = load <4 x i32>, ptr %y, align 16 - %23 = load <4 x i32>, ptr %z, align 16 - %24 = call i32 @llvm.vector.reduce.umin.v4i32(<4 x i32> %23) - %zero = icmp eq i32 %24, 0 - br i1 %zero, label %panic, label %checkok - -panic: ; preds = %entry - %25 = load ptr, ptr @std_core_builtin_panic, align 8 - call void %25(ptr @.panic_msg.18, i64 17, ptr @.file.19, i64 14, ptr @.func.20, i64 5, i32 56) - br label %checkok - -checkok: ; preds = %panic, %entry - %sdiv = sdiv <4 x i32> %22, %23 - store <4 x i32> %sdiv, ptr %w, align 16 - %26 = load <4 x i32>, ptr %w, align 16 - %27 = extractelement <4 x i32> %26, i64 0 - %28 = load <4 x i32>, ptr %w, align 16 - %29 = extractelement <4 x i32> %28, i64 1 - %30 = load <4 x i32>, ptr %w, align 16 - %31 = extractelement <4 x i32> %30, i64 2 - %32 = load <4 x i32>, ptr %w, align 16 - %33 = extractelement <4 x i32> %32, i64 3 - %34 = call i32 (ptr, ...) @printf(ptr @.str.21, i32 %27, i32 %29, i32 %31, i32 %33) - %35 = load <4 x i32>, ptr %y, align 16 - %36 = load <4 x i32>, ptr %z, align 16 - %sub = sub <4 x i32> %35, %36 - store <4 x i32> %sub, ptr %w, align 16 - %37 = load <4 x i32>, ptr %w, align 16 - %38 = extractelement <4 x i32> %37, i64 0 - %39 = load <4 x i32>, ptr %w, align 16 - %40 = extractelement <4 x i32> %39, i64 1 - %41 = load <4 x i32>, ptr %w, align 16 - %42 = extractelement <4 x i32> %41, i64 2 - %43 = load <4 x i32>, ptr %w, align 16 - %44 = extractelement <4 x i32> %43, i64 3 - %45 = call i32 (ptr, ...) @printf(ptr @.str.22, i32 %38, i32 %40, i32 %42, i32 %44) - %46 = load <4 x i32>, ptr %z, align 16 - %47 = load <4 x i32>, ptr %y, align 16 - %48 = call i32 @llvm.vector.reduce.smin.v4i32(<4 x i32> %47) - %shift_underflow = icmp slt i32 %48, 0 - br i1 %shift_underflow, label %panic1, label %checkok2 - -panic1: ; preds = %checkok - %49 = load ptr, ptr @std_core_builtin_panic, align 8 - call void %49(ptr @.panic_msg.23, i64 26, ptr @.file.24, i64 14, ptr @.func.25, i64 5, i32 60) - br label %checkok2 - -checkok2: ; preds = %panic1, %checkok - %50 = call i32 @llvm.vector.reduce.smax.v4i32(<4 x i32> %47) - %shift_exceeds = icmp sge i32 %50, 32 - br i1 %shift_exceeds, label %panic3, label %checkok4 - -panic3: ; preds = %checkok2 - %51 = load ptr, ptr @std_core_builtin_panic, align 8 - call void %51(ptr @.panic_msg.26, i64 26, ptr @.file.27, i64 14, ptr @.func.28, i64 5, i32 60) - br label %checkok4 - -checkok4: ; preds = %panic3, %checkok2 - %ashr = ashr <4 x i32> %46, %47 - %52 = freeze <4 x i32> %ashr - store <4 x i32> %52, ptr %w, align 16 - %53 = load <4 x i32>, ptr %w, align 16 - %54 = extractelement <4 x i32> %53, i64 0 - %55 = load <4 x i32>, ptr %w, align 16 - %56 = extractelement <4 x i32> %55, i64 1 - %57 = load <4 x i32>, ptr %w, align 16 - %58 = extractelement <4 x i32> %57, i64 2 - %59 = load <4 x i32>, ptr %w, align 16 - %60 = extractelement <4 x i32> %59, i64 3 - %61 = call i32 (ptr, ...) @printf(ptr @.str.29, i32 %54, i32 %56, i32 %58, i32 %60) - %62 = load <4 x i32>, ptr %z, align 16 - %63 = load <4 x i32>, ptr %y, align 16 - %64 = call i32 @llvm.vector.reduce.smin.v4i32(<4 x i32> %63) - %shift_underflow5 = icmp slt i32 %64, 0 - br i1 %shift_underflow5, label %panic6, label %checkok7 - -panic6: ; preds = %checkok4 - %65 = load ptr, ptr @std_core_builtin_panic, align 8 - call void %65(ptr @.panic_msg.30, i64 26, ptr @.file.31, i64 14, ptr @.func.32, i64 5, i32 62) - br label %checkok7 - -checkok7: ; preds = %panic6, %checkok4 - %66 = call i32 @llvm.vector.reduce.smax.v4i32(<4 x i32> %63) - %shift_exceeds8 = icmp sge i32 %66, 32 - br i1 %shift_exceeds8, label %panic9, label %checkok10 - -panic9: ; preds = %checkok7 - %67 = load ptr, ptr @std_core_builtin_panic, align 8 - call void %67(ptr @.panic_msg.33, i64 26, ptr @.file.34, i64 14, ptr @.func.35, i64 5, i32 62) - br label %checkok10 - -checkok10: ; preds = %panic9, %checkok7 - %shl = shl <4 x i32> %62, %63 - %68 = freeze <4 x i32> %shl - store <4 x i32> %68, ptr %w, align 16 - %69 = load <4 x i32>, ptr %w, align 16 - %70 = extractelement <4 x i32> %69, i64 0 - %71 = load <4 x i32>, ptr %w, align 16 - %72 = extractelement <4 x i32> %71, i64 1 - %73 = load <4 x i32>, ptr %w, align 16 - %74 = extractelement <4 x i32> %73, i64 2 - %75 = load <4 x i32>, ptr %w, align 16 - %76 = extractelement <4 x i32> %75, i64 3 - %77 = call i32 (ptr, ...) @printf(ptr @.str.36, i32 %70, i32 %72, i32 %74, i32 %76) - %78 = load <4 x i32>, ptr %z, align 16 - %79 = load <4 x i32>, ptr %y, align 16 - %gt = icmp sgt <4 x i32> %78, %79 - %80 = sext <4 x i1> %gt to <4 x i32> - store <4 x i32> %80, ptr %w, align 16 - %81 = load <4 x i32>, ptr %w, align 16 - %82 = extractelement <4 x i32> %81, i64 0 - %83 = load <4 x i32>, ptr %w, align 16 - %84 = extractelement <4 x i32> %83, i64 1 - %85 = load <4 x i32>, ptr %w, align 16 - %86 = extractelement <4 x i32> %85, i64 2 - %87 = load <4 x i32>, ptr %w, align 16 - %88 = extractelement <4 x i32> %87, i64 3 - %89 = call i32 (ptr, ...) @printf(ptr @.str.37, i32 %82, i32 %84, i32 %86, i32 %88) - %90 = load <4 x i32>, ptr %z, align 16 - %91 = load <4 x i32>, ptr %y, align 16 - %ge = icmp sge <4 x i32> %90, %91 - %92 = sext <4 x i1> %ge to <4 x i32> - store <4 x i32> %92, ptr %w, align 16 - %93 = load <4 x i32>, ptr %w, align 16 - %94 = extractelement <4 x i32> %93, i64 0 - %95 = load <4 x i32>, ptr %w, align 16 - %96 = extractelement <4 x i32> %95, i64 1 - %97 = load <4 x i32>, ptr %w, align 16 - %98 = extractelement <4 x i32> %97, i64 2 - %99 = load <4 x i32>, ptr %w, align 16 - %100 = extractelement <4 x i32> %99, i64 3 - %101 = call i32 (ptr, ...) @printf(ptr @.str.38, i32 %94, i32 %96, i32 %98, i32 %100) - %102 = load <4 x i32>, ptr %z, align 16 - %103 = load <4 x i32>, ptr %y, align 16 - %lt = icmp slt <4 x i32> %102, %103 - %104 = sext <4 x i1> %lt to <4 x i32> - store <4 x i32> %104, ptr %w, align 16 - %105 = load <4 x i32>, ptr %w, align 16 - %106 = extractelement <4 x i32> %105, i64 0 - %107 = load <4 x i32>, ptr %w, align 16 - %108 = extractelement <4 x i32> %107, i64 1 - %109 = load <4 x i32>, ptr %w, align 16 - %110 = extractelement <4 x i32> %109, i64 2 - %111 = load <4 x i32>, ptr %w, align 16 - %112 = extractelement <4 x i32> %111, i64 3 - %113 = call i32 (ptr, ...) @printf(ptr @.str.39, i32 %106, i32 %108, i32 %110, i32 %112) - %114 = load <4 x i32>, ptr %z, align 16 - %115 = load <4 x i32>, ptr %y, align 16 - %le = icmp sle <4 x i32> %114, %115 - %116 = sext <4 x i1> %le to <4 x i32> - store <4 x i32> %116, ptr %w, align 16 - %117 = load <4 x i32>, ptr %w, align 16 - %118 = extractelement <4 x i32> %117, i64 0 - %119 = load <4 x i32>, ptr %w, align 16 - %120 = extractelement <4 x i32> %119, i64 1 - %121 = load <4 x i32>, ptr %w, align 16 - %122 = extractelement <4 x i32> %121, i64 2 - %123 = load <4 x i32>, ptr %w, align 16 - %124 = extractelement <4 x i32> %123, i64 3 - %125 = call i32 (ptr, ...) @printf(ptr @.str.40, i32 %118, i32 %120, i32 %122, i32 %124) - %126 = load <4 x i32>, ptr %z, align 16 - %127 = load <4 x i32>, ptr %y, align 16 - %eq = icmp eq <4 x i32> %126, %127 - %128 = sext <4 x i1> %eq to <4 x i32> - store <4 x i32> %128, ptr %w, align 16 - %129 = load <4 x i32>, ptr %w, align 16 - %130 = extractelement <4 x i32> %129, i64 0 - %131 = load <4 x i32>, ptr %w, align 16 - %132 = extractelement <4 x i32> %131, i64 1 - %133 = load <4 x i32>, ptr %w, align 16 - %134 = extractelement <4 x i32> %133, i64 2 - %135 = load <4 x i32>, ptr %w, align 16 - %136 = extractelement <4 x i32> %135, i64 3 - %137 = call i32 (ptr, ...) @printf(ptr @.str.41, i32 %130, i32 %132, i32 %134, i32 %136) - %138 = load <4 x i32>, ptr %z, align 16 - %139 = load <4 x i32>, ptr %y, align 16 - %neq = icmp ne <4 x i32> %138, %139 - %140 = sext <4 x i1> %neq to <4 x i32> - store <4 x i32> %140, ptr %w, align 16 - %141 = load <4 x i32>, ptr %w, align 16 - %142 = extractelement <4 x i32> %141, i64 0 - %143 = load <4 x i32>, ptr %w, align 16 - %144 = extractelement <4 x i32> %143, i64 1 - %145 = load <4 x i32>, ptr %w, align 16 - %146 = extractelement <4 x i32> %145, i64 2 - %147 = load <4 x i32>, ptr %w, align 16 - %148 = extractelement <4 x i32> %147, i64 3 - %149 = call i32 (ptr, ...) @printf(ptr @.str.42, i32 %142, i32 %144, i32 %146, i32 %148) - store <4 x i32> , ptr %uz, align 16 - %150 = load <4 x i32>, ptr %uz, align 16 - %151 = load <4 x i32>, ptr %y, align 16 - %lt11 = icmp slt <4 x i32> %151, %150 - %check = icmp slt <4 x i32> %150, zeroinitializer - %siui-lt = or <4 x i1> %check, %lt11 - %152 = sext <4 x i1> %siui-lt to <4 x i32> - store <4 x i32> %152, ptr %w, align 16 - %153 = load <4 x i32>, ptr %w, align 16 - %154 = extractelement <4 x i32> %153, i64 0 - %155 = load <4 x i32>, ptr %w, align 16 - %156 = extractelement <4 x i32> %155, i64 1 - %157 = load <4 x i32>, ptr %w, align 16 - %158 = extractelement <4 x i32> %157, i64 2 - %159 = load <4 x i32>, ptr %w, align 16 - %160 = extractelement <4 x i32> %159, i64 3 - %161 = call i32 (ptr, ...) @printf(ptr @.str.43, i32 %154, i32 %156, i32 %158, i32 %160) - %162 = load <4 x i32>, ptr %uz, align 16 - %163 = load <4 x i32>, ptr %y, align 16 - %le12 = icmp sle <4 x i32> %163, %162 - %check13 = icmp slt <4 x i32> %162, zeroinitializer - %siui-le = or <4 x i1> %check13, %le12 - %164 = sext <4 x i1> %siui-le to <4 x i32> - store <4 x i32> %164, ptr %w, align 16 - %165 = load <4 x i32>, ptr %w, align 16 - %166 = extractelement <4 x i32> %165, i64 0 - %167 = load <4 x i32>, ptr %w, align 16 - %168 = extractelement <4 x i32> %167, i64 1 - %169 = load <4 x i32>, ptr %w, align 16 - %170 = extractelement <4 x i32> %169, i64 2 - %171 = load <4 x i32>, ptr %w, align 16 - %172 = extractelement <4 x i32> %171, i64 3 - %173 = call i32 (ptr, ...) @printf(ptr @.str.44, i32 %166, i32 %168, i32 %170, i32 %172) - %174 = load <4 x i32>, ptr %uz, align 16 - %175 = load <4 x i32>, ptr %y, align 16 - %gt14 = icmp sgt <4 x i32> %175, %174 - %check15 = icmp sge <4 x i32> %174, zeroinitializer - %siui-gt = and <4 x i1> %check15, %gt14 - %176 = sext <4 x i1> %siui-gt to <4 x i32> - store <4 x i32> %176, ptr %w, align 16 - %177 = load <4 x i32>, ptr %w, align 16 - %178 = extractelement <4 x i32> %177, i64 0 - %179 = load <4 x i32>, ptr %w, align 16 - %180 = extractelement <4 x i32> %179, i64 1 - %181 = load <4 x i32>, ptr %w, align 16 - %182 = extractelement <4 x i32> %181, i64 2 - %183 = load <4 x i32>, ptr %w, align 16 - %184 = extractelement <4 x i32> %183, i64 3 - %185 = call i32 (ptr, ...) @printf(ptr @.str.45, i32 %178, i32 %180, i32 %182, i32 %184) - %186 = load <4 x i32>, ptr %uz, align 16 - %187 = load <4 x i32>, ptr %y, align 16 - %ge16 = icmp sge <4 x i32> %187, %186 - %check17 = icmp sge <4 x i32> %186, zeroinitializer - %siui-ge = and <4 x i1> %check17, %ge16 - %188 = sext <4 x i1> %siui-ge to <4 x i32> - store <4 x i32> %188, ptr %w, align 16 - %189 = load <4 x i32>, ptr %w, align 16 - %190 = extractelement <4 x i32> %189, i64 0 - %191 = load <4 x i32>, ptr %w, align 16 - %192 = extractelement <4 x i32> %191, i64 1 - %193 = load <4 x i32>, ptr %w, align 16 - %194 = extractelement <4 x i32> %193, i64 2 - %195 = load <4 x i32>, ptr %w, align 16 - %196 = extractelement <4 x i32> %195, i64 3 - %197 = call i32 (ptr, ...) @printf(ptr @.str.46, i32 %190, i32 %192, i32 %194, i32 %196) - %198 = load <4 x i32>, ptr %uz, align 16 - %199 = load <4 x i32>, ptr %y, align 16 - %eq18 = icmp eq <4 x i32> %199, %198 - %check19 = icmp sge <4 x i32> %199, zeroinitializer - %siui-eq = and <4 x i1> %check19, %eq18 - %200 = sext <4 x i1> %siui-eq to <4 x i32> - store <4 x i32> %200, ptr %w, align 16 - %201 = load <4 x i32>, ptr %w, align 16 - %202 = extractelement <4 x i32> %201, i64 0 - %203 = load <4 x i32>, ptr %w, align 16 - %204 = extractelement <4 x i32> %203, i64 1 - %205 = load <4 x i32>, ptr %w, align 16 - %206 = extractelement <4 x i32> %205, i64 2 - %207 = load <4 x i32>, ptr %w, align 16 - %208 = extractelement <4 x i32> %207, i64 3 - %209 = call i32 (ptr, ...) @printf(ptr @.str.47, i32 %202, i32 %204, i32 %206, i32 %208) - %210 = load <4 x i32>, ptr %uz, align 16 - %211 = load <4 x i32>, ptr %y, align 16 - %neq20 = icmp ne <4 x i32> %211, %210 - %check21 = icmp slt <4 x i32> %211, zeroinitializer - %siui-ne = or <4 x i1> %check21, %neq20 - %212 = sext <4 x i1> %siui-ne to <4 x i32> - store <4 x i32> %212, ptr %w, align 16 - %213 = load <4 x i32>, ptr %w, align 16 - %214 = extractelement <4 x i32> %213, i64 0 - %215 = load <4 x i32>, ptr %w, align 16 - %216 = extractelement <4 x i32> %215, i64 1 - %217 = load <4 x i32>, ptr %w, align 16 - %218 = extractelement <4 x i32> %217, i64 2 - %219 = load <4 x i32>, ptr %w, align 16 - %220 = extractelement <4 x i32> %219, i64 3 - %221 = call i32 (ptr, ...) @printf(ptr @.str.48, i32 %214, i32 %216, i32 %218, i32 %220) ret void } diff --git a/test/unit/regression/inc_dec.c3 b/test/unit/regression/inc_dec.c3 index 0e7d40a26..d745a9ccc 100644 --- a/test/unit/regression/inc_dec.c3 +++ b/test/unit/regression/inc_dec.c3 @@ -7,10 +7,10 @@ fn void! vector_inc_dec() @test x[1]++; ++y[2]; int[<3>] g = x--; - assert($$reduce_and(x == { 0, 0, -1 })); - assert($$reduce_and(y == { 1, 0, 1 })); + assert(x == { 0, 0, -1 }); + assert(y == { 1, 0, 1 }); assert(z == 0 && zz == 1); - assert($$reduce_and(g == { 1, 1, 0 })); + assert(g == { 1, 1, 0 }); } fn void! int_inc_dec() @test diff --git a/test/unit/regression/vector_ops.c3 b/test/unit/regression/vector_ops.c3 new file mode 100644 index 000000000..8fcd60a5f --- /dev/null +++ b/test/unit/regression/vector_ops.c3 @@ -0,0 +1,81 @@ +import libc; + +fn void! test_div() @test +{ + float[<4>] y = { 1, 2, 3, 4 }; + float[<4>] z = { 0, 2, 2, -100 }; + +} +fn void! testf() @test +{ + float[<4>] y = { 1, 2, 3, 4 }; + float[<4>] z = { 2, 2, 2, -100 }; + float[<4>] w = y + z; + assert(w == { 3, 4, 5, -96 }); + w = y * z; + assert(w == { 2, 4, 6, -400 }); + w = y / z; + assert(w == { 0.5, 1.0, 1.5, -0.04 }); + w = y - z; + assert(w == { -1, 0, 1, 104 }); + int[<4>] ww = $$veccomplt(y, z); + assert(ww == { -1, 0, 0, 0 }); + ww = $$veccomple(y, z); + assert(ww == { -1, -1, 0, 0 }); + ww = $$veccompgt(y, z); + assert(ww == { 0, 0, -1, -1 }); + ww = $$veccompge(y, z); + assert(ww == { 0, -1, -1, -1 }); + ww = $$veccompeq(y, z); + assert(ww == { 0, -1, 0, 0 }); + ww = $$veccompne(y, z); + assert(ww == { -1, 0, -1, -1 }); +} + +fn void! testb() @test +{ + bool[<4>] y = { true, false, true, true }; + bool[<4>] z = { false, false, true, true }; + ichar[<4>] ww = $$veccomplt(y, z); + assert(ww == { 0, 0, 0, 0 }); + ww = $$veccomple(y, z); + assert(ww == { 0, -1, -1, -1 }); + ww = $$veccompgt(y, z); + assert(ww == { -1, 0, 0, 0 }); + ww = $$veccompge(y, z); + assert(ww == { -1, -1, -1, -1 }); + ww = $$veccompeq(y, z); + assert(ww == { 0, -1, -1, -1 }); + ww = $$veccompne(y, z); + assert(ww == { -1, 0, 0, 0 }); +} + +fn void! testi() @test +{ + int[<4>] y = { 1, 2, 3, 4 }; + int[<4>] z = { 2, 2, 2, -100 }; + int[<4>] w = y + z; + assert(w == { 3, 4, 5, -96 }); + w = y * z; + assert(w == { 2, 4, 6, -400 }); + w = y / z; + assert(w == { 0, 1, 1, 0 }); + w = y - z; + assert(w == { -1, 0, 1, 104 }); + w = z >> y; + assert(w == { 1, 0, 0, -7}); + w = z << y; + assert(w == { 4, 8, 16, -1600 }); + w = $$veccompgt(z, y); + assert(w == { -1, 0, 0, -1}); + w = $$veccompge(z, y); + assert(w == { -1, -1, 0, -1 }); + w = $$veccomplt(z, y); + assert(w == { 0, 0, -1, 0 }); + w = $$veccomple(z, y); + assert(w == { 0, -1, -1, 0 }); + w = $$veccompeq(z, y); + assert(w == { 0, -1, 0, 0 }); + w = $$veccompne(z, y); + assert(w == { -1, 0, -1, -1 }); +}