Write a 32-bit integer to an
The register index consists of 5 bits.
If it is 0, there is no change, because
The value to write is actually any integer, signed or unsigned, of which we only write the low 32 bits into the register, as an unsigned 32-bit register.
The fact that the value to write is any integer is handy for callers, who can just pass the integer (e.g. the exact result of an operation) and let this writer function convert the integer for the register.
Function:
(defun write32-xreg (reg val stat) (declare (xargs :guard (and (ubyte5p reg) (integerp val) (state32p stat)))) (let ((__function__ 'write32-xreg)) (declare (ignorable __function__)) (if (ubyte5-equiv reg 0) (state32-fix stat) (change-state32 stat :xregfile (update-nth (ubyte5-fix reg) (loghead 32 val) (state32->xregfile stat))))))
Theorem:
(defthm state32p-of-write32-xreg (b* ((new-stat (write32-xreg reg val stat))) (state32p new-stat)) :rule-classes :rewrite)
Theorem:
(defthm write32-xreg-of-ubyte5-fix-reg (equal (write32-xreg (ubyte5-fix reg) val stat) (write32-xreg reg val stat)))
Theorem:
(defthm write32-xreg-ubyte5-equiv-congruence-on-reg (implies (ubyte5-equiv reg reg-equiv) (equal (write32-xreg reg val stat) (write32-xreg reg-equiv val stat))) :rule-classes :congruence)
Theorem:
(defthm write32-xreg-of-ifix-val (equal (write32-xreg reg (ifix val) stat) (write32-xreg reg val stat)))
Theorem:
(defthm write32-xreg-int-equiv-congruence-on-val (implies (acl2::int-equiv val val-equiv) (equal (write32-xreg reg val stat) (write32-xreg reg val-equiv stat))) :rule-classes :congruence)
Theorem:
(defthm write32-xreg-of-state32-fix-stat (equal (write32-xreg reg val (state32-fix stat)) (write32-xreg reg val stat)))
Theorem:
(defthm write32-xreg-state32-equiv-congruence-on-stat (implies (state32-equiv stat stat-equiv) (equal (write32-xreg reg val stat) (write32-xreg reg val stat-equiv))) :rule-classes :congruence)