8
8
#![ allow( internal_features) ]
9
9
#![ cfg_attr( thumb, no_main) ]
10
10
#![ deny( dead_code) ]
11
+ #![ feature( allocator_api) ]
11
12
#![ feature( bench_black_box) ]
13
+ #![ feature( f128) ]
14
+ #![ feature( f16) ]
12
15
#![ feature( lang_items) ]
13
16
#![ feature( start) ]
14
- #![ feature( allocator_api) ]
15
17
#![ no_std]
16
18
17
19
extern crate panic_handler;
@@ -26,126 +28,132 @@ extern "C" {}
26
28
// have an additional comment: the function name is the ARM name for the intrinsic and the comment
27
29
// in the non-ARM name for the intrinsic.
28
30
mod intrinsics {
29
- // truncdfsf2
30
- pub fn aeabi_d2f ( x : f64 ) -> f32 {
31
- x as f32
31
+ /* f32 operations */
32
+
33
+ // extendsfdf2
34
+ pub fn aeabi_f2d ( x : f32 ) -> f64 {
35
+ x as f64
32
36
}
33
37
34
- // fixdfsi
35
- pub fn aeabi_d2i ( x : f64 ) -> i32 {
38
+ // fixsfsi
39
+ pub fn aeabi_f2iz ( x : f32 ) -> i32 {
36
40
x as i32
37
41
}
38
42
39
- // fixdfdi
40
- pub fn aeabi_d2l ( x : f64 ) -> i64 {
43
+ // fixsfdi
44
+ pub fn aeabi_f2lz ( x : f32 ) -> i64 {
41
45
x as i64
42
46
}
43
47
44
- // fixunsdfsi
45
- pub fn aeabi_d2uiz ( x : f64 ) -> u32 {
48
+ // fixunssfsi
49
+ pub fn aeabi_f2uiz ( x : f32 ) -> u32 {
46
50
x as u32
47
51
}
48
52
49
- // fixunsdfdi
50
- pub fn aeabi_d2ulz ( x : f64 ) -> u64 {
53
+ // fixunssfdi
54
+ pub fn aeabi_f2ulz ( x : f32 ) -> u64 {
51
55
x as u64
52
56
}
53
57
54
- // adddf3
55
- pub fn aeabi_dadd ( a : f64 , b : f64 ) -> f64 {
58
+ // addsf3
59
+ pub fn aeabi_fadd ( a : f32 , b : f32 ) -> f32 {
56
60
a + b
57
61
}
58
62
59
- // eqdf2
60
- pub fn aeabi_dcmpeq ( a : f64 , b : f64 ) -> bool {
63
+ // eqsf2
64
+ pub fn aeabi_fcmpeq ( a : f32 , b : f32 ) -> bool {
61
65
a == b
62
66
}
63
67
64
- // gtdf2
65
- pub fn aeabi_dcmpgt ( a : f64 , b : f64 ) -> bool {
68
+ // gtsf2
69
+ pub fn aeabi_fcmpgt ( a : f32 , b : f32 ) -> bool {
66
70
a > b
67
71
}
68
72
69
- // ltdf2
70
- pub fn aeabi_dcmplt ( a : f64 , b : f64 ) -> bool {
73
+ // ltsf2
74
+ pub fn aeabi_fcmplt ( a : f32 , b : f32 ) -> bool {
71
75
a < b
72
76
}
73
77
74
- // divdf3
75
- pub fn aeabi_ddiv ( a : f64 , b : f64 ) -> f64 {
78
+ // divsf3
79
+ pub fn aeabi_fdiv ( a : f32 , b : f32 ) -> f32 {
76
80
a / b
77
81
}
78
82
79
- // muldf3
80
- pub fn aeabi_dmul ( a : f64 , b : f64 ) -> f64 {
83
+ // mulsf3
84
+ pub fn aeabi_fmul ( a : f32 , b : f32 ) -> f32 {
81
85
a * b
82
86
}
83
87
84
- // subdf3
85
- pub fn aeabi_dsub ( a : f64 , b : f64 ) -> f64 {
88
+ // subsf3
89
+ pub fn aeabi_fsub ( a : f32 , b : f32 ) -> f32 {
86
90
a - b
87
91
}
88
92
89
- // extendsfdf2
90
- pub fn aeabi_f2d ( x : f32 ) -> f64 {
91
- x as f64
93
+ /* f64 operations */
94
+
95
+ // truncdfsf2
96
+ pub fn aeabi_d2f ( x : f64 ) -> f32 {
97
+ x as f32
92
98
}
93
99
94
- // fixsfsi
95
- pub fn aeabi_f2iz ( x : f32 ) -> i32 {
100
+ // fixdfsi
101
+ pub fn aeabi_d2i ( x : f64 ) -> i32 {
96
102
x as i32
97
103
}
98
104
99
- // fixsfdi
100
- pub fn aeabi_f2lz ( x : f32 ) -> i64 {
105
+ // fixdfdi
106
+ pub fn aeabi_d2l ( x : f64 ) -> i64 {
101
107
x as i64
102
108
}
103
109
104
- // fixunssfsi
105
- pub fn aeabi_f2uiz ( x : f32 ) -> u32 {
110
+ // fixunsdfsi
111
+ pub fn aeabi_d2uiz ( x : f64 ) -> u32 {
106
112
x as u32
107
113
}
108
114
109
- // fixunssfdi
110
- pub fn aeabi_f2ulz ( x : f32 ) -> u64 {
115
+ // fixunsdfdi
116
+ pub fn aeabi_d2ulz ( x : f64 ) -> u64 {
111
117
x as u64
112
118
}
113
119
114
- // addsf3
115
- pub fn aeabi_fadd ( a : f32 , b : f32 ) -> f32 {
120
+ // adddf3
121
+ pub fn aeabi_dadd ( a : f64 , b : f64 ) -> f64 {
116
122
a + b
117
123
}
118
124
119
- // eqsf2
120
- pub fn aeabi_fcmpeq ( a : f32 , b : f32 ) -> bool {
125
+ // eqdf2
126
+ pub fn aeabi_dcmpeq ( a : f64 , b : f64 ) -> bool {
121
127
a == b
122
128
}
123
129
124
- // gtsf2
125
- pub fn aeabi_fcmpgt ( a : f32 , b : f32 ) -> bool {
130
+ // gtdf2
131
+ pub fn aeabi_dcmpgt ( a : f64 , b : f64 ) -> bool {
126
132
a > b
127
133
}
128
134
129
- // ltsf2
130
- pub fn aeabi_fcmplt ( a : f32 , b : f32 ) -> bool {
135
+ // ltdf2
136
+ pub fn aeabi_dcmplt ( a : f64 , b : f64 ) -> bool {
131
137
a < b
132
138
}
133
139
134
- // divsf3
135
- pub fn aeabi_fdiv ( a : f32 , b : f32 ) -> f32 {
140
+ // divdf3
141
+ pub fn aeabi_ddiv ( a : f64 , b : f64 ) -> f64 {
136
142
a / b
137
143
}
138
144
139
- // mulsf3
140
- pub fn aeabi_fmul ( a : f32 , b : f32 ) -> f32 {
145
+ // muldf3
146
+ pub fn aeabi_dmul ( a : f64 , b : f64 ) -> f64 {
141
147
a * b
142
148
}
143
149
144
- // subsf3
145
- pub fn aeabi_fsub ( a : f32 , b : f32 ) -> f32 {
150
+ // subdf3
151
+ pub fn aeabi_dsub ( a : f64 , b : f64 ) -> f64 {
146
152
a - b
147
153
}
148
154
155
+ /* i32 operations */
156
+
149
157
// floatsidf
150
158
pub fn aeabi_i2d ( x : i32 ) -> f64 {
151
159
x as f64
@@ -164,26 +172,52 @@ mod intrinsics {
164
172
a % b
165
173
}
166
174
175
+ /* i64 operations */
176
+
177
+ // floatdisf
178
+ pub fn aeabi_l2f ( x : i64 ) -> f32 {
179
+ x as f32
180
+ }
181
+
167
182
// floatdidf
168
183
pub fn aeabi_l2d ( x : i64 ) -> f64 {
169
184
x as f64
170
185
}
171
186
172
- // floatdisf
173
- pub fn aeabi_l2f ( x : i64 ) -> f32 {
174
- x as f32
187
+ pub fn mulodi4 ( a : i64 , b : i64 ) -> i64 {
188
+ a * b
175
189
}
176
190
177
191
// divdi3
178
192
pub fn aeabi_ldivmod ( a : i64 , b : i64 ) -> i64 {
179
193
a / b
180
194
}
181
195
196
+ pub fn moddi3 ( a : i64 , b : i64 ) -> i64 {
197
+ a % b
198
+ }
199
+
182
200
// muldi3
183
201
pub fn aeabi_lmul ( a : i64 , b : i64 ) -> i64 {
184
202
a. wrapping_mul ( b)
185
203
}
186
204
205
+ /* i128 operations */
206
+
207
+ pub fn lshrti3 ( a : i128 , b : usize ) -> i128 {
208
+ a >> b
209
+ }
210
+
211
+ pub fn divti3 ( a : i128 , b : i128 ) -> i128 {
212
+ a / b
213
+ }
214
+
215
+ pub fn modti3 ( a : i128 , b : i128 ) -> i128 {
216
+ a % b
217
+ }
218
+
219
+ /* u32 operations */
220
+
187
221
// floatunsidf
188
222
pub fn aeabi_ui2d ( x : u32 ) -> f64 {
189
223
x as f64
@@ -202,33 +236,29 @@ mod intrinsics {
202
236
a % b
203
237
}
204
238
205
- // floatundidf
206
- pub fn aeabi_ul2d ( x : u64 ) -> f64 {
207
- x as f64
208
- }
239
+ /* u64 operations */
209
240
210
241
// floatundisf
211
242
pub fn aeabi_ul2f ( x : u64 ) -> f32 {
212
243
x as f32
213
244
}
214
245
215
- // udivdi3
216
- pub fn aeabi_uldivmod ( a : u64 , b : u64 ) -> u64 {
217
- a * b
218
- }
219
-
220
- pub fn moddi3 ( a : i64 , b : i64 ) -> i64 {
221
- a % b
246
+ // floatundidf
247
+ pub fn aeabi_ul2d ( x : u64 ) -> f64 {
248
+ x as f64
222
249
}
223
250
224
- pub fn mulodi4 ( a : i64 , b : i64 ) -> i64 {
251
+ // udivdi3
252
+ pub fn aeabi_uldivmod ( a : u64 , b : u64 ) -> u64 {
225
253
a * b
226
254
}
227
255
228
256
pub fn umoddi3 ( a : u64 , b : u64 ) -> u64 {
229
257
a % b
230
258
}
231
259
260
+ /* u128 operations */
261
+
232
262
pub fn muloti4 ( a : u128 , b : u128 ) -> Option < u128 > {
233
263
a. checked_mul ( b)
234
264
}
@@ -245,29 +275,13 @@ mod intrinsics {
245
275
a << b
246
276
}
247
277
248
- pub fn lshrti3 ( a : i128 , b : usize ) -> i128 {
249
- a >> b
250
- }
251
-
252
278
pub fn udivti3 ( a : u128 , b : u128 ) -> u128 {
253
279
a / b
254
280
}
255
281
256
282
pub fn umodti3 ( a : u128 , b : u128 ) -> u128 {
257
283
a % b
258
284
}
259
-
260
- pub fn divti3 ( a : i128 , b : i128 ) -> i128 {
261
- a / b
262
- }
263
-
264
- pub fn modti3 ( a : i128 , b : i128 ) -> i128 {
265
- a % b
266
- }
267
-
268
- pub fn udivsi3 ( a : u32 , b : u32 ) -> u32 {
269
- a / b
270
- }
271
285
}
272
286
273
287
fn run ( ) {
@@ -325,7 +339,6 @@ fn run() {
325
339
bb ( umodti3 ( bb ( 2 ) , bb ( 2 ) ) ) ;
326
340
bb ( divti3 ( bb ( 2 ) , bb ( 2 ) ) ) ;
327
341
bb ( modti3 ( bb ( 2 ) , bb ( 2 ) ) ) ;
328
- bb ( udivsi3 ( bb ( 2 ) , bb ( 2 ) ) ) ;
329
342
330
343
something_with_a_dtor ( & || assert_eq ! ( bb( 1 ) , 1 ) ) ;
331
344
0 commit comments