aboutsummaryrefslogtreecommitdiffstats
path: root/riscV
diff options
context:
space:
mode:
authorBernhard Schommer <bschommer@users.noreply.github.com>2018-09-12 14:32:01 +0200
committerXavier Leroy <xavierleroy@users.noreply.github.com>2018-09-12 14:32:01 +0200
commit591073be98300e1c07527af45c7c4ce8dff5bc39 (patch)
tree1f5143b8405b4d33a6133a7210839dab1e6eaad6 /riscV
parent25ba7367a0d9391a4bea2d7685b8cfe8e304e2f8 (diff)
downloadcompcert-kvx-591073be98300e1c07527af45c7c4ce8dff5bc39.tar.gz
compcert-kvx-591073be98300e1c07527af45c7c4ce8dff5bc39.zip
Generate a nop instruction after some ais annotations (#137)
* Generate a nop instruction after ais annotations. In order to prevent the merging of ais annotations with following Labels a nop instruction is inserted, but only if the annotation is followed immediately by a label. The insertion of nop instructions is performed during the expansion of builtin and pseudo assembler instructions and is processor independent, by inserting a __builtin_nop built-in. * Add Pnop instruction to ARM, RISC-V, and x86 ARM as well as RISC-V don't have nop instructions that can be easily encoded by for example add with zero instructions. For x86 we used to use `mov X0, X0` for nop but this may not be as efficient as the true nop instruction. * Implement __builtin_nop on all supported target architectures. This builtin is not yet made available on the C side for all architectures. Bug 24067
Diffstat (limited to 'riscV')
-rw-r--r--riscV/Asm.v4
-rw-r--r--riscV/Asmexpand.ml8
-rw-r--r--riscV/TargetPrinter.ml4
3 files changed, 9 insertions, 7 deletions
diff --git a/riscV/Asm.v b/riscV/Asm.v
index 6d223c1d..1d8fda11 100644
--- a/riscV/Asm.v
+++ b/riscV/Asm.v
@@ -344,7 +344,8 @@ Inductive instruction : Type :=
| Ploadsi (rd: freg) (f: float32) (**r load an immediate single *)
| Pbtbl (r: ireg) (tbl: list label) (**r N-way branch through a jump table *)
| Pbuiltin: external_function -> list (builtin_arg preg)
- -> builtin_res preg -> instruction. (**r built-in function (pseudo) *)
+ -> builtin_res preg -> instruction (**r built-in function (pseudo) *)
+ | Pnop : instruction. (**r nop instruction *)
(** The pseudo-instructions are the following:
@@ -985,6 +986,7 @@ Definition exec_instr (f: function) (i: instruction) (rs: regset) (m: mem) : out
| Pfmsubd _ _ _ _
| Pfnmaddd _ _ _ _
| Pfnmsubd _ _ _ _
+ | Pnop
=> Stuck
end.
diff --git a/riscV/Asmexpand.ml b/riscV/Asmexpand.ml
index 0a7f8a8a..3e734747 100644
--- a/riscV/Asmexpand.ml
+++ b/riscV/Asmexpand.ml
@@ -468,7 +468,8 @@ let expand_builtin_inline name args res =
(fun rl ->
emit (Pmulw (rl, X a, X b));
emit (Pmulhuw (rh, X a, X b)))
-
+ | "__builtin_nop", [], _ ->
+ emit Pnop
(* Catch-all *)
| _ ->
raise (Error ("unrecognized builtin " ^ name))
@@ -598,10 +599,7 @@ let preg_to_dwarf = function
let expand_function id fn =
try
set_current_function fn;
- if !Clflags.option_g then
- expand_debug id (* sp= *) 2 preg_to_dwarf expand_instruction fn.fn_code
- else
- List.iter expand_instruction fn.fn_code;
+ expand id (* sp= *) 2 preg_to_dwarf expand_instruction fn.fn_code;
Errors.OK (get_current_function ())
with Error s ->
Errors.Error (Errors.msg (coqstring_of_camlstring s))
diff --git a/riscV/TargetPrinter.ml b/riscV/TargetPrinter.ml
index e3fbfe36..19704bad 100644
--- a/riscV/TargetPrinter.ml
+++ b/riscV/TargetPrinter.ml
@@ -564,6 +564,8 @@ module Target : TARGET =
fprintf oc " jr x5\n";
jumptables := (lbl, tbl) :: !jumptables;
fprintf oc "%s end pseudoinstr btbl\n" comment
+ | Pnop ->
+ fprintf oc " nop\n"
| Pbuiltin(ef, args, res) ->
begin match ef with
| EF_annot(kind,txt, targs) ->
@@ -571,7 +573,7 @@ module Target : TARGET =
| 1 -> let annot = annot_text preg_annot "x2" (camlstring_of_coqstring txt) args in
fprintf oc "%s annotation: %S\n" comment annot
| 2 -> let lbl = new_label () in
- fprintf oc "%a: " label lbl;
+ fprintf oc "%a:\n" label lbl;
add_ais_annot lbl preg_annot "x2" (camlstring_of_coqstring txt) args
| _ -> assert false
end