1
+ //@ add-core-stubs
1
2
//@ compile-flags: -C opt-level=0 -C no-prepopulate-passes
2
3
3
4
#![ crate_type = "lib" ]
5
+ #![ feature( no_core, repr_simd, arm_target_feature, mips_target_feature, s390x_target_feature) ]
6
+ #![ no_core]
7
+ extern crate minicore;
8
+
9
+ use minicore:: * ;
4
10
5
11
// With opaque ptrs in LLVM, `transmute` can load/store any `alloca` as any type,
6
12
// without needing to pointercast, and SRoA will turn that into a `bitcast`.
14
20
// CHECK-NEXT: ret i32 %_0
15
21
#[ no_mangle]
16
22
pub fn f32_to_bits ( x : f32 ) -> u32 {
17
- unsafe { std :: mem:: transmute ( x) }
23
+ unsafe { mem:: transmute ( x) }
18
24
}
19
25
20
26
// CHECK-LABEL: define{{.*}}i8 @bool_to_byte(i1 zeroext %b)
21
27
// CHECK: %_0 = zext i1 %b to i8
22
28
// CHECK-NEXT: ret i8 %_0
23
29
#[ no_mangle]
24
30
pub fn bool_to_byte ( b : bool ) -> u8 {
25
- unsafe { std :: mem:: transmute ( b) }
31
+ unsafe { mem:: transmute ( b) }
26
32
}
27
33
28
34
// CHECK-LABEL: define{{.*}}zeroext i1 @byte_to_bool(i8{{.*}} %byte)
29
35
// CHECK: %_0 = trunc{{( nuw)?}} i8 %byte to i1
30
36
// CHECK-NEXT: ret i1 %_0
31
37
#[ no_mangle]
32
38
pub unsafe fn byte_to_bool ( byte : u8 ) -> bool {
33
- std :: mem:: transmute ( byte)
39
+ mem:: transmute ( byte)
34
40
}
35
41
36
42
// CHECK-LABEL: define{{.*}}ptr @ptr_to_ptr(ptr %p)
37
43
// CHECK: ret ptr %p
38
44
#[ no_mangle]
39
45
pub fn ptr_to_ptr ( p : * mut u16 ) -> * mut u8 {
40
- unsafe { std :: mem:: transmute ( p) }
46
+ unsafe { mem:: transmute ( p) }
41
47
}
42
48
43
49
// CHECK: define{{.*}}[[USIZE:i[0-9]+]] @ptr_to_int(ptr %p)
44
50
// CHECK: %_0 = ptrtoint ptr %p to [[USIZE]]
45
51
// CHECK-NEXT: ret [[USIZE]] %_0
46
52
#[ no_mangle]
47
53
pub fn ptr_to_int ( p : * mut u16 ) -> usize {
48
- unsafe { std :: mem:: transmute ( p) }
54
+ unsafe { mem:: transmute ( p) }
49
55
}
50
56
51
57
// CHECK: define{{.*}}ptr @int_to_ptr([[USIZE]] %i)
52
58
// CHECK: %_0 = getelementptr i8, ptr null, [[USIZE]] %i
53
59
// CHECK-NEXT: ret ptr %_0
54
60
#[ no_mangle]
55
61
pub fn int_to_ptr ( i : usize ) -> * mut u16 {
56
- unsafe { std :: mem:: transmute ( i) }
62
+ unsafe { mem:: transmute ( i) }
57
63
}
58
64
59
65
// This is the one case where signedness matters to transmuting:
@@ -70,15 +76,15 @@ pub enum FakeBoolSigned {
70
76
// CHECK-NEXT: ret i8 %_0
71
77
#[ no_mangle]
72
78
pub fn bool_to_fake_bool_signed ( b : bool ) -> FakeBoolSigned {
73
- unsafe { std :: mem:: transmute ( b) }
79
+ unsafe { mem:: transmute ( b) }
74
80
}
75
81
76
82
// CHECK-LABEL: define{{.*}}i1 @fake_bool_signed_to_bool(i8 %b)
77
83
// CHECK: %_0 = trunc nuw i8 %b to i1
78
84
// CHECK-NEXT: ret i1 %_0
79
85
#[ no_mangle]
80
86
pub fn fake_bool_signed_to_bool ( b : FakeBoolSigned ) -> bool {
81
- unsafe { std :: mem:: transmute ( b) }
87
+ unsafe { mem:: transmute ( b) }
82
88
}
83
89
84
90
#[ repr( u8 ) ]
@@ -91,12 +97,41 @@ pub enum FakeBoolUnsigned {
91
97
// CHECK: ret i1 %b
92
98
#[ no_mangle]
93
99
pub fn bool_to_fake_bool_unsigned ( b : bool ) -> FakeBoolUnsigned {
94
- unsafe { std :: mem:: transmute ( b) }
100
+ unsafe { mem:: transmute ( b) }
95
101
}
96
102
97
103
// CHECK-LABEL: define{{.*}}i1 @fake_bool_unsigned_to_bool(i1 zeroext %b)
98
104
// CHECK: ret i1 %b
99
105
#[ no_mangle]
100
106
pub fn fake_bool_unsigned_to_bool ( b : FakeBoolUnsigned ) -> bool {
101
- unsafe { std:: mem:: transmute ( b) }
107
+ unsafe { mem:: transmute ( b) }
108
+ }
109
+
110
+ #[ repr( simd) ]
111
+ struct S ( [ i64 ; 1 ] ) ;
112
+
113
+ // CHECK-LABEL: define{{.*}}i64 @single_element_simd_to_scalar(<1 x i64> %b)
114
+ // CHECK: bitcast <1 x i64> %b to i64
115
+ // CHECK: ret i64
116
+ #[ no_mangle]
117
+ #[ cfg_attr( target_family = "wasm" , target_feature( enable = "simd128" ) ) ]
118
+ #[ cfg_attr( target_arch = "arm" , target_feature( enable = "neon" ) ) ]
119
+ #[ cfg_attr( target_arch = "x86" , target_feature( enable = "sse" ) ) ]
120
+ #[ cfg_attr( target_arch = "mips" , target_feature( enable = "msa" ) ) ]
121
+ #[ cfg_attr( target_arch = "s390x" , target_feature( enable = "vector" ) ) ]
122
+ pub extern "C" fn single_element_simd_to_scalar ( b : S ) -> i64 {
123
+ unsafe { mem:: transmute ( b) }
124
+ }
125
+
126
+ // CHECK-LABEL: define{{.*}}<1 x i64> @scalar_to_single_element_simd(i64 %b)
127
+ // CHECK: bitcast i64 %b to <1 x i64>
128
+ // CHECK: ret <1 x i64>
129
+ #[ no_mangle]
130
+ #[ cfg_attr( target_family = "wasm" , target_feature( enable = "simd128" ) ) ]
131
+ #[ cfg_attr( target_arch = "arm" , target_feature( enable = "neon" ) ) ]
132
+ #[ cfg_attr( target_arch = "x86" , target_feature( enable = "sse" ) ) ]
133
+ #[ cfg_attr( target_arch = "mips" , target_feature( enable = "msa" ) ) ]
134
+ #[ cfg_attr( target_arch = "s390x" , target_feature( enable = "vector" ) ) ]
135
+ pub extern "C" fn scalar_to_single_element_simd ( b : i64 ) -> S {
136
+ unsafe { mem:: transmute ( b) }
102
137
}
0 commit comments