• Top
    • Documentation
    • Books
    • Boolean-reasoning
    • Projects
    • Debugging
    • Community
    • Std
    • Proof-automation
    • Macro-libraries
    • ACL2
    • Interfacing-tools
    • Hardware-verification
    • Software-verification
      • Kestrel-books
      • X86isa
        • Program-execution
        • Sdm-instruction-set-summary
        • Tlb
        • Running-linux
        • Introduction
        • Asmtest
        • X86isa-build-instructions
        • Publications
        • Contributors
        • Machine
          • X86isa-state
          • Syscalls
          • Cpuid
          • Linear-memory
          • Rflag-specifications
          • Characterizing-undefined-behavior
          • App-view
          • Top-level-memory
          • X86-decoder
          • Physical-memory
          • Decoding-and-spec-utils
          • Instructions
            • Two-byte-opcodes
              • X86-vandp?/vandnp?/vorp?/vxorp?/vpand/vpandn/vpor/vpxor-vex
              • X86-endbr32/endbr64
              • X86-adds?/subs?/muls?/divs?/maxs?/mins?-op/en-rm
              • X86-push-segment-register
              • X86-andp?/andnp?/orp?/xorp?/pand/pandn/por/pxor-op/en-rm
              • X86-addps/subps/mulps/divps/maxps/minps-op/en-rm
              • X86-vmovups/vmovupd/vmovdqu-vex-b
              • X86-vmovaps/vmovapd/vmovdqa-vex-b
              • X86-lldt
              • X86-vmovups/vmovupd/vmovdqu-vex-a
              • X86-vmovddup-vex
                • X86-vmovaps/vmovapd/vmovdqa-vex-a
                • X86-addpd/subpd/mulpd/divpd/maxpd/minpd-op/en-rm
                • X86-cmovcc
                • X86-two-byte-jcc
                • X86-setcc
                • X86-cvts?2si/cvtts?2si-op/en-rm
                • X86-comis?/ucomis?-op/en-rm
                • X86-cmpps-op/en-rmi
                • X86-vpsubb/vpsubw/vpsubd/vpsubq-vex
                • X86-vpcmpeqb/vpcmpeqw/vpcmpeqd/vpcmpeqq-vex
                • X86-vpaddb/vpaddw/vpaddd/vpaddq-vex
                • X86-movups/movupd/movdqu-op/en-rm
                • X86-vpcmpgtb/vpcmpgtw/vpcmpgtd/vpcmpgtq-vex
                • X86-sysret
                • X86-pmovmskb-op/en-rm
                • X86-unpck?ps-op/en-rm
                • X86-lidt
                • X86-lgdt
                • X86-cmppd-op/en-rmi
                • X86-sqrtps-op/en-rm
                • X86-rdrand
                • X86-unpck?pd-op/en-rm
                • X86-cvtsi2s?-op/en-rm
                • X86-cmpss/cmpsd-op/en-rmi
                • X86-shufps-op/en-rmi
                • X86-fxsave/fxsave64
                • X86-fxrstor/fxrstor64
                • X86-cvtpd2ps-op/en-rm
                • X86-btr-0f-b3
                • X86-bt-0f-ba
                • X86-bt-0f-ab
                • X86-sqrtpd-op/en-rm
                • X86-movddup-sse
                • X86-cvts?2s?-op/en-rm
                • X86-vzeroupper
                • X86-two-byte-nop
                • X86-sgdt
                • X86-psubb/psubw/psubd/psubq-sse
                • X86-paddb/paddw/paddd/paddq-sse
                • X86-paddb/paddw/paddd/paddq-mmx
                • X86-movups/movupd/movdqu-op/en-mr
                • X86-cvtps2pd-op/en-rm
                • X86-sqrts?-op/en-rm
                • X86-imul-op/en-rm
                • X86-bt-0f-a3
                • X86-syscall
                • X86-shufpd-op/en-rmi
                • X86-punpckh-sse
                • X86-movss/movsd-op/en-rm
                • X86-movss/movsd-op/en-mr
                • X86-movhps/movhpd-op/en-mr
                • X86-movaps/movapd-op/en-mr
                • X86-cmpxchg8b/16b
                • X86-bswap
                • X86-punpckl-sse
                • X86-pcmpgtb/pcmpgtw/pcmpgtd-sse
                • X86-pcmpeqb/pcmpeqw/pcmpeqd-sse
                • X86-movlps/movlpd-op/en-rm
                • X86-movlps/movlpd-op/en-mr
                • X86-movhps/movhpd-op/en-rm
                • X86-movaps/movapd-op/en-rm
                • X86-ldmxcsr/stmxcsr-op/en-m
                • X86-bsf-op/en-rm
                • X86-syscall-app-view
                • X86-psrl-xmm-sse
                • X86-psll-xmm-sse
                • X86-movsx
                • X86-cmpxchg
                • X86-movhlps-sse
                • X86-movbe-op/en-mr
                • X86-psrl-imm-sse
                • X86-psra-xmm-sse
                • X86-psll-imm-sse
                • X86-movbe-op/en-rm
                • X86-pslldq/psrldq
                • X86-movzx
                • X86-tzcnt
                • X86-psra-imm-sse
                • X86-pshuflw
                • X86-pshufhw
                • X86-pshufd
                • X86-movd/movq-from-xmm
                • X86-movdqa-from-xmm
                • X86-ltr
                • X86-bsr
                • X86-popcnt
                • X86-packuswb-sse
                • X86-movq-to-xmm/mem
                • X86-movdqa-to-xmm
                • X86-movq-from-xmm/mem
                • X86-movd/movq-to-xmm
                • X86-mov-control-regs-op/en-rm
                • X86-mov-control-regs-op/en-mr
                • X86-invlpg
                • X86-cpuid
                • X86-wrmsr
                • X86-syscall-both-views
                • X86-rdmsr
                • X86-one-byte-nop
              • One-byte-opcodes
              • Fp-opcodes
              • Instruction-semantic-functions
              • X86-illegal-instruction
              • Implemented-opcodes
              • Opcode-maps
              • X86-general-protection
              • X86-device-not-available
              • X86-step-unimplemented
              • Privileged-opcodes
              • Three-byte-opcodes
            • Register-readers-and-writers
            • X86-modes
            • Segmentation
            • Other-non-deterministic-computations
            • Environment
            • Paging
          • Implemented-opcodes
          • To-do
          • Proof-utilities
          • Peripherals
          • Model-validation
          • Modelcalls
          • Concrete-simulation-examples
          • Utils
          • Debugging-code-proofs
        • Axe
        • Execloader
      • Math
      • Testing-utilities
    • Two-byte-opcodes

    X86-vmovddup-vex

    VMOVDDUP: replicate double precision floating-point values.

    Signature
    (x86-vmovddup-vex proc-mode 
                      start-rip temp-rip prefixes rex-byte 
                      vex-prefixes opcode modr/m sib x86) 
     
      → 
    x86
    Returns
    x86 — Type (x86p x86), given (x86p x86).

    This instruction is listed under MOVDDUP in Intel Manual Volume 2 (Jun 2025).

    When the operand size is 128 bits, the use of m64 in xmm2/m64 in the Intel manual suggests that only 64 bits are read from the source operand. If the access is to memory, reading 128 bits and ignoring the 64 high ones can make a difference if the additional memory accesses cause some kind of exception.

    When the operand size is 256 bits, the use of m256 in ymm2/m256 in the Intel manual suggests that all 256 bits are read from the source operand, even though the ones at positions 64-127 and 192-255 are ignored. In principle it could suffice to read the ones at positions 0-63 and 128-191, or perhaps the low 192 bits. But we read all 256, because of the m256. If the access is to memory, reading fewer bytes could make a difference if the additional ignored ones cause some kind of exception.

    Definitions and Theorems

    Function: x86-vmovddup-vex

    (defun x86-vmovddup-vex
           (proc-mode start-rip temp-rip prefixes rex-byte
                      vex-prefixes opcode modr/m sib x86)
     (declare (xargs :stobjs (x86)))
     (declare (type (integer 0 4) proc-mode)
              (type (signed-byte 48) start-rip)
              (type (signed-byte 48) temp-rip)
              (type (unsigned-byte 52) prefixes)
              (type (unsigned-byte 8) rex-byte)
              (type (unsigned-byte 24) vex-prefixes)
              (type (unsigned-byte 8) opcode)
              (type (unsigned-byte 8) modr/m)
              (type (unsigned-byte 8) sib))
     (declare (ignorable proc-mode start-rip temp-rip
                         prefixes rex-byte opcode modr/m sib))
     (declare (xargs :guard (and (prefixes-p prefixes)
                                 (modr/m-p modr/m)
                                 (sib-p sib)
                                 (rip-guard-okp proc-mode temp-rip)
                                 (vex-prefixes-byte0-p vex-prefixes))))
     (let ((__function__ 'x86-vmovddup-vex))
      (declare (ignorable __function__))
      (b* ((?ctx 'x86-vmovddup-vex)
           (?r/m (the (unsigned-byte 3)
                      (modr/m->r/m modr/m)))
           (?mod (the (unsigned-byte 2)
                      (modr/m->mod modr/m)))
           (?reg (the (unsigned-byte 3)
                      (modr/m->reg modr/m))))
       (b*
        ((p2 (prefixes->seg prefixes))
         (p4? (eql 103 (prefixes->adr prefixes)))
         (seg-reg
             (select-segment-register proc-mode p2 p4? mod r/m sib x86))
         (rex-byte (rex-byte-from-vex-prefixes vex-prefixes))
         ((the (unsigned-byte 4) xmm/ymm-index)
          (reg-index reg rex-byte 2))
         ((the (integer 16 32) operand-size)
          (if (equal (vex->l vex-prefixes) 1)
              32
            16))
         (inst-ac? t)
         ((mv flg (the (unsigned-byte 256) val)
              (the (integer 0 4) increment-rip-by)
              & x86)
          (x86-operand-from-modr/m-and-sib-bytes
               proc-mode (if (= operand-size 16) 2 3)
               (if (= operand-size 16) 8 32)
               inst-ac? nil seg-reg p4?
               temp-rip rex-byte r/m mod sib 0 x86))
         ((when flg)
          (!!ms-fresh :x86-operand-from-modr/m-and-sib-bytes flg))
         ((mv flg (the (signed-byte 48) temp-rip))
          (add-to-*ip proc-mode
                      temp-rip increment-rip-by x86))
         ((when flg)
          (!!ms-fresh :rip-increment-error flg))
         (badlength? (check-instruction-length start-rip temp-rip 0))
         ((when badlength?)
          (!!fault-fresh :gp 0
                         :instruction-length badlength?))
         (dup-val (if (= operand-size 16)
                      (logior (ash val 64) val)
                    (b* ((x0 (part-select val :low 0 :high 63))
                         (x2 (part-select val :low 128 :high 191))
                         (x0x0 (logior (ash x0 64) x0))
                         (x2x2 (logior (ash x2 64) x2)))
                      (logior (ash x2x2 128) x0x0))))
         (x86 (!zmmi-size operand-size xmm/ymm-index dup-val x86
                          :regtype (if (= operand-size 16) 2 3)))
         (x86 (write-*ip proc-mode temp-rip x86)))
        x86))))

    Theorem: x86p-of-x86-vmovddup-vex

    (defthm x86p-of-x86-vmovddup-vex
     (implies
       (x86p x86)
       (b* ((x86 (x86-vmovddup-vex proc-mode
                                   start-rip temp-rip prefixes rex-byte
                                   vex-prefixes opcode modr/m sib x86)))
         (x86p x86)))
     :rule-classes :rewrite)