@@ -58,6 +58,20 @@ let emit_loadimm r n =
58
58
let emit_addimm rd rs n =
59
59
List. iter emit (Asmgen. addimm rd rs n [] )
60
60
61
+ let emit_aindexed mk1 mk2 unaligned r1 temp ofs =
62
+ List. iter emit (Asmgen. aindexed mk1 mk2 unaligned r1 temp ofs [] )
63
+
64
+ let emit_aindexed2 mk r1 r2 =
65
+ List. iter emit (Asmgen. aindexed2 mk r1 r2 [] )
66
+
67
+ let emit_aglobal mk1 mk2 unaligned temp symb ofs =
68
+ List. iter emit (Asmgen. aglobal mk1 mk2 unaligned temp symb ofs [] )
69
+
70
+ let emit_abased mk1 mk2 unaligned r1 temp symb ofs =
71
+ List. iter emit (Asmgen. abased mk1 mk2 unaligned r1 temp symb ofs [] )
72
+
73
+ let emit_ainstack mk1 mk2 unaligned temp ofs =
74
+ List. iter emit (Asmgen. ainstack mk1 mk2 unaligned temp ofs [] )
61
75
(* Numbering of bits in the CR register *)
62
76
63
77
let num_crbit = function
@@ -175,79 +189,23 @@ let expand_builtin_memcpy sz al args =
175
189
(* Handling of volatile reads and writes *)
176
190
177
191
let expand_volatile_access
178
- (mk1 : ireg -> constant -> unit )
179
- (mk2 : ireg -> ireg -> unit )
192
+ (mk1 : constant -> ireg -> instruction list -> instruction list )
193
+ (mk2 : ireg -> ireg -> instruction list -> instruction list )
180
194
?(ofs_unaligned = true )
181
195
addr temp =
182
196
match addr with
183
197
| BA (IR r ) ->
184
- mk1 r (Cint _0)
198
+ List. iter emit ( mk1 (Cint _0) r [] )
185
199
| BA_addrstack ofs ->
186
- if ofs_unaligned || Int. eq (Int. mods ofs _4) _0 then
187
- if offset_in_range ofs then
188
- mk1 GPR1 (Cint ofs)
189
- else begin
190
- emit (Paddis (temp, GPR1 , Cint (Asmgen. high_s ofs)));
191
- mk1 temp (Cint (Asmgen. low_s ofs))
192
- end
193
- else begin
194
- emit (Paddis (temp, GPR1 , Cint (Asmgen. high_s ofs)));
195
- emit (Paddi (temp, temp, Cint (Asmgen. low_s ofs)));
196
- mk1 temp (Cint _0)
197
- end
200
+ emit_ainstack mk1 mk2 ofs_unaligned temp ofs
198
201
| BA_addrglobal (id , ofs ) ->
199
- if symbol_is_small_data id ofs then
200
- if ofs_unaligned || Asmgen. symbol_ofs_word_aligned id ofs then
201
- mk1 GPR0 (Csymbol_sda (id, ofs))
202
- else begin
203
- emit (Paddi (temp, GPR0 , (Csymbol_sda (id,ofs))));
204
- mk1 temp (Cint _0)
205
- end
206
- else if symbol_is_rel_data id ofs then begin
207
- emit (Paddis (temp, GPR0 , Csymbol_rel_high (id, ofs)));
208
- emit (Paddi (temp, temp, Csymbol_rel_low (id, ofs)));
209
- mk1 temp (Cint _0)
210
- end else if ofs_unaligned || Asmgen. symbol_ofs_word_aligned id ofs then begin
211
- emit (Paddis (temp, GPR0 , Csymbol_high (id, ofs)));
212
- mk1 temp (Csymbol_low (id, ofs))
213
- end else begin
214
- emit (Paddis (temp, GPR0 , (Csymbol_high (id, ofs))));
215
- emit (Paddi (temp, temp, (Csymbol_low (id, ofs))));
216
- mk1 temp (Cint _0)
217
- end
202
+ emit_aglobal mk1 mk2 ofs_unaligned temp id ofs
218
203
| BA_addptr (BA(IR r ), BA_int n ) ->
219
- if ofs_unaligned || Int. eq (Int. mods n _4) _0 then
220
- if offset_in_range n then
221
- mk1 r (Cint n)
222
- else begin
223
- emit (Paddis (temp, r, Cint (Asmgen. high_s n)));
224
- mk1 temp (Cint (Asmgen. low_s n))
225
- end
226
- else begin
227
- emit (Paddis (temp, r, Cint (Asmgen. high_s n)));
228
- emit (Paddi (temp, temp, Cint (Asmgen. low_s n)));
229
- mk1 temp (Cint _0)
230
- end
204
+ emit_aindexed mk1 mk2 ofs_unaligned r temp n
231
205
| BA_addptr (BA_addrglobal(id , ofs ), BA(IR r )) ->
232
- if symbol_is_small_data id ofs then begin
233
- emit (Paddi (GPR0 , GPR0 , Csymbol_sda (id, ofs)));
234
- mk2 r GPR0
235
- end else if symbol_is_rel_data id ofs then begin
236
- emit (Pmr (GPR0 , r));
237
- emit (Paddis (temp, GPR0 , Csymbol_rel_high (id, ofs)));
238
- emit (Paddi (temp, temp, Csymbol_rel_low (id, ofs)));
239
- mk2 temp GPR0
240
- end else if ofs_unaligned || Asmgen. symbol_ofs_word_aligned id ofs then begin
241
- emit (Paddis (temp, r, Csymbol_high (id, ofs)));
242
- mk1 temp (Csymbol_low (id, ofs))
243
- end else begin
244
- emit (Pmr (GPR0 , r));
245
- emit (Paddis (temp, GPR0 , Csymbol_high (id, ofs)));
246
- emit (Paddi (temp, temp, Csymbol_low (id, ofs)));
247
- mk2 temp GPR0
248
- end
206
+ emit_abased mk1 mk2 ofs_unaligned r temp id ofs
249
207
| BA_addptr (BA(IR r1 ), BA(IR r2 )) ->
250
- mk2 r1 r2
208
+ emit_aindexed2 mk2 r1 r2
251
209
| _ ->
252
210
assert false
253
211
@@ -260,69 +218,69 @@ let offset_constant cst delta =
260
218
Some (Csymbol_sda (id, Int. add ofs delta))
261
219
| _ -> None
262
220
263
- let expand_load_int64 hi lo base ofs_hi ofs_lo =
221
+ let expand_load_int64 hi lo base ofs_hi ofs_lo k =
264
222
if hi <> base then begin
265
- emit ( Plwz (hi, ofs_hi, base));
266
- emit ( Plwz (lo, ofs_lo, base))
223
+ Plwz (hi, ofs_hi, base) ::
224
+ Plwz (lo, ofs_lo, base) :: k
267
225
end else begin
268
- emit ( Plwz (lo, ofs_lo, base));
269
- emit ( Plwz (hi, ofs_hi, base))
226
+ Plwz (lo, ofs_lo, base) ::
227
+ Plwz (hi, ofs_hi, base) :: k
270
228
end
271
229
272
230
let expand_builtin_vload_1 chunk addr res =
273
231
match chunk, res with
274
232
| Mint8unsigned , BR (IR res ) ->
275
233
expand_volatile_access
276
- (fun r c -> emit ( Plbz (res, c, r)) )
277
- (fun r1 r2 -> emit ( Plbzx (res, r1, r2)) )
234
+ (fun c r k -> Plbz (res, c, r) :: k )
235
+ (fun r1 r2 k -> Plbzx (res, r1, r2) :: k )
278
236
addr GPR11
279
237
| Mint8signed , BR (IR res ) ->
280
238
expand_volatile_access
281
- (fun r c -> emit ( Plbz (res, c, r)); emit ( Pextsb (res, res)) )
282
- (fun r1 r2 -> emit ( Plbzx (res, r1, r2)); emit ( Pextsb (res, res)) )
239
+ (fun c r k -> Plbz (res, c, r) :: Pextsb (res, res) :: k )
240
+ (fun r1 r2 k -> Plbzx (res, r1, r2) :: Pextsb (res, res) :: k )
283
241
addr GPR11
284
242
| Mint16unsigned , BR (IR res ) ->
285
243
expand_volatile_access
286
- (fun r c -> emit ( Plhz (res, c, r)) )
287
- (fun r1 r2 -> emit ( Plhzx (res, r1, r2)) )
244
+ (fun c r k -> Plhz (res, c, r) :: k )
245
+ (fun r1 r2 k -> Plhzx (res, r1, r2) :: k )
288
246
addr GPR11
289
247
| Mint16signed , BR (IR res ) ->
290
248
expand_volatile_access
291
- (fun r c -> emit ( Plha (res, c, r)) )
292
- (fun r1 r2 -> emit ( Plhax (res, r1, r2)) )
249
+ (fun c r k -> Plha (res, c, r) :: k )
250
+ (fun r1 r2 k -> Plhax (res, r1, r2) :: k )
293
251
addr GPR11
294
252
| (Mint32 | Many32 ), BR (IR res ) ->
295
253
expand_volatile_access
296
- (fun r c -> emit ( Plwz (res, c, r)) )
297
- (fun r1 r2 -> emit ( Plwzx (res, r1, r2)) )
254
+ (fun c r k -> Plwz (res, c, r) :: k )
255
+ (fun r1 r2 k -> Plwzx (res, r1, r2) :: k )
298
256
addr GPR11
299
257
| Mfloat32 , BR (FR res ) ->
300
258
expand_volatile_access
301
- (fun r c -> emit ( Plfs (res, c, r)) )
302
- (fun r1 r2 -> emit ( Plfsx (res, r1, r2)) )
259
+ (fun c r k -> Plfs (res, c, r) :: k )
260
+ (fun r1 r2 k -> Plfsx (res, r1, r2) :: k )
303
261
addr GPR11
304
262
| (Mfloat64 | Many64 ), BR (FR res ) ->
305
263
expand_volatile_access
306
- (fun r c -> emit ( Plfd (res, c, r)) )
307
- (fun r1 r2 -> emit ( Plfdx (res, r1, r2)) )
264
+ (fun c r k -> Plfd (res, c, r) :: k )
265
+ (fun r1 r2 k -> Plfdx (res, r1, r2) :: k )
308
266
addr GPR11
309
267
| (Mint64 | Many64 ), BR (IR res ) ->
310
268
expand_volatile_access
311
- (fun r c -> emit ( Pld (res, c, r)) )
312
- (fun r1 r2 -> emit ( Pldx (res, r1, r2)) )
269
+ (fun c r k -> Pld (res, c, r) :: k )
270
+ (fun r1 r2 k -> Pldx (res, r1, r2) :: k )
313
271
~ofs_unaligned: false
314
272
addr GPR11
315
273
| Mint64 , BR_splitlong (BR(IR hi ), BR(IR lo )) ->
316
274
expand_volatile_access
317
- (fun r c ->
275
+ (fun c r k ->
318
276
match offset_constant c _4 with
319
- | Some c' -> expand_load_int64 hi lo r c c'
277
+ | Some c' -> expand_load_int64 hi lo r c c' k
320
278
| None ->
321
- emit ( Paddi (GPR11 , r, c));
322
- expand_load_int64 hi lo GPR11 (Cint _0) (Cint _4))
323
- (fun r1 r2 ->
324
- emit ( Padd (GPR11 , r1, r2));
325
- expand_load_int64 hi lo GPR11 (Cint _0) (Cint _4))
279
+ Paddi (GPR11 , r, c) ::
280
+ expand_load_int64 hi lo GPR11 (Cint _0) (Cint _4) k )
281
+ (fun r1 r2 k ->
282
+ Padd (GPR11 , r1, r2) ::
283
+ expand_load_int64 hi lo GPR11 (Cint _0) (Cint _4) k )
326
284
addr GPR11
327
285
| _ , _ ->
328
286
assert false
@@ -338,55 +296,55 @@ let temp_for_vstore src =
338
296
else if not (List. mem (IR GPR12 ) rl) then GPR12
339
297
else GPR10
340
298
341
- let expand_store_int64 hi lo base ofs_hi ofs_lo =
342
- emit ( Pstw (hi, ofs_hi, base));
343
- emit ( Pstw (lo, ofs_lo, base))
299
+ let expand_store_int64 hi lo base ofs_hi ofs_lo k =
300
+ Pstw (hi, ofs_hi, base) ::
301
+ Pstw (lo, ofs_lo, base) :: k
344
302
345
303
let expand_builtin_vstore_1 chunk addr src =
346
304
let temp = temp_for_vstore src in
347
305
match chunk, src with
348
306
| (Mint8signed | Mint8unsigned ), BA (IR src ) ->
349
307
expand_volatile_access
350
- (fun r c -> emit ( Pstb (src, c, r)) )
351
- (fun r1 r2 -> emit ( Pstbx (src, r1, r2)) )
308
+ (fun c r k -> Pstb (src, c, r) :: k )
309
+ (fun r1 r2 k -> Pstbx (src, r1, r2) :: k )
352
310
addr temp
353
311
| (Mint16signed | Mint16unsigned ), BA (IR src ) ->
354
312
expand_volatile_access
355
- (fun r c -> emit ( Psth (src, c, r)) )
356
- (fun r1 r2 -> emit ( Psthx (src, r1, r2)) )
313
+ (fun c r k -> Psth (src, c, r) :: k )
314
+ (fun r1 r2 k -> Psthx (src, r1, r2) :: k )
357
315
addr temp
358
316
| (Mint32 | Many32 ), BA (IR src ) ->
359
317
expand_volatile_access
360
- (fun r c -> emit ( Pstw (src, c, r)) )
361
- (fun r1 r2 -> emit ( Pstwx (src, r1, r2)) )
318
+ (fun c r k -> Pstw (src, c, r) :: k )
319
+ (fun r1 r2 k -> Pstwx (src, r1, r2) :: k )
362
320
addr temp
363
321
| Mfloat32 , BA (FR src ) ->
364
322
expand_volatile_access
365
- (fun r c -> emit ( Pstfs (src, c, r)) )
366
- (fun r1 r2 -> emit ( Pstfsx (src, r1, r2)) )
323
+ (fun c r k -> Pstfs (src, c, r) :: k )
324
+ (fun r1 r2 k -> Pstfsx (src, r1, r2) :: k )
367
325
addr temp
368
326
| (Mfloat64 | Many64 ), BA (FR src ) ->
369
327
expand_volatile_access
370
- (fun r c -> emit ( Pstfd (src, c, r)) )
371
- (fun r1 r2 -> emit ( Pstfdx (src, r1, r2)) )
328
+ (fun c r k -> Pstfd (src, c, r) :: k )
329
+ (fun r1 r2 k -> Pstfdx (src, r1, r2) :: k )
372
330
addr temp
373
331
| (Mint64 | Many64 ), BA (IR src ) ->
374
332
expand_volatile_access
375
- (fun r c -> emit ( Pstd (src, c, r)) )
376
- (fun r1 r2 -> emit ( Pstdx (src, r1, r2)) )
333
+ (fun c r k -> Pstd (src, c, r) :: k )
334
+ (fun r1 r2 k -> Pstdx (src, r1, r2) :: k )
377
335
~ofs_unaligned: false
378
336
addr temp
379
337
| Mint64 , BA_splitlong (BA(IR hi ), BA(IR lo )) ->
380
338
expand_volatile_access
381
- (fun r c ->
339
+ (fun c r k ->
382
340
match offset_constant c _4 with
383
- | Some c' -> expand_store_int64 hi lo r c c'
341
+ | Some c' -> expand_store_int64 hi lo r c c' k
384
342
| None ->
385
- emit ( Paddi (temp, r, c));
386
- expand_store_int64 hi lo temp (Cint _0) (Cint _4))
387
- (fun r1 r2 ->
388
- emit ( Padd (temp, r1, r2));
389
- expand_store_int64 hi lo temp (Cint _0) (Cint _4))
343
+ Paddi (temp, r, c) ::
344
+ expand_store_int64 hi lo temp (Cint _0) (Cint _4) k )
345
+ (fun r1 r2 k ->
346
+ Padd (temp, r1, r2) ::
347
+ expand_store_int64 hi lo temp (Cint _0) (Cint _4) k )
390
348
addr temp
391
349
| _ , _ ->
392
350
assert false
0 commit comments