diff options
author | Bernhard Schommer <bschommer@users.noreply.github.com> | 2018-09-12 14:32:01 +0200 |
---|---|---|
committer | Xavier Leroy <xavierleroy@users.noreply.github.com> | 2018-09-12 14:32:01 +0200 |
commit | 591073be98300e1c07527af45c7c4ce8dff5bc39 (patch) | |
tree | 1f5143b8405b4d33a6133a7210839dab1e6eaad6 /arm/TargetPrinter.ml | |
parent | 25ba7367a0d9391a4bea2d7685b8cfe8e304e2f8 (diff) | |
download | compcert-591073be98300e1c07527af45c7c4ce8dff5bc39.tar.gz compcert-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 'arm/TargetPrinter.ml')
-rw-r--r-- | arm/TargetPrinter.ml | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/arm/TargetPrinter.ml b/arm/TargetPrinter.ml index 52d2ada6..bf37b0e4 100644 --- a/arm/TargetPrinter.ml +++ b/arm/TargetPrinter.ml @@ -306,6 +306,8 @@ struct fprintf oc " vsqrt.f64 %a, %a\n" freg f1 freg f2 | Psbc (r1,r2,sa) -> fprintf oc " sbc %a, %a, %a\n" ireg r1 ireg r2 shift_op sa + | Pnop -> + fprintf oc " nop\n" | Pstr(r1, r2, sa) | Pstr_a(r1, r2, sa) -> fprintf oc " str %a, [%a, %a]\n" ireg r1 ireg r2 shift_op sa | Pstrb(r1, r2, sa) -> @@ -463,7 +465,7 @@ struct | 1 -> let annot = annot_text preg_annot "sp" (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; AisAnnot.add_ais_annot lbl preg_annot "r13" (camlstring_of_coqstring txt) args | _ -> assert false end |