]>
Commit | Line | Data |
---|---|---|
e9174d1e SL |
1 | // Copyright 2015 The Rust Project Developers. See the COPYRIGHT |
2 | // file at the top-level directory of this distribution and at | |
3 | // http://rust-lang.org/COPYRIGHT. | |
4 | // | |
5 | // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | |
6 | // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | |
7 | // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | |
8 | // option. This file may not be copied, modified, or distributed | |
9 | // except according to those terms. | |
10 | ||
e9174d1e SL |
11 | #![crate_name = "rustc_platform_intrinsics"] |
12 | #![unstable(feature = "rustc_private", issue = "27812")] | |
e9174d1e SL |
13 | #![crate_type = "dylib"] |
14 | #![crate_type = "rlib"] | |
54a0048b | 15 | #![feature(staged_api)] |
7453a54e | 16 | #![cfg_attr(not(stage0), deny(warnings))] |
54a0048b | 17 | #![allow(bad_style)] |
e9174d1e SL |
18 | |
19 | pub struct Intrinsic { | |
54a0048b SL |
20 | pub inputs: &'static [&'static Type], |
21 | pub output: &'static Type, | |
e9174d1e SL |
22 | |
23 | pub definition: IntrinsicDef, | |
24 | } | |
25 | ||
26 | #[derive(Clone, Hash, Eq, PartialEq)] | |
27 | pub enum Type { | |
28 | Void, | |
29 | Integer(/* signed */ bool, u8, /* llvm width */ u8), | |
30 | Float(u8), | |
54a0048b SL |
31 | Pointer(&'static Type, Option<&'static Type>, /* const */ bool), |
32 | Vector(&'static Type, Option<&'static Type>, u8), | |
33 | Aggregate(bool, &'static [&'static Type]), | |
e9174d1e SL |
34 | } |
35 | ||
36 | pub enum IntrinsicDef { | |
37 | Named(&'static str), | |
38 | } | |
39 | ||
54a0048b SL |
40 | static I8: Type = Type::Integer(true, 8, 8); |
41 | static I16: Type = Type::Integer(true, 16, 16); | |
42 | static I32: Type = Type::Integer(true, 32, 32); | |
43 | static I64: Type = Type::Integer(true, 64, 64); | |
44 | static U8: Type = Type::Integer(false, 8, 8); | |
45 | static U16: Type = Type::Integer(false, 16, 16); | |
46 | static U32: Type = Type::Integer(false, 32, 32); | |
47 | static U64: Type = Type::Integer(false, 64, 64); | |
48 | static F32: Type = Type::Float(32); | |
49 | static F64: Type = Type::Float(64); | |
50 | ||
51 | static I32_8: Type = Type::Integer(true, 32, 8); | |
52 | ||
53 | static I8x8: Type = Type::Vector(&I8, None, 8); | |
54 | static U8x8: Type = Type::Vector(&U8, None, 8); | |
55 | static I8x16: Type = Type::Vector(&I8, None, 16); | |
56 | static U8x16: Type = Type::Vector(&U8, None, 16); | |
57 | static I8x32: Type = Type::Vector(&I8, None, 32); | |
58 | static U8x32: Type = Type::Vector(&U8, None, 32); | |
59 | ||
60 | static I16x4: Type = Type::Vector(&I16, None, 4); | |
61 | static U16x4: Type = Type::Vector(&U16, None, 4); | |
62 | static I16x8: Type = Type::Vector(&I16, None, 8); | |
63 | static U16x8: Type = Type::Vector(&U16, None, 8); | |
64 | static I16x16: Type = Type::Vector(&I16, None, 16); | |
65 | static U16x16: Type = Type::Vector(&U16, None, 16); | |
66 | ||
67 | static I32x2: Type = Type::Vector(&I32, None, 2); | |
68 | static U32x2: Type = Type::Vector(&U32, None, 2); | |
69 | static I32x4: Type = Type::Vector(&I32, None, 4); | |
70 | static U32x4: Type = Type::Vector(&U32, None, 4); | |
71 | static I32x8: Type = Type::Vector(&I32, None, 8); | |
72 | static U32x8: Type = Type::Vector(&U32, None, 8); | |
73 | ||
74 | static I64x1: Type = Type::Vector(&I64, None, 1); | |
75 | static U64x1: Type = Type::Vector(&U64, None, 1); | |
76 | static I64x2: Type = Type::Vector(&I64, None, 2); | |
77 | static U64x2: Type = Type::Vector(&U64, None, 2); | |
78 | static I64x4: Type = Type::Vector(&I64, None, 4); | |
79 | static U64x4: Type = Type::Vector(&U64, None, 4); | |
80 | ||
81 | static F32x2: Type = Type::Vector(&F32, None, 2); | |
82 | static F32x4: Type = Type::Vector(&F32, None, 4); | |
83 | static F32x8: Type = Type::Vector(&F32, None, 8); | |
84 | static F64x1: Type = Type::Vector(&F64, None, 1); | |
85 | static F64x2: Type = Type::Vector(&F64, None, 2); | |
86 | static F64x4: Type = Type::Vector(&F64, None, 4); | |
87 | ||
88 | static I32x4_F32: Type = Type::Vector(&I32, Some(&F32), 4); | |
89 | static I32x8_F32: Type = Type::Vector(&I32, Some(&F32), 8); | |
90 | static I64x2_F64: Type = Type::Vector(&I64, Some(&F64), 2); | |
91 | static I64x4_F64: Type = Type::Vector(&I64, Some(&F64), 4); | |
92 | ||
93 | static VOID: Type = Type::Void; | |
e9174d1e SL |
94 | |
95 | mod x86; | |
96 | mod arm; | |
97 | mod aarch64; | |
98 | ||
99 | impl Intrinsic { | |
54a0048b | 100 | pub fn find(name: &str) -> Option<Intrinsic> { |
e9174d1e | 101 | if name.starts_with("x86_") { |
54a0048b | 102 | x86::find(name) |
e9174d1e | 103 | } else if name.starts_with("arm_") { |
54a0048b | 104 | arm::find(name) |
e9174d1e | 105 | } else if name.starts_with("aarch64_") { |
54a0048b | 106 | aarch64::find(name) |
e9174d1e SL |
107 | } else { |
108 | None | |
109 | } | |
110 | } | |
111 | } |