aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arm/CBuiltins.ml2
-rw-r--r--arm/PrintAsm.ml2
-rw-r--r--powerpc/CBuiltins.ml4
-rw-r--r--powerpc/PrintAsm.ml6
-rw-r--r--test/regression/builtins.c4
5 files changed, 15 insertions, 3 deletions
diff --git a/arm/CBuiltins.ml b/arm/CBuiltins.ml
index dc4ca60e..6c01a36a 100644
--- a/arm/CBuiltins.ml
+++ b/arm/CBuiltins.ml
@@ -24,6 +24,8 @@ let builtins = {
(* Integer arithmetic *)
"__builtin_bswap",
(TInt(IUInt, []), [TInt(IUInt, [])], false);
+ "__builtin_cntlz",
+ (TInt(IUInt, []), [TInt(IUInt, [])], false);
(* Float arithmetic *)
"__builtin_fsqrt",
(TFloat(FDouble, []), [TFloat(FDouble, [])], false);
diff --git a/arm/PrintAsm.ml b/arm/PrintAsm.ml
index 542f3a4e..db95e549 100644
--- a/arm/PrintAsm.ml
+++ b/arm/PrintAsm.ml
@@ -392,6 +392,8 @@ let print_builtin_inline oc name args res =
(* Integer arithmetic *)
| "__builtin_bswap", [IR a1], IR res ->
print_bswap oc a1 IR14 res; 4
+ | "__builtin_cntlz", [IR a1], IR res ->
+ fprintf oc " clz %a, %a\n" ireg res ireg a1; 1
(* Float arithmetic *)
| "__builtin_fabs", [FR a1], FR res ->
fprintf oc " fabsd %a, %a\n" freg res freg a1; 1
diff --git a/powerpc/CBuiltins.ml b/powerpc/CBuiltins.ml
index 4fbe6e44..6b683806 100644
--- a/powerpc/CBuiltins.ml
+++ b/powerpc/CBuiltins.ml
@@ -26,7 +26,9 @@ let builtins = {
(TInt(IInt, []), [TInt(IInt, []); TInt(IInt, [])], false);
"__builtin_mulhwu",
(TInt(IUInt, []), [TInt(IUInt, []); TInt(IUInt, [])], false);
- "__builtin_cntlzw",
+ "__builtin_cntlz",
+ (TInt(IUInt, []), [TInt(IUInt, [])], false);
+ "__builtin_bswap",
(TInt(IUInt, []), [TInt(IUInt, [])], false);
(* Float arithmetic *)
"__builtin_fmadd",
diff --git a/powerpc/PrintAsm.ml b/powerpc/PrintAsm.ml
index 794441c8..68e607b9 100644
--- a/powerpc/PrintAsm.ml
+++ b/powerpc/PrintAsm.ml
@@ -428,8 +428,12 @@ let print_builtin_inline oc name args res =
fprintf oc " mulhw %a, %a, %a\n" ireg res ireg a1 ireg a2
| "__builtin_mulhwu", [IR a1; IR a2], IR res ->
fprintf oc " mulhwu %a, %a, %a\n" ireg res ireg a1 ireg a2
- | "__builtin_cntlzw", [IR a1], IR res ->
+ | "__builtin_cntlz", [IR a1], IR res ->
fprintf oc " cntlzw %a, %a\n" ireg res ireg a1
+ | "__builtin_bswap", [IR a1], IR res ->
+ fprintf oc " stwu %a, -8(%a)\n" ireg a1 ireg GPR1;
+ fprintf oc " lwbrx %a, %a, %a\n" ireg res ireg_or_zero GPR0 ireg GPR1;
+ fprintf oc " addi %a, %a, 8\n" ireg GPR1 ireg GPR1
(* Float arithmetic *)
| "__builtin_fmadd", [FR a1; FR a2; FR a3], FR res ->
fprintf oc " fmadd %a, %a, %a, %a\n" freg res freg a1 freg a2 freg a3
diff --git a/test/regression/builtins.c b/test/regression/builtins.c
index ea971bf7..96b1699c 100644
--- a/test/regression/builtins.c
+++ b/test/regression/builtins.c
@@ -15,7 +15,8 @@ int main(int argc, char ** argv)
printf("mulhw(%x, %x) = %x\n", x, y, __builtin_mulhw(x, y));
printf("mulhwu(%x, %x) = %x\n", x, y, __builtin_mulhwu(x, y));
- printf("cntlzw(%x) = %d\n", x, __builtin_cntlzw(x));
+ printf("cntlz(%x) = %d\n", x, __builtin_cntlz(x));
+ printf("bswap(%x) = %x\n", x, __builtin_bswap(x));
printf("fmadd(%f, %f, %f) = %f\n", a, b, c, __builtin_fmadd(a, b, c));
printf("fmsub(%f, %f, %f) = %f\n", a, b, c, __builtin_fmsub(a, b, c));
@@ -36,6 +37,7 @@ int main(int argc, char ** argv)
#ifdef __arm__
printf("bswap(%x) = %x\n", x, __builtin_bswap(x));
+ printf("cntlz(%x) = %d\n", x, __builtin_cntlz(x));
printf("fsqrt(%f) = %f\n", a, __builtin_fsqrt(a));