aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--powerpc/Asm.v4
-rw-r--r--powerpc/AsmToJSON.ml6
-rw-r--r--powerpc/Asmexpand.ml20
-rw-r--r--powerpc/CBuiltins.ml14
-rw-r--r--powerpc/TargetPrinter.ml4
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) ->