about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorManish Goregaokar <manishsmail@gmail.com>2015-03-25 17:12:14 +0530
committerManish Goregaokar <manishsmail@gmail.com>2015-03-25 19:44:08 +0530
commit4283b2ab5053eec3c7f95682e82aee9006c58eef (patch)
treee8a5c9dc6311b248cfcde17f3dfde2f66b3ff5be /src
parent5a5845dc010401dccb14954239ea60a2e27e8406 (diff)
parent1663665be0f3e7b0bef782d72a3201cf6138e55b (diff)
downloadrust-4283b2ab5053eec3c7f95682e82aee9006c58eef.tar.gz
rust-4283b2ab5053eec3c7f95682e82aee9006c58eef.zip
Rollup merge of #23692 - yjh0502:fix/simd-overflow, r=pnkfelix
Disable overflow checking on SIMD operations, fix #23037
Diffstat (limited to 'src')
-rw-r--r--src/librustc_trans/trans/expr.rs6
-rw-r--r--src/test/run-pass/issue-23037.rs19
2 files changed, 25 insertions, 0 deletions
diff --git a/src/librustc_trans/trans/expr.rs b/src/librustc_trans/trans/expr.rs
index 4d7431a20b7..ba8de6da42f 100644
--- a/src/librustc_trans/trans/expr.rs
+++ b/src/librustc_trans/trans/expr.rs
@@ -1766,6 +1766,8 @@ fn trans_eager_binop<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
       ast::BiAdd => {
         if is_float {
             FAdd(bcx, lhs, rhs, binop_debug_loc)
+        } else if is_simd {
+            Add(bcx, lhs, rhs, binop_debug_loc)
         } else {
             let (newbcx, res) = with_overflow_check(
                 bcx, OverflowOp::Add, info, lhs_t, lhs, rhs, binop_debug_loc);
@@ -1776,6 +1778,8 @@ fn trans_eager_binop<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
       ast::BiSub => {
         if is_float {
             FSub(bcx, lhs, rhs, binop_debug_loc)
+        } else if is_simd {
+            Sub(bcx, lhs, rhs, binop_debug_loc)
         } else {
             let (newbcx, res) = with_overflow_check(
                 bcx, OverflowOp::Sub, info, lhs_t, lhs, rhs, binop_debug_loc);
@@ -1786,6 +1790,8 @@ fn trans_eager_binop<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
       ast::BiMul => {
         if is_float {
             FMul(bcx, lhs, rhs, binop_debug_loc)
+        } else if is_simd {
+            Mul(bcx, lhs, rhs, binop_debug_loc)
         } else {
             let (newbcx, res) = with_overflow_check(
                 bcx, OverflowOp::Mul, info, lhs_t, lhs, rhs, binop_debug_loc);
diff --git a/src/test/run-pass/issue-23037.rs b/src/test/run-pass/issue-23037.rs
new file mode 100644
index 00000000000..5257daa047a
--- /dev/null
+++ b/src/test/run-pass/issue-23037.rs
@@ -0,0 +1,19 @@
+// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![feature(core)]
+
+use std::simd::i32x4;
+fn main() {
+    let foo = i32x4(1,2,3,4);
+    let bar = i32x4(40,30,20,10);
+    let baz = foo + bar;
+    assert!(baz.0 == 41 && baz.1 == 32 && baz.2 == 23 && baz.3 == 14);
+}