aboutsummaryrefslogtreecommitdiffstats
path: root/mppa_k1c/Asmexpand.ml
diff options
context:
space:
mode:
Diffstat (limited to 'mppa_k1c/Asmexpand.ml')
-rw-r--r--mppa_k1c/Asmexpand.ml158
1 files changed, 85 insertions, 73 deletions
diff --git a/mppa_k1c/Asmexpand.ml b/mppa_k1c/Asmexpand.ml
index 945974e0..fea71f61 100644
--- a/mppa_k1c/Asmexpand.ml
+++ b/mppa_k1c/Asmexpand.ml
@@ -42,9 +42,10 @@ let wordsize = if Archi.ptr64 then 8 else 4
let align n a = (n + a - 1) land (-a)
(* Emit instruction sequences that set or offset a register by a constant. *)
-
-let expand_loadimm32 dst n =
+(*
+ let expand_loadimm32 dst n =
List.iter emit (Asmgen.loadimm32 dst n [])
+*)
let expand_addptrofs dst src n =
List.iter emit (Asmgen.addptrofs dst src n [])
let expand_storeind_ptr src base ofs =
@@ -60,11 +61,12 @@ let expand_storeind_ptr src base ofs =
(* Fix-up code around calls to variadic functions. Floating-point arguments
residing in FP registers need to be moved to integer registers. *)
-let int_param_regs = [| X10; X11; X12; X13; X14; X15; X16; X17 |]
-let float_param_regs = [| F10; F11; F12; F13; F14; F15; F16; F17 |]
+let int_param_regs = [| GPR0; GPR1; GPR2; GPR3; GPR4; GPR5; GPR6; GPR7 |]
+(* let float_param_regs = [| F10; F11; F12; F13; F14; F15; F16; F17 |] *)
+let float_param_regs = [| |]
-let rec fixup_variadic_call pos tyl =
- if pos < 8 then
+let fixup_variadic_call pos tyl = assert false
+(*if pos < 8 then
match tyl with
| [] ->
()
@@ -98,14 +100,15 @@ let rec fixup_variadic_call pos tyl =
fixup_variadic_call (pos + 2) tyl
end
end
+*)
let fixup_call sg =
if sg.sig_cc.cc_vararg then fixup_variadic_call 0 sg.sig_args
(* Handling of annotations *)
-let expand_annot_val kind txt targ args res =
- emit (Pbuiltin (EF_annot(kind,txt,[targ]), args, BR_none));
+let expand_annot_val kind txt targ args res = assert false
+(*emit (Pbuiltin (EF_annot(kind,txt,[targ]), args, BR_none));
match args, res with
| [BA(IR src)], BR(IR dst) ->
if dst <> src then emit (Pmv (dst, src))
@@ -113,6 +116,7 @@ let expand_annot_val kind txt targ args res =
if dst <> src then emit (Pfmv (dst, src))
| _, _ ->
raise (Error "ill-formed __builtin_annot_val")
+*)
(* Handling of memcpy *)
@@ -121,20 +125,21 @@ let expand_annot_val kind txt targ args res =
let offset_in_range ofs =
let ofs = Z.to_int64 ofs in -2048L <= ofs && ofs < 2048L
-let memcpy_small_arg sz arg tmp =
- match arg with
+let memcpy_small_arg sz arg tmp = assert false
+(*match arg with
| BA (IR r) ->
(r, _0)
| BA_addrstack ofs ->
if offset_in_range ofs
&& offset_in_range (Ptrofs.add ofs (Ptrofs.repr (Z.of_uint sz)))
- then (X2, ofs)
- else begin expand_addptrofs tmp X2 ofs; (tmp, _0) end
+ then (GPR12, ofs)
+ else begin expand_addptrofs tmp GPR12 ofs; (tmp, _0) end
| _ ->
assert false
+*)
-let expand_builtin_memcpy_small sz al src dst =
- let (tsrc, tdst) =
+let expand_builtin_memcpy_small sz al src dst = assert false
+(*let (tsrc, tdst) =
if dst <> BA (IR X5) then (X5, X6) else (X6, X5) in
let (rsrc, osrc) = memcpy_small_arg sz src tsrc in
let (rdst, odst) = memcpy_small_arg sz dst tdst in
@@ -164,17 +169,19 @@ let expand_builtin_memcpy_small sz al src dst =
copy (Ptrofs.add osrc _1) (Ptrofs.add odst _1) (sz - 1)
end
in copy osrc odst sz
+*)
-let memcpy_big_arg sz arg tmp =
- match arg with
+let memcpy_big_arg sz arg tmp = assert false
+(*match arg with
| BA (IR r) -> if r <> tmp then emit (Pmv(tmp, r))
| BA_addrstack ofs ->
expand_addptrofs tmp X2 ofs
| _ ->
assert false
+*)
-let expand_builtin_memcpy_big sz al src dst =
- assert (sz >= al);
+let expand_builtin_memcpy_big sz al src dst = assert false
+(*assert (sz >= al);
assert (sz mod al = 0);
let (s, d) =
if dst <> BA (IR X5) then (X5, X6) else (X6, X5) in
@@ -200,6 +207,7 @@ let expand_builtin_memcpy_big sz al src dst =
emit store;
expand_addptrofs d d delta;
emit (Pbnew (X X7, X0, lbl))
+*)
let expand_builtin_memcpy sz al args =
let (dst, src) =
@@ -210,8 +218,8 @@ let expand_builtin_memcpy sz al args =
(* Handling of volatile reads and writes *)
-let expand_builtin_vload_common chunk base ofs res =
- match chunk, res with
+let expand_builtin_vload_common chunk base ofs res = assert false
+(*match chunk, res with
| Mint8unsigned, BR(IR res) ->
emit (Plbu (res, base, Ofsimm ofs))
| Mint8signed, BR(IR res) ->
@@ -239,30 +247,32 @@ let expand_builtin_vload_common chunk base ofs res =
emit (Pfld (res, base, Ofsimm ofs))
| _ ->
assert false
+*)
-let expand_builtin_vload chunk args res =
- match args with
+let expand_builtin_vload chunk args res = assert false
+(*match args with
| [BA(IR addr)] ->
expand_builtin_vload_common chunk addr _0 res
| [BA_addrstack ofs] ->
if offset_in_range (Z.add ofs (Memdata.size_chunk chunk)) then
- expand_builtin_vload_common chunk X2 ofs res
+ expand_builtin_vload_common chunk GPR12 ofs res
else begin
- expand_addptrofs X31 X2 ofs; (* X31 <- sp + ofs *)
- expand_builtin_vload_common chunk X31 _0 res
+ expand_addptrofs GPR32 GPR12 ofs; (* X31 <- sp + ofs *)
+ expand_builtin_vload_common chunk GPR32 _0 res
end
| [BA_addptr(BA(IR addr), (BA_int ofs | BA_long ofs))] ->
if offset_in_range (Z.add ofs (Memdata.size_chunk chunk)) then
expand_builtin_vload_common chunk addr ofs res
else begin
- expand_addptrofs X31 addr ofs; (* X31 <- addr + ofs *)
- expand_builtin_vload_common chunk X31 _0 res
+ expand_addptrofs GPR32 addr ofs; (* X31 <- addr + ofs *)
+ expand_builtin_vload_common chunk GPR32 _0 res
end
| _ ->
assert false
+*)
-let expand_builtin_vstore_common chunk base ofs src =
- match chunk, src with
+let expand_builtin_vstore_common chunk base ofs src = assert false
+(*match chunk, src with
| (Mint8signed | Mint8unsigned), BA(IR src) ->
emit (Psb (src, base, Ofsimm ofs))
| (Mint16signed | Mint16unsigned), BA(IR src) ->
@@ -281,9 +291,10 @@ let expand_builtin_vstore_common chunk base ofs src =
emit (Pfsd (src, base, Ofsimm ofs))
| _ ->
assert false
+*)
-let expand_builtin_vstore chunk args =
- match args with
+let expand_builtin_vstore chunk args = assert false
+(*match args with
| [BA(IR addr); src] ->
expand_builtin_vstore_common chunk addr _0 src
| [BA_addrstack ofs; src] ->
@@ -302,6 +313,7 @@ let expand_builtin_vstore chunk args =
end
| _ ->
assert false
+*)
(* Handling of varargs *)
@@ -322,19 +334,20 @@ let save_arguments first_reg base_ofs =
for i = first_reg to 7 do
expand_storeind_ptr
int_param_regs.(i)
- X2
+ GPR12
(Ptrofs.repr (Z.add base_ofs (Z.of_uint ((i - first_reg) * wordsize))))
done
let vararg_start_ofs : Z.t option ref = ref None
-let expand_builtin_va_start r =
- match !vararg_start_ofs with
+let expand_builtin_va_start r = assert false
+(*match !vararg_start_ofs with
| None ->
invalid_arg "Fatal error: va_start used in non-vararg function"
| Some ofs ->
expand_addptrofs X31 X2 (Ptrofs.repr ofs);
expand_storeind_ptr X31 r Ptrofs.zero
+*)
(* Auxiliary for 64-bit integer arithmetic built-ins. They expand to
two instructions, one computing the low 32 bits of the result,
@@ -343,26 +356,27 @@ let expand_builtin_va_start r =
instruction, we must go through X31 to hold the low 32 bits of the result.
*)
-let expand_int64_arith conflict rl fn =
- if conflict then (fn X31; emit (Pmv(rl, X31))) else fn rl
+let expand_int64_arith conflict rl fn = assert false
+(*if conflict then (fn X31; emit (Pmv(rl, X31))) else fn rl *)
(* Byte swaps. There are no specific instructions, so we use standard,
not-very-efficient formulas. *)
-let expand_bswap16 d s =
+let expand_bswap16 d s = assert false
(* d = (s & 0xFF) << 8 | (s >> 8) & 0xFF *)
- emit (Pandiw(X31, X s, coqint_of_camlint 0xFFl));
+(*emit (Pandiw(X31, X s, coqint_of_camlint 0xFFl));
emit (Pslliw(X31, X X31, _8));
emit (Psrliw(d, X s, _8));
emit (Pandiw(d, X d, coqint_of_camlint 0xFFl));
emit (Porw(d, X X31, X d))
+*)
-let expand_bswap32 d s =
+let expand_bswap32 d s = assert false
(* d = (s << 24)
| (((s >> 8) & 0xFF) << 16)
| (((s >> 16) & 0xFF) << 8)
| (s >> 24) *)
- emit (Pslliw(X1, X s, coqint_of_camlint 24l));
+(*emit (Pslliw(X1, X s, coqint_of_camlint 24l));
emit (Psrliw(X31, X s, _8));
emit (Pandiw(X31, X X31, coqint_of_camlint 0xFFl));
emit (Pslliw(X31, X X31, _16));
@@ -373,8 +387,9 @@ let expand_bswap32 d s =
emit (Porw(X1, X X1, X X31));
emit (Psrliw(X31, X s, coqint_of_camlint 24l));
emit (Porw(d, X X1, X X31))
+*)
-let expand_bswap64 d s =
+let expand_bswap64 d s = assert false
(* d = s << 56
| (((s >> 8) & 0xFF) << 48)
| (((s >> 16) & 0xFF) << 40)
@@ -383,7 +398,7 @@ let expand_bswap64 d s =
| (((s >> 40) & 0xFF) << 16)
| (((s >> 48) & 0xFF) << 8)
| s >> 56 *)
- emit (Psllil(X1, X s, coqint_of_camlint 56l));
+(*emit (Psllil(X1, X s, coqint_of_camlint 56l));
List.iter
(fun (n1, n2) ->
emit (Psrlil(X31, X s, coqint_of_camlint n1));
@@ -393,6 +408,7 @@ let expand_bswap64 d s =
[(8l,48l); (16l,40l); (24l,32l); (32l,24l); (40l,16l); (48l,8l)];
emit (Psrlil(X31, X s, coqint_of_camlint 56l));
emit (Porl(d, X X1, X X31))
+*)
(* Handling of compiler-inlined builtins *)
@@ -401,13 +417,13 @@ let expand_builtin_inline name args res =
(* Synchronization *)
| "__builtin_membar", [], _ ->
()
- | "__builtin_fence", [], _ ->
+(*| "__builtin_fence", [], _ ->
emit Pfence
- (* Vararg stuff *)
+*)(* Vararg stuff *)
| "__builtin_va_start", [BA(IR a)], _ ->
expand_builtin_va_start a
(* Byte swaps *)
- | "__builtin_bswap16", [BA(IR a1)], BR(IR res) ->
+(*| "__builtin_bswap16", [BA(IR a1)], BR(IR res) ->
expand_bswap16 res a1
| ("__builtin_bswap"| "__builtin_bswap32"), [BA(IR a1)], BR(IR res) ->
expand_bswap32 res a1
@@ -468,7 +484,7 @@ let expand_builtin_inline name args res =
(fun rl ->
emit (Pmulw (rl, X a, X b));
emit (Pmulhuw (rh, X a, X b)))
-
+*)
(* Catch-all *)
| _ ->
raise (Error ("unrecognized builtin " ^ name))
@@ -479,20 +495,20 @@ let expand_instruction instr =
match instr with
| Pallocframe (sz, ofs) ->
let sg = get_current_function_sig() in
- emit (Pmv (X30, X2));
+ emit (Pmv (GPR32, GPR12));
if sg.sig_cc.cc_vararg then begin
let n = arguments_size sg in
let extra_sz = if n >= 8 then 0 else align 16 ((8 - n) * wordsize) in
let full_sz = Z.add sz (Z.of_uint extra_sz) in
- expand_addptrofs X2 X2 (Ptrofs.repr (Z.neg full_sz));
- expand_storeind_ptr X30 X2 ofs;
+ expand_addptrofs GPR12 GPR12 (Ptrofs.repr (Z.neg full_sz));
+ expand_storeind_ptr GPR32 GPR12 ofs;
let va_ofs =
Z.add full_sz (Z.of_sint ((n - 8) * wordsize)) in
vararg_start_ofs := Some va_ofs;
save_arguments n va_ofs
end else begin
- expand_addptrofs X2 X2 (Ptrofs.repr (Z.neg sz));
- expand_storeind_ptr X30 X2 ofs;
+ expand_addptrofs GPR12 GPR12 (Ptrofs.repr (Z.neg sz));
+ expand_storeind_ptr GPR32 GPR12 ofs;
vararg_start_ofs := None
end
| Pfreeframe (sz, ofs) ->
@@ -502,9 +518,9 @@ let expand_instruction instr =
let n = arguments_size sg in
if n >= 8 then 0 else align 16 ((8 - n) * wordsize)
end else 0 in
- expand_addptrofs X2 X2 (Ptrofs.repr (Z.add sz (Z.of_uint extra_sz)))
+ expand_addptrofs GPR12 GPR12 (Ptrofs.repr (Z.add sz (Z.of_uint extra_sz)))
- | Pseqw(rd, rs1, rs2) ->
+(*| Pseqw(rd, rs1, rs2) ->
(* emulate based on the fact that x == 0 iff x <u 1 (unsigned cmp) *)
if rs2 = X0 then begin
emit (Psltiuw(rd, rs1, Int.one))
@@ -565,34 +581,30 @@ let expand_instruction instr =
| _ ->
assert false
end
- | _ ->
+*)| _ ->
emit instr
(* NOTE: Dwarf register maps for RV32G are not yet specified
officially. This is just a placeholder. *)
let int_reg_to_dwarf = function
- | X1 -> 1 | X2 -> 2 | X3 -> 3
- | X4 -> 4 | X5 -> 5 | X6 -> 6 | X7 -> 7
- | X8 -> 8 | X9 -> 9 | X10 -> 10 | X11 -> 11
- | X12 -> 12 | X13 -> 13 | X14 -> 14 | X15 -> 15
- | X16 -> 16 | X17 -> 17 | X18 -> 18 | X19 -> 19
- | X20 -> 20 | X21 -> 21 | X22 -> 22 | X23 -> 23
- | X24 -> 24 | X25 -> 25 | X26 -> 26 | X27 -> 27
- | X28 -> 28 | X29 -> 29 | X30 -> 30 | X31 -> 31
-
-let float_reg_to_dwarf = function
- | F0 -> 32 | F1 -> 33 | F2 -> 34 | F3 -> 35
- | F4 -> 36 | F5 -> 37 | F6 -> 38 | F7 -> 39
- | F8 -> 40 | F9 -> 41 | F10 -> 42 | F11 -> 43
- | F12 -> 44 | F13 -> 45 | F14 -> 46 | F15 -> 47
- | F16 -> 48 | F17 -> 49 | F18 -> 50 | F19 -> 51
- | F20 -> 52 | F21 -> 53 | F22 -> 54 | F23 -> 55
- | F24 -> 56 | F25 -> 57 | F26 -> 58 | F27 -> 59
- | F28 -> 60 | F29 -> 61 | F30 -> 62 | F31 -> 63
+ | GPR0 -> 1 | GPR1 -> 2 | GPR2 -> 3 | GPR3 -> 4 | GPR4 -> 5
+ | GPR5 -> 6 | GPR6 -> 7 | GPR7 -> 8 | GPR8 -> 9 | GPR9 -> 10
+ | GPR10 -> 11 | GPR11 -> 12 | GPR12 -> 13 | GPR13 -> 14 | GPR14 -> 15
+ | GPR15 -> 16 | GPR16 -> 17 | GPR17 -> 18 | GPR18 -> 19 | GPR19 -> 20
+ | GPR20 -> 21 | GPR21 -> 22 | GPR22 -> 23 | GPR23 -> 24 | GPR24 -> 25
+ | GPR25 -> 26 | GPR26 -> 27 | GPR27 -> 28 | GPR28 -> 29 | GPR29 -> 30
+ | GPR30 -> 31 | GPR31 -> 32 | GPR32 -> 33 | GPR33 -> 34 | GPR34 -> 35
+ | GPR35 -> 36 | GPR36 -> 37 | GPR37 -> 38 | GPR38 -> 39 | GPR39 -> 40
+ | GPR40 -> 41 | GPR41 -> 42 | GPR42 -> 43 | GPR43 -> 44 | GPR44 -> 45
+ | GPR45 -> 46 | GPR46 -> 47 | GPR47 -> 48 | GPR48 -> 49 | GPR49 -> 50
+ | GPR50 -> 51 | GPR51 -> 52 | GPR52 -> 53 | GPR53 -> 54 | GPR54 -> 55
+ | GPR55 -> 56 | GPR56 -> 57 | GPR57 -> 58 | GPR58 -> 59 | GPR59 -> 60
+ | GPR60 -> 61 | GPR61 -> 62 | GPR62 -> 63 | GPR63 -> 64
let preg_to_dwarf = function
| IR r -> int_reg_to_dwarf r
- | FR r -> float_reg_to_dwarf r
+ | FR r -> int_reg_to_dwarf r
+ | RA -> 65 (* FIXME - No idea *)
| _ -> assert false
let expand_function id fn =