From b1e584557d2c5ef8422694ea6453f537dbd1573a Mon Sep 17 00:00:00 2001 From: Xavier Leroy Date: Thu, 23 Apr 2015 15:01:53 +0200 Subject: Allow "scratch" (non-allocatable temporary registers) to be mentioned in asm clobber lists. --- arm/Machregsaux.ml | 2 ++ arm/Machregsaux.mli | 3 ++- cparser/ExtendedAsm.ml | 1 + ia32/Machregsaux.ml | 2 ++ ia32/Machregsaux.mli | 1 + powerpc/Machregsaux.ml | 2 ++ powerpc/Machregsaux.mli | 3 ++- 7 files changed, 12 insertions(+), 2 deletions(-) diff --git a/arm/Machregsaux.ml b/arm/Machregsaux.ml index 3f7d0693..44e6b192 100644 --- a/arm/Machregsaux.ml +++ b/arm/Machregsaux.ml @@ -25,6 +25,8 @@ let register_names = [ ("F12", F12);("F13", F13);("F14", F14); ("F15", F15) ] +let scratch_register_names = [ "R14" ] + let name_of_register r = let rec rev_assoc = function | [] -> None diff --git a/arm/Machregsaux.mli b/arm/Machregsaux.mli index 90343b5b..f0feec96 100644 --- a/arm/Machregsaux.mli +++ b/arm/Machregsaux.mli @@ -12,7 +12,8 @@ (** Auxiliary functions on machine registers *) +val name_of_register: Machregs.mreg -> string option val register_by_name: string -> Machregs.mreg option +val scratch_register_names: string list val can_reserve_register: Machregs.mreg -> bool -val name_of_register: Machregs.mreg -> string option val mregs_of_clobber: Camlcoq.atom list -> Machregs.mreg list diff --git a/cparser/ExtendedAsm.ml b/cparser/ExtendedAsm.ml index 8751291b..94d23102 100644 --- a/cparser/ExtendedAsm.ml +++ b/cparser/ExtendedAsm.ml @@ -162,6 +162,7 @@ let check_clobbers loc clob = List.iter (fun c -> if Machregsaux.register_by_name c <> None + || List.mem c Machregsaux.scratch_register_names || c = "memory" || c = "cc" then () else error "%aError: unrecognized asm register clobber '%s'" diff --git a/ia32/Machregsaux.ml b/ia32/Machregsaux.ml index 75fd588a..5e98b58b 100644 --- a/ia32/Machregsaux.ml +++ b/ia32/Machregsaux.ml @@ -22,6 +22,8 @@ let register_names = [ ("ST0", FP0) ] +let scratch_register_names = [] + let name_of_register r = let rec rev_assoc = function | [] -> None diff --git a/ia32/Machregsaux.mli b/ia32/Machregsaux.mli index f09ebddb..f0feec96 100644 --- a/ia32/Machregsaux.mli +++ b/ia32/Machregsaux.mli @@ -14,5 +14,6 @@ val name_of_register: Machregs.mreg -> string option val register_by_name: string -> Machregs.mreg option +val scratch_register_names: string list val can_reserve_register: Machregs.mreg -> bool val mregs_of_clobber: Camlcoq.atom list -> Machregs.mreg list diff --git a/powerpc/Machregsaux.ml b/powerpc/Machregsaux.ml index f8253ca4..ba111089 100644 --- a/powerpc/Machregsaux.ml +++ b/powerpc/Machregsaux.ml @@ -33,6 +33,8 @@ let register_names = [ ("F28", F28); ("F29", F29); ("F30", F30); ("F31", F31) ] +let scratch_register_names = [ "R0" ] + let name_of_register r = let rec rev_assoc = function | [] -> None diff --git a/powerpc/Machregsaux.mli b/powerpc/Machregsaux.mli index 90343b5b..f0feec96 100644 --- a/powerpc/Machregsaux.mli +++ b/powerpc/Machregsaux.mli @@ -12,7 +12,8 @@ (** Auxiliary functions on machine registers *) +val name_of_register: Machregs.mreg -> string option val register_by_name: string -> Machregs.mreg option +val scratch_register_names: string list val can_reserve_register: Machregs.mreg -> bool -val name_of_register: Machregs.mreg -> string option val mregs_of_clobber: Camlcoq.atom list -> Machregs.mreg list -- cgit