diff --git a/src/librustc_trans/trans/expr.rs b/src/librustc_trans/trans/expr.rs index ceb9a29efa887..989ad0d55347d 100644 --- a/src/librustc_trans/trans/expr.rs +++ b/src/librustc_trans/trans/expr.rs @@ -1779,6 +1779,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); @@ -1789,6 +1791,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); @@ -1799,6 +1803,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 0000000000000..5257daa047af8 --- /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 or the MIT license +// , 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); +}