aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXavier Leroy <xavier.leroy@inria.fr>2015-04-23 15:01:53 +0200
committerXavier Leroy <xavier.leroy@inria.fr>2015-04-23 15:01:53 +0200
commitb1e584557d2c5ef8422694ea6453f537dbd1573a (patch)
tree1a72485fa0a1b629d461bba274d22b83f413756a
parent5ad466befa609df178f04886484ee38b1a9c44ed (diff)
downloadcompcert-kvx-b1e584557d2c5ef8422694ea6453f537dbd1573a.tar.gz
compcert-kvx-b1e584557d2c5ef8422694ea6453f537dbd1573a.zip
Allow "scratch" (non-allocatable temporary registers) to be mentioned in asm clobber lists.
-rw-r--r--arm/Machregsaux.ml2
-rw-r--r--arm/Machregsaux.mli3
-rw-r--r--cparser/ExtendedAsm.ml1
-rw-r--r--ia32/Machregsaux.ml2
-rw-r--r--ia32/Machregsaux.mli1
-rw-r--r--powerpc/Machregsaux.ml2
-rw-r--r--powerpc/Machregsaux.mli3
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