Skip to content

Commit 7e8e3ef

Browse files
bschommerxavierleroy
authored andcommitted
Share code for memory access for PowerPC
Instead of duplicating the memory access code in `Asmexpand.ml` we move the code for each of the different addressings in `Asmgen.v` into separate functions that then can be reused in `Asmexpand.ml`.
1 parent a320361 commit 7e8e3ef

File tree

4 files changed

+159
-166
lines changed

4 files changed

+159
-166
lines changed

powerpc/Asmexpand.ml

+72-114
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,20 @@ let emit_loadimm r n =
5858
let emit_addimm rd rs n =
5959
List.iter emit (Asmgen.addimm rd rs n [])
6060

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 [])
6175
(* Numbering of bits in the CR register *)
6276

6377
let num_crbit = function
@@ -175,79 +189,23 @@ let expand_builtin_memcpy sz al args =
175189
(* Handling of volatile reads and writes *)
176190

177191
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)
180194
?(ofs_unaligned = true)
181195
addr temp =
182196
match addr with
183197
| BA(IR r) ->
184-
mk1 r (Cint _0)
198+
List.iter emit (mk1 (Cint _0) r [])
185199
| 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
198201
| 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
218203
| 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
231205
| 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
249207
| BA_addptr(BA(IR r1), BA(IR r2)) ->
250-
mk2 r1 r2
208+
emit_aindexed2 mk2 r1 r2
251209
| _ ->
252210
assert false
253211

@@ -260,69 +218,69 @@ let offset_constant cst delta =
260218
Some (Csymbol_sda(id, Int.add ofs delta))
261219
| _ -> None
262220

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 =
264222
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
267225
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
270228
end
271229

272230
let expand_builtin_vload_1 chunk addr res =
273231
match chunk, res with
274232
| Mint8unsigned, BR(IR res) ->
275233
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)
278236
addr GPR11
279237
| Mint8signed, BR(IR res) ->
280238
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)
283241
addr GPR11
284242
| Mint16unsigned, BR(IR res) ->
285243
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)
288246
addr GPR11
289247
| Mint16signed, BR(IR res) ->
290248
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)
293251
addr GPR11
294252
| (Mint32 | Many32), BR(IR res) ->
295253
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)
298256
addr GPR11
299257
| Mfloat32, BR(FR res) ->
300258
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)
303261
addr GPR11
304262
| (Mfloat64 | Many64), BR(FR res) ->
305263
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)
308266
addr GPR11
309267
| (Mint64 | Many64), BR(IR res) ->
310268
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)
313271
~ofs_unaligned:false
314272
addr GPR11
315273
| Mint64, BR_splitlong(BR(IR hi), BR(IR lo)) ->
316274
expand_volatile_access
317-
(fun r c ->
275+
(fun c r k->
318276
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
320278
| 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)
326284
addr GPR11
327285
| _, _ ->
328286
assert false
@@ -338,55 +296,55 @@ let temp_for_vstore src =
338296
else if not (List.mem (IR GPR12) rl) then GPR12
339297
else GPR10
340298

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
344302

345303
let expand_builtin_vstore_1 chunk addr src =
346304
let temp = temp_for_vstore src in
347305
match chunk, src with
348306
| (Mint8signed | Mint8unsigned), BA(IR src) ->
349307
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)
352310
addr temp
353311
| (Mint16signed | Mint16unsigned), BA(IR src) ->
354312
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)
357315
addr temp
358316
| (Mint32 | Many32), BA(IR src) ->
359317
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)
362320
addr temp
363321
| Mfloat32, BA(FR src) ->
364322
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)
367325
addr temp
368326
| (Mfloat64 | Many64), BA(FR src) ->
369327
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)
372330
addr temp
373331
| (Mint64 | Many64), BA(IR src) ->
374332
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)
377335
~ofs_unaligned:false
378336
addr temp
379337
| Mint64, BA_splitlong(BA(IR hi), BA(IR lo)) ->
380338
expand_volatile_access
381-
(fun r c ->
339+
(fun c r k ->
382340
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
384342
| 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)
390348
addr temp
391349
| _, _ ->
392350
assert false

0 commit comments

Comments
 (0)