• Top
    • Documentation
    • Books
    • Boolean-reasoning
    • Projects
      • Apt
      • Zfc
      • Acre
      • Milawa
      • Smtlink
      • Abnf
      • Vwsim
      • Isar
      • Wp-gen
      • Dimacs-reader
      • Pfcs
      • Legacy-defrstobj
      • Proof-checker-array
      • Soft
      • C
      • Farray
      • Rp-rewriter
      • Instant-runoff-voting
      • Imp-language
      • Sidekick
      • Leftist-trees
      • Java
      • Riscv
        • Specification
        • Executable
        • Specialized
          • Specialized-features
          • Rv64im
          • Rv32im
            • Semantics32
              • Exec32-bgeu
              • Exec32-bltu
              • Exec32-blt
              • Exec32-bge
              • Exec32-bne
              • Exec32-beq
              • Exec32-jalr
              • Exec32-branch
              • Exec32-jal
              • Exec32-op
              • Exec32-store
              • Exec32-op-imm
              • Exec32-load
              • Exec32-sra
              • Exec32-sltiu
              • Exec32-op-imms
              • Exec32-srl
              • Exec32-slti
              • Exec32-remu
              • Exec32-rem
              • Exec32-auipc
              • Exec32-xori
              • Exec32-srli
              • Exec32-srai
              • Exec32-ori
              • Exec32-divu
              • Exec32-andi
              • Exec32-addi
              • Exec32-sltu
              • Exec32-slt
              • Exec32-sll
              • Exec32-mulhsu
                • Exec32-lhu
                • Exec32-div
                • Exec32-xor
                • Exec32-slli
                • Exec32-sh
                • Exec32-mulhu
                • Exec32-mulh
                • Exec32-lh
                • Exec32-lbu
                • Exec32-sw
                • Exec32-sub
                • Exec32-sb
                • Exec32-or
                • Exec32-lw
                • Exec32-lb
                • Exec32-and
                • Exec32-mul
                • Exec32-add
                • Exec32-instr
                • Eff32-addr
                • Exec32-lui
              • States32
              • Execution32
            • Specialized-states
          • Optimized
        • Taspi
        • Bitcoin
        • Des
        • Ethereum
        • X86isa
        • Sha-2
        • Yul
        • Zcash
        • Proof-checker-itp13
        • Regex
        • ACL2-programming-language
        • Json
        • Jfkr
        • Equational
        • Cryptography
        • Poseidon
        • Where-do-i-place-my-book
        • Axe
        • Aleo
        • Bigmems
        • Builtins
        • Execloader
        • Solidity
        • Paco
        • Concurrent-programs
        • Bls12-377-curves
      • Debugging
      • Community
      • Std
      • Proof-automation
      • Macro-libraries
      • ACL2
      • Interfacing-tools
      • Hardware-verification
      • Software-verification
      • Math
      • Testing-utilities
    • Semantics32

    Exec32-mulhsu

    Semanics of the MULHSU instruction [ISA:12.1].

    Signature
    (exec32-mulhsu rd rs1 rs2 stat) → new-stat
    Arguments
    rd — Guard (ubyte5p rd).
    rs1 — Guard (ubyte5p rs1).
    rs2 — Guard (ubyte5p rs2).
    stat — Guard (stat32ip stat).
    Returns
    new-stat — Type (stat32ip new-stat).

    We read a signed 32-bit integer from rs1 and an unsigned 32-bit integer from rs2. We multiply them, we shift the product right by 32 bits, and we write the result to rd. We increment the program counter.

    Definitions and Theorems

    Function: exec32-mulhsu

    (defun exec32-mulhsu (rd rs1 rs2 stat)
      (declare (xargs :guard (and (ubyte5p rd)
                                  (ubyte5p rs1)
                                  (ubyte5p rs2)
                                  (stat32ip stat))))
      (let ((__function__ 'exec32-mulhsu))
        (declare (ignorable __function__))
        (b* ((rs1-operand (read32-xreg-signed rs1 stat))
             (rs2-operand (read32-xreg-unsigned rs2 stat))
             (product (* rs1-operand rs2-operand))
             (result (ash product 32))
             (stat (write32-xreg rd result stat))
             (stat (inc32-pc stat)))
          stat)))

    Theorem: stat32ip-of-exec32-mulhsu

    (defthm stat32ip-of-exec32-mulhsu
      (b* ((new-stat (exec32-mulhsu rd rs1 rs2 stat)))
        (stat32ip new-stat))
      :rule-classes :rewrite)

    Theorem: exec32-mulhsu-of-ubyte5-fix-rd

    (defthm exec32-mulhsu-of-ubyte5-fix-rd
      (equal (exec32-mulhsu (ubyte5-fix rd)
                            rs1 rs2 stat)
             (exec32-mulhsu rd rs1 rs2 stat)))

    Theorem: exec32-mulhsu-ubyte5-equiv-congruence-on-rd

    (defthm exec32-mulhsu-ubyte5-equiv-congruence-on-rd
      (implies (ubyte5-equiv rd rd-equiv)
               (equal (exec32-mulhsu rd rs1 rs2 stat)
                      (exec32-mulhsu rd-equiv rs1 rs2 stat)))
      :rule-classes :congruence)

    Theorem: exec32-mulhsu-of-ubyte5-fix-rs1

    (defthm exec32-mulhsu-of-ubyte5-fix-rs1
      (equal (exec32-mulhsu rd (ubyte5-fix rs1)
                            rs2 stat)
             (exec32-mulhsu rd rs1 rs2 stat)))

    Theorem: exec32-mulhsu-ubyte5-equiv-congruence-on-rs1

    (defthm exec32-mulhsu-ubyte5-equiv-congruence-on-rs1
      (implies (ubyte5-equiv rs1 rs1-equiv)
               (equal (exec32-mulhsu rd rs1 rs2 stat)
                      (exec32-mulhsu rd rs1-equiv rs2 stat)))
      :rule-classes :congruence)

    Theorem: exec32-mulhsu-of-ubyte5-fix-rs2

    (defthm exec32-mulhsu-of-ubyte5-fix-rs2
      (equal (exec32-mulhsu rd rs1 (ubyte5-fix rs2)
                            stat)
             (exec32-mulhsu rd rs1 rs2 stat)))

    Theorem: exec32-mulhsu-ubyte5-equiv-congruence-on-rs2

    (defthm exec32-mulhsu-ubyte5-equiv-congruence-on-rs2
      (implies (ubyte5-equiv rs2 rs2-equiv)
               (equal (exec32-mulhsu rd rs1 rs2 stat)
                      (exec32-mulhsu rd rs1 rs2-equiv stat)))
      :rule-classes :congruence)

    Theorem: exec32-mulhsu-of-stat32i-fix-stat

    (defthm exec32-mulhsu-of-stat32i-fix-stat
      (equal (exec32-mulhsu rd rs1 rs2 (stat32i-fix stat))
             (exec32-mulhsu rd rs1 rs2 stat)))

    Theorem: exec32-mulhsu-stat32i-equiv-congruence-on-stat

    (defthm exec32-mulhsu-stat32i-equiv-congruence-on-stat
      (implies (stat32i-equiv stat stat-equiv)
               (equal (exec32-mulhsu rd rs1 rs2 stat)
                      (exec32-mulhsu rd rs1 rs2 stat-equiv)))
      :rule-classes :congruence)