diff --git a/compiler/x86/insts.lisp b/compiler/x86/insts.lisp index 2fba8cabb79aa31daf01bdfaeba29bb036611937..8a64cb981f760292a1eb6b7d31ccfcf6bb57e1a8 100644 --- a/compiler/x86/insts.lisp +++ b/compiler/x86/insts.lisp @@ -7,7 +7,7 @@ ;;; Scott Fahlman or slisp-group@cs.cmu.edu. ;;; (ext:file-comment - "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/x86/insts.lisp,v 1.19 1999/11/11 16:12:30 dtc Exp $") + "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/x86/insts.lisp,v 1.20 2000/04/21 20:30:40 dtc Exp $") ;;; ;;; ********************************************************************** ;;; @@ -1850,6 +1850,30 @@ (emit-byte segment #b11100000) (emit-byte-displacement-backpatch segment target))) + +;;; Conditional move. + +(disassem:define-instruction-format (cond-move 24 + :default-printer + '('cmov cond :tab reg ", " reg/mem)) + (prefix :field (byte 8 0) :value #b00001111) + (op :field (byte 4 12) :value #b0100) + (cond :field (byte 4 8) :type 'condition-code) + (reg/mem :fields (list (byte 2 22) (byte 3 16)) + :type 'reg/mem) + (reg :field (byte 3 19) :type 'reg)) + +(define-instruction cmov (segment cond dst src) + (:printer cond-move ()) + (:emitter + (assert (register-p dst)) + (let ((size (matching-operand-size dst src))) + (assert (or (eq size :word) (eq size :dword))) + (maybe-emit-operand-size-prefix segment size)) + (emit-byte segment #b00001111) + (emit-byte segment (dpb (conditional-opcode cond) (byte 4 0) #b01000000)) + (emit-ea segment src (reg-tn-encoding dst)))) + ;;;; Conditional byte set. @@ -2670,6 +2694,23 @@ (emit-byte segment #b11011001) (emit-byte segment #b11100100))) +;;; Compare and move ST(i) to ST0. +;;; +;;; Intel syntal: FCMOVcc ST, ST(i) +;;; +(define-instruction fcmov (segment cond src) + #+nil (:printer floating-point ((op '(#b01? #b???)))) + (:emitter + (assert (fp-reg-tn-p src)) + (emit-byte segment (ecase cond + ((:b :e :be :u) #b11011010) + ((:nb :ne :nbe :nu) #b11011011))) + (emit-fp-op segment src (ecase cond + ((:b :nb) #b000) + ((:e :ne) #b000) + ((:be :nbe) #b000) + ((:u nu) #b000))))) + ;;; ;;; 80387 Specials ;;;