• 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-movddup-sse

    MOVDDUP: replicate double precision floating-point values.

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

    This is the SSE variant.

    Although 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 and ignoring the 64 high ones can make a difference if the additional memory accesses cause some kind of exception.

    Definitions and Theorems

    Function: x86-movddup-sse

    (defun x86-movddup-sse
           (proc-mode start-rip temp-rip
                      prefixes rex-byte 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 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))))
     (let ((__function__ 'x86-movddup-sse))
      (declare (ignorable __function__))
      (b* ((?ctx 'x86-movddup-sse)
           (?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))
         ((the (unsigned-byte 4) xmm-index)
          (reg-index reg rex-byte 2))
         (inst-ac? t)
         ((mv flg0 (the (unsigned-byte 64) val)
              (the (integer 0 4) increment-rip-by)
              & x86)
          (x86-operand-from-modr/m-and-sib-bytes
               proc-mode 1 8 inst-ac? nil seg-reg p4?
               temp-rip rex-byte r/m mod sib 0 x86))
         ((when flg0)
          (!!ms-fresh :x86-operand-from-modr/m-and-sib-bytes flg0))
         ((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 (logior (ash val 64) val))
         (x86 (!xmmi-size 16 xmm-index dup-val x86))
         (x86 (write-*ip proc-mode temp-rip x86)))
        x86))))

    Theorem: x86p-of-x86-movddup-sse

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