aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorxleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2011-08-05 09:40:29 +0000
committerxleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2011-08-05 09:40:29 +0000
commit40a41ae1131f05269514e21f769d5d8c07c09c4a (patch)
tree315fa537a178ece91582eec5f92d7f2b56e849ff
parentc72445321a6ae3577a1522c0ad12859565fb19bc (diff)
downloadcompcert-kvx-40a41ae1131f05269514e21f769d5d8c07c09c4a.tar.gz
compcert-kvx-40a41ae1131f05269514e21f769d5d8c07c09c4a.zip
arm/PrintAsm: bugs in expansion of new builtins
test/: testing the builtins git-svn-id: https://yquem.inria.fr/compcert/svn/compcert/trunk@1696 fca1b0fc-160b-0410-b1d3-a4f43f01ea2e
-rw-r--r--arm/PrintAsm.ml7
-rw-r--r--test/regression/builtins.c45
2 files changed, 35 insertions, 17 deletions
diff --git a/arm/PrintAsm.ml b/arm/PrintAsm.ml
index c50acba8..542f3a4e 100644
--- a/arm/PrintAsm.ml
+++ b/arm/PrintAsm.ml
@@ -372,7 +372,7 @@ let print_builtin_vstore oc chunk args =
(* Magic sequence for byte-swapping *)
-let print_bswap oc src dst tmp =
+let print_bswap oc src tmp dst =
(* tmp <> src, tmp <> dst, but can have dst = src *)
(* src = A . B .C . D *)
fprintf oc " eor %a, %a, %a, ror #16\n" ireg tmp ireg src ireg src;
@@ -400,8 +400,9 @@ let print_builtin_inline oc name args res =
(* Memory accesses *)
| "__builtin_read_int16_reversed", [IR a1], IR res ->
fprintf oc " ldrh %a, [%a, #0]\n" ireg res ireg a1;
- fprintf oc " mov %a, %a, lsr #8\n" ireg IR14 ireg res;
- fprintf oc " orr %a, %a, %a, lsl #8\n" ireg res ireg IR14 ireg res; 3
+ fprintf oc " mov %a, %a, lsl #8\n" ireg IR14 ireg res;
+ fprintf oc " and %a, %a, #0xFF00\n" ireg IR14 ireg IR14;
+ fprintf oc " orr %a, %a, %a, lsr #8\n" ireg res ireg IR14 ireg res; 4
| "__builtin_read_int32_reversed", [IR a1], IR res ->
fprintf oc " ldr %a, [%a, #0]\n" ireg res ireg a1;
print_bswap oc res IR14 res; 5
diff --git a/test/regression/builtins.c b/test/regression/builtins.c
index b13578a4..ea971bf7 100644
--- a/test/regression/builtins.c
+++ b/test/regression/builtins.c
@@ -1,22 +1,22 @@
-/* Fun with PowerPC builtins */
+/* Fun with builtins */
#include <stdio.h>
-#ifdef __ppc__
-
int main(int argc, char ** argv)
{
int x = 0x12345678;
unsigned int y = 0xDEADBEEF;
+ double a = 3.14159;
+ double b = 2.718;
+ double c = 1.414;
+ unsigned short s = 0x1234;
+
+#ifdef __ppc__
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));
- double a = 3.14159;
- double b = 2.718;
- double c = 1.414;
-
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));
printf("fabs(%f) = %f\n", a, __builtin_fabs(a));
@@ -27,7 +27,30 @@ int main(int argc, char ** argv)
printf("fsel(%f, %f, %f) = %f\n", a, b, c, __builtin_fsel(a, b, c));
printf("fsel(%f, %f, %f) = %f\n", -a, b, c, __builtin_fsel(-a, b, c));
- unsigned short s = 0x1234;
+ __builtin_eieio();
+ __builtin_sync();
+ __builtin_isync();
+
+#endif
+
+#ifdef __arm__
+
+ printf("bswap(%x) = %x\n", x, __builtin_bswap(x));
+
+ printf("fsqrt(%f) = %f\n", a, __builtin_fsqrt(a));
+
+#endif
+
+#ifdef __i386__
+
+ printf("bswap(%x) = %x\n", x, __builtin_bswap(x));
+
+ printf("fsqrt(%f) = %f\n", a, __builtin_fsqrt(a));
+ printf("fmin(%f, %f) = %f\n", a, b, __builtin_fmin(a, b));
+ printf("fmax(%f, %f) = %f\n", a, b, __builtin_fmax(a, b));
+
+#endif
+
printf ("read_16_rev = %x\n", __builtin_read_int16_reversed(&s));
printf ("read_32_rev = %x\n", __builtin_read_int32_reversed(&y));
__builtin_write_int16_reversed(&s, 0x789A);
@@ -35,15 +58,9 @@ int main(int argc, char ** argv)
__builtin_write_int32_reversed(&y, 0x12345678);
printf ("after write_32_rev: %x\n", y);
- __builtin_eieio();
- __builtin_sync();
- __builtin_isync();
-
return 0;
}
-#endif
-