aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCyril SIX <cyril.six@kalray.eu>2019-09-20 14:32:33 +0200
committerCyril SIX <cyril.six@kalray.eu>2019-09-20 14:32:33 +0200
commit1801685f8352b7a120d87d5b529d290728129529 (patch)
treed5b1458e741a426e2f62ec2a0c8100ddb6aca8f5
parent2fa58b2f496c9aa8c0310c4f9f1683d106e8975d (diff)
downloadcompcert-kvx-1801685f8352b7a120d87d5b529d290728129529.tar.gz
compcert-kvx-1801685f8352b7a120d87d5b529d290728129529.zip
__builtin_bswap16, 32 and 64
-rw-r--r--cparser/Machine.ml2
-rw-r--r--mppa_k1c/Asmexpand.ml63
-rw-r--r--mppa_k1c/CBuiltins.ml8
-rw-r--r--test/regression/Makefile4
4 files changed, 38 insertions, 39 deletions
diff --git a/cparser/Machine.ml b/cparser/Machine.ml
index 658cf0f4..ac34fa5f 100644
--- a/cparser/Machine.ml
+++ b/cparser/Machine.ml
@@ -254,7 +254,7 @@ let mppa_k1c =
sizeof_wchar = 4;
sizeof_size_t = 8;
sizeof_ptrdiff_t = 8;
- sizeof_intreg = 4; (* What is this for ? *)
+ sizeof_intreg = 8; (* What is this for ? *)
alignof_ptr = 8;
alignof_short = 2;
alignof_int = 4;
diff --git a/mppa_k1c/Asmexpand.ml b/mppa_k1c/Asmexpand.ml
index 1e5149fd..9c256bd0 100644
--- a/mppa_k1c/Asmexpand.ml
+++ b/mppa_k1c/Asmexpand.ml
@@ -345,34 +345,32 @@ let expand_int64_arith conflict rl fn = assert false
(* Byte swaps. There are no specific instructions, so we use standard,
not-very-efficient formulas. *)
-let expand_bswap16 d s = assert false
+let expand_bswap16 d s = let open Asmvliw in
(* d = (s & 0xFF) << 8 | (s >> 8) & 0xFF *)
-(*emit (Pandiw(X31, X s, coqint_of_camlint 0xFFl));
- emit (Pslliw(X31, X X31, _8));
- emit (Psrliw(d, X s, _8));
- emit (Pandiw(d, X d, coqint_of_camlint 0xFFl));
- emit (Porw(d, X X31, X d))
-*)
+ emit (Pandiw(GPR32, s, coqint_of_camlint 0xFFl)); emit Psemi;
+ emit (Pslliw(GPR32, GPR32, _8)); emit Psemi;
+ emit (Psrliw(d, s, _8)); emit Psemi;
+ emit (Pandiw(d, d, coqint_of_camlint 0xFFl));
+ emit (Porw(d, GPR32, d)); emit Psemi
-let expand_bswap32 d s = assert false
+let expand_bswap32 d s = let open Asmvliw in
(* d = (s << 24)
| (((s >> 8) & 0xFF) << 16)
| (((s >> 16) & 0xFF) << 8)
| (s >> 24) *)
-(*emit (Pslliw(X1, X s, coqint_of_camlint 24l));
- emit (Psrliw(X31, X s, _8));
- emit (Pandiw(X31, X X31, coqint_of_camlint 0xFFl));
- emit (Pslliw(X31, X X31, _16));
- emit (Porw(X1, X X1, X X31));
- emit (Psrliw(X31, X s, _16));
- emit (Pandiw(X31, X X31, coqint_of_camlint 0xFFl));
- emit (Pslliw(X31, X X31, _8));
- emit (Porw(X1, X X1, X X31));
- emit (Psrliw(X31, X s, coqint_of_camlint 24l));
- emit (Porw(d, X X1, X X31))
-*)
-
-let expand_bswap64 d s = assert false
+ emit (Pslliw(GPR16, s, coqint_of_camlint 24l)); emit Psemi;
+ emit (Psrliw(GPR32, s, _8)); emit Psemi;
+ emit (Pandiw(GPR32, GPR32, coqint_of_camlint 0xFFl)); emit Psemi;
+ emit (Pslliw(GPR32, GPR32, _16)); emit Psemi;
+ emit (Porw(GPR16, GPR16, GPR31)); emit Psemi;
+ emit (Psrliw(GPR32, s, _16)); emit Psemi;
+ emit (Pandiw(GPR32, GPR32, coqint_of_camlint 0xFFl)); emit Psemi;
+ emit (Pslliw(GPR32, GPR32, _8)); emit Psemi;
+ emit (Porw(GPR16, GPR16, GPR32)); emit Psemi;
+ emit (Psrliw(GPR32, s, coqint_of_camlint 24l)); emit Psemi;
+ emit (Porw(d, GPR16, GPR32)); emit Psemi
+
+let expand_bswap64 d s = let open Asmvliw in
(* d = s << 56
| (((s >> 8) & 0xFF) << 48)
| (((s >> 16) & 0xFF) << 40)
@@ -381,17 +379,16 @@ let expand_bswap64 d s = assert false
| (((s >> 40) & 0xFF) << 16)
| (((s >> 48) & 0xFF) << 8)
| s >> 56 *)
-(*emit (Psllil(X1, X s, coqint_of_camlint 56l));
+ emit (Psllil(GPR16, s, coqint_of_camlint 56l)); emit Psemi;
List.iter
(fun (n1, n2) ->
- emit (Psrlil(X31, X s, coqint_of_camlint n1));
- emit (Pandil(X31, X X31, coqint_of_camlint 0xFFl));
- emit (Psllil(X31, X X31, coqint_of_camlint n2));
- emit (Porl(X1, X X1, X X31)))
+ emit (Psrlil(GPR32, s, coqint_of_camlint n1)); emit Psemi;
+ emit (Pandil(GPR32, GPR32, coqint_of_camlint 0xFFl)); emit Psemi;
+ emit (Psllil(GPR32, GPR32, coqint_of_camlint n2)); emit Psemi;
+ emit (Porl(GPR16, GPR16, GPR32)); emit Psemi;)
[(8l,48l); (16l,40l); (24l,32l); (32l,24l); (40l,16l); (48l,8l)];
- emit (Psrlil(X31, X s, coqint_of_camlint 56l));
- emit (Porl(d, X X1, X X31))
-*)
+ emit (Psrlil(GPR32, s, coqint_of_camlint 56l)); emit Psemi;
+ emit (Porl(d, GPR16, GPR32)); emit Psemi
(* Handling of compiler-inlined builtins *)
let last_system_register = 511l
@@ -477,6 +474,12 @@ let expand_builtin_inline name args res = let open Asmvliw in
emit (Palclrd(res, addr))
| "__builtin_alclrw", [BA(IR addr)], BR(IR res) ->
emit (Palclrw(res, addr))
+ | "__builtin_bswap16", [BA(IR a1)], BR(IR res) ->
+ expand_bswap16 res a1
+ | ("__builtin_bswap"| "__builtin_bswap32"), [BA(IR a1)], BR(IR res) ->
+ expand_bswap32 res a1
+ | "__builtin_bswap64", [BA(IR src)], BR(IR res) ->
+ expand_bswap64 res src
(* Byte swaps *)
(*| "__builtin_bswap16", [BA(IR a1)], BR(IR res) ->
diff --git a/mppa_k1c/CBuiltins.ml b/mppa_k1c/CBuiltins.ml
index 235496c5..a91119b1 100644
--- a/mppa_k1c/CBuiltins.ml
+++ b/mppa_k1c/CBuiltins.ml
@@ -96,12 +96,8 @@ let builtins = {
(* Synchronization *)
(* "__builtin_fence",
- (TVoid [], [], false);
- (* Integer arithmetic *)
- "__builtin_bswap64",
- (TInt(IULongLong, []),
- [TInt(IULongLong, [])], false);
- (* Float arithmetic *)
+ (TVoid [], [], false); *)
+(* (* Float arithmetic *)
"__builtin_fmadd",
(TFloat(FDouble, []),
[TFloat(FDouble, []); TFloat(FDouble, []); TFloat(FDouble, [])], false);
diff --git a/test/regression/Makefile b/test/regression/Makefile
index ab27c85a..c77aa073 100644
--- a/test/regression/Makefile
+++ b/test/regression/Makefile
@@ -23,8 +23,8 @@ TESTS=int32 int64 floats floats-basics \
TESTS_COMP=attribs1 bitfields1 bitfields2 bitfields3 bitfields4 \
bitfields5 bitfields6 bitfields7 bitfields8 \
builtins-$(ARCH) alignas \
- varargs1 varargs2 varargs3 sections alias aligned
-# FIXME K1C : packedstruct1 packedstruct2
+ varargs1 varargs2 varargs3 sections alias aligned\
+ packedstruct1 packedstruct2
# Can run, both in compiled mode and in interpreter mode,
# but produce processor-dependent results, so no reference output in Results