diff options
-rw-r--r-- | cparser/Machine.ml | 2 | ||||
-rw-r--r-- | mppa_k1c/Asmexpand.ml | 63 | ||||
-rw-r--r-- | mppa_k1c/CBuiltins.ml | 8 | ||||
-rw-r--r-- | test/regression/Makefile | 4 |
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 |