diff options
author | xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e> | 2011-08-05 12:04:58 +0000 |
---|---|---|
committer | xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e> | 2011-08-05 12:04:58 +0000 |
commit | ab624a0ebf01a4f3e45aecb438e890b4da2f66f0 (patch) | |
tree | ffac7325744b54d1973733cfa479e5fa2bc95eac | |
parent | 40a41ae1131f05269514e21f769d5d8c07c09c4a (diff) | |
download | compcert-ab624a0ebf01a4f3e45aecb438e890b4da2f66f0.tar.gz compcert-ab624a0ebf01a4f3e45aecb438e890b4da2f66f0.zip |
More builtins for ARM and PowerPC
git-svn-id: https://yquem.inria.fr/compcert/svn/compcert/trunk@1697 fca1b0fc-160b-0410-b1d3-a4f43f01ea2e
-rw-r--r-- | arm/CBuiltins.ml | 2 | ||||
-rw-r--r-- | arm/PrintAsm.ml | 2 | ||||
-rw-r--r-- | powerpc/CBuiltins.ml | 4 | ||||
-rw-r--r-- | powerpc/PrintAsm.ml | 6 | ||||
-rw-r--r-- | test/regression/builtins.c | 4 |
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)); |