aboutsummaryrefslogtreecommitdiffstats
path: root/powerpc/Asmexpand.ml
diff options
context:
space:
mode:
Diffstat (limited to 'powerpc/Asmexpand.ml')
-rw-r--r--powerpc/Asmexpand.ml29
1 files changed, 23 insertions, 6 deletions
diff --git a/powerpc/Asmexpand.ml b/powerpc/Asmexpand.ml
index 96b11056..5a2df8d3 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", [], _ ->
()
@@ -562,7 +582,7 @@ let expand_builtin_inline name args res =
if not (mo = _0 || mo = _1) then
raise (Error "the argument of __builtin_mbar must be 0 or 1");
emit (Pmbar mo)
- | "__builin_mbar", _, _ ->
+ | "__builtin_mbar", _, _ ->
raise (Error "the argument of __builtin_mbar must be a constant");
| "__builtin_trap", [], _ ->
emit (Ptrap)
@@ -871,7 +891,7 @@ let expand_instruction instr =
expand_builtin_memcpy (Z.to_int sz) (Z.to_int al) args
| EF_annot_val(kind,txt, targ) ->
expand_annot_val kind txt targ args res
- | EF_annot _ | EF_debug _ | EF_inline_asm _ ->
+ | EF_annot _ | EF_debug _ | EF_inline_asm _ ->
emit instr
| _ ->
assert false
@@ -912,10 +932,7 @@ let preg_to_dwarf = function
let expand_function id fn =
try
set_current_function fn;
- if !Clflags.option_g then
- expand_debug id 1 preg_to_dwarf expand_instruction fn.fn_code
- else
- List.iter expand_instruction fn.fn_code;
+ expand id 1 preg_to_dwarf expand_instruction fn.fn_code;
Errors.OK (get_current_function ())
with Error s ->
Errors.Error (Errors.msg (coqstring_of_camlstring s))