aboutsummaryrefslogtreecommitdiffstats
path: root/powerpc/Asmexpand.ml
diff options
context:
space:
mode:
authorMichael Schmidt <github@mschmidt.me>2018-04-19 12:57:53 +0200
committerBernhard Schommer <bernhardschommer@gmail.com>2018-04-27 14:28:14 +0200
commit5344a75a6a8d09006dbf227cc9717aafd239da20 (patch)
treed93f6fc3ea006d42de2ef8cfbd61fe34bd0c0680 /powerpc/Asmexpand.ml
parent2aa105b546748cc0dd2fa65d4e9b948395a412eb (diff)
downloadcompcert-kvx-5344a75a6a8d09006dbf227cc9717aafd239da20.tar.gz
compcert-kvx-5344a75a6a8d09006dbf227cc9717aafd239da20.zip
Add new powerpc builtins.
New builtin for 64-bit load/store with byte reversal and 64-bit mul-high. Bug 23541
Diffstat (limited to 'powerpc/Asmexpand.ml')
-rw-r--r--powerpc/Asmexpand.ml20
1 files changed, 20 insertions, 0 deletions
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", [], _ ->
()