9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
-
-
+
+
-
-
+
+
-
+
-
+
|
{
void SetupRuntimeBasicTypes( Env& e )
{
e.storeValue( AppendToVectorTerm( RootIdentity(), TSID( half ) ), ANYTERM( _ ), ValueToIRExpr( ToValue( HalfFloatType() ) ) );
e.storeValue( AppendToVectorTerm( RootIdentity(), TSID( float ) ), ANYTERM( _ ), ValueToIRExpr( ToValue( FloatType() ) ) );
e.storeValue( AppendToVectorTerm( RootIdentity(), TSID( double ) ), ANYTERM( _ ), ValueToIRExpr( ToValue( DoubleFloatType() ) ) );
RegisterBuiltinFunc< Eager< Value > ( uint64_t ) >( e, "uint"_sid,
[]( uint64_t numBits )
RegisterBuiltinFunc< Eager< Value > ( uint32_t ) >( e, "uint"_sid,
[]( uint32_t numBits )
{
return ToValue( IntegerType( numBits ) );
} );
RegisterBuiltinFunc< Eager< Value > ( uint64_t ) >( e, "sint"_sid,
[]( uint64_t numBits )
RegisterBuiltinFunc< Eager< Value > ( uint32_t ) >( e, "sint"_sid,
[]( uint32_t numBits )
{
return ToValue( IntegerType( numBits, true ) );
} );
}
const Term& IntegerType::Pattern::GetPattern()
{
static auto pattern = ValueToIRExpr( Value( TypeType(), TVEC( TSID( rt_type ),
MkHole( "llvmType"_sid ),
TSID( integer ), MkHole( "size"_sid ), MkHole( "signedness"_sid ) ) ) );
return pattern;
}
const Term& IntegerType::PatternSigned::GetPattern()
{
static auto pattern = ValueToIRExpr( Value( TypeType(), TVEC( TSID( rt_type ),
MkHole( "llvmType"_sid ),
TSID( integer ), MkHole( "size"_sid ), TERM( 1ULL ) ) ) );
TSID( integer ), MkHole( "size"_sid ), TERM( 1U ) ) ) );
return pattern;
}
const Term& IntegerType::PatternUnsigned::GetPattern()
{
static auto pattern = ValueToIRExpr( Value( TypeType(), TVEC( TSID( rt_type ),
MkHole( "llvmType"_sid ),
TSID( integer ), MkHole( "size"_sid ), TERM( 0ULL ) ) ) );
TSID( integer ), MkHole( "size"_sid ), TERM( 0U ) ) ) );
return pattern;
}
}
namespace empathy::ir
{
|
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
-
+
-
-
+
+
|
}
//// Integer
Value Bridge< IntegerType >::ToValue( const IntegerType& i )
{
return Value( Type(), TVEC( TSID( rt_type ),
TERM( llvm::IntegerType::get( GetLLVMContext(), i.m_numBits ) ),
TSID( integer ), TERM( i.m_numBits ), i.m_signed ? TERM( 1ULL ) : TERM( 0ULL ) ) );
TSID( integer ), TERM( i.m_numBits ), i.m_signed ? TERM( 1U ) : TERM( 0U ) ) );
}
optional< IntegerType > Bridge< IntegerType >::FromValue( const Value& v )
{
auto result = Decompose( v.val(),
Vec(
Lit( "rt_type"_sid ),
Val< void* >(),
Lit( "integer"_sid ),
Val< uint64_t >(),
Val< uint64_t >()
Val< uint32_t >(),
Val< uint32_t >()
)
);
if( !result )
return nullopt;
auto&& [llvmType, numBits, signd] = *result;
|