From abf674c626d9b21ceeb5cb3e5dbec0fc115cd16b Mon Sep 17 00:00:00 2001 From: Michael Schmidt Date: Thu, 12 Jul 2018 14:00:59 +0200 Subject: 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 --- x86/Asmexpand.ml | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'x86') 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) -> -- cgit