Skip to content

Commit 8051242

Browse files
committed
Fix SwitchInt on 128bit integers
1 parent 4a48a39 commit 8051242

File tree

3 files changed

+13
-297
lines changed

3 files changed

+13
-297
lines changed

example/mini_core.rs

+4
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,10 @@ impl<T: ?Sized> PartialEq for *const T {
336336
}
337337
}
338338

339+
pub fn is_true(a: bool) -> u8 {
340+
if a { 1 } else { 0 }
341+
}
342+
339343
#[lang = "neg"]
340344
pub trait Neg {
341345
type Output;

example/std_example.rs

+8-296
Original file line numberDiff line numberDiff line change
@@ -1,300 +1,12 @@
1-
#![feature(core_intrinsics, generators, generator_trait, is_sorted)]
2-
3-
use std::arch::x86_64::*;
4-
use std::io::Write;
5-
use std::ops::Generator;
6-
71
fn main() {
8-
println!("{:?}", std::env::args().collect::<Vec<_>>());
9-
10-
let mutex = std::sync::Mutex::new(());
11-
let _guard = mutex.lock().unwrap();
12-
13-
let _ = ::std::iter::repeat('a' as u8).take(10).collect::<Vec<_>>();
14-
let stderr = ::std::io::stderr();
15-
let mut stderr = stderr.lock();
16-
17-
std::thread::spawn(move || {
18-
println!("Hello from another thread!");
19-
});
20-
21-
writeln!(stderr, "some {} text", "<unknown>").unwrap();
22-
23-
let _ = std::process::Command::new("true").env("c", "d").spawn();
24-
25-
println!("cargo:rustc-link-lib=z");
26-
27-
static ONCE: std::sync::Once = std::sync::Once::new();
28-
ONCE.call_once(|| {});
29-
30-
let _eq = LoopState::Continue(()) == LoopState::Break(());
31-
32-
// Make sure ByValPair values with differently sized components are correctly passed
33-
map(None::<(u8, Box<Instruction>)>);
34-
35-
println!("{}", 2.3f32.exp());
36-
println!("{}", 2.3f32.exp2());
37-
println!("{}", 2.3f32.abs());
38-
println!("{}", 2.3f32.sqrt());
39-
println!("{}", 2.3f32.floor());
40-
println!("{}", 2.3f32.ceil());
41-
println!("{}", 2.3f32.min(1.0));
42-
println!("{}", 2.3f32.max(1.0));
43-
println!("{}", 2.3f32.powi(2));
44-
println!("{}", 2.3f32.log2());
45-
assert_eq!(2.3f32.copysign(-1.0), -2.3f32);
46-
println!("{}", 2.3f32.powf(2.0));
47-
48-
assert_eq!(-128i8, (-128i8).saturating_sub(1));
49-
assert_eq!(127i8, 127i8.saturating_sub(-128));
50-
assert_eq!(-128i8, (-128i8).saturating_add(-128));
51-
assert_eq!(127i8, 127i8.saturating_add(1));
52-
53-
assert_eq!(0b0000000000000000000000000010000010000000000000000000000000000000_0000000000100000000000000000000000001000000000000100000000000000u128.leading_zeros(), 26);
54-
assert_eq!(0b0000000000000000000000000010000000000000000000000000000000000000_0000000000000000000000000000000000001000000000000000000010000000u128.trailing_zeros(), 7);
55-
56-
let _d = 0i128.checked_div(2i128);
57-
let _d = 0u128.checked_div(2u128);
58-
assert_eq!(1u128 + 2, 3);
59-
60-
assert_eq!(0b100010000000000000000000000000000u128 >> 10, 0b10001000000000000000000u128);
61-
assert_eq!(0xFEDCBA987654321123456789ABCDEFu128 >> 64, 0xFEDCBA98765432u128);
62-
assert_eq!(0xFEDCBA987654321123456789ABCDEFu128 as i128 >> 64, 0xFEDCBA98765432i128);
63-
64-
let tmp = 353985398u128;
65-
assert_eq!(tmp * 932490u128, 330087843781020u128);
66-
67-
let tmp = -0x1234_5678_9ABC_DEF0i64;
68-
assert_eq!(tmp as i128, -0x1234_5678_9ABC_DEF0i128);
69-
70-
// Check that all u/i128 <-> float casts work correctly.
71-
let houndred_u128 = 100u128;
72-
let houndred_i128 = 100i128;
73-
let houndred_f32 = 100.0f32;
74-
let houndred_f64 = 100.0f64;
75-
assert_eq!(houndred_u128 as f32, 100.0);
76-
assert_eq!(houndred_u128 as f64, 100.0);
77-
assert_eq!(houndred_f32 as u128, 100);
78-
assert_eq!(houndred_f64 as u128, 100);
79-
assert_eq!(houndred_i128 as f32, 100.0);
80-
assert_eq!(houndred_i128 as f64, 100.0);
81-
assert_eq!(houndred_f32 as i128, 100);
82-
assert_eq!(houndred_f64 as i128, 100);
83-
84-
// Test signed 128bit comparing
85-
let max = usize::MAX as i128;
86-
if 100i128 < 0i128 || 100i128 > max {
87-
panic!();
88-
}
89-
90-
test_checked_mul();
91-
92-
let _a = 1u32 << 2u8;
93-
94-
let empty: [i32; 0] = [];
95-
assert!(empty.is_sorted());
96-
97-
println!("{:?}", std::intrinsics::caller_location());
98-
99-
unsafe {
100-
test_simd();
101-
}
102-
103-
Box::pin(move |mut _task_context| {
104-
yield ();
105-
}).as_mut().resume(0);
106-
}
107-
108-
#[target_feature(enable = "sse2")]
109-
unsafe fn test_simd() {
110-
let x = _mm_setzero_si128();
111-
let y = _mm_set1_epi16(7);
112-
let or = _mm_or_si128(x, y);
113-
let cmp_eq = _mm_cmpeq_epi8(y, y);
114-
let cmp_lt = _mm_cmplt_epi8(y, y);
115-
116-
assert_eq!(std::mem::transmute::<_, [u16; 8]>(or), [7, 7, 7, 7, 7, 7, 7, 7]);
117-
assert_eq!(std::mem::transmute::<_, [u16; 8]>(cmp_eq), [0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff]);
118-
assert_eq!(std::mem::transmute::<_, [u16; 8]>(cmp_lt), [0, 0, 0, 0, 0, 0, 0, 0]);
119-
120-
test_mm_slli_si128();
121-
test_mm_movemask_epi8();
122-
test_mm256_movemask_epi8();
123-
test_mm_add_epi8();
124-
test_mm_add_pd();
125-
test_mm_cvtepi8_epi16();
126-
test_mm_cvtsi128_si64();
127-
128-
// FIXME(#666) implement `#[rustc_arg_required_const(..)]` support
129-
//test_mm_extract_epi8();
130-
131-
let mask1 = _mm_movemask_epi8(dbg!(_mm_setr_epi8(255u8 as i8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)));
132-
assert_eq!(mask1, 1);
133-
}
134-
135-
#[target_feature(enable = "sse2")]
136-
unsafe fn test_mm_slli_si128() {
137-
#[rustfmt::skip]
138-
let a = _mm_setr_epi8(
139-
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
140-
);
141-
let r = _mm_slli_si128(a, 1);
142-
let e = _mm_setr_epi8(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
143-
assert_eq_m128i(r, e);
144-
145-
#[rustfmt::skip]
146-
let a = _mm_setr_epi8(
147-
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
148-
);
149-
let r = _mm_slli_si128(a, 15);
150-
let e = _mm_setr_epi8(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);
151-
assert_eq_m128i(r, e);
152-
153-
#[rustfmt::skip]
154-
let a = _mm_setr_epi8(
155-
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
156-
);
157-
let r = _mm_slli_si128(a, 16);
158-
assert_eq_m128i(r, _mm_set1_epi8(0));
159-
160-
#[rustfmt::skip]
161-
let a = _mm_setr_epi8(
162-
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
163-
);
164-
let r = _mm_slli_si128(a, -1);
165-
assert_eq_m128i(_mm_set1_epi8(0), r);
166-
167-
#[rustfmt::skip]
168-
let a = _mm_setr_epi8(
169-
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
170-
);
171-
let r = _mm_slli_si128(a, -0x80000000);
172-
assert_eq_m128i(r, _mm_set1_epi8(0));
173-
}
174-
175-
#[target_feature(enable = "sse2")]
176-
unsafe fn test_mm_movemask_epi8() {
177-
#[rustfmt::skip]
178-
let a = _mm_setr_epi8(
179-
0b1000_0000u8 as i8, 0b0, 0b1000_0000u8 as i8, 0b01,
180-
0b0101, 0b1111_0000u8 as i8, 0, 0,
181-
0, 0, 0b1111_0000u8 as i8, 0b0101,
182-
0b01, 0b1000_0000u8 as i8, 0b0, 0b1000_0000u8 as i8,
183-
);
184-
let r = _mm_movemask_epi8(a);
185-
assert_eq!(r, 0b10100100_00100101);
186-
}
187-
188-
#[target_feature(enable = "avx2")]
189-
unsafe fn test_mm256_movemask_epi8() {
190-
let a = _mm256_set1_epi8(-1);
191-
let r = _mm256_movemask_epi8(a);
192-
let e = -1;
193-
assert_eq!(r, e);
194-
}
195-
196-
#[target_feature(enable = "sse2")]
197-
unsafe fn test_mm_add_epi8() {
198-
let a = _mm_setr_epi8(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
199-
#[rustfmt::skip]
200-
let b = _mm_setr_epi8(
201-
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
202-
);
203-
let r = _mm_add_epi8(a, b);
204-
#[rustfmt::skip]
205-
let e = _mm_setr_epi8(
206-
16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46,
207-
);
208-
assert_eq_m128i(r, e);
209-
}
210-
211-
#[target_feature(enable = "sse2")]
212-
unsafe fn test_mm_add_pd() {
213-
let a = _mm_setr_pd(1.0, 2.0);
214-
let b = _mm_setr_pd(5.0, 10.0);
215-
let r = _mm_add_pd(a, b);
216-
assert_eq_m128d(r, _mm_setr_pd(6.0, 12.0));
217-
}
218-
219-
fn assert_eq_m128i(x: std::arch::x86_64::__m128i, y: std::arch::x86_64::__m128i) {
220-
unsafe {
221-
assert_eq!(std::mem::transmute::<_, [u8; 16]>(x), std::mem::transmute::<_, [u8; 16]>(y));
222-
}
223-
}
224-
225-
#[target_feature(enable = "sse2")]
226-
pub unsafe fn assert_eq_m128d(a: __m128d, b: __m128d) {
227-
if _mm_movemask_pd(_mm_cmpeq_pd(a, b)) != 0b11 {
228-
panic!("{:?} != {:?}", a, b);
229-
}
230-
}
231-
232-
#[target_feature(enable = "sse2")]
233-
unsafe fn test_mm_cvtsi128_si64() {
234-
let r = _mm_cvtsi128_si64(std::mem::transmute::<[i64; 2], _>([5, 0]));
235-
assert_eq!(r, 5);
236-
}
237-
238-
#[target_feature(enable = "sse4.1")]
239-
unsafe fn test_mm_cvtepi8_epi16() {
240-
let a = _mm_set1_epi8(10);
241-
let r = _mm_cvtepi8_epi16(a);
242-
let e = _mm_set1_epi16(10);
243-
assert_eq_m128i(r, e);
244-
let a = _mm_set1_epi8(-10);
245-
let r = _mm_cvtepi8_epi16(a);
246-
let e = _mm_set1_epi16(-10);
247-
assert_eq_m128i(r, e);
248-
}
249-
250-
#[target_feature(enable = "sse4.1")]
251-
unsafe fn test_mm_extract_epi8() {
252-
#[rustfmt::skip]
253-
let a = _mm_setr_epi8(
254-
-1, 1, 2, 3, 4, 5, 6, 7,
255-
8, 9, 10, 11, 12, 13, 14, 15
256-
);
257-
let r1 = _mm_extract_epi8(a, 0);
258-
let r2 = _mm_extract_epi8(a, 19);
259-
assert_eq!(r1, 0xFF);
260-
assert_eq!(r2, 3);
261-
}
262-
263-
fn test_checked_mul() {
264-
let u: Option<u8> = u8::from_str_radix("1000", 10).ok();
265-
assert_eq!(u, None);
266-
267-
assert_eq!(1u8.checked_mul(255u8), Some(255u8));
268-
assert_eq!(255u8.checked_mul(255u8), None);
269-
assert_eq!(1i8.checked_mul(127i8), Some(127i8));
270-
assert_eq!(127i8.checked_mul(127i8), None);
271-
assert_eq!((-1i8).checked_mul(-127i8), Some(127i8));
272-
assert_eq!(1i8.checked_mul(-128i8), Some(-128i8));
273-
assert_eq!((-128i8).checked_mul(-128i8), None);
274-
275-
assert_eq!(1u64.checked_mul(u64::max_value()), Some(u64::max_value()));
276-
assert_eq!(u64::max_value().checked_mul(u64::max_value()), None);
277-
assert_eq!(1i64.checked_mul(i64::max_value()), Some(i64::max_value()));
278-
assert_eq!(i64::max_value().checked_mul(i64::max_value()), None);
279-
assert_eq!((-1i64).checked_mul(i64::min_value() + 1), Some(i64::max_value()));
280-
assert_eq!(1i64.checked_mul(i64::min_value()), Some(i64::min_value()));
281-
assert_eq!(i64::min_value().checked_mul(i64::min_value()), None);
282-
}
283-
284-
#[derive(PartialEq)]
285-
enum LoopState {
286-
Continue(()),
287-
Break(())
288-
}
289-
290-
pub enum Instruction {
291-
Increment,
292-
Loop,
2+
let options = [1u128];
3+
match options[0] {
4+
1 => (),
5+
0 => loop {},
6+
v => panic(v),
7+
};
2938
}
2949

295-
fn map(a: Option<(u8, Box<Instruction>)>) -> Option<Box<Instruction>> {
296-
match a {
297-
None => None,
298-
Some((_, instr)) => Some(instr),
299-
}
10+
fn panic(v: u128) -> !{
11+
panic!("{}", v)
30012
}

src/base.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ fn codegen_fn_content(fx: &mut FunctionCx<'_, '_, impl Backend>) {
282282
let mut switch = ::cranelift_frontend::Switch::new();
283283
for (i, value) in values.iter().enumerate() {
284284
let block = fx.get_block(targets[i]);
285-
switch.set_entry(*value as u64, block);
285+
switch.set_entry(*value, block);
286286
}
287287
let otherwise_block = fx.get_block(targets[targets.len() - 1]);
288288
switch.emit(&mut fx.bcx, discr, otherwise_block);

0 commit comments

Comments
 (0)