Skip to content

Commit 29b85c2

Browse files
committed
Add minimal syntactic support for type _Float16
This is part of C23 appendix H, and is starting to be used in system header files. `_Float16` is kept as a distinct FP type during elaboration, then rejected during conversion to CompCert C. The verified part of CompCert is unchanged.
1 parent 5f90f91 commit 29b85c2

9 files changed

Lines changed: 31 additions & 6 deletions

File tree

cfrontend/C2C.ml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,9 @@ let convertIkind k a : coq_type =
421421

422422
let convertFkind k a : coq_type =
423423
match k with
424+
| C.FFloat16 ->
425+
unsupported "'_Float16' type";
426+
Tfloat (F32, a)
424427
| C.FFloat -> Tfloat (F32, a)
425428
| C.FDouble -> Tfloat (F64, a)
426429
| C.FLongDouble ->
@@ -695,6 +698,9 @@ let convertFloat f kind =
695698
match mant with
696699
| Z.Z0 ->
697700
begin match kind with
701+
| FFloat16 ->
702+
unsupported "'_Float16' type";
703+
Ctyping.econst_single (Float.to_single Float.zero)
698704
| FFloat ->
699705
Ctyping.econst_single (Float.to_single Float.zero)
700706
| FDouble | FLongDouble ->
@@ -712,6 +718,9 @@ let convertFloat f kind =
712718
let base = P.of_int (if f.C.hex then 2 else 10) in
713719

714720
begin match kind with
721+
| FFloat16 ->
722+
unsupported "'_Float16' type";
723+
Ctyping.econst_single (Float.to_single Float.zero)
715724
| FFloat ->
716725
let f = Float32.from_parsed base mant exp in
717726
checkFloatOverflow f "float";

cparser/C.mli

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,11 @@ type ikind =
4646
(** Kinds of floating-point numbers*)
4747

4848
type fkind =
49-
FFloat (** [float] *)
50-
| FDouble (** [double] *)
49+
| FFloat16 (** [_Float16] *)
50+
| FFloat (** [float], [_Float32] *)
51+
| FDouble (** [double], [_Float64] *)
5152
| FLongDouble (** [long double] *)
5253

53-
5454
(** Constants *)
5555

5656
type float_cst = {

cparser/Cabs.v

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ Inductive typeSpecifier := (* Merge all specifiers into one type *)
4848
| Tint
4949
| Tlong
5050
| Tfloat
51+
| Tfloat16
5152
| Tdouble
5253
| Tsigned
5354
| Tunsigned

cparser/Cprint.ml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ let const pp = function
5656
else
5757
fprintf pp "%s.%sE%s" v.intPart v.fracPart v.exp;
5858
begin match fk with
59+
| FFloat16 -> () (* no syntax for FP16 literals; should not happen *)
5960
| FFloat -> fprintf pp "F"
6061
| FLongDouble -> fprintf pp "L"
6162
| FDouble -> ()
@@ -123,6 +124,7 @@ let name_of_ikind = function
123124
| IULongLong -> "unsigned long long"
124125

125126
let name_of_fkind = function
127+
| FFloat16 -> "_Float16"
126128
| FFloat -> "float"
127129
| FDouble -> "double"
128130
| FLongDouble -> "long double"

cparser/Cutil.ml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,7 @@ let alignof_ikind = function
461461
| ILongLong | IULongLong -> !config.alignof_longlong
462462

463463
let alignof_fkind = function
464+
| FFloat16 -> 2
464465
| FFloat -> !config.alignof_float
465466
| FDouble -> !config.alignof_double
466467
| FLongDouble -> !config.alignof_longdouble
@@ -515,6 +516,7 @@ let sizeof_ikind = function
515516
| ILongLong | IULongLong -> !config.sizeof_longlong
516517

517518
let sizeof_fkind = function
519+
| FFloat16 -> 2
518520
| FFloat -> !config.sizeof_float
519521
| FDouble -> !config.sizeof_double
520522
| FLongDouble -> !config.sizeof_longdouble
@@ -865,6 +867,7 @@ let integer_rank = function
865867
(* Ranking of float kinds *)
866868

867869
let float_rank = function
870+
| FFloat16 -> 0
868871
| FFloat -> 1
869872
| FDouble -> 2
870873
| FLongDouble -> 3
@@ -922,7 +925,9 @@ let binary_conversion env t1 t2 =
922925
| TFloat(FDouble, _), (TInt _ | TFloat _) -> t1
923926
| (TInt _ | TFloat _), TFloat(FDouble, _) -> t2
924927
| TFloat(FFloat, _), (TInt _ | TFloat _) -> t1
925-
| (TInt _), TFloat(FFloat, _) -> t2
928+
| (TInt _ | TFloat _), TFloat(FFloat, _) -> t2
929+
| TFloat(FFloat16, _), (TInt _ | TFloat _) -> t1
930+
| (TInt _), TFloat(FFloat16, _) -> t2
926931
| TInt(k1, _), TInt(k2, _) ->
927932
if k1 = k2 then t1 else begin
928933
match is_signed_ikind k1, is_signed_ikind k2 with

cparser/Elab.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -815,6 +815,7 @@ let rec elab_specifier ?(only = false) loc env specifier =
815815
| [Cabs.Tunsigned; Cabs.Tlong; Cabs.Tlong; Cabs.Tint] -> simple (TInt(IULongLong, []))
816816

817817
| [Cabs.Tfloat] -> simple (TFloat(FFloat, []))
818+
| [Cabs.Tfloat16] -> simple (TFloat(FFloat16, []))
818819
| [Cabs.Tdouble] -> simple (TFloat(FDouble, []))
819820

820821
| [Cabs.Tlong; Cabs.Tdouble] -> simple (TFloat(FLongDouble, []))

cparser/Lexer.mll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ let () =
3737
("_Bool", fun loc -> UNDERSCORE_BOOL loc);
3838
("_Generic", fun loc -> GENERIC loc);
3939
("_Complex", fun loc -> reserved_keyword loc "_Complex");
40+
("_Float16", fun loc -> FLOAT16 loc);
4041
("_Imaginary", fun loc -> reserved_keyword loc "_Imaginary");
4142
("_Static_assert", fun loc -> STATIC_ASSERT loc);
4243
("__alignof", fun loc -> ALIGNOF loc);
@@ -638,6 +639,7 @@ and singleline_comment = parse
638639
| Pre_parser.EQEQ loc -> loop (Parser.EQEQ loc)
639640
| Pre_parser.EXTERN loc -> loop (Parser.EXTERN loc)
640641
| Pre_parser.FLOAT loc -> loop (Parser.FLOAT loc)
642+
| Pre_parser.FLOAT16 loc -> loop (Parser.FLOAT16 loc)
641643
| Pre_parser.FOR loc -> loop (Parser.FOR loc)
642644
| Pre_parser.GENERIC loc -> loop (Parser.GENERIC loc)
643645
| Pre_parser.GEQ loc -> loop (Parser.GEQ loc)

cparser/Parser.vy

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ Require Cabs.
3535

3636
%token<Cabs.loc> LPAREN RPAREN LBRACK RBRACK LBRACE RBRACE DOT COMMA
3737
SEMICOLON ELLIPSIS TYPEDEF EXTERN STATIC RESTRICT AUTO REGISTER INLINE
38-
NORETURN CHAR SHORT INT LONG SIGNED UNSIGNED FLOAT DOUBLE CONST VOLATILE VOID
38+
NORETURN CHAR SHORT INT LONG SIGNED UNSIGNED FLOAT FLOAT16 DOUBLE
39+
CONST VOLATILE VOID
3940
STRUCT UNION ENUM UNDERSCORE_BOOL PACKED ALIGNAS ATTRIBUTE ASM
4041

4142
%token<Cabs.loc> CASE DEFAULT IF_ ELSE SWITCH WHILE DO FOR GOTO CONTINUE BREAK
@@ -441,6 +442,8 @@ type_specifier:
441442
{ (Cabs.Tlong, loc) }
442443
| loc = FLOAT
443444
{ (Cabs.Tfloat, loc) }
445+
| loc = FLOAT16
446+
{ (Cabs.Tfloat16, loc) }
444447
| loc = DOUBLE
445448
{ (Cabs.Tdouble, loc) }
446449
| loc = SIGNED

cparser/pre_parser.mly

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@
5555
COLON AND MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN ADD_ASSIGN SUB_ASSIGN LEFT_ASSIGN
5656
RIGHT_ASSIGN AND_ASSIGN XOR_ASSIGN OR_ASSIGN LPAREN RPAREN LBRACK RBRACK
5757
LBRACE RBRACE DOT COMMA SEMICOLON ELLIPSIS TYPEDEF EXTERN STATIC RESTRICT
58-
AUTO REGISTER INLINE NORETURN CHAR SHORT INT LONG SIGNED UNSIGNED FLOAT DOUBLE
58+
AUTO REGISTER INLINE NORETURN CHAR SHORT INT LONG SIGNED UNSIGNED
59+
FLOAT FLOAT16 DOUBLE
5960
UNDERSCORE_BOOL CONST VOLATILE VOID STRUCT UNION ENUM CASE DEFAULT IF ELSE
6061
SWITCH WHILE DO FOR GOTO CONTINUE BREAK RETURN BUILTIN_VA_ARG ALIGNOF
6162
ATTRIBUTE ALIGNAS PACKED ASM BUILTIN_OFFSETOF STATIC_ASSERT GENERIC
@@ -510,6 +511,7 @@ type_specifier_no_typedef_name:
510511
| INT
511512
| LONG
512513
| FLOAT
514+
| FLOAT16
513515
| DOUBLE
514516
| SIGNED
515517
| UNSIGNED

0 commit comments

Comments
 (0)