diff options
Diffstat (limited to 'powerpc/Asmexpand.ml')
-rw-r--r-- | powerpc/Asmexpand.ml | 29 |
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)) |