[PATCH] D85074: [WebAssembly] Use "signed char" instead of "char" in SIMD intrinsics.
This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rG47f7174ffa71: [WebAssembly] Use "signed char" instead of "char" in SIMD intrinsics. (authored by sunfishcode). Changed prior to commit: https://reviews.llvm.org/D85074?vs=282608&id=283004#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D85074/new/ https://reviews.llvm.org/D85074 Files: clang/include/clang/Basic/BuiltinsWebAssembly.def clang/lib/Headers/wasm_simd128.h clang/test/CodeGen/builtins-wasm.c Index: clang/test/CodeGen/builtins-wasm.c === --- clang/test/CodeGen/builtins-wasm.c +++ clang/test/CodeGen/builtins-wasm.c @@ -3,7 +3,7 @@ // RUN: not %clang_cc1 -triple wasm64-unknown-unknown -target-feature +nontrapping-fptoint -target-feature +exception-handling -target-feature +bulk-memory -target-feature +atomics -flax-vector-conversions=none -O3 -emit-llvm -o - %s 2>&1 | FileCheck %s -check-prefixes MISSING-SIMD // SIMD convenience types -typedef char i8x16 __attribute((vector_size(16))); +typedef signed char i8x16 __attribute((vector_size(16))); typedef short i16x8 __attribute((vector_size(16))); typedef int i32x4 __attribute((vector_size(16))); typedef long long i64x2 __attribute((vector_size(16))); @@ -201,7 +201,7 @@ // WEBASSEMBLY-NEXT: ret } -int extract_lane_u_i8x16(i8x16 v) { +int extract_lane_u_i8x16(u8x16 v) { return __builtin_wasm_extract_lane_u_i8x16(v, 13); // WEBASSEMBLY: extractelement <16 x i8> %v, i32 13 // WEBASSEMBLY-NEXT: zext @@ -215,7 +215,7 @@ // WEBASSEMBLY-NEXT: ret } -int extract_lane_u_i16x8(i16x8 v) { +int extract_lane_u_i16x8(u16x8 v) { return __builtin_wasm_extract_lane_u_i16x8(v, 7); // WEBASSEMBLY: extractelement <8 x i16> %v, i32 7 // WEBASSEMBLY-NEXT: zext @@ -291,7 +291,7 @@ // WEBASSEMBLY-NEXT: ret } -i8x16 add_saturate_u_i8x16(i8x16 x, i8x16 y) { +u8x16 add_saturate_u_i8x16(u8x16 x, u8x16 y) { return __builtin_wasm_add_saturate_u_i8x16(x, y); // WEBASSEMBLY: call <16 x i8> @llvm.uadd.sat.v16i8( // WEBASSEMBLY-SAME: <16 x i8> %x, <16 x i8> %y) @@ -305,7 +305,7 @@ // WEBASSEMBLY-NEXT: ret } -i16x8 add_saturate_u_i16x8(i16x8 x, i16x8 y) { +u16x8 add_saturate_u_i16x8(u16x8 x, u16x8 y) { return __builtin_wasm_add_saturate_u_i16x8(x, y); // WEBASSEMBLY: call <8 x i16> @llvm.uadd.sat.v8i16( // WEBASSEMBLY-SAME: <8 x i16> %x, <8 x i16> %y) @@ -319,7 +319,7 @@ // WEBASSEMBLY-NEXT: ret } -i8x16 sub_saturate_u_i8x16(i8x16 x, i8x16 y) { +u8x16 sub_saturate_u_i8x16(u8x16 x, u8x16 y) { return __builtin_wasm_sub_saturate_u_i8x16(x, y); // WEBASSEMBLY: call <16 x i8> @llvm.wasm.sub.saturate.unsigned.v16i8( // WEBASSEMBLY-SAME: <16 x i8> %x, <16 x i8> %y) @@ -357,7 +357,7 @@ // WEBASSEMBLY-NEXT: ret <16 x i8> %1 } -i8x16 min_u_i8x16(i8x16 x, i8x16 y) { +u8x16 min_u_i8x16(u8x16 x, u8x16 y) { return __builtin_wasm_min_u_i8x16(x, y); // WEBASSEMBLY: %0 = icmp ult <16 x i8> %x, %y // WEBASSEMBLY-NEXT: %1 = select <16 x i1> %0, <16 x i8> %x, <16 x i8> %y @@ -371,7 +371,7 @@ // WEBASSEMBLY-NEXT: ret <16 x i8> %1 } -i8x16 max_u_i8x16(i8x16 x, i8x16 y) { +u8x16 max_u_i8x16(u8x16 x, u8x16 y) { return __builtin_wasm_max_u_i8x16(x, y); // WEBASSEMBLY: %0 = icmp ugt <16 x i8> %x, %y // WEBASSEMBLY-NEXT: %1 = select <16 x i1> %0, <16 x i8> %x, <16 x i8> %y @@ -385,7 +385,7 @@ // WEBASSEMBLY-NEXT: ret <8 x i16> %1 } -i16x8 min_u_i16x8(i16x8 x, i16x8 y) { +u16x8 min_u_i16x8(u16x8 x, u16x8 y) { return __builtin_wasm_min_u_i16x8(x, y); // WEBASSEMBLY: %0 = icmp ult <8 x i16> %x, %y // WEBASSEMBLY-NEXT: %1 = select <8 x i1> %0, <8 x i16> %x, <8 x i16> %y @@ -399,7 +399,7 @@ // WEBASSEMBLY-NEXT: ret <8 x i16> %1 } -i16x8 max_u_i16x8(i16x8 x, i16x8 y) { +u16x8 max_u_i16x8(u16x8 x, u16x8 y) { return __builtin_wasm_max_u_i16x8(x, y); // WEBASSEMBLY: %0 = icmp ugt <8 x i16> %x, %y // WEBASSEMBLY-NEXT: %1 = select <8 x i1> %0, <8 x i16> %x, <8 x i16> %y @@ -413,7 +413,7 @@ // WEBASSEMBLY-NEXT: ret <4 x i32> %1 } -i32x4 min_u_i32x4(i32x4 x, i32x4 y) { +u32x4 min_u_i32x4(u32x4 x, u32x4 y) { return __builtin_wasm_min_u_i32x4(x, y); // WEBASSEMBLY: %0 = icmp ult <4 x i32> %x, %y // WEBASSEMBLY-NEXT: %1 = select <4 x i1> %0, <4 x i32> %x, <4 x i32> %y @@ -427,7 +427,7 @@ // WEBASSEMBLY-NEXT: ret <4 x i32> %1 } -i32x4 max_u_i32x4(i32x4 x, i32x4 y) { +u32x4 max_u_i32x4(u32x4 x, u32x4 y) { return __builtin_wasm_max_u_i32x4(x, y); // WEBASSEMBLY: %0 = icmp ugt <4 x i32> %x, %y // WEBASSEMBLY-NEXT: %1 = select <4 x i1> %0, <4 x i32> %x, <4 x i32> %y @@ -441,21 +441,21 @@ // WEBASSEMBLY-NEXT: ret } -i16x8 sub_saturate_u_i16x8(i16x8 x, i16x8 y) { +u16x8 sub_saturate_u_i16x8(u16x8 x, u16x8 y) { return __builtin_wasm_sub_saturate_u_i16x8(x, y); // WEBASSEMBLY: call <8 x
[PATCH] D85074: [WebAssembly] Use "signed char" instead of "char" in SIMD intrinsics.
sunfish updated this revision to Diff 282608. sunfish added a comment. - Update clang/test/CodeGen/builtins-wasm.c. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D85074/new/ https://reviews.llvm.org/D85074 Files: clang/include/clang/Basic/BuiltinsWebAssembly.def clang/lib/Headers/wasm_simd128.h clang/test/CodeGen/builtins-wasm.c Index: clang/test/CodeGen/builtins-wasm.c === --- clang/test/CodeGen/builtins-wasm.c +++ clang/test/CodeGen/builtins-wasm.c @@ -3,7 +3,7 @@ // RUN: not %clang_cc1 -triple wasm64-unknown-unknown -target-feature +nontrapping-fptoint -target-feature +exception-handling -target-feature +bulk-memory -target-feature +atomics -flax-vector-conversions=none -O3 -emit-llvm -o - %s 2>&1 | FileCheck %s -check-prefixes MISSING-SIMD // SIMD convenience types -typedef char i8x16 __attribute((vector_size(16))); +typedef signed char i8x16 __attribute((vector_size(16))); typedef short i16x8 __attribute((vector_size(16))); typedef int i32x4 __attribute((vector_size(16))); typedef long long i64x2 __attribute((vector_size(16))); @@ -201,7 +201,7 @@ // WEBASSEMBLY-NEXT: ret } -int extract_lane_u_i8x16(i8x16 v) { +int extract_lane_u_i8x16(u8x16 v) { return __builtin_wasm_extract_lane_u_i8x16(v, 13); // WEBASSEMBLY: extractelement <16 x i8> %v, i32 13 // WEBASSEMBLY-NEXT: zext @@ -215,7 +215,7 @@ // WEBASSEMBLY-NEXT: ret } -int extract_lane_u_i16x8(i16x8 v) { +int extract_lane_u_i16x8(u16x8 v) { return __builtin_wasm_extract_lane_u_i16x8(v, 7); // WEBASSEMBLY: extractelement <8 x i16> %v, i32 7 // WEBASSEMBLY-NEXT: zext @@ -291,7 +291,7 @@ // WEBASSEMBLY-NEXT: ret } -i8x16 add_saturate_u_i8x16(i8x16 x, i8x16 y) { +u8x16 add_saturate_u_i8x16(u8x16 x, u8x16 y) { return __builtin_wasm_add_saturate_u_i8x16(x, y); // WEBASSEMBLY: call <16 x i8> @llvm.uadd.sat.v16i8( // WEBASSEMBLY-SAME: <16 x i8> %x, <16 x i8> %y) @@ -305,7 +305,7 @@ // WEBASSEMBLY-NEXT: ret } -i16x8 add_saturate_u_i16x8(i16x8 x, i16x8 y) { +u16x8 add_saturate_u_i16x8(u16x8 x, u16x8 y) { return __builtin_wasm_add_saturate_u_i16x8(x, y); // WEBASSEMBLY: call <8 x i16> @llvm.uadd.sat.v8i16( // WEBASSEMBLY-SAME: <8 x i16> %x, <8 x i16> %y) @@ -319,7 +319,7 @@ // WEBASSEMBLY-NEXT: ret } -i8x16 sub_saturate_u_i8x16(i8x16 x, i8x16 y) { +u8x16 sub_saturate_u_i8x16(u8x16 x, u8x16 y) { return __builtin_wasm_sub_saturate_u_i8x16(x, y); // WEBASSEMBLY: call <16 x i8> @llvm.wasm.sub.saturate.unsigned.v16i8( // WEBASSEMBLY-SAME: <16 x i8> %x, <16 x i8> %y) @@ -357,7 +357,7 @@ // WEBASSEMBLY-NEXT: ret <16 x i8> %1 } -i8x16 min_u_i8x16(i8x16 x, i8x16 y) { +u8x16 min_u_i8x16(u8x16 x, u8x16 y) { return __builtin_wasm_min_u_i8x16(x, y); // WEBASSEMBLY: %0 = icmp ult <16 x i8> %x, %y // WEBASSEMBLY-NEXT: %1 = select <16 x i1> %0, <16 x i8> %x, <16 x i8> %y @@ -371,7 +371,7 @@ // WEBASSEMBLY-NEXT: ret <16 x i8> %1 } -i8x16 max_u_i8x16(i8x16 x, i8x16 y) { +u8x16 max_u_i8x16(u8x16 x, u8x16 y) { return __builtin_wasm_max_u_i8x16(x, y); // WEBASSEMBLY: %0 = icmp ugt <16 x i8> %x, %y // WEBASSEMBLY-NEXT: %1 = select <16 x i1> %0, <16 x i8> %x, <16 x i8> %y @@ -385,7 +385,7 @@ // WEBASSEMBLY-NEXT: ret <8 x i16> %1 } -i16x8 min_u_i16x8(i16x8 x, i16x8 y) { +u16x8 min_u_i16x8(u16x8 x, u16x8 y) { return __builtin_wasm_min_u_i16x8(x, y); // WEBASSEMBLY: %0 = icmp ult <8 x i16> %x, %y // WEBASSEMBLY-NEXT: %1 = select <8 x i1> %0, <8 x i16> %x, <8 x i16> %y @@ -399,7 +399,7 @@ // WEBASSEMBLY-NEXT: ret <8 x i16> %1 } -i16x8 max_u_i16x8(i16x8 x, i16x8 y) { +u16x8 max_u_i16x8(u16x8 x, u16x8 y) { return __builtin_wasm_max_u_i16x8(x, y); // WEBASSEMBLY: %0 = icmp ugt <8 x i16> %x, %y // WEBASSEMBLY-NEXT: %1 = select <8 x i1> %0, <8 x i16> %x, <8 x i16> %y @@ -413,7 +413,7 @@ // WEBASSEMBLY-NEXT: ret <4 x i32> %1 } -i32x4 min_u_i32x4(i32x4 x, i32x4 y) { +u32x4 min_u_i32x4(u32x4 x, u32x4 y) { return __builtin_wasm_min_u_i32x4(x, y); // WEBASSEMBLY: %0 = icmp ult <4 x i32> %x, %y // WEBASSEMBLY-NEXT: %1 = select <4 x i1> %0, <4 x i32> %x, <4 x i32> %y @@ -427,7 +427,7 @@ // WEBASSEMBLY-NEXT: ret <4 x i32> %1 } -i32x4 max_u_i32x4(i32x4 x, i32x4 y) { +u32x4 max_u_i32x4(u32x4 x, u32x4 y) { return __builtin_wasm_max_u_i32x4(x, y); // WEBASSEMBLY: %0 = icmp ugt <4 x i32> %x, %y // WEBASSEMBLY-NEXT: %1 = select <4 x i1> %0, <4 x i32> %x, <4 x i32> %y @@ -441,21 +441,21 @@ // WEBASSEMBLY-NEXT: ret } -i16x8 sub_saturate_u_i16x8(i16x8 x, i16x8 y) { +u16x8 sub_saturate_u_i16x8(u16x8 x, u16x8 y) { return __builtin_wasm_sub_saturate_u_i16x8(x, y); // WEBASSEMBLY: call <8 x i16> @llvm.wasm.sub.saturate.unsigned.v8i16( // WEBASSEMBLY-SAME: <8 x i16> %x, <8 x i16> %y) // WEBASSEMBLY-NEXT: ret } -i8x16 avgr_u_i8x16(i8x16 x, i8x16 y) { +u8x16 avgr_u_i8x16(u8x16 x, u8x16 y) { return __buil
[PATCH] D85074: [WebAssembly] Use "signed char" instead of "char" in SIMD intrinsics.
tlively accepted this revision. tlively added a comment. This revision is now accepted and ready to land. Nice! Thanks for doing that :) Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D85074/new/ https://reviews.llvm.org/D85074 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D85074: [WebAssembly] Use "signed char" instead of "char" in SIMD intrinsics.
sunfish created this revision. sunfish added a reviewer: tlively. Herald added subscribers: jgravelle-google, sbc100, dschuff. Herald added a project: clang. sunfish requested review of this revision. Herald added a subscriber: aheejin. This allows people to use `int8_t` instead of `char`, -funsigned-char, and generally decouples SIMD from the specialness of `char`. And it makes intrinsics like `__builtin_wasm_add_saturate_s_i8x16` and `__builtin_wasm_add_saturate_u_i8x16` use signed and unsigned element types, respectively. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D85074 Files: clang/include/clang/Basic/BuiltinsWebAssembly.def clang/lib/Headers/wasm_simd128.h Index: clang/lib/Headers/wasm_simd128.h === --- clang/lib/Headers/wasm_simd128.h +++ clang/lib/Headers/wasm_simd128.h @@ -18,8 +18,7 @@ // Internal types determined by clang builtin definitions typedef int32_t __v128_u __attribute__((__vector_size__(16), __aligned__(1))); -typedef char __i8x16 __attribute__((__vector_size__(16), __aligned__(16))); -typedef signed char __s8x16 +typedef signed char __i8x16 __attribute__((__vector_size__(16), __aligned__(16))); typedef unsigned char __u8x16 __attribute__((__vector_size__(16), __aligned__(16))); @@ -340,17 +339,17 @@ static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i8x16_eq(v128_t __a, v128_t __b) { - return (v128_t)((__s8x16)__a == (__s8x16)__b); + return (v128_t)((__i8x16)__a == (__i8x16)__b); } static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i8x16_ne(v128_t __a, v128_t __b) { - return (v128_t)((__s8x16)__a != (__s8x16)__b); + return (v128_t)((__i8x16)__a != (__i8x16)__b); } static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i8x16_lt(v128_t __a, v128_t __b) { - return (v128_t)((__s8x16)__a < (__s8x16)__b); + return (v128_t)((__i8x16)__a < (__i8x16)__b); } static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u8x16_lt(v128_t __a, @@ -360,7 +359,7 @@ static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i8x16_gt(v128_t __a, v128_t __b) { - return (v128_t)((__s8x16)__a > (__s8x16)__b); + return (v128_t)((__i8x16)__a > (__i8x16)__b); } static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u8x16_gt(v128_t __a, @@ -370,7 +369,7 @@ static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i8x16_le(v128_t __a, v128_t __b) { - return (v128_t)((__s8x16)__a <= (__s8x16)__b); + return (v128_t)((__i8x16)__a <= (__i8x16)__b); } static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u8x16_le(v128_t __a, @@ -380,7 +379,7 @@ static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i8x16_ge(v128_t __a, v128_t __b) { - return (v128_t)((__s8x16)__a >= (__s8x16)__b); + return (v128_t)((__i8x16)__a >= (__i8x16)__b); } static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u8x16_ge(v128_t __a, @@ -602,7 +601,7 @@ static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_i8x16_shr(v128_t __a, int32_t __b) { - return (v128_t)((__s8x16)__a >> __b); + return (v128_t)((__i8x16)__a >> __b); } static __inline__ v128_t __DEFAULT_FN_ATTRS wasm_u8x16_shr(v128_t __a, Index: clang/include/clang/Basic/BuiltinsWebAssembly.def === --- clang/include/clang/Basic/BuiltinsWebAssembly.def +++ clang/include/clang/Basic/BuiltinsWebAssembly.def @@ -66,67 +66,67 @@ TARGET_BUILTIN(__builtin_wasm_trunc_saturate_u_i64_f64, "LLid", "nc", "nontrapping-fptoint") // SIMD builtins -TARGET_BUILTIN(__builtin_wasm_swizzle_v8x16, "V16cV16cV16c", "nc", "simd128") +TARGET_BUILTIN(__builtin_wasm_swizzle_v8x16, "V16ScV16ScV16Sc", "nc", "simd128") -TARGET_BUILTIN(__builtin_wasm_extract_lane_s_i8x16, "iV16cIi", "nc", "simd128") -TARGET_BUILTIN(__builtin_wasm_extract_lane_u_i8x16, "iV16cIi", "nc", "simd128") +TARGET_BUILTIN(__builtin_wasm_extract_lane_s_i8x16, "iV16ScIi", "nc", "simd128") +TARGET_BUILTIN(__builtin_wasm_extract_lane_u_i8x16, "iV16UcIUi", "nc", "simd128") TARGET_BUILTIN(__builtin_wasm_extract_lane_s_i16x8, "iV8sIi", "nc", "simd128") -TARGET_BUILTIN(__builtin_wasm_extract_lane_u_i16x8, "iV8sIi", "nc", "simd128") +TARGET_BUILTIN(__builtin_wasm_extract_lane_u_i16x8, "iV8UsIUi", "nc", "simd128") TARGET_BUILTIN(__builtin_wasm_extract_lane_i32x4, "iV4iIi", "nc", "simd128") TARGET_BUILTIN(__builtin_wasm_extract_lane_i64x2, "LLiV2LLiIi", "nc", "simd128") TARGET_BUILTIN(__builtin_wasm_extract_lane_f32x4, "fV4fIi", "nc", "simd128") TARGET_BUILTIN(__builtin_wasm_extract_lane_f64x2, "dV2dIi", "nc", "simd128") -TARGET_BUILTIN(__builtin_wasm_replace_lane_i8x16, "V16cV16cI