From 51d32b92df4eeba729c4cb950d6374b8f879ca5c Mon Sep 17 00:00:00 2001 From: Bernhard Schommer Date: Tue, 18 Sep 2018 10:43:53 +0200 Subject: Add builtin isel (conditional move) for int64, uint64 and _Bool (#140) New builtin isel variants to support conditional moves for 64bit integers and _Bool values. Bug 24516 --- powerpc/Asmexpand.ml | 8 +++++++- powerpc/CBuiltins.ml | 9 +++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/powerpc/Asmexpand.ml b/powerpc/Asmexpand.ml index 5a2df8d3..106193d9 100644 --- a/powerpc/Asmexpand.ml +++ b/powerpc/Asmexpand.ml @@ -669,7 +669,7 @@ let expand_builtin_inline name args res = | "__builtin_return_address",_,BR (IR res) -> emit (Plwz (res, Cint! retaddr_offset,GPR1)) (* Integer selection *) - | ("__builtin_isel" | "__builtin_uisel"), [BA (IR a1); BA (IR a2); BA (IR a3)],BR (IR res) -> + | ("__builtin_bsel" | "__builtin_isel" | "__builtin_uisel"), [BA (IR a1); BA (IR a2); BA (IR a3)],BR (IR res) -> if eref then begin emit (Pcmpwi (a1,Cint (Int.zero))); emit (Pisel (res,a3,a2,CRbit_2)) @@ -688,6 +688,12 @@ let expand_builtin_inline name args res = end; emit (Por (res, res, GPR0)) end + | ("__builtin_isel64" | "__builtin_uisel64"), [BA (IR a1); BA (IR a2); BA (IR a3)],BR (IR res) -> + if eref && Archi.ppc64 then begin + emit (Pcmpwi (a1,Cint (Int.zero))); + emit (Pisel (res,a3,a2,CRbit_2)) + end else + raise (Error (name ^" is only supported for PPC64 targets")) (* no operation *) | "__builtin_nop", [], _ -> emit (Pori (GPR0, GPR0, Cint _0)) diff --git a/powerpc/CBuiltins.ml b/powerpc/CBuiltins.ml index c76b69ba..11b7aef9 100644 --- a/powerpc/CBuiltins.ml +++ b/powerpc/CBuiltins.ml @@ -142,6 +142,15 @@ let builtins = { (* uisel *) "__builtin_uisel", (TInt (IUInt, []),[TInt(IBool, []);TInt(IUInt, []);TInt(IUInt, [])],false); + (* isel64 *) + "__builtin_isel64", + (TInt (ILongLong, []),[TInt(IBool, []);TInt(ILongLong, []);TInt(ILongLong, [])],false); + (* uisel *) + "__builtin_uisel64", + (TInt (IULongLong, []),[TInt(IBool, []);TInt(IULongLong, []);TInt(IULongLong, [])],false); + (* bsel *) + "__builtin_bsel", + (TInt (IBool, []),[TInt(IBool, []);TInt(IBool, []);TInt(IBool, [])],false); (* no operation *) "__builtin_nop", (TVoid [], [], false); -- cgit