aboutsummaryrefslogtreecommitdiffstats
path: root/x86/Asm.v
diff options
context:
space:
mode:
Diffstat (limited to 'x86/Asm.v')
-rw-r--r--x86/Asm.v11
1 files changed, 10 insertions, 1 deletions
diff --git a/x86/Asm.v b/x86/Asm.v
index 8b873e48..7b4a29f4 100644
--- a/x86/Asm.v
+++ b/x86/Asm.v
@@ -1047,6 +1047,15 @@ Definition preg_of (r: mreg) : preg :=
| FP0 => ST0
end.
+(** Undefine all registers except SP and callee-save registers *)
+
+Definition undef_caller_save_regs (rs: regset) : regset :=
+ fun r =>
+ if preg_eq r SP
+ || In_dec preg_eq r (List.map preg_of (List.filter is_callee_save all_mregs))
+ then rs r
+ else Vundef.
+
(** Extract the values of the arguments of an external call.
We exploit the calling conventions from module [Conventions], except that
we use machine registers instead of locations. *)
@@ -1106,7 +1115,7 @@ Inductive step: state -> trace -> state -> Prop :=
Genv.find_funct_ptr ge b = Some (External ef) ->
extcall_arguments rs m (ef_sig ef) args ->
external_call ef ge args m t res m' ->
- rs' = (set_pair (loc_external_result (ef_sig ef)) res rs) #PC <- (rs RA) ->
+ rs' = (set_pair (loc_external_result (ef_sig ef)) res (undef_caller_save_regs rs)) #PC <- (rs RA) ->
step (State rs m) t (State rs' m').
End RELSEM.