aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mppa_k1c/Asm.v2
-rw-r--r--mppa_k1c/Asmexpand.ml8
-rw-r--r--mppa_k1c/CBuiltins.ml6
-rw-r--r--mppa_k1c/Machregs.v1
-rw-r--r--mppa_k1c/TargetPrinter.ml4
-rw-r--r--test/monniaux/k1_builtins/atomics.c11
6 files changed, 29 insertions, 3 deletions
diff --git a/mppa_k1c/Asm.v b/mppa_k1c/Asm.v
index b5051de3..a9a88d75 100644
--- a/mppa_k1c/Asm.v
+++ b/mppa_k1c/Asm.v
@@ -92,6 +92,8 @@ Inductive instruction : Type :=
| Piinvals (addr: ireg)
| Pitouchl (addr: ireg)
| Pdzerol (addr: ireg)
+ | Pafaddd (addr: ireg) (incr_res: ireg)
+ | Pafaddw (addr: ireg) (incr_res: ireg)
(** Loads **)
| Plb (rd: ireg) (ra: ireg) (ofs: addressing) (**r load byte *)
diff --git a/mppa_k1c/Asmexpand.ml b/mppa_k1c/Asmexpand.ml
index c4e73b76..872a29f5 100644
--- a/mppa_k1c/Asmexpand.ml
+++ b/mppa_k1c/Asmexpand.ml
@@ -405,6 +405,14 @@ let expand_builtin_inline name args res = let open Asmvliw in
emit (Pitouchl addr)
| "__builtin_k1_dzerol", [BA(IR addr)], _ ->
emit (Pdzerol addr)
+ | "__builtin_k1_afaddd", [BA(IR addr); BA (IR incr_res)], BR(IR res) ->
+ (if res <> incr_res
+ then (emit (Pmv(res, incr_res)); emit Psemi));
+ emit (Pafaddd(addr, res))
+ | "__builtin_k1_afaddw", [BA(IR addr); BA (IR incr_res)], BR(IR res) ->
+ (if res <> incr_res
+ then (emit (Pmv(res, incr_res)); emit Psemi));
+ emit (Pafaddw(addr, res))
(* Byte swaps *)
(*| "__builtin_bswap16", [BA(IR a1)], BR(IR res) ->
diff --git a/mppa_k1c/CBuiltins.ml b/mppa_k1c/CBuiltins.ml
index 1490d94f..9fe5c958 100644
--- a/mppa_k1c/CBuiltins.ml
+++ b/mppa_k1c/CBuiltins.ml
@@ -42,9 +42,9 @@ let builtins = {
"__builtin_k1_set", (TVoid [], [TInt(IInt, []); TInt(IULongLong, [])], false); (* DONE *)
(* LSU Instructions *)
- (* No ACWS - __int128 *)
- "__builtin_k1_afda", (TInt(IULongLong, []), [TPtr(TVoid [], []); TInt(ILongLong, [])], false);
- "__builtin_k1_aldc", (TInt(IULongLong, []), [TPtr(TVoid [], [])], false);
+ (* No ACWS - __int128 *)
+ "__builtin_k1_afaddd", (TInt(IULongLong, []), [TPtr(TVoid [], []); TInt(ILongLong, [])], false);
+ "__builtin_k1_afaddw", (TInt(IUInt, []), [TPtr(TVoid [], []); TInt(IInt, [])], false);
"__builtin_k1_dinval", (TVoid [], [], false); (* DONE *)
"__builtin_k1_dinvall", (TVoid [], [TPtr(TVoid [], [])], false); (* DONE *)
"__builtin_k1_dtouchl", (TVoid [], [TPtr(TVoid [], [])], false); (* DONE *)
diff --git a/mppa_k1c/Machregs.v b/mppa_k1c/Machregs.v
index 61f9089f..06758756 100644
--- a/mppa_k1c/Machregs.v
+++ b/mppa_k1c/Machregs.v
@@ -184,6 +184,7 @@ Definition mregs_for_operation (op: operation): list (option mreg) * option mreg
(* FIXME DMonniaux this seems to be the place for preferred registers for arguments *)
Definition mregs_for_builtin (ef: external_function): list (option mreg) * list(option mreg) := (nil, nil).
+
(* match ef with
| EF_builtin name sg =>
if (negb Archi.ptr64) && string_dec name "__builtin_bswap64" then
diff --git a/mppa_k1c/TargetPrinter.ml b/mppa_k1c/TargetPrinter.ml
index 7b22a857..4599f2a1 100644
--- a/mppa_k1c/TargetPrinter.ml
+++ b/mppa_k1c/TargetPrinter.ml
@@ -312,6 +312,10 @@ module Target (*: TARGET*) =
fprintf oc " itouchl 0[%a]\n" ireg addr
| Pdzerol addr ->
fprintf oc " dzerol 0[%a]\n" ireg addr
+ | Pafaddd(addr, incr_res) ->
+ fprintf oc " afaddd 0[%a] = %a\n" ireg addr ireg incr_res
+ | Pafaddw(addr, incr_res) ->
+ fprintf oc " afaddw 0[%a] = %a\n" ireg addr ireg incr_res
| Pjumptable (idx_reg, tbl) ->
let lbl = new_label() in
diff --git a/test/monniaux/k1_builtins/atomics.c b/test/monniaux/k1_builtins/atomics.c
new file mode 100644
index 00000000..40c459e2
--- /dev/null
+++ b/test/monniaux/k1_builtins/atomics.c
@@ -0,0 +1,11 @@
+#include <stdio.h>
+
+int main() {
+ long lval = 45;
+ long lval2 = __builtin_k1_afaddd(&lval, 6);
+ printf("%ld %ld\n", lval, lval2);
+ int ival = 45;
+ int ival2 = __builtin_k1_afaddw(&ival, 6);
+ printf("%d %d\n", ival, ival2);
+ return 0;
+}