@@ -24,10 +24,10 @@ class PlatformInfo(object):
24
24
def __init__ (self , json ):
25
25
self ._platform = json ['platform' ]
26
26
self ._intrinsic_prefix = json ['intrinsic_prefix' ]
27
+
27
28
def intrinsic_prefix (self ):
28
29
return self ._intrinsic_prefix
29
30
30
-
31
31
class IntrinsicSet (object ):
32
32
def __init__ (self , platform , json ):
33
33
self ._llvm_prefix = json ['llvm_prefix' ]
@@ -41,10 +41,13 @@ def intrinsics(self):
41
41
yield GenericIntrinsic (self ,
42
42
raw ['intrinsic' ], raw ['width' ], raw ['llvm' ],
43
43
raw ['ret' ], raw ['args' ])
44
+
44
45
def platform (self ):
45
46
return self ._platform
47
+
46
48
def llvm_prefix (self ):
47
49
return self ._llvm_prefix
50
+
48
51
def width_info (self , bitwidth ):
49
52
return self ._widths [str (bitwidth )]
50
53
@@ -67,8 +70,10 @@ class PlatformTypeInfo(object):
67
70
def __init__ (self , llvm_name , properties ):
68
71
self .properties = properties
69
72
self .llvm_name = llvm_name
73
+
70
74
def __getattr__ (self , name ):
71
75
return self .properties [name ]
76
+
72
77
def vectorize (self , length , width_info ):
73
78
props = self .properties .copy ()
74
79
props .update (width_info )
@@ -80,12 +85,14 @@ def __init__(self, bitwidth):
80
85
81
86
def bitwidth (self ):
82
87
return self ._bitwidth
88
+
83
89
def modify (self , spec , width ):
84
90
raise NotImplementedError ()
85
91
86
92
class Number (Type ):
87
93
def __init__ (self , bitwidth ):
88
94
Type .__init__ (self , bitwidth )
95
+
89
96
def modify (self , spec , width ):
90
97
if spec == 'u' :
91
98
return Unsigned (self .bitwidth ())
@@ -106,30 +113,40 @@ def type_info(self, platform_info):
106
113
class Signed (Number ):
107
114
def __init__ (self , bitwidth ):
108
115
Number .__init__ (self , bitwidth )
116
+
109
117
def compiler_ctor (self ):
110
118
return 'i({})' .format (self .bitwidth ())
119
+
111
120
def llvm_name (self ):
112
121
return 'i{}' .format (self .bitwidth ())
122
+
113
123
def rust_name (self ):
114
124
return 'i{}' .format (self .bitwidth ())
115
125
116
126
class Unsigned (Number ):
117
127
def __init__ (self , bitwidth ):
118
128
Number .__init__ (self , bitwidth )
129
+
119
130
def compiler_ctor (self ):
120
131
return 'u({})' .format (self .bitwidth ())
132
+
121
133
def llvm_name (self ):
122
134
return 'i{}' .format (self .bitwidth ())
135
+
123
136
def rust_name (self ):
124
137
return 'u{}' .format (self .bitwidth ())
138
+
125
139
class Float (Number ):
126
140
def __init__ (self , bitwidth ):
127
141
assert bitwidth in (32 , 64 )
128
142
Number .__init__ (self , bitwidth )
143
+
129
144
def compiler_ctor (self ):
130
145
return 'f({})' .format (self .bitwidth ())
146
+
131
147
def llvm_name (self ):
132
148
return 'f{}' .format (self .bitwidth ())
149
+
133
150
def rust_name (self ):
134
151
return 'f{}' .format (self .bitwidth ())
135
152
@@ -140,6 +157,7 @@ def __init__(self, elem, length):
140
157
elem .bitwidth () * length )
141
158
self ._length = length
142
159
self ._elem = elem
160
+
143
161
def modify (self , spec , width ):
144
162
if spec == 'h' :
145
163
return Vector (self ._elem , self ._length // 2 )
@@ -150,10 +168,13 @@ def modify(self, spec, width):
150
168
return Vector (self ._elem , new_bitwidth // self ._elem .bitwidth ())
151
169
else :
152
170
return Vector (self ._elem .modify (spec , width ), self ._length )
171
+
153
172
def compiler_ctor (self ):
154
173
return 'v({}, {})' .format (self ._elem .compiler_ctor (), self ._length )
174
+
155
175
def rust_name (self ):
156
176
return '{}x{}' .format (self ._elem .rust_name (), self ._length )
177
+
157
178
def type_info (self , platform_info ):
158
179
elem_info = self ._elem .type_info (platform_info )
159
180
return elem_info .vectorize (self ._length ,
@@ -163,15 +184,18 @@ class Aggregate(Type):
163
184
def __init__ (self , flatten , elems ):
164
185
self ._flatten = flatten
165
186
self ._elems = elems
166
- Type .__init__ (self ,
167
- sum ( elem . bitwidth () for elem in elems ))
187
+ Type .__init__ (self , sum ( elem . bitwidth () for elem in elems ))
188
+
168
189
def __repr__ (self ):
169
190
return '<Aggregate {}>' .format (self ._elems )
191
+
170
192
def compiler_ctor (self ):
171
193
return 'agg({}, vec![{}])' .format ('true' if self ._flatten else 'false' ,
172
194
', ' .join (elem .compiler_ctor () for elem in self ._elems ))
195
+
173
196
def rust_name (self ):
174
197
return '({})' .format (', ' .join (elem .rust_name () for elem in self ._elems ))
198
+
175
199
def type_info (self , platform_info ):
176
200
#return PlatformTypeInfo(None, None, self._llvm_name)
177
201
return None
@@ -188,6 +212,7 @@ def __init__(self, spec):
188
212
spec = [spec ]
189
213
190
214
self .spec = spec
215
+
191
216
def enumerate (self , width ):
192
217
for spec in self .spec :
193
218
match = SPEC .match (spec )
@@ -208,13 +233,13 @@ def enumerate(self, width):
208
233
for ctor in type_ctors :
209
234
scalar = ctor (bitwidth )
210
235
if is_vector :
211
-
212
236
yield Vector (scalar , width // bitwidth )
213
237
else :
214
238
yield scalar
215
239
bitwidth *= 2
216
240
else :
217
241
print ('Failed to parse: `{}`' .format (spec ), file = sys .stderr )
242
+
218
243
def resolve (self , width , zero ):
219
244
assert len (self .spec ) == 1
220
245
spec = self .spec [0 ]
@@ -272,23 +297,30 @@ def __init__(self, platform, intrinsic, width, llvm_name, ret, args):
272
297
self ._ret = ret .type_info (platform )
273
298
self ._args_raw = args
274
299
self ._args = [arg .type_info (platform ) for arg in args ]
300
+
275
301
def llvm_name (self ):
276
302
if self ._llvm_name .startswith ('!' ):
277
303
return self ._llvm_name [1 :].format (self ._ret , * self ._args )
278
304
else :
279
305
return self ._platform .llvm_prefix () + self ._llvm_name .format (self ._ret , * self ._args )
306
+
280
307
def intrinsic_suffix (self ):
281
308
return self ._intrinsic .format (self ._ret ,
282
309
* self ._args ,
283
310
width = self ._width )
311
+
284
312
def intrinsic_name (self ):
285
313
return self ._platform .platform ().intrinsic_prefix () + self .intrinsic_suffix ()
314
+
286
315
def compiler_args (self ):
287
316
return ', ' .join (arg .compiler_ctor () for arg in self ._args_raw )
317
+
288
318
def compiler_ret (self ):
289
319
return self ._ret_raw .compiler_ctor ()
320
+
290
321
def compiler_signature (self ):
291
322
return '({}) -> {}' .format (self .compiler_args (), self .compiler_ret ())
323
+
292
324
def intrinsic_signature (self ):
293
325
names = 'xyzwabcdef'
294
326
return '({}) -> {}' .format (', ' .join ('{}: {}' .format (name , arg .rust_name ())
@@ -410,17 +442,21 @@ def parse_args():
410
442
class ExternBlock (object ):
411
443
def __init__ (self ):
412
444
pass
445
+
413
446
def open (self , platform ):
414
447
return 'extern "platform-intrinsic" {'
448
+
415
449
def render (self , mono ):
416
450
return ' fn {}{};' .format (mono .intrinsic_name (),
417
451
mono .intrinsic_signature ())
452
+
418
453
def close (self ):
419
454
return '}'
420
455
421
456
class CompilerDefs (object ):
422
457
def __init__ (self ):
423
458
pass
459
+
424
460
def open (self , platform ):
425
461
return '''\
426
462
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
@@ -456,6 +492,7 @@ def render(self, mono):
456
492
mono .compiler_args (),
457
493
mono .compiler_ret (),
458
494
mono .llvm_name ())
495
+
459
496
def close (self ):
460
497
return '''\
461
498
_ => return None,
@@ -499,6 +536,7 @@ def main():
499
536
for intr in intrinsics .intrinsics ():
500
537
for mono in intr .monomorphise ():
501
538
print (out_format .render (mono ), file = out )
539
+
502
540
print (out_format .close (), file = out )
503
541
504
542
if __name__ == '__main__' :
0 commit comments