Skip to content

Commit 777d473

Browse files
committed
Fix transmuting from vector type to ScalarPair type
Fixes rust-lang#1292
1 parent c57aacf commit 777d473

File tree

2 files changed

+6
-1
lines changed

2 files changed

+6
-1
lines changed

example/std_example.rs

+2
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,8 @@ unsafe fn test_simd() {
164164
let cmp_eq = _mm_cmpeq_epi8(y, y);
165165
let cmp_lt = _mm_cmplt_epi8(y, y);
166166

167+
let (zero0, zero1) = std::mem::transmute::<_, (u64, u64)>(x);
168+
assert_eq!((zero0, zero1), (0, 0));
167169
assert_eq!(std::mem::transmute::<_, [u16; 8]>(or), [7, 7, 7, 7, 7, 7, 7, 7]);
168170
assert_eq!(std::mem::transmute::<_, [u16; 8]>(cmp_eq), [0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff]);
169171
assert_eq!(std::mem::transmute::<_, [u16; 8]>(cmp_lt), [0, 0, 0, 0, 0, 0, 0, 0]);

src/value_and_place.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -590,7 +590,10 @@ impl<'tcx> CPlace<'tcx> {
590590
return;
591591
}
592592
CPlaceInner::VarPair(_local, var1, var2) => {
593-
let (data1, data2) = CValue(from.0, dst_layout).load_scalar_pair(fx);
593+
let (ptr, meta) = from.force_stack(fx);
594+
assert!(meta.is_none());
595+
let (data1, data2) =
596+
CValue(CValueInner::ByRef(ptr, None), dst_layout).load_scalar_pair(fx);
594597
let (dst_ty1, dst_ty2) = fx.clif_pair_type(self.layout().ty).unwrap();
595598
transmute_value(fx, var1, data1, dst_ty1);
596599
transmute_value(fx, var2, data2, dst_ty2);

0 commit comments

Comments
 (0)