diff options
author | Arthur Cohen <arthur.cohen@embecosm.com> | 2022-10-26 15:57:54 +0200 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2023-02-21 12:36:42 +0100 |
commit | 1c586a1d1c12dce2a65fb117b577a73ad5cf45ea (patch) | |
tree | e17a7e330a6e97e19f5506bcb54128f31be3306d /gcc/testsuite/rust | |
parent | a7c8f7ee34334edec4b57db547de1c8b5d0ad31d (diff) | |
download | gcc-1c586a1d1c12dce2a65fb117b577a73ad5cf45ea.zip gcc-1c586a1d1c12dce2a65fb117b577a73ad5cf45ea.tar.gz gcc-1c586a1d1c12dce2a65fb117b577a73ad5cf45ea.tar.bz2 |
gccrs: intrinsics: Add unchecked operation intrinsics
gcc/rust/ChangeLog:
* backend/rust-compile-intrinsic.cc (is_basic_integer_type): New function.
(unchecked_op_inner): New handler.
(unchecked_op_handler): New handler.
gcc/testsuite/ChangeLog:
* rust/compile/torture/intrinsics-6.rs: New test.
* rust/compile/torture/intrinsics-7.rs: New test.
Diffstat (limited to 'gcc/testsuite/rust')
-rw-r--r-- | gcc/testsuite/rust/compile/torture/intrinsics-6.rs | 21 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/torture/intrinsics-7.rs | 10 |
2 files changed, 31 insertions, 0 deletions
diff --git a/gcc/testsuite/rust/compile/torture/intrinsics-6.rs b/gcc/testsuite/rust/compile/torture/intrinsics-6.rs new file mode 100644 index 0000000..143b62a --- /dev/null +++ b/gcc/testsuite/rust/compile/torture/intrinsics-6.rs @@ -0,0 +1,21 @@ +extern "rust-intrinsic" { + pub fn unchecked_add<T>(x: T, y: T) -> T; + pub fn unchecked_sub<T>(x: T, y: T) -> T; + pub fn unchecked_mul<T>(x: T, y: T) -> T; + pub fn unchecked_div<T>(x: T, y: T) -> T; + pub fn unchecked_rem<T>(x: T, y: T) -> T; + pub fn unchecked_shl<T>(x: T, y: T) -> T; + pub fn unchecked_shr<T>(x: T, y: T) -> T; +} + +fn main() -> i32 { + let zero0 = unsafe { (1 + 5) - unchecked_add(1, 5) }; + let zero1 = unsafe { (1 - 5) - unchecked_sub(1, 5) }; + let zero2 = unsafe { (1 * 5) - unchecked_mul(1, 5) }; + let zero3 = unsafe { (1 / 5) - unchecked_div(1, 5) }; + let zero4 = unsafe { (1 % 5) - unchecked_rem(1, 5) }; + let zero5 = unsafe { (1 << 5) - unchecked_shl(1, 5) }; + let zero6 = unsafe { (1 >> 5) - unchecked_shr(1, 5) }; + + zero0 + zero1 + zero2 + zero3 + zero4 + zero5 + zero6 +} diff --git a/gcc/testsuite/rust/compile/torture/intrinsics-7.rs b/gcc/testsuite/rust/compile/torture/intrinsics-7.rs new file mode 100644 index 0000000..8e8c5fe --- /dev/null +++ b/gcc/testsuite/rust/compile/torture/intrinsics-7.rs @@ -0,0 +1,10 @@ +extern "rust-intrinsic" { + pub fn unchecked_add<T>(x: T, y: T) -> T; + // { dg-error "unchecked operation intrinsics can only be used with basic integer types .got .NotAdd.." "" { target *-*-* } .-1 } +} + +fn main() { + struct NotAdd; + + unsafe { unchecked_add(NotAdd, NotAdd) }; +} |