aboutsummaryrefslogtreecommitdiffstats
path: root/x86/Asmexpand.ml
diff options
context:
space:
mode:
authorMichael Schmidt <github@mschmidt.me>2018-07-12 14:00:59 +0200
committerXavier Leroy <xavierleroy@users.noreply.github.com>2018-07-12 14:00:59 +0200
commitabf674c626d9b21ceeb5cb3e5dbec0fc115cd16b (patch)
treedf6255927f3262ec46975ab1b2c8e8e1046c49e9 /x86/Asmexpand.ml
parent3b8e9235d4f35d0cde623fb3e3564764f07b4afb (diff)
downloadcompcert-kvx-abf674c626d9b21ceeb5cb3e5dbec0fc115cd16b.tar.gz
compcert-kvx-abf674c626d9b21ceeb5cb3e5dbec0fc115cd16b.zip
Fix expansion of ctzl/clzl builtin for 64bit targets (#127)
bug 24105, issue #243: expand correct version of ctzl/clzl builtin when long type is 64bit wide
Diffstat (limited to 'x86/Asmexpand.ml')
-rw-r--r--x86/Asmexpand.ml17
1 files changed, 15 insertions, 2 deletions
diff --git a/x86/Asmexpand.ml b/x86/Asmexpand.ml
index 9927d2fb..99666920 100644
--- a/x86/Asmexpand.ml
+++ b/x86/Asmexpand.ml
@@ -331,9 +331,17 @@ let expand_builtin_inline name args res =
if a1 <> res then
emit (Pmov_rr (res,a1));
emit (Pbswap16 res)
- | ("__builtin_clz"|"__builtin_clzl"), [BA(IR a1)], BR(IR res) ->
+ | "__builtin_clz", [BA(IR a1)], BR(IR res) ->
emit (Pbsrl (res,a1));
emit (Pxorl_ri(res,coqint_of_camlint 31l))
+ | "__builtin_clzl", [BA(IR a1)], BR(IR res) ->
+ if not(Archi.ptr64) then begin
+ emit (Pbsrl (res,a1));
+ emit (Pxorl_ri(res,coqint_of_camlint 31l))
+ end else begin
+ emit (Pbsrq (res,a1));
+ emit (Pxorl_ri(res,coqint_of_camlint 63l))
+ end
| "__builtin_clzll", [BA(IR a1)], BR(IR res) ->
emit (Pbsrq (res,a1));
emit (Pxorl_ri(res,coqint_of_camlint 63l))
@@ -349,8 +357,13 @@ let expand_builtin_inline name args res =
emit (Pbsrl(res, al));
emit (Pxorl_ri(res, coqint_of_camlint 63l));
emit (Plabel lbl2)
- | ("__builtin_ctz" | "__builtin_ctzl"), [BA(IR a1)], BR(IR res) ->
+ | "__builtin_ctz", [BA(IR a1)], BR(IR res) ->
emit (Pbsfl (res,a1))
+ | "__builtin_ctzl", [BA(IR a1)], BR(IR res) ->
+ if not(Archi.ptr64) then
+ emit (Pbsfl (res,a1))
+ else
+ emit (Pbsfq (res,a1))
| "__builtin_ctzll", [BA(IR a1)], BR(IR res) ->
emit (Pbsfq (res,a1))
| "__builtin_ctzll", [BA_splitlong(BA (IR ah), BA (IR al))], BR(IR res) ->