Rollup merge of #23692 - yjh0502:fix/simd-overflow, r=pnkfelix
Disable overflow checking on SIMD operations, fix #23037
This commit is contained in:
commit
4283b2ab50
2 changed files with 25 additions and 0 deletions
|
@ -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);
|
||||
|
|
19
src/test/run-pass/issue-23037.rs
Normal file
19
src/test/run-pass/issue-23037.rs
Normal file
|
@ -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);
|
||||
}
|
Loading…
Reference in a new issue