From 0e5f7395d185cde931c11fb3a12e6c2af03a7ebf Mon Sep 17 00:00:00 2001 From: David Monniaux Date: Thu, 11 Apr 2019 14:20:47 +0200 Subject: afaddd / afaddw --- mppa_k1c/Asm.v | 2 ++ mppa_k1c/Asmexpand.ml | 8 ++++++++ mppa_k1c/CBuiltins.ml | 6 +++--- mppa_k1c/Machregs.v | 1 + mppa_k1c/TargetPrinter.ml | 4 ++++ 5 files changed, 18 insertions(+), 3 deletions(-) (limited to 'mppa_k1c') 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 -- cgit