diff --git a/clang/lib/Headers/wasm_simd128.h b/clang/lib/Headers/wasm_simd128.h --- a/clang/lib/Headers/wasm_simd128.h +++ b/clang/lib/Headers/wasm_simd128.h @@ -276,12 +276,28 @@ __c12, __c13, __c14, __c15}; } +static __inline__ v128_t __DEFAULT_FN_ATTRS +wasm_u8x16_make(uint8_t __c0, uint8_t __c1, uint8_t __c2, uint8_t __c3, + uint8_t __c4, uint8_t __c5, uint8_t __c6, uint8_t __c7, + uint8_t __c8, uint8_t __c9, uint8_t __c10, uint8_t __c11, + uint8_t __c12, uint8_t __c13, uint8_t __c14, uint8_t __c15) { + return (v128_t)(__u8x16){__c0, __c1, __c2, __c3, __c4, __c5, + __c6, __c7, __c8, __c9, __c10, __c11, + __c12, __c13, __c14, __c15}; +} + static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i16x8_make(int16_t __c0, int16_t __c1, int16_t __c2, int16_t __c3, int16_t __c4, int16_t __c5, int16_t __c6, int16_t __c7) { return (v128_t)(__i16x8){__c0, __c1, __c2, __c3, __c4, __c5, __c6, __c7}; } +static __inline__ v128_t __DEFAULT_FN_ATTRS +wasm_u16x8_make(uint16_t __c0, uint16_t __c1, uint16_t __c2, uint16_t __c3, + uint16_t __c4, uint16_t __c5, uint16_t __c6, uint16_t __c7) { + return (v128_t)(__u16x8){__c0, __c1, __c2, __c3, __c4, __c5, __c6, __c7}; +} + static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i32x4_make(int32_t __c0, int32_t __c1, int32_t __c2, @@ -289,11 +305,23 @@ return (v128_t)(__i32x4){__c0, __c1, __c2, __c3}; } +static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u32x4_make(uint32_t __c0, + uint32_t __c1, + uint32_t __c2, + uint32_t __c3) { + return (v128_t)(__u32x4){__c0, __c1, __c2, __c3}; +} + static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i64x2_make(int64_t __c0, int64_t __c1) { return (v128_t)(__i64x2){__c0, __c1}; } +static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u64x2_make(uint64_t __c0, + uint64_t __c1) { + return (v128_t)(__u64x2){__c0, __c1}; +} + static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_f32x4_make(float __c0, float __c1, float __c2, @@ -324,6 +352,24 @@ __c12, __c13, __c14, __c15}; } +static __inline__ v128_t __DEFAULT_FN_ATTRS +wasm_u8x16_const(uint8_t __c0, uint8_t __c1, uint8_t __c2, uint8_t __c3, + uint8_t __c4, uint8_t __c5, uint8_t __c6, uint8_t __c7, + uint8_t __c8, uint8_t __c9, uint8_t __c10, uint8_t __c11, + uint8_t __c12, uint8_t __c13, uint8_t __c14, uint8_t __c15) + __REQUIRE_CONSTANT(__c0) __REQUIRE_CONSTANT(__c1) __REQUIRE_CONSTANT(__c2) + __REQUIRE_CONSTANT(__c3) __REQUIRE_CONSTANT(__c4) + __REQUIRE_CONSTANT(__c5) __REQUIRE_CONSTANT(__c6) + __REQUIRE_CONSTANT(__c7) __REQUIRE_CONSTANT(__c8) + __REQUIRE_CONSTANT(__c9) __REQUIRE_CONSTANT(__c10) + __REQUIRE_CONSTANT(__c11) __REQUIRE_CONSTANT(__c12) + __REQUIRE_CONSTANT(__c13) __REQUIRE_CONSTANT(__c14) + __REQUIRE_CONSTANT(__c15) { + return (v128_t)(__u8x16){__c0, __c1, __c2, __c3, __c4, __c5, + __c6, __c7, __c8, __c9, __c10, __c11, + __c12, __c13, __c14, __c15}; +} + static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i16x8_const(int16_t __c0, int16_t __c1, int16_t __c2, int16_t __c3, int16_t __c4, int16_t __c5, int16_t __c6, int16_t __c7) @@ -334,6 +380,16 @@ return (v128_t)(__i16x8){__c0, __c1, __c2, __c3, __c4, __c5, __c6, __c7}; } +static __inline__ v128_t __DEFAULT_FN_ATTRS +wasm_u16x8_const(uint16_t __c0, uint16_t __c1, uint16_t __c2, uint16_t __c3, + uint16_t __c4, uint16_t __c5, uint16_t __c6, uint16_t __c7) + __REQUIRE_CONSTANT(__c0) __REQUIRE_CONSTANT(__c1) __REQUIRE_CONSTANT(__c2) + __REQUIRE_CONSTANT(__c3) __REQUIRE_CONSTANT(__c4) + __REQUIRE_CONSTANT(__c5) __REQUIRE_CONSTANT(__c6) + __REQUIRE_CONSTANT(__c7) { + return (v128_t)(__u16x8){__c0, __c1, __c2, __c3, __c4, __c5, __c6, __c7}; +} + static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i32x4_const(int32_t __c0, int32_t __c1, int32_t __c2, int32_t __c3) __REQUIRE_CONSTANT(__c0) __REQUIRE_CONSTANT(__c1) __REQUIRE_CONSTANT(__c2) @@ -341,12 +397,25 @@ return (v128_t)(__i32x4){__c0, __c1, __c2, __c3}; } +static __inline__ v128_t __DEFAULT_FN_ATTRS +wasm_u32x4_const(uint32_t __c0, uint32_t __c1, uint32_t __c2, uint32_t __c3) + __REQUIRE_CONSTANT(__c0) __REQUIRE_CONSTANT(__c1) __REQUIRE_CONSTANT(__c2) + __REQUIRE_CONSTANT(__c3) { + return (v128_t)(__u32x4){__c0, __c1, __c2, __c3}; +} + static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i64x2_const(int64_t __c0, int64_t __c1) __REQUIRE_CONSTANT(__c0) __REQUIRE_CONSTANT(__c1) { return (v128_t)(__i64x2){__c0, __c1}; } +static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u64x2_const(uint64_t __c0, + uint64_t __c1) + __REQUIRE_CONSTANT(__c0) __REQUIRE_CONSTANT(__c1) { + return (v128_t)(__u64x2){__c0, __c1}; +} + static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_f32x4_const(float __c0, float __c1, float __c2, float __c3) __REQUIRE_CONSTANT(__c0) __REQUIRE_CONSTANT(__c1) __REQUIRE_CONSTANT(__c2) @@ -366,21 +435,42 @@ __c, __c, __c, __c, __c, __c, __c, __c}; } +static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u8x16_const_splat(uint8_t __c) + __REQUIRE_CONSTANT(__c) { + return (v128_t)(__u8x16){__c, __c, __c, __c, __c, __c, __c, __c, + __c, __c, __c, __c, __c, __c, __c, __c}; +} + static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i16x8_const_splat(int16_t __c) __REQUIRE_CONSTANT(__c) { return (v128_t)(__i16x8){__c, __c, __c, __c, __c, __c, __c, __c}; } +static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u16x8_const_splat(uint16_t __c) + __REQUIRE_CONSTANT(__c) { + return (v128_t)(__u16x8){__c, __c, __c, __c, __c, __c, __c, __c}; +} + static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i32x4_const_splat(int32_t __c) __REQUIRE_CONSTANT(__c) { return (v128_t)(__i32x4){__c, __c, __c, __c}; } +static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u32x4_const_splat(uint32_t __c) + __REQUIRE_CONSTANT(__c) { + return (v128_t)(__u32x4){__c, __c, __c, __c}; +} + static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i64x2_const_splat(int64_t __c) __REQUIRE_CONSTANT(__c) { return (v128_t)(__i64x2){__c, __c}; } +static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u64x2_const_splat(uint64_t __c) + __REQUIRE_CONSTANT(__c) { + return (v128_t)(__u64x2){__c, __c}; +} + static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_f32x4_const_splat(float __c) __REQUIRE_CONSTANT(__c) { return (v128_t)(__f32x4){__c, __c, __c, __c}; @@ -396,6 +486,11 @@ __a, __a, __a, __a, __a, __a, __a, __a}; } +static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u8x16_splat(uint8_t __a) { + return (v128_t)(__u8x16){__a, __a, __a, __a, __a, __a, __a, __a, + __a, __a, __a, __a, __a, __a, __a, __a}; +} + static __inline__ int8_t __DEFAULT_FN_ATTRS wasm_i8x16_extract_lane(v128_t __a, int __i) __REQUIRE_CONSTANT(__i) { @@ -417,10 +512,23 @@ return (v128_t)__v; } +static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u8x16_replace_lane(v128_t __a, + int __i, + uint8_t __b) + __REQUIRE_CONSTANT(__i) { + __u8x16 __v = (__u8x16)__a; + __v[__i] = __b; + return (v128_t)__v; +} + static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i16x8_splat(int16_t __a) { return (v128_t)(__i16x8){__a, __a, __a, __a, __a, __a, __a, __a}; } +static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u16x8_splat(uint16_t __a) { + return (v128_t)(__u16x8){__a, __a, __a, __a, __a, __a, __a, __a}; +} + static __inline__ int16_t __DEFAULT_FN_ATTRS wasm_i16x8_extract_lane(v128_t __a, int __i) __REQUIRE_CONSTANT(__i) { @@ -441,16 +549,32 @@ return (v128_t)__v; } +static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u16x8_replace_lane( + v128_t __a, int __i, uint16_t __b) __REQUIRE_CONSTANT(__i) { + __u16x8 __v = (__u16x8)__a; + __v[__i] = __b; + return (v128_t)__v; +} + static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i32x4_splat(int32_t __a) { return (v128_t)(__i32x4){__a, __a, __a, __a}; } +static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u32x4_splat(uint32_t __a) { + return (v128_t)(__u32x4){__a, __a, __a, __a}; +} + static __inline__ int32_t __DEFAULT_FN_ATTRS wasm_i32x4_extract_lane(v128_t __a, int __i) __REQUIRE_CONSTANT(__i) { return ((__i32x4)__a)[__i]; } +static __inline__ uint32_t __DEFAULT_FN_ATTRS +wasm_u32x4_extract_lane(v128_t __a, int __i) __REQUIRE_CONSTANT(__i) { + return ((__u32x4)__a)[__i]; +} + static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i32x4_replace_lane(v128_t __a, int __i, int32_t __b) @@ -460,16 +584,32 @@ return (v128_t)__v; } +static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u32x4_replace_lane( + v128_t __a, int __i, uint32_t __b) __REQUIRE_CONSTANT(__i) { + __u32x4 __v = (__u32x4)__a; + __v[__i] = __b; + return (v128_t)__v; +} + static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i64x2_splat(int64_t __a) { return (v128_t)(__i64x2){__a, __a}; } +static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u64x2_splat(uint64_t __a) { + return (v128_t)(__u64x2){__a, __a}; +} + static __inline__ int64_t __DEFAULT_FN_ATTRS wasm_i64x2_extract_lane(v128_t __a, int __i) __REQUIRE_CONSTANT(__i) { return ((__i64x2)__a)[__i]; } +static __inline__ uint64_t __DEFAULT_FN_ATTRS +wasm_u64x2_extract_lane(v128_t __a, int __i) __REQUIRE_CONSTANT(__i) { + return ((__u64x2)__a)[__i]; +} + static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i64x2_replace_lane(v128_t __a, int __i, int64_t __b) @@ -479,6 +619,13 @@ return (v128_t)__v; } +static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u64x2_replace_lane( + v128_t __a, int __i, uint64_t __b) __REQUIRE_CONSTANT(__i) { + __u64x2 __v = (__u64x2)__a; + __v[__i] = __b; + return (v128_t)__v; +} + static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_f32x4_splat(float __a) { return (v128_t)(__f32x4){__a, __a, __a, __a}; } diff --git a/clang/test/Headers/wasm.c b/clang/test/Headers/wasm.c --- a/clang/test/Headers/wasm.c +++ b/clang/test/Headers/wasm.c @@ -3,7 +3,7 @@ // FIXME: This should not be using -O2 and implicitly testing the entire IR opt pipeline. -// RUN: %clang %s -O2 -emit-llvm -S -o - -target wasm32-unknown-unknown -msimd128 -Wcast-qual -fno-lax-vector-conversions -Werror | FileCheck %s +// RUN: %clang %s -O2 -emit-llvm -S -o - -target wasm32-unknown-unknown -msimd128 -Wall -Weverything -Wno-missing-prototypes -fno-lax-vector-conversions -Werror | FileCheck %s #include @@ -213,7 +213,7 @@ // CHECK-NEXT: ret void // void test_v128_store(void *mem, v128_t a) { - return wasm_v128_store(mem, a); + wasm_v128_store(mem, a); } // CHECK-LABEL: @test_v128_store8_lane( @@ -224,7 +224,7 @@ // CHECK-NEXT: ret void // void test_v128_store8_lane(uint8_t *ptr, v128_t vec) { - return wasm_v128_store8_lane(ptr, vec, 15); + wasm_v128_store8_lane(ptr, vec, 15); } // CHECK-LABEL: @test_v128_store16_lane( @@ -235,7 +235,7 @@ // CHECK-NEXT: ret void // void test_v128_store16_lane(uint16_t *ptr, v128_t vec) { - return wasm_v128_store16_lane(ptr, vec, 7); + wasm_v128_store16_lane(ptr, vec, 7); } // CHECK-LABEL: @test_v128_store32_lane( @@ -245,7 +245,7 @@ // CHECK-NEXT: ret void // void test_v128_store32_lane(uint32_t *ptr, v128_t vec) { - return wasm_v128_store32_lane(ptr, vec, 3); + wasm_v128_store32_lane(ptr, vec, 3); } // CHECK-LABEL: @test_v128_store64_lane( @@ -256,7 +256,7 @@ // CHECK-NEXT: ret void // void test_v128_store64_lane(uint64_t *ptr, v128_t vec) { - return wasm_v128_store64_lane(ptr, vec, 1); + wasm_v128_store64_lane(ptr, vec, 1); } // CHECK-LABEL: @test_i8x16_make( @@ -284,6 +284,31 @@ return wasm_i8x16_make(c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15); } +// CHECK-LABEL: @test_u8x16_make( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VECINIT_I:%.*]] = insertelement <16 x i8> undef, i8 [[C0:%.*]], i32 0 +// CHECK-NEXT: [[VECINIT1_I:%.*]] = insertelement <16 x i8> [[VECINIT_I]], i8 [[C1:%.*]], i32 1 +// CHECK-NEXT: [[VECINIT2_I:%.*]] = insertelement <16 x i8> [[VECINIT1_I]], i8 [[C2:%.*]], i32 2 +// CHECK-NEXT: [[VECINIT3_I:%.*]] = insertelement <16 x i8> [[VECINIT2_I]], i8 [[C3:%.*]], i32 3 +// CHECK-NEXT: [[VECINIT4_I:%.*]] = insertelement <16 x i8> [[VECINIT3_I]], i8 [[C4:%.*]], i32 4 +// CHECK-NEXT: [[VECINIT5_I:%.*]] = insertelement <16 x i8> [[VECINIT4_I]], i8 [[C5:%.*]], i32 5 +// CHECK-NEXT: [[VECINIT6_I:%.*]] = insertelement <16 x i8> [[VECINIT5_I]], i8 [[C6:%.*]], i32 6 +// CHECK-NEXT: [[VECINIT7_I:%.*]] = insertelement <16 x i8> [[VECINIT6_I]], i8 [[C7:%.*]], i32 7 +// CHECK-NEXT: [[VECINIT8_I:%.*]] = insertelement <16 x i8> [[VECINIT7_I]], i8 [[C8:%.*]], i32 8 +// CHECK-NEXT: [[VECINIT9_I:%.*]] = insertelement <16 x i8> [[VECINIT8_I]], i8 [[C9:%.*]], i32 9 +// CHECK-NEXT: [[VECINIT10_I:%.*]] = insertelement <16 x i8> [[VECINIT9_I]], i8 [[C10:%.*]], i32 10 +// CHECK-NEXT: [[VECINIT11_I:%.*]] = insertelement <16 x i8> [[VECINIT10_I]], i8 [[C11:%.*]], i32 11 +// CHECK-NEXT: [[VECINIT12_I:%.*]] = insertelement <16 x i8> [[VECINIT11_I]], i8 [[C12:%.*]], i32 12 +// CHECK-NEXT: [[VECINIT13_I:%.*]] = insertelement <16 x i8> [[VECINIT12_I]], i8 [[C13:%.*]], i32 13 +// CHECK-NEXT: [[VECINIT14_I:%.*]] = insertelement <16 x i8> [[VECINIT13_I]], i8 [[C14:%.*]], i32 14 +// CHECK-NEXT: [[VECINIT15_I:%.*]] = insertelement <16 x i8> [[VECINIT14_I]], i8 [[C15:%.*]], i32 15 +// CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i8> [[VECINIT15_I]] to <4 x i32> +// CHECK-NEXT: ret <4 x i32> [[TMP0]] +// +v128_t test_u8x16_make(uint8_t c0, uint8_t c1, uint8_t c2, uint8_t c3, uint8_t c4, uint8_t c5, uint8_t c6, uint8_t c7, uint8_t c8, uint8_t c9, uint8_t c10, uint8_t c11, uint8_t c12, uint8_t c13, uint8_t c14, uint8_t c15) { + return wasm_u8x16_make(c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15); +} + // CHECK-LABEL: @test_i16x8_make( // CHECK-NEXT: entry: // CHECK-NEXT: [[VECINIT_I:%.*]] = insertelement <8 x i16> undef, i16 [[C0:%.*]], i32 0 @@ -301,6 +326,23 @@ return wasm_i16x8_make(c0, c1, c2, c3, c4, c5, c6, c7); } +// CHECK-LABEL: @test_u16x8_make( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VECINIT_I:%.*]] = insertelement <8 x i16> undef, i16 [[C0:%.*]], i32 0 +// CHECK-NEXT: [[VECINIT1_I:%.*]] = insertelement <8 x i16> [[VECINIT_I]], i16 [[C1:%.*]], i32 1 +// CHECK-NEXT: [[VECINIT2_I:%.*]] = insertelement <8 x i16> [[VECINIT1_I]], i16 [[C2:%.*]], i32 2 +// CHECK-NEXT: [[VECINIT3_I:%.*]] = insertelement <8 x i16> [[VECINIT2_I]], i16 [[C3:%.*]], i32 3 +// CHECK-NEXT: [[VECINIT4_I:%.*]] = insertelement <8 x i16> [[VECINIT3_I]], i16 [[C4:%.*]], i32 4 +// CHECK-NEXT: [[VECINIT5_I:%.*]] = insertelement <8 x i16> [[VECINIT4_I]], i16 [[C5:%.*]], i32 5 +// CHECK-NEXT: [[VECINIT6_I:%.*]] = insertelement <8 x i16> [[VECINIT5_I]], i16 [[C6:%.*]], i32 6 +// CHECK-NEXT: [[VECINIT7_I:%.*]] = insertelement <8 x i16> [[VECINIT6_I]], i16 [[C7:%.*]], i32 7 +// CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x i16> [[VECINIT7_I]] to <4 x i32> +// CHECK-NEXT: ret <4 x i32> [[TMP0]] +// +v128_t test_u16x8_make(uint16_t c0, uint16_t c1, uint16_t c2, uint16_t c3, uint16_t c4, uint16_t c5, uint16_t c6, uint16_t c7) { + return wasm_u16x8_make(c0, c1, c2, c3, c4, c5, c6, c7); +} + // CHECK-LABEL: @test_i32x4_make( // CHECK-NEXT: entry: // CHECK-NEXT: [[VECINIT_I:%.*]] = insertelement <4 x i32> undef, i32 [[C0:%.*]], i32 0 @@ -313,6 +355,18 @@ return wasm_i32x4_make(c0, c1, c2, c3); } +// CHECK-LABEL: @test_u32x4_make( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VECINIT_I:%.*]] = insertelement <4 x i32> undef, i32 [[C0:%.*]], i32 0 +// CHECK-NEXT: [[VECINIT1_I:%.*]] = insertelement <4 x i32> [[VECINIT_I]], i32 [[C1:%.*]], i32 1 +// CHECK-NEXT: [[VECINIT2_I:%.*]] = insertelement <4 x i32> [[VECINIT1_I]], i32 [[C2:%.*]], i32 2 +// CHECK-NEXT: [[VECINIT3_I:%.*]] = insertelement <4 x i32> [[VECINIT2_I]], i32 [[C3:%.*]], i32 3 +// CHECK-NEXT: ret <4 x i32> [[VECINIT3_I]] +// +v128_t test_u32x4_make(uint32_t c0, uint32_t c1, uint32_t c2, uint32_t c3) { + return wasm_u32x4_make(c0, c1, c2, c3); +} + // CHECK-LABEL: @test_i64x2_make( // CHECK-NEXT: entry: // CHECK-NEXT: [[VECINIT_I:%.*]] = insertelement <2 x i64> undef, i64 [[C0:%.*]], i32 0 @@ -324,6 +378,17 @@ return wasm_i64x2_make(c0, c1); } +// CHECK-LABEL: @test_u64x2_make( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VECINIT_I:%.*]] = insertelement <2 x i64> undef, i64 [[C0:%.*]], i32 0 +// CHECK-NEXT: [[VECINIT1_I:%.*]] = insertelement <2 x i64> [[VECINIT_I]], i64 [[C1:%.*]], i32 1 +// CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x i64> [[VECINIT1_I]] to <4 x i32> +// CHECK-NEXT: ret <4 x i32> [[TMP0]] +// +v128_t test_u64x2_make(uint64_t c0, uint64_t c1) { + return wasm_u64x2_make(c0, c1); +} + // CHECK-LABEL: @test_f32x4_make( // CHECK-NEXT: entry: // CHECK-NEXT: [[VECINIT_I:%.*]] = insertelement <4 x float> undef, float [[C0:%.*]], i32 0 @@ -352,39 +417,71 @@ // CHECK-NEXT: entry: // CHECK-NEXT: ret <4 x i32> // -v128_t test_i8x16_const() { +v128_t test_i8x16_const(void) { return wasm_i8x16_const(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); } +// CHECK-LABEL: @test_u8x16_const( +// CHECK-NEXT: entry: +// CHECK-NEXT: ret <4 x i32> +// +v128_t test_u8x16_const(void) { + return wasm_u8x16_const(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); +} + // CHECK-LABEL: @test_i16x8_const( // CHECK-NEXT: entry: // CHECK-NEXT: ret <4 x i32> // -v128_t test_i16x8_const() { +v128_t test_i16x8_const(void) { return wasm_i16x8_const(0, 1, 2, 3, 4, 5, 6, 7); } +// CHECK-LABEL: @test_u16x8_const( +// CHECK-NEXT: entry: +// CHECK-NEXT: ret <4 x i32> +// +v128_t test_u16x8_const(void) { + return wasm_u16x8_const(0, 1, 2, 3, 4, 5, 6, 7); +} + // CHECK-LABEL: @test_i32x4_const( // CHECK-NEXT: entry: // CHECK-NEXT: ret <4 x i32> // -v128_t test_i32x4_const() { +v128_t test_i32x4_const(void) { return wasm_i32x4_const(0, 1, 2, 3); } +// CHECK-LABEL: @test_u32x4_const( +// CHECK-NEXT: entry: +// CHECK-NEXT: ret <4 x i32> +// +v128_t test_u32x4_const(void) { + return wasm_u32x4_const(0, 1, 2, 3); +} + // CHECK-LABEL: @test_i64x2_const( // CHECK-NEXT: entry: // CHECK-NEXT: ret <4 x i32> // -v128_t test_i64x2_const() { +v128_t test_i64x2_const(void) { return wasm_i64x2_const(0, 1); } +// CHECK-LABEL: @test_u64x2_const( +// CHECK-NEXT: entry: +// CHECK-NEXT: ret <4 x i32> +// +v128_t test_u64x2_const(void) { + return wasm_u64x2_const(0, 1); +} + // CHECK-LABEL: @test_f32x4_const( // CHECK-NEXT: entry: // CHECK-NEXT: ret <4 x i32> // -v128_t test_f32x4_const() { +v128_t test_f32x4_const(void) { return wasm_f32x4_const(0, 1, 2, 3); } @@ -392,7 +489,7 @@ // CHECK-NEXT: entry: // CHECK-NEXT: ret <4 x i32> // -v128_t test_f64x2_const() { +v128_t test_f64x2_const(void) { return wasm_f64x2_const(0, 1); } @@ -400,39 +497,71 @@ // CHECK-NEXT: entry: // CHECK-NEXT: ret <4 x i32> // -v128_t test_i8x16_const_splat() { +v128_t test_i8x16_const_splat(void) { return wasm_i8x16_const_splat(42); } +// CHECK-LABEL: @test_u8x16_const_splat( +// CHECK-NEXT: entry: +// CHECK-NEXT: ret <4 x i32> +// +v128_t test_u8x16_const_splat(void) { + return wasm_u8x16_const_splat(42); +} + // CHECK-LABEL: @test_i16x8_const_splat( // CHECK-NEXT: entry: // CHECK-NEXT: ret <4 x i32> // -v128_t test_i16x8_const_splat() { +v128_t test_i16x8_const_splat(void) { return wasm_i16x8_const_splat(42); } +// CHECK-LABEL: @test_u16x8_const_splat( +// CHECK-NEXT: entry: +// CHECK-NEXT: ret <4 x i32> +// +v128_t test_u16x8_const_splat(void) { + return wasm_u16x8_const_splat(42); +} + // CHECK-LABEL: @test_i32x4_const_splat( // CHECK-NEXT: entry: // CHECK-NEXT: ret <4 x i32> // -v128_t test_i32x4_const_splat() { +v128_t test_i32x4_const_splat(void) { return wasm_i32x4_const_splat(42); } +// CHECK-LABEL: @test_u32x4_const_splat( +// CHECK-NEXT: entry: +// CHECK-NEXT: ret <4 x i32> +// +v128_t test_u32x4_const_splat(void) { + return wasm_u32x4_const_splat(42); +} + // CHECK-LABEL: @test_i64x2_const_splat( // CHECK-NEXT: entry: // CHECK-NEXT: ret <4 x i32> // -v128_t test_i64x2_const_splat() { +v128_t test_i64x2_const_splat(void) { return wasm_i64x2_const_splat(42); } +// CHECK-LABEL: @test_u64x2_const_splat( +// CHECK-NEXT: entry: +// CHECK-NEXT: ret <4 x i32> +// +v128_t test_u64x2_const_splat(void) { + return wasm_u64x2_const_splat(42); +} + // CHECK-LABEL: @test_f32x4_const_splat( // CHECK-NEXT: entry: // CHECK-NEXT: ret <4 x i32> // -v128_t test_f32x4_const_splat() { +v128_t test_f32x4_const_splat(void) { return wasm_f32x4_const_splat(42); } @@ -440,7 +569,7 @@ // CHECK-NEXT: entry: // CHECK-NEXT: ret <4 x i32> // -v128_t test_f64x2_const_splat() { +v128_t test_f64x2_const_splat(void) { return wasm_f64x2_const_splat(42); } @@ -455,6 +584,17 @@ return wasm_i8x16_splat(a); } +// CHECK-LABEL: @test_u8x16_splat( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VECINIT_I:%.*]] = insertelement <16 x i8> undef, i8 [[A:%.*]], i32 0 +// CHECK-NEXT: [[VECINIT15_I:%.*]] = shufflevector <16 x i8> [[VECINIT_I]], <16 x i8> poison, <16 x i32> zeroinitializer +// CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i8> [[VECINIT15_I]] to <4 x i32> +// CHECK-NEXT: ret <4 x i32> [[TMP0]] +// +v128_t test_u8x16_splat(uint8_t a) { + return wasm_u8x16_splat(a); +} + // CHECK-LABEL: @test_i8x16_extract_lane( // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <16 x i8> @@ -486,6 +626,17 @@ return wasm_i8x16_replace_lane(a, 15, b); } +// CHECK-LABEL: @test_u8x16_replace_lane( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <16 x i8> +// CHECK-NEXT: [[VECINS_I:%.*]] = insertelement <16 x i8> [[TMP0]], i8 [[B:%.*]], i32 15 +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i8> [[VECINS_I]] to <4 x i32> +// CHECK-NEXT: ret <4 x i32> [[TMP1]] +// +v128_t test_u8x16_replace_lane(v128_t a, uint8_t b) { + return wasm_u8x16_replace_lane(a, 15, b); +} + // CHECK-LABEL: @test_i16x8_splat( // CHECK-NEXT: entry: // CHECK-NEXT: [[VECINIT_I:%.*]] = insertelement <8 x i16> undef, i16 [[A:%.*]], i32 0 @@ -497,6 +648,17 @@ return wasm_i16x8_splat(a); } +// CHECK-LABEL: @test_u16x8_splat( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VECINIT_I:%.*]] = insertelement <8 x i16> undef, i16 [[A:%.*]], i32 0 +// CHECK-NEXT: [[VECINIT7_I:%.*]] = shufflevector <8 x i16> [[VECINIT_I]], <8 x i16> poison, <8 x i32> zeroinitializer +// CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x i16> [[VECINIT7_I]] to <4 x i32> +// CHECK-NEXT: ret <4 x i32> [[TMP0]] +// +v128_t test_u16x8_splat(uint16_t a) { + return wasm_u16x8_splat(a); +} + // CHECK-LABEL: @test_i16x8_extract_lane( // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <8 x i16> @@ -528,6 +690,17 @@ return wasm_i16x8_replace_lane(a, 7, b); } +// CHECK-LABEL: @test_u16x8_replace_lane( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <8 x i16> +// CHECK-NEXT: [[VECINS_I:%.*]] = insertelement <8 x i16> [[TMP0]], i16 [[B:%.*]], i32 7 +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i16> [[VECINS_I]] to <4 x i32> +// CHECK-NEXT: ret <4 x i32> [[TMP1]] +// +v128_t test_u16x8_replace_lane(v128_t a, uint16_t b) { + return wasm_u16x8_replace_lane(a, 7, b); +} + // CHECK-LABEL: @test_i32x4_splat( // CHECK-NEXT: entry: // CHECK-NEXT: [[VECINIT_I:%.*]] = insertelement <4 x i32> undef, i32 [[A:%.*]], i32 0 @@ -538,6 +711,16 @@ return wasm_i32x4_splat(a); } +// CHECK-LABEL: @test_u32x4_splat( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VECINIT_I:%.*]] = insertelement <4 x i32> undef, i32 [[A:%.*]], i32 0 +// CHECK-NEXT: [[VECINIT3_I:%.*]] = shufflevector <4 x i32> [[VECINIT_I]], <4 x i32> poison, <4 x i32> zeroinitializer +// CHECK-NEXT: ret <4 x i32> [[VECINIT3_I]] +// +v128_t test_u32x4_splat(uint32_t a) { + return wasm_u32x4_splat(a); +} + // CHECK-LABEL: @test_i32x4_extract_lane( // CHECK-NEXT: entry: // CHECK-NEXT: [[VECEXT_I:%.*]] = extractelement <4 x i32> [[A:%.*]], i32 3 @@ -547,6 +730,15 @@ return wasm_i32x4_extract_lane(a, 3); } +// CHECK-LABEL: @test_u32x4_extract_lane( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VECEXT_I:%.*]] = extractelement <4 x i32> [[A:%.*]], i32 3 +// CHECK-NEXT: ret i32 [[VECEXT_I]] +// +uint32_t test_u32x4_extract_lane(v128_t a) { + return wasm_u32x4_extract_lane(a, 3); +} + // CHECK-LABEL: @test_i32x4_replace_lane( // CHECK-NEXT: entry: // CHECK-NEXT: [[VECINS_I:%.*]] = insertelement <4 x i32> [[A:%.*]], i32 [[B:%.*]], i32 3 @@ -556,6 +748,15 @@ return wasm_i32x4_replace_lane(a, 3, b); } +// CHECK-LABEL: @test_u32x4_replace_lane( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VECINS_I:%.*]] = insertelement <4 x i32> [[A:%.*]], i32 [[B:%.*]], i32 3 +// CHECK-NEXT: ret <4 x i32> [[VECINS_I]] +// +v128_t test_u32x4_replace_lane(v128_t a, uint32_t b) { + return wasm_u32x4_replace_lane(a, 3, b); +} + // CHECK-LABEL: @test_i64x2_splat( // CHECK-NEXT: entry: // CHECK-NEXT: [[VECINIT_I:%.*]] = insertelement <2 x i64> undef, i64 [[A:%.*]], i32 0 @@ -567,6 +768,17 @@ return wasm_i64x2_splat(a); } +// CHECK-LABEL: @test_u64x2_splat( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VECINIT_I:%.*]] = insertelement <2 x i64> undef, i64 [[A:%.*]], i32 0 +// CHECK-NEXT: [[VECINIT1_I:%.*]] = shufflevector <2 x i64> [[VECINIT_I]], <2 x i64> poison, <2 x i32> zeroinitializer +// CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x i64> [[VECINIT1_I]] to <4 x i32> +// CHECK-NEXT: ret <4 x i32> [[TMP0]] +// +v128_t test_u64x2_splat(uint64_t a) { + return wasm_u64x2_splat(a); +} + // CHECK-LABEL: @test_i64x2_extract_lane( // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <2 x i64> @@ -577,6 +789,16 @@ return wasm_i64x2_extract_lane(a, 1); } +// CHECK-LABEL: @test_u64x2_extract_lane( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <2 x i64> +// CHECK-NEXT: [[VECEXT_I:%.*]] = extractelement <2 x i64> [[TMP0]], i32 1 +// CHECK-NEXT: ret i64 [[VECEXT_I]] +// +uint64_t test_u64x2_extract_lane(v128_t a) { + return wasm_u64x2_extract_lane(a, 1); +} + // CHECK-LABEL: @test_i64x2_replace_lane( // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <2 x i64> @@ -588,6 +810,17 @@ return wasm_i64x2_replace_lane(a, 1, b); } +// CHECK-LABEL: @test_u64x2_replace_lane( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i32> [[A:%.*]] to <2 x i64> +// CHECK-NEXT: [[VECINS_I:%.*]] = insertelement <2 x i64> [[TMP0]], i64 [[B:%.*]], i32 1 +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i64> [[VECINS_I]] to <4 x i32> +// CHECK-NEXT: ret <4 x i32> [[TMP1]] +// +v128_t test_u64x2_replace_lane(v128_t a, uint64_t b) { + return wasm_u64x2_replace_lane(a, 1, b); +} + // CHECK-LABEL: @test_f32x4_splat( // CHECK-NEXT: entry: // CHECK-NEXT: [[VECINIT_I:%.*]] = insertelement <4 x float> undef, float [[A:%.*]], i32 0