From 8658a433f2ad46e5834d2168a73df9cae88c29e5 Mon Sep 17 00:00:00 2001 From: Richard Diamond Date: Tue, 21 Jan 2014 23:12:41 -0600 Subject: [PATCH 1/3] Allow SIMD types in generics. Closes #10604 --- src/librustc/middle/trans/adt.rs | 18 ++++++++------ src/test/run-pass/simd-generics.rs | 34 +++++++++++++++++++++++++++ src/test/run-pass/simd-issue-10604.rs | 13 ++++++++++ 3 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 src/test/run-pass/simd-generics.rs create mode 100644 src/test/run-pass/simd-issue-10604.rs diff --git a/src/librustc/middle/trans/adt.rs b/src/librustc/middle/trans/adt.rs index 7b194690b2f23..5a3d226fa3c0a 100644 --- a/src/librustc/middle/trans/adt.rs +++ b/src/librustc/middle/trans/adt.rs @@ -46,6 +46,7 @@ use std::container::Map; use std::libc::c_ulonglong; use std::option::{Option, Some, None}; +use std::num::{Bitwise}; use lib::llvm::{ValueRef, True, IntEQ, IntNE}; use middle::trans::_match; @@ -424,19 +425,22 @@ fn generic_type_of(cx: &CrateContext, r: &Repr, name: Option<&str>, sizing: bool let align = most_aligned.align; let discr_ty = ll_inttype(cx, ity); let discr_size = machine::llsize_of_alloc(cx, discr_ty) as u64; + let align_units = (size + align - 1) / align - 1; let pad_ty = match align { - 1 => Type::i8(), - 2 => Type::i16(), - 4 => Type::i32(), - 8 if machine::llalign_of_min(cx, Type::i64()) == 8 => Type::i64(), + 1 => Type::array(&Type::i8(), align_units), + 2 => Type::array(&Type::i16(), align_units), + 4 => Type::array(&Type::i32(), align_units), + 8 if machine::llalign_of_min(cx, Type::i64()) == 8 => + Type::array(&Type::i64(), align_units), + a if a.population_count() == 1 => Type::array(&Type::vector(&Type::i32(), a / 4), + align_units), _ => fail!("Unsupported enum alignment: {:?}", align) }; assert_eq!(machine::llalign_of_min(cx, pad_ty) as u64, align); - let align_units = (size + align - 1) / align; assert_eq!(align % discr_size, 0); let fields = ~[discr_ty, - Type::array(&discr_ty, align / discr_size - 1), - Type::array(&pad_ty, align_units - 1)]; + Type::array(&discr_ty, align / discr_size - 1), + pad_ty]; match name { None => Type::struct_(fields, false), Some(name) => { diff --git a/src/test/run-pass/simd-generics.rs b/src/test/run-pass/simd-generics.rs new file mode 100644 index 0000000000000..c6d5f91961602 --- /dev/null +++ b/src/test/run-pass/simd-generics.rs @@ -0,0 +1,34 @@ +// Copyright 2013 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. + +use std::ops; + +#[simd] struct f32x4(f32, f32, f32, f32); + +fn add>(lhs: T, rhs: T) -> T { + lhs + rhs +} + +impl ops::Add for f32x4 { + fn add(&self, rhs: &f32x4) -> f32x4 { + *self + *rhs + } +} + +fn main() { + let lr = f32x4(1.0f32, 2.0f32, 3.0f32, 4.0f32); + + // lame-o + let f32x4(x, y, z, w) = add(lr, lr); + assert_eq!(x, 2.0f32); + assert_eq!(y, 4.0f32); + assert_eq!(z, 6.0f32); + assert_eq!(w, 8.0f32); +} diff --git a/src/test/run-pass/simd-issue-10604.rs b/src/test/run-pass/simd-issue-10604.rs new file mode 100644 index 0000000000000..49aa87f3e26a0 --- /dev/null +++ b/src/test/run-pass/simd-issue-10604.rs @@ -0,0 +1,13 @@ +// Copyright 2013 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. + +fn main() { + let _o = None::; +} From 63ba2e1219088514b578bf81c0481baaeb6e941e Mon Sep 17 00:00:00 2001 From: Richard Diamond Date: Tue, 4 Feb 2014 01:04:19 -0600 Subject: [PATCH 2/3] Simd feature gating + Win32/64 fixes. --- src/test/run-pass/simd-generics.rs | 4 +++- src/test/run-pass/simd-issue-10604.rs | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/test/run-pass/simd-generics.rs b/src/test/run-pass/simd-generics.rs index c6d5f91961602..9b48387789dd2 100644 --- a/src/test/run-pass/simd-generics.rs +++ b/src/test/run-pass/simd-generics.rs @@ -8,6 +8,8 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +#[feature(simd)]; + use std::ops; #[simd] struct f32x4(f32, f32, f32, f32); @@ -22,7 +24,7 @@ impl ops::Add for f32x4 { } } -fn main() { +pub fn main() { let lr = f32x4(1.0f32, 2.0f32, 3.0f32, 4.0f32); // lame-o diff --git a/src/test/run-pass/simd-issue-10604.rs b/src/test/run-pass/simd-issue-10604.rs index 49aa87f3e26a0..cf0f020f43962 100644 --- a/src/test/run-pass/simd-issue-10604.rs +++ b/src/test/run-pass/simd-issue-10604.rs @@ -7,7 +7,9 @@ // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. +#[allow(experimental)]; +#[feature(simd)]; -fn main() { +pub fn main() { let _o = None::; } From 7becc0f34cdbf7cc3ec31757ec2a566560e9ff62 Mon Sep 17 00:00:00 2001 From: Richard Diamond Date: Tue, 4 Feb 2014 02:26:02 -0600 Subject: [PATCH 3/3] Added missing xfail-fast. --- src/test/run-pass/simd-generics.rs | 2 ++ src/test/run-pass/simd-issue-10604.rs | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/test/run-pass/simd-generics.rs b/src/test/run-pass/simd-generics.rs index 9b48387789dd2..900d2befea432 100644 --- a/src/test/run-pass/simd-generics.rs +++ b/src/test/run-pass/simd-generics.rs @@ -8,6 +8,8 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +// xfail-fast + #[feature(simd)]; use std::ops; diff --git a/src/test/run-pass/simd-issue-10604.rs b/src/test/run-pass/simd-issue-10604.rs index cf0f020f43962..4132ec0059ff9 100644 --- a/src/test/run-pass/simd-issue-10604.rs +++ b/src/test/run-pass/simd-issue-10604.rs @@ -7,6 +7,9 @@ // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. + +// xfail-fast + #[allow(experimental)]; #[feature(simd)];