diff options
Diffstat (limited to 'arm')
-rw-r--r-- | arm/Asmexpand.ml | 8 | ||||
-rw-r--r-- | arm/CBuiltins.ml | 4 |
2 files changed, 11 insertions, 1 deletions
diff --git a/arm/Asmexpand.ml b/arm/Asmexpand.ml index 2b19cbe8..65bb19ee 100644 --- a/arm/Asmexpand.ml +++ b/arm/Asmexpand.ml @@ -287,8 +287,14 @@ let expand_builtin_inline name args res = emit (Prev (res, a1)) | "__builtin_bswap16", [BA(IR a1)], BR(IR res) -> emit (Prev16 (res, a1)) - | "__builtin_clz", [BA(IR a1)], BR(IR res) -> + | ("__builtin_clz" | "__builtin_clzl"), [BA(IR a1)], BR(IR res) -> emit (Pclz (res, a1)) + | "__builtin_clzll", [BA_splitlong(BA (IR ah), BA (IR al))], BR(IR res) -> + emit (Pclz (IR14, al)); + emit (Pcmp (ah, SOimm _0)); + emit (Pmovite (TCeq, IR14, SOimm _0, SOreg IR14)); + emit (Pclz (res, ah)); + emit (Padd (res, res, SOreg IR14)) (* Float arithmetic *) | "__builtin_fabs", [BA(FR a1)], BR(FR res) -> emit (Pfabsd (res,a1)) diff --git a/arm/CBuiltins.ml b/arm/CBuiltins.ml index 6751074c..1b06b93b 100644 --- a/arm/CBuiltins.ml +++ b/arm/CBuiltins.ml @@ -31,6 +31,10 @@ let builtins = { (TInt(IUShort, []), [TInt(IUShort, [])], false); "__builtin_clz", (TInt(IInt, []), [TInt(IUInt, [])], false); + "__builtin_clzl", + (TInt(IInt, []), [TInt(IULong, [])], false); + "__builtin_clzll", + (TInt(IInt, []), [TInt(IULongLong, [])], false); (* Float arithmetic *) "__builtin_fsqrt", (TFloat(FDouble, []), [TFloat(FDouble, [])], false); |