1
2
3
4
5
6
7
8
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
寻观「标准库」之书。
寻观「编译器核心」之「编译数据」之「抽象绑定树结构」之「抽象语法树」之「总集」之书。
。
寻观「编译器核心」之「编译数据」之「编译配置」之「编译期输出」之书。
寻观「编译器核心」之「编译步骤」之「总体过程」之「编译过程工具」之书。
寻观「拓展库」之「顺序标识符」之「顺序标识符」之书。
寻观「编译器核心」之「编译步骤」之「代码生成」之「低级虚拟机」之「代码生成工具」之书。
寻观「编译器核心」之「编译步骤」之「代码生成」之「低级虚拟机」之「数值运算代码生成」之书。
寻观「编译器核心」之「编译数据」之「编译配置」之「全局配置」之书。
「非公开函数修饰串」者『internal 』也。
「包裹函数体前」乃化「爻」而化「字符串」而(「列」于「字符串」)也。
「包裹函数体前」者会「公开」而会「函数名」而
「列」【(『define 』附(若「公开」则『』否则「非公开函数修饰串」)附「默认调用规范」附『 void @"』附「函数名」附
『"(i128 %"栈顶", i128 %"当前分配参数") {「:换行:」』附
『%"当前分配顶" = alloca i128「:换行:」』附
『store i128 %"当前分配参数", i128 * %"当前分配顶"「:换行:」』附
『br label %"入口续延名_进入标签"「:换行:」』
)】
也。
「包裹函数体后」乃(「列」于「字符串」)也。
「包裹函数体后」者「列」【『「:换行:」}「:换行:」』】也。
「直接代码生成」乃化「字符串」 「:防止重复命名的续延名:」而
化(化(「列」于「字符串」)而「有」)而
化「字符串」而
化「表达式」 「:待变换的式子:」而
(「列」于「字符串」) 「:字符串将赋值给返回名,包含换行:」
也。
「直接代码生成」者会「续延名」而会「写出」而会「返回名」而会「式」而
虑「保留字段」者「下个字符序数」于『_』附『_重名_』而
虑「读名」者「读取直接变量」而
虑「无」者「详细调试打印行」于(会「无」而『直接代码生成中:』)而
虑「无」者「详细调试打印行」于(会「无」而『直接代码生成中:』附(「表达式表示」于「式」))而
虑「默认返回」者(化(「列」于「字符串」)而(「列」于「字符串」)也会「串」而
「缀」于(『%"』附「返回名」附『" = 』)于(「附加」于「串」于(「列」【『「:换行:」』】)))
而
虑「空返回」者(「默认返回」于((「列」【『bitcast i128 0 to i128』】)))而
虑「转换结果」者(「尝试运行」授以(「列」于「字符串」))于(会「无」而
鉴「式」而
有(「自由变量」于「名」)则
「默认返回」于((「列」【(『bitcast i128 %"』附「名」附『" to i128』)】))
或有(「式节点」于(「非自由变量节点」于「变量名」)于「罄」)则
(「默认返回」于((「列」【(『bitcast i128 %"』附「变量名」附『" to i128』)】)))
或有(「式节点」于(「自由变量标注节点」于「标注名」)于((「列」【(「自由变量」于「新名」)】)))
则
「默认返回」于((「列」【(『bitcast i128 %"』附「新名」附『" to i128』)】))
或有(「式节点」于(「文件定义引用节点」于「文件名」于「定义名」于「序数」)于「罄」)
则(虑「无」者「列引用前衔」于
「所有文件定义读取」
于(「文件定义转全局名」于「文件名」于「定义名」于「序数」)
而
「默认返回」
于((「列」【(『load i128, i128* @"』附(「文件定义转全局名」于「文件名」于「定义名」于「序数」)附『"』)】)))
或有(「式节点」于(「文件引用节点」于「文件名」)于「罄」)则
「发生事故」于『名称解析未消除文件引用,不能进入代码生成:』附「文件名」
或有(「式节点」于(「文件定义内存引用节点」于「文件名」于「定义名」于「序数」)于「罄」)
则(虑「无」者
「列引用前衔」于
「所有文件定义存储」
于(「文件定义转全局名」于「文件名」于「定义名」于「序数」)
而
「列」【(『%"文件定义内存引用』
附「保留字段」附
『" = ptrtoint i128* @"』
附(「文件定义转全局名」于「文件名」于「定义名」于「序数」)附
『" to i128「:换行:」』
附『%"』附「返回名」
附
『" = or i128 %"文件定义内存引用』
附「保留字段」附
『", 』附
「静态指针类型标记值」
附『「:换行:」』)】
)
或有(「式节点」于(「展开后内建节点」于「量」)于「参数们」)
则(虑「参数名们」者(「态射」)于「参数们」于
「读名」而
鉴「量」而
有「内建爻阳」则((「默认返回」于((「列」【『zext i1 1 to i128』】))))
或有「内建爻阴」则((「默认返回」于((「列」【『zext i1 0 to i128』】))))
或有「内建有元」则(「空返回」)
或有「内建函数整数相等」则(鉴「参数名们」而
有((「列」【「左名」,「右名」】))则
(「生成数值比较代码」于「左名」于「右名」于「保留字段」于『i64』于『eq』于「返回名」)
或有「其他」则(「发生事故」于『期待两个参数』))
或有「内建函数整数大于」则(鉴「参数名们」而
有((「列」【「左名」,「右名」】))则
(「生成数值比较代码」于「左名」于「右名」于「保留字段」于『i64』于『sgt』于「返回名」)
或有「其他」则(「发生事故」于『期待两个参数』))
或有「内建函数整数减」则(鉴「参数名们」而
有((「列」【「左名」,「右名」】))则(「生成数值计算代码」于
「左名」于「右名」于「保留字段」于『i64』于『sub』
于(「整数类型标记值」)于「返回名」
)
或有「其他」则(「发生事故」于『期待两个参数』))
或有「其他」则(「发生事故」于『未有213:』附(「表达式表示」于(「式」))))
或有(「式节点」于(「整数节点」于「数」)于「罄」)则
((「默认返回」于((「列」【(『or i128 』附(「整数表示」于「数」)附『, 』附「整数类型标记值」)】))))
或有(「式节点」于(「小数节点」于「数」于「整小部」)于「罄」)
则(虑「小名」者「下个字符序数」于『小数值』而
虑「小名二」者「下个字符序数」于『长小数值』而「附加」
于(「列」【(『%"』附「小名」附『" = bitcast double 』附(「整小部」中「零」)附『.』附(「整小部」中「一」)附
『 to i64「:换行:」』附『%"』附「小名二」附
『" = zext i64 %"』附「小名」附
『" to i128「:换行:」』)】)
于(「默认返回」于((「列」【(『or i128 %"』附「小名二」附『", 』附「小数类型标记值」)】))))
或有(「式节点」于(「字符串节点」于「串」)于「罄」)
则(虑「串名」者「下个字符序数」于『字符串』附「保留字段」而
(「写出」
于((「列」【(「字符串声明」于「串名」于「串」)】));
(「附加」
于(「列」【(『%"字符串指针』附「保留字段」附『" = ptrtoint 』附(「字符串声明类型」于「串」)附『* @"』附「串名」
附
『" to i128「:换行:」』附
『%"字符串长度标记』附「保留字段」附『" = shl i128 』附(「整数表示」
于(「加」于(「字节长度」于「串」)于「一」))附『, 』附
「长度偏移」附『「:换行:」』附『%"字符串带长度』附
「保留字段」附『" = or i128 %"字符串指针』附「保留字段」附
『", %"字符串长度标记』附「保留字段」附『"「:换行:」』)】)
于(「默认返回」
于((「列」【(『or i128 %"字符串带长度』附「保留字段」附『", 』附「字符串类型标记值」)】))))))
「: 或有(式节点于(元组构造节点)于「参数」)则
(
虑元素名们者(态射授以表达式授以字符串)于读名于参数而
创建数组于返回名于元素名们
) :」
或有(「式节点」于(「运行时元组构造转换节点」于「元组长」)于((「列」【「元组式」】)))则(「附加」
于(「列」【(『%"元组长』
附「保留字段」附『" = shl i128 』附(「整数表示」于「元组长」)附『, 』
附「长度偏移」附『「:换行:」』附
『%"暂存零』附「保留字段」附『" = and i128 %"』附(「读名」于「元组式」)附『", 』附
「清除类型标记值」附『「:换行:」』附
『%"暂存一』附「保留字段」附『" = or i128 %"暂存零』附「保留字段」附『", %"元组长』
附「保留字段」附『"「:换行:」』
)】
)于(「默认返回」
于((「列」【(『or i128 %"暂存一』附「保留字段」附『", 』附「元组类型标记值」附『』)】))))
或有(「式节点」于(「元组解构节点」于「序数」)于((「列」【「元组」】)))
则(虑「元组名」者「读名」于
「元组」而
「附加」
于(「列」【(『%"元组数组』附
「保留字段」附
『" = inttoptr i128 %"』附
「元组名」附
『" to i128*「:换行:」』附
『%"目标指针』附「保留字段」附
『" = getelementptr i128, i128* %"元组数组』
附「保留字段」附『", i128 』附
(「整数表示」于「序数」)附『「:换行:」』)】)
于(「默认返回」于((「列」【(『load i128, i128* %"目标指针』附「保留字段」附『"』)】))))
或有(「式节点」于(「指针偏移节点」于「序数」)于((「列」【「指针」】)))则((「默认返回」
于((「列」【(『add i128 %"』附(「读名」于「指针」)附『", 』附(「整数表示」
于(「乘」于「序数」于「默认元素大小」)))】))))
或有(「式节点」于(「元组更新节点」于「序数」)于((「列」【「元组」,「新值」】)))
则(虑「元组名」者「读名」于「元组」而
虑「新值名」者「读名」于「新值」而
「附加」于(「列」【(『%"元组数组』附「保留字段」附『" = inttoptr i128 %"』附「元组名」附
『" to i128*「:换行:」』附
『%"目标指针』附「保留字段」附『" = getelementptr i128, i128* %"元组数组』附
「保留字段」附『", i128 』附(「整数表示」于「序数」)附『「:换行:」』
附
『store i128 %"』附「新值名」附『", i128* %"目标指针』附「保留字段」附
『"「:换行:」』)】)于
「空返回」
)
或有(「式节点」于(「解析后外部调用节点无类型」于「串」)于「参数」)
则(虑「参数名们」者(「态射」)于「参数」于
「读名」而
虑「目标调用名」者「目标外部调用名称」于「串」而
虑「无」者「添加外部调用」于「目标调用名」
于(「长度」于「参数」)而
虑「参数签名」者「间合」于『,』
于((「态射」)于「参数名们」于(会「参数名」而『i128 %"』附「参数名」附『"』))
而
「附加」
于(「列」【(『%"局部分配值_』附「保留字段」附
『" = load i128, i128* %"当前分配顶"「:换行:」』附
『%"局部分配指针_』附「保留字段」附
『" = inttoptr i128 %"局部分配值_』附「保留字段」附
『" to i128*「:换行:」』附『store i128* %"局部分配指针_』
附「保留字段」附
『", i128** @"豫言_当前分配指针"「:换行:」』附
『%"局部栈指针_』附「保留字段」附
『" = inttoptr i128 %"栈顶" to i128*「:换行:」』附
『store i128* %"局部栈指针_』附「保留字段」附
『", i128** @"豫言_栈指针"「:换行:」』附『%"返回值』附
「保留字段」附『" = call i128 @"』附「目标调用名」附『"(』附
「参数签名」附『)「:换行:」』)】)
于(「附加」
于(「列」【(『%"新分配指针值_』附「保留字段」附
『" = load i128*, i128** @"豫言_当前分配指针"「:换行:」』
附『%"新分配指针_』附「保留字段」附
『" = ptrtoint i128* %"新分配指针值_』附「保留字段」附
『" to i128「:换行:」』附『%"新分配值_』附「保留字段」附
『" = or i128 %"新分配指针_』附「保留字段」附『", 』附
「全局指针类型标记值」附『「:换行:」』附
『store i128 %"新分配指针_』附「保留字段」附
『", i128* %"当前分配顶"「:换行:」』)】)
于(「默认返回」于((「列」【(『bitcast i128 %"返回值』附「保留字段」附『" to i128』)】)))))
或有(「式节点」于「空值节点」于「罄」)则
(「默认返回」于((「列」【『bitcast i128 0 to i128』】)))
或有(「式节点」于(「擦除后类型节点」)于「罄」)则
(「默认返回」于((「列」【『bitcast i128 0 to i128』】)))
或有(「式节点」于(「文件定义存储节点」于「文件名」于「定义名」于「序数」)于((「列」【「参」】)))
则(虑「无」者「列引用前衔」于「所有文件定义存储」于(「文件定义转全局名」于「文件名」于「定义名」于「序数」)
而
虑「参名」者「读名」于「参」而
「附加」于(「列」【(『store i128 %"』附「参名」附『", i128* @"』附
(「文件定义转全局名」于「文件名」于「定义名」于「序数」)附『"「:换行:」』)】)于
「空返回」
)
「:默认读取堆指针:」
或有(「式节点」于(「全局指针读取节点」于「全局名」)于「罄」)则(「附加」
于(「列」【(『%"读取指针』
附
「保留字段」附『" = load i128*, i128** @"』附「全局名」附
『"「:换行:」』附
『%"基本指针』附「保留字段」附『" = ptrtoint i128* %"读取指针』附「保留字段」附
『" to i128「:换行:」』
)】
)于(「默认返回」
于((「列」【(『or i128 %"基本指针』附「保留字段」附『", 』附「全局指针类型标记值」附『』)】))))
或有(「式节点」于(「全局指针更新节点」于「全局名」)于((「列」【「参」】)))则(「附加」
于(「列」【(『%"更新指针』
附「保留字段」附『" = inttoptr i128 %"』附(「读名」于「参」)附
『" to i128*「:换行:」』附
『store i128* %"更新指针』附「保留字段」附『", i128** @"』附「全局名」附
『"「:换行:」』
)】
)于
「空返回」
)
或有(「式节点」于(「局部指针读取节点」于「局部名」)于「罄」)则(「附加」
于(「列」【(『%"读取指针』附「保留字段」附『" = load i128, i128* %"』附「局部名」附『"「:换行:」』)】
)于(「默认返回」于((「列」【(『or i128 %"读取指针』附「保留字段」附『", 』附「局部指针类型标记值」附『』)】))))
或有(「式节点」于(「局部指针更新节点」于「局部名」)于((「列」【「参」】)))则(「附加」
于(「列」【(『store i128 %"』附(「读名」于「参」)附『", i128* %"』附「局部名」附『"「:换行:」』)】
)于
「空返回」
)
或有(「式节点」于(「函数引用调用节点」)于((「列」【「函数名」,「栈名」】)))则(「列」【(『%"函数调用引用』附「保留字段」附『" = inttoptr i128 %"』附(「读名」于「函数名」)
附
『" to 』附「函数指针类型」附『「:换行:」』附
『%"下个分配参数』附「保留字段」附『" = load i128, i128* %"当前分配顶"「:换行:」』附
『musttail call void %"函数调用引用』附「保留字段」附『"(i128 %"』附(「读名」于「栈名」)
附『", i128 %"下个分配参数』附「保留字段」附『")「:换行:」』
)】
)
或有(「式节点」于(「函数引用节点」于「函数名」)于「罄」)则(「附加」
于(「列」【(『%"函数引用』附「保留字段」附『" = ptrtoint 』附「函数指针类型」附
『 @"』附
「函数名」附『" to i128「:换行:」』
)】
)于(「默认返回」
于((「列」【(『or i128 %"函数引用』附「保留字段」附『", 』附「函数指针类型标记值」)】))))
或有(「式节点」于(「唯一构造器序数元组节点」于「序数」于「元组长」)于((「列」【「元组式」】)))
则(「附加」于(「列」【(『%"元组长』附「保留字段」附『" = shl i128 』附(「整数表示」于「元组长」)附
『, 』
附「子类型偏移」附『「:换行:」』附
『%"唯一序数』附「保留字段」附『" = shl i128 』附(「整数表示」于「序数」)附
『, 』
附「长度偏移」附『「:换行:」』附
『%"暂存零』附「保留字段」附『" = and i128 %"』附(「读名」于「元组式」)附
『", 』附
「清除类型标记值」附『「:换行:」』附
『%"暂存一』附「保留字段」附『" = or i128 %"暂存零』附「保留字段」附『", 』附
「唯一构造器序数元组类型标记值」附『「:换行:」』附
『%"暂存二』附「保留字段」附『" = or i128 %"暂存一』附「保留字段」附
『", %"元组长』
附「保留字段」附『"「:换行:」』
)】
)于(「默认返回」
于((「列」【(『or i128 %"暂存二』附「保留字段」附『", %"唯一序数』附「保留字段」附『"』)】))))
或有(「式节点」于(「唯一构造器序数元组投影序数节点」)于((「列」【「构造式」】)))则(「附加」
于(「列」【(『%"暂存零』
附「保留字段」附『" = lshr i128 %"』附(「读名」于「构造式」)附『", 』
附「长度偏移」附『「:换行:」』附
『%"暂存一』附「保留字段」附『" = and i128 %"暂存零』附「保留字段」附『", 』附
「清除长度标记值」附『「:换行:」』
)】
)
于(「默认返回」于(「列」【(『or i128 %"暂存一』
附「保留字段」附『", 』附「整数类型标记值」附
『「:换行:」』)】)))
或有(「式节点」于(「唯一构造器序数元组投影元组节点」)于((「列」【「构造式」】)))则(「附加」
于(「列」【(『%"长度暂存零』
附「保留字段」附『" = lshr i128 %"』附(「读名」于「构造式」)附
『", 』附「子类型偏移」附『「:换行:」』附
『%"长度暂存一』附「保留字段」附『" = and i128 %"长度暂存零』附「保留字段」附
『", u0xFF「:换行:」』附
『%"长度暂存二』附「保留字段」附『" = shl i128 %"长度暂存一』附「保留字段」附『", 』
附「长度偏移」附『「:换行:」』附
『%"元组暂存零』附「保留字段」附『" = and i128 %"』附(「读名」于「构造式」)附
『", 』附「清除类型标记值」附『「:换行:」』附
『%"元组暂存一』附「保留字段」附『" = or i128 %"元组暂存零』附「保留字段」附『", 』
附「元组类型标记值」附『「:换行:」』
)】
)
于(「默认返回」于(「列」【(『or i128 %"元组暂存一』
附「保留字段」附『", %"长度暂存二』附
「保留字段」附『"「:换行:」』)】)))
或有「其他」则「发生事故」于『未有直接代码生成497:』附(「表达式表示」于「式」))
于(会「异常」而「发生事故」于「异常」附『「:换行:」在直接代码生成』附(「表达式表示」于「式」)附『时』)
而
虑「无」者「非常详细调试打印行」于(会「无」而『直接代码生成完成:』附(「表达式表示」于「式」)附『。结果是:』)
而
「转换结果」
也。