aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mppa_k1c/Asm.v5
-rw-r--r--mppa_k1c/Asmexpand.ml10
-rw-r--r--mppa_k1c/CBuiltins.ml10
-rw-r--r--mppa_k1c/TargetPrinter.ml10
-rw-r--r--test/monniaux/k1_builtins/test_k1_builtins.c8
5 files changed, 38 insertions, 5 deletions
diff --git a/mppa_k1c/Asm.v b/mppa_k1c/Asm.v
index 26c6cc02..55138a3f 100644
--- a/mppa_k1c/Asm.v
+++ b/mppa_k1c/Asm.v
@@ -80,6 +80,11 @@ Inductive instruction : Type :=
| Pwfxl (n: int) (src: ireg)
| Pwfxm (n: int) (src: ireg)
| Pldu (dst: ireg) (addr: ireg)
+ | Pawait
+ | Psleep
+ | Pstop
+ | Pbarrier
+ | Pfence
(** Loads **)
| Plb (rd: ireg) (ra: ireg) (ofs: addressing) (**r load byte *)
diff --git a/mppa_k1c/Asmexpand.ml b/mppa_k1c/Asmexpand.ml
index bcc2d28f..e09492e9 100644
--- a/mppa_k1c/Asmexpand.ml
+++ b/mppa_k1c/Asmexpand.ml
@@ -381,6 +381,16 @@ let expand_builtin_inline name args res = let open Asmvliw in
else emit (Pwfxm(n, src)))
| "__builtin_k1_ldu", [BA(IR addr)], BR(IR res) ->
emit (Pldu(res, addr))
+ | "__builtin_k1_await", [], _ ->
+ emit Pawait
+ | "__builtin_k1_sleep", [], _ ->
+ emit Psleep
+ | "__builtin_k1_stop", [], _ ->
+ emit Pstop
+ | "__builtin_k1_barrier", [], _ ->
+ emit Pbarrier
+ | "__builtin_k1_fence", [], _ ->
+ emit Pfence
(* Byte swaps *)
(*| "__builtin_bswap16", [BA(IR a1)], BR(IR res) ->
diff --git a/mppa_k1c/CBuiltins.ml b/mppa_k1c/CBuiltins.ml
index 0de6d0c7..e4652d77 100644
--- a/mppa_k1c/CBuiltins.ml
+++ b/mppa_k1c/CBuiltins.ml
@@ -24,8 +24,8 @@ let builtins = {
(* The builtin list is inspired from the GCC file builtin_k1.h *)
Builtins.functions = [ (* Some builtins are commented out because their opcode is not present (yet?) *)
(* BCU Instructions *)
- "__builtin_k1_await", (TVoid [], [], false);
- "__builtin_k1_barrier", (TVoid [], [], false);
+ "__builtin_k1_await", (TVoid [], [], false); (* DONE *)
+ "__builtin_k1_barrier", (TVoid [], [], false); (* DONE *)
"__builtin_k1_doze", (TVoid [], [], false);
"__builtin_k1_wfxl", (TVoid [], [TInt(IUChar, []); TInt(ILongLong, [])], false); (* DONE *)
"__builtin_k1_wfxm", (TVoid [], [TInt(IUChar, []); TInt(ILongLong, [])], false); (* DONE *)
@@ -33,8 +33,8 @@ let builtins = {
"__builtin_k1_invalitlb", (TVoid [], [], false);
"__builtin_k1_probetlb", (TVoid [], [], false);
"__builtin_k1_readtlb", (TVoid [], [], false);
- "__builtin_k1_sleep", (TVoid [], [], false);
- "__builtin_k1_stop", (TVoid [], [], false);
+ "__builtin_k1_sleep", (TVoid [], [], false); (* DONE *)
+ "__builtin_k1_stop", (TVoid [], [], false); (* DONE *)
"__builtin_k1_syncgroup", (TVoid [], [TInt(IUInt, [])], false);
"__builtin_k1_tlbwrite", (TVoid [], [], false);
@@ -49,7 +49,7 @@ let builtins = {
"__builtin_k1_dinvall", (TVoid [], [TPtr(TVoid [], [])], false);
"__builtin_k1_dtouchl", (TVoid [], [TPtr(TVoid [], [])], false);
"__builtin_k1_dzerol", (TVoid [], [TPtr(TVoid [], [])], false);
- "__builtin_k1_fence", (TVoid [], [], false);
+ "__builtin_k1_fence", (TVoid [], [], false); (* DONE *)
"__builtin_k1_iinval", (TVoid [], [], false);
"__builtin_k1_iinvals", (TVoid [], [TPtr(TVoid [], [])], false);
"__builtin_k1_itouchl", (TVoid [], [TPtr(TVoid [], [])], false);
diff --git a/mppa_k1c/TargetPrinter.ml b/mppa_k1c/TargetPrinter.ml
index b2a9e827..c67792e7 100644
--- a/mppa_k1c/TargetPrinter.ml
+++ b/mppa_k1c/TargetPrinter.ml
@@ -288,6 +288,16 @@ module Target (*: TARGET*) =
fprintf oc " wfxm $s%ld = %a\n" (camlint_of_coqint n) ireg dst
| Pldu(dst, addr) ->
fprintf oc " ld.u %a = 0[%a]\n" ireg dst ireg addr
+ | Pawait ->
+ fprintf oc " await\n"
+ | Psleep ->
+ fprintf oc " sleep\n"
+ | Pstop ->
+ fprintf oc " stop\n"
+ | Pbarrier ->
+ fprintf oc " barrier\n"
+ | Pfence ->
+ fprintf oc " fence\n"
| Pjumptable (idx_reg, tbl) ->
let lbl = new_label() in
diff --git a/test/monniaux/k1_builtins/test_k1_builtins.c b/test/monniaux/k1_builtins/test_k1_builtins.c
index 261eedc2..db90d4ea 100644
--- a/test/monniaux/k1_builtins/test_k1_builtins.c
+++ b/test/monniaux/k1_builtins/test_k1_builtins.c
@@ -10,3 +10,11 @@ void test_system_regs(void) {
void test_loads(void *addr) {
__builtin_k1_ldu(addr);
}
+
+void test_stops(void) {
+ __builtin_k1_await();
+ __builtin_k1_sleep();
+ __builtin_k1_stop();
+ __builtin_k1_barrier();
+ __builtin_k1_fence();
+}