Skip to content

Commit d5b1d0d

Browse files
committed
auto merge of #5724 : JensNockert/rust/remove-intrinsics, r=brson
I am not convinced that this is a great idea, but I wanted to throw this out here since I noticed it was possible to save a few hundred lines of code with no reduction in functionality. The main ideas of this commit is to remove most of the special implementation for llvm-intrinsics in src/librustc/middle/trans/base.rs and friends, and instead declare them as semi-standard functions instead with a combination of attributes instead. In the end, this means that the compiler doesn't need to know about every intrinsic and we only need to provide definitions for the ones we use in the core/std library and users can provide the rest if they need them.
2 parents babe506 + 85f3100 commit d5b1d0d

File tree

9 files changed

+179
-667
lines changed

9 files changed

+179
-667
lines changed

src/libcore/num/f32.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use num::NumCast;
1616
use num::strconv;
1717
use num;
1818
use option::Option;
19-
use unstable::intrinsics::floorf32;
19+
use unstable::intrinsics;
2020
use from_str;
2121
use to_str;
2222

@@ -93,7 +93,6 @@ delegate!(fn ldexp_radix(n: c_float, i: c_int) -> c_float =
9393
cmath::c_float_utils::ldexp_radix)
9494
delegate!(fn sin(n: c_float) -> c_float = cmath::c_float_utils::sin)
9595
delegate!(fn sinh(n: c_float) -> c_float = cmath::c_float_utils::sinh)
96-
delegate!(fn sqrt(n: c_float) -> c_float = cmath::c_float_utils::sqrt)
9796
delegate!(fn tan(n: c_float) -> c_float = cmath::c_float_utils::tan)
9897
delegate!(fn tanh(n: c_float) -> c_float = cmath::c_float_utils::tanh)
9998
delegate!(fn tgamma(n: c_float) -> c_float = cmath::c_float_utils::tgamma)
@@ -146,7 +145,10 @@ pub fn gt(x: f32, y: f32) -> bool { return x > y; }
146145

147146
/// Returns `x` rounded down
148147
#[inline(always)]
149-
pub fn floor(x: f32) -> f32 { unsafe { floorf32(x) } }
148+
pub fn floor(x: f32) -> f32 { unsafe { intrinsics::llvm::floorf32(x) } }
149+
150+
#[inline(always)]
151+
pub fn sqrt(x: f32) -> f32 { unsafe { intrinsics::llvm::sqrtf32(x) } }
150152

151153
// FIXME (#1999): replace the predicates below with llvm intrinsics or
152154
// calls to the libmath macros in the rust runtime for performance.

src/libcore/num/f64.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use num::NumCast;
1616
use num::strconv;
1717
use num;
1818
use option::Option;
19-
use unstable::intrinsics::floorf64;
19+
use unstable::intrinsics;
2020
use to_str;
2121
use from_str;
2222

@@ -94,7 +94,6 @@ delegate!(fn ldexp_radix(n: c_double, i: c_int) -> c_double =
9494
cmath::c_double_utils::ldexp_radix)
9595
delegate!(fn sin(n: c_double) -> c_double = cmath::c_double_utils::sin)
9696
delegate!(fn sinh(n: c_double) -> c_double = cmath::c_double_utils::sinh)
97-
delegate!(fn sqrt(n: c_double) -> c_double = cmath::c_double_utils::sqrt)
9897
delegate!(fn tan(n: c_double) -> c_double = cmath::c_double_utils::tan)
9998
delegate!(fn tanh(n: c_double) -> c_double = cmath::c_double_utils::tanh)
10099
delegate!(fn tgamma(n: c_double) -> c_double = cmath::c_double_utils::tgamma)
@@ -221,7 +220,10 @@ pub fn is_finite(x: f64) -> bool {
221220

222221
/// Returns `x` rounded down
223222
#[inline(always)]
224-
pub fn floor(x: f64) -> f64 { unsafe { floorf64(x) } }
223+
pub fn floor(x: f64) -> f64 { unsafe { intrinsics::llvm::floorf64(x) } }
224+
225+
#[inline(always)]
226+
pub fn sqrt(x: f64) -> f64 { unsafe { intrinsics::llvm::sqrtf64(x) } }
225227

226228
// FIXME (#1999): add is_normal, is_subnormal, and fpclassify
227229

src/libcore/unstable/intrinsics.rs

Lines changed: 158 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -63,69 +63,213 @@ pub extern "rust-intrinsic" {
6363

6464
pub fn memmove32(dst: *mut u8, src: *u8, size: u32);
6565
pub fn memmove64(dst: *mut u8, src: *u8, size: u64);
66+
}
6667

68+
#[nolink]
69+
pub extern mod llvm {
70+
#[rust_stack]
71+
#[inline(always)]
72+
#[link_name="llvm.sqrt.f32"]
6773
pub fn sqrtf32(x: f32) -> f32;
74+
75+
#[rust_stack]
76+
#[inline(always)]
77+
#[link_name="llvm.sqrt.f64"]
6878
pub fn sqrtf64(x: f64) -> f64;
6979

80+
#[rust_stack]
81+
#[inline(always)]
82+
#[link_name="llvm.powi.f32"]
7083
pub fn powif32(a: f32, x: i32) -> f32;
84+
85+
#[rust_stack]
86+
#[inline(always)]
87+
#[link_name="llvm.powi.f64"]
7188
pub fn powif64(a: f64, x: i32) -> f64;
7289

90+
#[rust_stack]
91+
#[inline(always)]
92+
#[link_name="llvm.sin.f32"]
7393
pub fn sinf32(x: f32) -> f32;
94+
95+
#[rust_stack]
96+
#[inline(always)]
97+
#[link_name="llvm.sin.f64"]
7498
pub fn sinf64(x: f64) -> f64;
7599

100+
#[rust_stack]
101+
#[inline(always)]
102+
#[link_name="llvm.cos.f32"]
76103
pub fn cosf32(x: f32) -> f32;
104+
105+
#[rust_stack]
106+
#[inline(always)]
107+
#[link_name="llvm.cos.f64"]
77108
pub fn cosf64(x: f64) -> f64;
78109

110+
#[rust_stack]
111+
#[inline(always)]
112+
#[link_name="llvm.pow.f32"]
79113
pub fn powf32(a: f32, x: f32) -> f32;
114+
115+
#[rust_stack]
116+
#[inline(always)]
117+
#[link_name="llvm.pow.f64"]
80118
pub fn powf64(a: f64, x: f64) -> f64;
81119

120+
#[rust_stack]
121+
#[inline(always)]
122+
#[link_name="llvm.exp.f32"]
82123
pub fn expf32(x: f32) -> f32;
83-
pub fn expf64(x: f64) -> f64;
84124

85-
pub fn exp2f32(x: f32) -> f32;
86-
pub fn exp2f64(x: f64) -> f64;
125+
#[rust_stack]
126+
#[inline(always)]
127+
#[link_name="llvm.exp.f64"]
128+
pub fn expf64(x: f64) -> f64;
87129

130+
#[rust_stack]
131+
#[inline(always)]
132+
#[link_name="llvm.log.f32"]
88133
pub fn logf32(x: f32) -> f32;
134+
135+
#[rust_stack]
136+
#[inline(always)]
137+
#[link_name="llvm.log.f64"]
89138
pub fn logf64(x: f64) -> f64;
90139

140+
/* NOTE: Do these intrinsics even exist?
141+
pub fn exp2f32(x: f32) -> f32;
142+
pub fn exp2f64(x: f64) -> f64;
143+
91144
pub fn log10f32(x: f32) -> f32;
92145
pub fn log10f64(x: f64) -> f64;
93146
94147
pub fn log2f32(x: f32) -> f32;
95148
pub fn log2f64(x: f64) -> f64;
149+
*/
96150

151+
#[rust_stack]
152+
#[inline(always)]
153+
#[link_name="llvm.fma.f32"]
97154
pub fn fmaf32(a: f32, b: f32, c: f32) -> f32;
155+
156+
#[rust_stack]
157+
#[inline(always)]
158+
#[link_name="llvm.fma.f64"]
98159
pub fn fmaf64(a: f64, b: f64, c: f64) -> f64;
99160

161+
#[rust_stack]
162+
#[inline(always)]
163+
#[link_name="llvm.fabs.f32"]
100164
pub fn fabsf32(x: f32) -> f32;
165+
166+
#[rust_stack]
167+
#[inline(always)]
168+
#[link_name="llvm.fabs.f64"]
101169
pub fn fabsf64(x: f64) -> f64;
102170

171+
#[rust_stack]
172+
#[inline(always)]
173+
#[link_name="llvm.floor.f32"]
103174
pub fn floorf32(x: f32) -> f32;
175+
176+
#[rust_stack]
177+
#[inline(always)]
178+
#[link_name="llvm.floor.f64"]
104179
pub fn floorf64(x: f64) -> f64;
105180

181+
/* NOTE: Needs LLVM 3.3
182+
#[rust_stack]
183+
#[link_name="llvm.ceil.f32"]
106184
pub fn ceilf32(x: f32) -> f32;
185+
186+
#[rust_stack]
187+
#[link_name="llvm.ceil.f64"]
107188
pub fn ceilf64(x: f64) -> f64;
108189
190+
#[rust_stack]
191+
#[link_name="llvm.trunc.f32"]
109192
pub fn truncf32(x: f32) -> f32;
193+
194+
#[rust_stack]
195+
#[link_name="llvm.trunc.f64"]
110196
pub fn truncf64(x: f64) -> f64;
197+
*/
111198

199+
#[rust_stack]
200+
#[inline(always)]
201+
#[link_name="llvm.ctpop.i8"]
112202
pub fn ctpop8(x: i8) -> i8;
203+
204+
#[rust_stack]
205+
#[inline(always)]
206+
#[link_name="llvm.ctpop.i16"]
113207
pub fn ctpop16(x: i16) -> i16;
114-
pub fn ctpop32(x: i32) -> i32;
115-
pub fn ctpop64(x: i64) -> i64;
116208

117-
pub fn ctlz8(x: i8) -> i8;
118-
pub fn ctlz16(x: i16) -> i16;
119-
pub fn ctlz32(x: i32) -> i32;
120-
pub fn ctlz64(x: i64) -> i64;
209+
#[rust_stack]
210+
#[inline(always)]
211+
#[link_name="llvm.ctpop.i32"]
212+
pub fn ctpop32(x: i32) -> i32;
121213

122-
pub fn cttz8(x: i8) -> i8;
123-
pub fn cttz16(x: i16) -> i16;
124-
pub fn cttz32(x: i32) -> i32;
125-
pub fn cttz64(x: i64) -> i64;
214+
#[rust_stack]
215+
#[inline(always)]
216+
#[link_name="llvm.ctpop.i64"]
217+
pub fn ctpop64(x: i64) -> i64;
126218

219+
/* NOTE: Needs i1 constants
220+
#[rust_stack]
221+
#[inline(always)]
222+
#[link_name="llvm.ctlz.i8"]
223+
pub fn ctlz8(x: i8, is_zero_undef: bool) -> i8;
224+
225+
#[rust_stack]
226+
#[inline(always)]
227+
#[link_name="llvm.ctlz.i16"]
228+
pub fn ctlz16(x: i16, is_zero_undef: bool) -> i16;
229+
230+
#[rust_stack]
231+
#[inline(always)]
232+
#[link_name="llvm.ctlz.i32"]
233+
pub fn ctlz32(x: i32, is_zero_undef: bool) -> i32;
234+
235+
#[rust_stack]
236+
#[inline(always)]
237+
#[link_name="llvm.ctlz.i64"]
238+
pub fn ctlz64(x: i64, is_zero_undef: bool) -> i64;
239+
240+
#[rust_stack]
241+
#[inline(always)]
242+
#[link_name="llvm.cttz.i8"]
243+
pub fn cttz8(x: i8, is_zero_undef: bool) -> i8;
244+
245+
#[rust_stack]
246+
#[inline(always)]
247+
#[link_name="llvm.cttz.i16"]
248+
pub fn cttz16(x: i16, is_zero_undef: bool) -> i16;
249+
250+
#[rust_stack]
251+
#[inline(always)]
252+
#[link_name="llvm.cttz.i32"]
253+
pub fn cttz32(x: i32, is_zero_undef: bool) -> i32;
254+
255+
#[rust_stack]
256+
#[inline(always)]
257+
#[link_name="llvm.cttz.i64"]
258+
pub fn cttz64(x: i64, is_zero_undef: bool) -> i64;
259+
*/
260+
261+
#[rust_stack]
262+
#[inline(always)]
263+
#[link_name="llvm.bswap.i16"]
127264
pub fn bswap16(x: i16) -> i16;
265+
266+
#[rust_stack]
267+
#[inline(always)]
268+
#[link_name="llvm.bswap.i32"]
128269
pub fn bswap32(x: i32) -> i32;
270+
271+
#[rust_stack]
272+
#[inline(always)]
273+
#[link_name="llvm.bswap.i64"]
129274
pub fn bswap64(x: i64) -> i64;
130275
}
131-

0 commit comments

Comments
 (0)