From 5344a75a6a8d09006dbf227cc9717aafd239da20 Mon Sep 17 00:00:00 2001 From: Michael Schmidt Date: Thu, 19 Apr 2018 12:57:53 +0200 Subject: Add new powerpc builtins. New builtin for 64-bit load/store with byte reversal and 64-bit mul-high. Bug 23541 --- powerpc/Asm.v | 4 ++++ powerpc/AsmToJSON.ml | 6 ++++-- powerpc/Asmexpand.ml | 20 ++++++++++++++++++++ powerpc/CBuiltins.ml | 14 ++++++++++++-- powerpc/TargetPrinter.ml | 4 ++++ 5 files changed, 44 insertions(+), 4 deletions(-) diff --git a/powerpc/Asm.v b/powerpc/Asm.v index 746a610b..ff580f01 100644 --- a/powerpc/Asm.v +++ b/powerpc/Asm.v @@ -239,6 +239,7 @@ Inductive instruction : Type := | Pld: ireg -> constant -> ireg -> instruction (**r load 64-bit int (PPC64) *) | Pldx: ireg -> ireg -> ireg -> instruction (**r same, with 2 index regs *) | Pld_a: ireg -> constant -> ireg -> instruction (**r load 64-bit quantity to int reg (PPC64) *) + | Pldbrx: ireg -> ireg -> ireg -> instruction (**r load 64-bit int and reverse endianness (PPC64) *) | Pldx_a: ireg -> ireg -> ireg -> instruction (**r same, with 2 index regs *) | Plfd: freg -> constant -> ireg -> instruction (**r load 64-bit float *) | Plfdx: freg -> ireg -> ireg -> instruction (**r same, with 2 index regs *) @@ -307,6 +308,7 @@ Inductive instruction : Type := | Pstbx: ireg -> ireg -> ireg -> instruction (**r same, with 2 index regs *) | Pstd: ireg -> constant -> ireg -> instruction (**r store 64-bit integer (PPC64) *) | Pstdx: ireg -> ireg -> ireg -> instruction (**r same, with 2 index regs (PPC64) *) + | Pstdbrx: ireg -> ireg -> ireg -> instruction (**r store 64-bit int with reverse endianness (PPC64) *) | Pstdu: ireg -> constant -> ireg -> instruction (**r store 64-bit integer with update (PPC64) *) | Pstd_a: ireg -> constant -> ireg -> instruction (**r store 64-bit quantity from int reg (PPC64) *) | Pstdx_a: ireg -> ireg -> ireg -> instruction (**r same, with 2 index regs (PPC64) *) @@ -1077,6 +1079,7 @@ Definition exec_instr (f: function) (i: instruction) (rs: regset) (m: mem) : out | Picbi _ _ | Picbtls _ _ _ | Pisync + | Pldbrx _ _ _ | Plwsync | Plhbrx _ _ _ | Plwzu _ _ _ @@ -1086,6 +1089,7 @@ Definition exec_instr (f: function) (i: instruction) (rs: regset) (m: mem) : out | Pmtspr _ _ | Prldicl _ _ _ _ | Prldimi _ _ _ _ + | Pstdbrx _ _ _ | Pstdu _ _ _ | Pstwbrx _ _ _ | Pstwcx_ _ _ _ diff --git a/powerpc/AsmToJSON.ml b/powerpc/AsmToJSON.ml index 720d09a6..ee3eaca8 100644 --- a/powerpc/AsmToJSON.ml +++ b/powerpc/AsmToJSON.ml @@ -97,14 +97,14 @@ let mnemonic_names =["Padd"; "Paddc"; "Padde"; "Paddi"; "Paddic"; "Paddis"; "Pa "Pfmadd"; "Pfmr"; "Pfmsub"; "Pfmul"; "Pfmuls"; "Pfneg"; "Pfnmadd"; "Pfnmsub"; "Pfres"; "Pfrsp"; "Pfrsqrte"; "Pfsel"; "Pfsqrt"; "Pfsub"; "Pfsubs"; "Picbi"; "Picbtls"; "Pinlineasm"; "Pisel"; "Pisync"; "Plabel"; - "Plbz"; "Plbzx"; "Pld"; "Pldi"; "Pldx"; "Plfd"; "Plfdx"; "Plfi"; "Plfis"; + "Plbz"; "Plbzx"; "Pld"; "Pldbrx"; "Pldi"; "Pldx"; "Plfd"; "Plfdx"; "Plfi"; "Plfis"; "Plfs"; "Plfsx"; "Plha"; "Plhax"; "Plhbrx"; "Plhz"; "Plhzx"; "Plwarx"; "Plwbrx"; "Plwsync"; "Plwz"; "Plwzu"; "Plwzx"; "Pmbar"; "Pmfcr"; "Pmflr"; "Pmfspr"; "Pmr"; "Pmtctr"; "Pmtlr"; "Pmtspr"; "Pmulhd"; "Pmulhdu"; "Pmulhw"; "Pmulhwu"; "Pmulld"; "Pmulli"; "Pmullw"; "Pnand"; "Pnor"; "Por"; "Porc"; "Pori"; "Poris"; "Prldicl"; "Prldimi"; "Prldinm"; "Prlwimi"; "Prlwinm"; "Psld"; "Pslw"; "Psrad"; "Psradi"; "Psraw"; "Psrawi"; "Psrd"; "Psrw"; - "Pstb"; "Pstbx"; "Pstd"; "Pstdu"; "Pstdx"; "Pstfd"; "Pstfdu"; "Pstfdx"; + "Pstb"; "Pstbx"; "Pstd"; "Pstdbrx"; "Pstdu"; "Pstdx"; "Pstfd"; "Pstfdu"; "Pstfdx"; "Pstfs"; "Pstfsx"; "Psth"; "Psthbrx"; "Psthx"; "Pstw"; "Pstwbrx"; "Pstwcx_"; "Pstwu"; "Pstwux"; "Pstwx"; "Psubfc"; "Psubfe"; "Psubfic"; "Psubfze"; "Psync"; "Ptrap"; "Pxor"; "Pxori"; "Pxoris"] @@ -236,6 +236,7 @@ let pp_instructions pp ic = | Plbzx (ir1,ir2,ir3) -> instruction pp "Plbzx" [Ireg ir1; Ireg ir2; Ireg ir3] | Pld (ir1,c,ir2) | Pld_a (ir1,c,ir2) -> instruction pp "Pld" [Ireg ir1; Constant c; Ireg ir2] + | Pldbrx (ir1,ir2,ir3) -> instruction pp "Pldbrx" [Ireg ir1; Ireg ir2; Ireg ir3] | Pldx (ir1,ir2,ir3) | Pldx_a (ir1,ir2,ir3) -> instruction pp "Pldx" [Ireg ir1; Ireg ir2; Ireg ir3] | Plfd (fr,c,ir) @@ -305,6 +306,7 @@ let pp_instructions pp ic = | Pstbx (ir1,ir2,ir3) -> instruction pp "Pstbx" [Ireg ir1; Ireg ir2; Ireg ir3] | Pstd (ir1,c,ir2) | Pstd_a (ir1,c,ir2) -> instruction pp "Pstd" [Ireg ir1; Constant c; Ireg ir2] + | Pstdbrx (ir1,ir2,ir3) -> instruction pp "Pstdbrx" [Ireg ir1; Ireg ir2; Ireg ir3] | Pstdx (ir1,ir2,ir3) | Pstdx_a (ir1,ir2,ir3) -> instruction pp "Pstdx" [Ireg ir1; Ireg ir2; Ireg ir3] | Pstdu (ir1,c,ir2) -> instruction pp "Pstdu" [Ireg ir1; Constant c; Ireg ir2] diff --git a/powerpc/Asmexpand.ml b/powerpc/Asmexpand.ml index 96b11056..f880e2d1 100644 --- a/powerpc/Asmexpand.ml +++ b/powerpc/Asmexpand.ml @@ -433,6 +433,16 @@ let expand_builtin_inline name args res = emit (Pmulhw(res, a1, a2)) | "__builtin_mulhwu", [BA(IR a1); BA(IR a2)], BR(IR res) -> emit (Pmulhwu(res, a1, a2)) + | "__builtin_mulhd", [BA(IR a1); BA(IR a2)], BR(IR res) -> + if Archi.ppc64 then + emit (Pmulhd(res, a1, a2)) + else + raise (Error "__builtin_mulhd is only supported for PPC64 targets") + | "__builtin_mulhdu", [BA(IR a1); BA(IR a2)], BR(IR res) -> + if Archi.ppc64 then + emit (Pmulhdu(res, a1, a2)) + else + raise (Error "__builtin_mulhdu is only supported for PPC64 targets") | ("__builtin_clz" | "__builtin_clzl"), [BA(IR a1)], BR(IR res) -> emit (Pcntlzw(res, a1)) | "__builtin_clzll", [BA(IR a1)], BR(IR res) -> @@ -543,10 +553,20 @@ let expand_builtin_inline name args res = emit (Plhbrx(res, GPR0, a1)) | "__builtin_read32_reversed", [BA(IR a1)], BR(IR res) -> emit (Plwbrx(res, GPR0, a1)) + | "__builtin_read64_reversed", [BA(IR a1)], BR(IR res) -> + if Archi.ppc64 then + emit (Pldbrx(res, GPR0, a1)) + else + raise (Error "__builtin_read64_reversed is only supported for PPC64 targets") | "__builtin_write16_reversed", [BA(IR a1); BA(IR a2)], _ -> emit (Psthbrx(a2, GPR0, a1)) | "__builtin_write32_reversed", [BA(IR a1); BA(IR a2)], _ -> emit (Pstwbrx(a2, GPR0, a1)) + | "__builtin_write64_reversed", [BA(IR a1); BA(IR a2)], _ -> + if Archi.ppc64 then + emit (Pstdbrx(a2, GPR0, a1)) + else + raise (Error "__builtin_write64_reversed is only supported for PPC64 targets") (* Synchronization *) | "__builtin_membar", [], _ -> () diff --git a/powerpc/CBuiltins.ml b/powerpc/CBuiltins.ml index 35d6b89f..c76b69ba 100644 --- a/powerpc/CBuiltins.ml +++ b/powerpc/CBuiltins.ml @@ -42,6 +42,11 @@ let builtins = { (TInt(IInt, []), [TInt(IULongLong, [])], false); "__builtin_cmpb", (TInt (IUInt, []), [TInt(IUInt, []);TInt(IUInt, [])], false); + (* Integer arithmetic in 32/64-bit hybrid mode *) + "__builtin_mulhd", + (TInt(ILongLong, []), [TInt(ILongLong, []); TInt(ILongLong, [])], false); + "__builtin_mulhdu", + (TInt(IULongLong, []), [TInt(IULongLong, []); TInt(IULongLong, [])], false); (* Float arithmetic *) "__builtin_fmadd", (TFloat(FDouble, []), @@ -80,6 +85,11 @@ let builtins = { (TVoid [], [TPtr(TInt(IUShort, []), []); TInt(IUShort, [])], false); "__builtin_write32_reversed", (TVoid [], [TPtr(TInt(IUInt, []), []); TInt(IUInt, [])], false); + (* Memory accesses in 32/64-bit hybrid mode *) + "__builtin_read64_reversed", + (TInt(IULongLong, []), [TPtr(TInt(IULongLong, [AConst]), [])], false); + "__builtin_write64_reversed", + (TVoid [], [TPtr(TInt(IULongLong, []), []); TInt(IULongLong, [])], false); (* Synchronization *) "__builtin_eieio", (TVoid [], [], false); @@ -113,7 +123,7 @@ let builtins = { (TInt(IUInt, []), [TInt(IInt, [])], false); "__builtin_set_spr", (TVoid [], [TInt(IInt, []); TInt(IUInt, [])], false); - (* Access to special registers in 32bit hybrid mode*) + (* Access to special registers in 32/64-bit hybrid mode *) "__builtin_get_spr64", (TInt(IULongLong, []), [TInt(IInt, [])], false); "__builtin_set_spr64", @@ -135,7 +145,7 @@ let builtins = { (* no operation *) "__builtin_nop", (TVoid [], [], false); - (* atomic operations *) + (* Atomic operations *) "__builtin_atomic_exchange", (TVoid [], [TPtr (TInt(IInt, []),[]);TPtr (TInt(IInt, []),[]);TPtr (TInt(IInt, []),[])],false); "__builtin_atomic_load", diff --git a/powerpc/TargetPrinter.ml b/powerpc/TargetPrinter.ml index 9a6840b1..2a592b26 100644 --- a/powerpc/TargetPrinter.ml +++ b/powerpc/TargetPrinter.ml @@ -618,6 +618,8 @@ module Target (System : SYSTEM):TARGET = fprintf oc " lbzx %a, %a, %a\n" ireg r1 ireg r2 ireg r3 | Pld(r1, c, r2) | Pld_a(r1, c, r2) -> fprintf oc " ld %a, %a(%a)\n" ireg r1 constant c ireg r2 + | Pldbrx(r1, r2, r3) -> + fprintf oc " ldbrx %a, %a, %a\n" ireg r1 ireg r2 ireg r3 | Pldx(r1, r2, r3) | Pldx_a(r1, r2, r3) -> fprintf oc " ldx %a, %a, %a\n" ireg r1 ireg r2 ireg r3 | Plfd(r1, c, r2) | Plfd_a(r1, c, r2) -> @@ -772,6 +774,8 @@ module Target (System : SYSTEM):TARGET = fprintf oc " stbx %a, %a, %a\n" ireg r1 ireg r2 ireg r3 | Pstd(r1, c, r2) | Pstd_a(r1, c, r2) -> fprintf oc " std %a, %a(%a)\n" ireg r1 constant c ireg r2 + | Pstdbrx(r1, r2, r3) -> + fprintf oc " stdbrx %a, %a, %a\n" ireg r1 ireg r2 ireg r3 | Pstdx(r1, r2, r3) | Pstdx_a(r1, r2, r3) -> fprintf oc " stdx %a, %a, %a\n" ireg r1 ireg r2 ireg r3 | Pstdu(r1, c, r2) -> -- cgit