diff options
author | Bernhard Schommer <bschommer@users.noreply.github.com> | 2019-08-12 16:16:10 +0200 |
---|---|---|
committer | Xavier Leroy <xavierleroy@users.noreply.github.com> | 2019-08-12 16:16:10 +0200 |
commit | 040d9c67942c73d875eec9a2ab131fbae6e8f984 (patch) | |
tree | 13a98dd663fb8b7a7824d3fc629a9ab2e9301e98 /common | |
parent | 2ce5e496b8d4c838c87c9f00a84ed23d1abc26fc (diff) | |
download | compcert-040d9c67942c73d875eec9a2ab131fbae6e8f984.tar.gz compcert-040d9c67942c73d875eec9a2ab131fbae6e8f984.zip |
bswap builtins: give semantics to them, support bswap64 on all targets
* Added semantic for byte swap builtins
The `__builtin_bswap`, `__builtin_bswap16`, `__builtin_bswap32`, `__builtin_bswap64` builtin function are now standard builtin functions with a defined semantics.
The semantics is given in terms of the decode/encode functions used for the memory model.
* Added bswap64 expansion to PowerPC 32 bits.
* Added bswap64 expansion for ARM.
Diffstat (limited to 'common')
-rw-r--r-- | common/Builtins0.v | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/common/Builtins0.v b/common/Builtins0.v index c6a299d9..b78006dd 100644 --- a/common/Builtins0.v +++ b/common/Builtins0.v @@ -16,7 +16,7 @@ (** Associating semantics to built-in functions *) Require Import String Coqlib. -Require Import AST Integers Floats Values. +Require Import AST Integers Floats Values Memdata. (** This module provides definitions and mechanisms to associate semantics with names of built-in functions. @@ -337,6 +337,9 @@ Inductive standard_builtin : Type := | BI_addl | BI_subl | BI_mull + | BI_i16_bswap + | BI_i32_bswap + | BI_i64_bswap | BI_i64_umulh | BI_i64_smulh | BI_i64_sdiv @@ -366,6 +369,10 @@ Definition standard_builtin_table : list (string * standard_builtin) := :: ("__builtin_addl", BI_addl) :: ("__builtin_subl", BI_subl) :: ("__builtin_mull", BI_mull) + :: ("__builtin_bswap16", BI_i16_bswap) + :: ("__builtin_bswap", BI_i32_bswap) + :: ("__builtin_bswap32", BI_i32_bswap) + :: ("__builtin_bswap64", BI_i64_bswap) :: ("__compcert_i64_umulh", BI_i64_umulh) :: ("__compcert_i64_smulh", BI_i64_smulh) :: ("__compcert_i64_sdiv", BI_i64_sdiv) @@ -396,6 +403,12 @@ Definition standard_builtin_sig (b: standard_builtin) : signature := mksignature (Tlong :: Tlong :: nil) (Some Tlong) cc_default | BI_mull => mksignature (Tint :: Tint :: nil) (Some Tlong) cc_default + | BI_i32_bswap => + mksignature (Tint :: nil) (Some Tint) cc_default + | BI_i64_bswap => + mksignature (Tlong :: nil) (Some Tlong) cc_default + | BI_i16_bswap => + mksignature (Tint :: nil) (Some Tint) cc_default | BI_i64_shl | BI_i64_shr | BI_i64_sar => mksignature (Tlong :: Tint :: nil) (Some Tlong) cc_default | BI_i64_dtos | BI_i64_dtou => @@ -420,6 +433,15 @@ Program Definition standard_builtin_sem (b: standard_builtin) : builtin_sem (pro | BI_addl => mkbuiltin_v2t Tlong Val.addl _ _ | BI_subl => mkbuiltin_v2t Tlong Val.subl _ _ | BI_mull => mkbuiltin_v2t Tlong Val.mull' _ _ + | BI_i16_bswap => + mkbuiltin_n1t Tint Tint + (fun n => Int.repr (decode_int (List.rev (encode_int 2%nat (Int.unsigned n))))) + | BI_i32_bswap => + mkbuiltin_n1t Tint Tint + (fun n => Int.repr (decode_int (List.rev (encode_int 4%nat (Int.unsigned n))))) + | BI_i64_bswap => + mkbuiltin_n1t Tlong Tlong + (fun n => Int64.repr (decode_int (List.rev (encode_int 8%nat (Int64.unsigned n))))) | BI_i64_umulh => mkbuiltin_n2t Tlong Tlong Tlong Int64.mulhu | BI_i64_smulh => mkbuiltin_n2t Tlong Tlong Tlong Int64.mulhs | BI_i64_sdiv => mkbuiltin_v2p Tlong Val.divls _ _ |