+
+;; new xmm insns required by sse float
+;; movsd andpd comisd comiss
+
+(define-instruction movsd (segment dst src)
+; (:printer reg-reg/mem ((op #x10) (width 1))) ;wrong
+ (:emitter
+ (cond ((typep src 'tn)
+ (emit-byte segment #xf2)
+ (maybe-emit-rex-for-ea segment dst src)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x11)
+ (emit-ea segment dst (reg-tn-encoding src)))
+ (t
+ (emit-byte segment #xf2)
+ (maybe-emit-rex-for-ea segment src dst)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x10)
+ (emit-ea segment src (reg-tn-encoding dst))))))
+
+(define-instruction movss (segment dst src)
+; (:printer reg-reg/mem ((op #x10) (width 1))) ;wrong
+ (:emitter
+ (cond ((tn-p src)
+ (emit-byte segment #xf3)
+ (maybe-emit-rex-for-ea segment dst src)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x11)
+ (emit-ea segment dst (reg-tn-encoding src)))
+ (t
+ (emit-byte segment #xf3)
+ (maybe-emit-rex-for-ea segment src dst)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x10)
+ (emit-ea segment src (reg-tn-encoding dst))))))
+
+(define-instruction andpd (segment dst src)
+; (:printer reg-reg/mem ((op #x10) (width 1))) ;wrong
+ (:emitter
+ (emit-byte segment #x66)
+ (maybe-emit-rex-for-ea segment src dst)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x54)
+ (emit-ea segment src (reg-tn-encoding dst))))
+
+(define-instruction andps (segment dst src)
+ (:emitter
+ (maybe-emit-rex-for-ea segment src dst)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x54)
+ (emit-ea segment src (reg-tn-encoding dst))))
+
+(define-instruction comisd (segment dst src)
+; (:printer reg-reg/mem ((op #x10) (width 1))) ;wrong
+ (:emitter
+ (emit-byte segment #x66)
+ (maybe-emit-rex-for-ea segment src dst)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x2f)
+ (emit-ea segment src (reg-tn-encoding dst))))
+
+(define-instruction comiss (segment dst src)
+; (:printer reg-reg/mem ((op #x10) (width 1))) ;wrong
+ (:emitter
+ (maybe-emit-rex-for-ea segment src dst)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x2f)
+ (emit-ea segment src (reg-tn-encoding dst))))
+
+;; movd movq xorp xord
+
+;; we only do the xmm version of movd
+(define-instruction movd (segment dst src)
+; (:printer reg-reg/mem ((op #x10) (width 1))) ;wrong
+ (:emitter
+ (cond ((fp-reg-tn-p dst)
+ (emit-byte segment #x66)
+ (maybe-emit-rex-for-ea segment src dst)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x6e)
+ (emit-ea segment src (reg-tn-encoding dst)))
+ (t
+ (aver (fp-reg-tn-p src))
+ (emit-byte segment #x66)
+ (maybe-emit-rex-for-ea segment dst src)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x7e)
+ (emit-ea segment dst (reg-tn-encoding src))))))
+
+(define-instruction movq (segment dst src)
+; (:printer reg-reg/mem ((op #x10) (width 1))) ;wrong
+ (:emitter
+ (cond ((fp-reg-tn-p dst)
+ (emit-byte segment #xf3)
+ (maybe-emit-rex-for-ea segment src dst)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x7e)
+ (emit-ea segment src (reg-tn-encoding dst)))
+ (t
+ (aver (fp-reg-tn-p src))
+ (emit-byte segment #x66)
+ (maybe-emit-rex-for-ea segment dst src)
+ (emit-byte segment #x0f)
+ (emit-byte segment #xd6)
+ (emit-ea segment dst (reg-tn-encoding src))))))
+
+(define-instruction xorpd (segment dst src)
+; (:printer reg-reg/mem ((op #x10) (width 1))) ;wrong
+ (:emitter
+ (emit-byte segment #x66)
+ (maybe-emit-rex-for-ea segment src dst)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x57)
+ (emit-ea segment src (reg-tn-encoding dst))))
+
+(define-instruction xorps (segment dst src)
+; (:printer reg-reg/mem ((op #x10) (width 1))) ;wrong
+ (:emitter
+ (maybe-emit-rex-for-ea segment src dst)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x57)
+ (emit-ea segment src (reg-tn-encoding dst))))
+
+(define-instruction cvtsd2si (segment dst src)
+; (:printer reg-reg/mem ((op #x10) (width 1))) ;wrong
+ (:emitter
+ (emit-byte segment #xf2)
+ (maybe-emit-rex-for-ea segment src dst :operand-size :qword)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x2d)
+ (emit-ea segment src (reg-tn-encoding dst))))
+
+(define-instruction cvtsd2ss (segment dst src)
+; (:printer reg-reg/mem ((op #x10) (width 1))) ;wrong
+ (:emitter
+ (emit-byte segment #xf2)
+ (maybe-emit-rex-for-ea segment src dst)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x5a)
+ (emit-ea segment src (reg-tn-encoding dst))))
+
+(define-instruction cvtss2si (segment dst src)
+; (:printer reg-reg/mem ((op #x10) (width 1))) ;wrong
+ (:emitter
+ (emit-byte segment #xf3)
+ (maybe-emit-rex-for-ea segment src dst :operand-size :qword)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x2d)
+ (emit-ea segment src (reg-tn-encoding dst))))
+
+(define-instruction cvtss2sd (segment dst src)
+; (:printer reg-reg/mem ((op #x10) (width 1))) ;wrong
+ (:emitter
+ (emit-byte segment #xf3)
+ (maybe-emit-rex-for-ea segment src dst)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x5a)
+ (emit-ea segment src (reg-tn-encoding dst))))
+
+(define-instruction cvtsi2ss (segment dst src)
+; (:printer reg-reg/mem ((op #x10) (width 1))) ;wrong
+ (:emitter
+ (emit-byte segment #xf3)
+ (maybe-emit-rex-for-ea segment src dst)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x2a)
+ (emit-ea segment src (reg-tn-encoding dst))))
+
+(define-instruction cvtsi2sd (segment dst src)
+; (:printer reg-reg/mem ((op #x10) (width 1))) ;wrong
+ (:emitter
+ (emit-byte segment #xf2)
+ (maybe-emit-rex-for-ea segment src dst)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x2a)
+ (emit-ea segment src (reg-tn-encoding dst))))
+
+(define-instruction cvtdq2pd (segment dst src)
+; (:printer reg-reg/mem ((op #x10) (width 1))) ;wrong
+ (:emitter
+ (emit-byte segment #xf3)
+ (maybe-emit-rex-for-ea segment src dst)
+ (emit-byte segment #x0f)
+ (emit-byte segment #xe6)
+ (emit-ea segment src (reg-tn-encoding dst))))
+
+(define-instruction cvtdq2ps (segment dst src)
+; (:printer reg-reg/mem ((op #x10) (width 1))) ;wrong
+ (:emitter
+ (maybe-emit-rex-for-ea segment src dst)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x5b)
+ (emit-ea segment src (reg-tn-encoding dst))))
+
+;; CVTTSD2SI CVTTSS2SI
+
+(define-instruction cvttsd2si (segment dst src)
+; (:printer reg-reg/mem ((op #x10) (width 1))) ;wrong
+ (:emitter
+ (emit-byte segment #xf2)
+ (maybe-emit-rex-for-ea segment src dst :operand-size :qword)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x2c)
+ (emit-ea segment src (reg-tn-encoding dst))))
+
+(define-instruction cvttss2si (segment dst src)
+; (:printer reg-reg/mem ((op #x10) (width 1))) ;wrong
+ (:emitter
+ (emit-byte segment #xf3)
+ (maybe-emit-rex-for-ea segment src dst :operand-size :qword)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x2c)
+ (emit-ea segment src (reg-tn-encoding dst))))
+
+(define-instruction addsd (segment dst src)
+; (:printer reg-reg/mem ((op #x10) (width 1))) ;wrong
+ (:emitter
+ (emit-byte segment #xf2)
+ (maybe-emit-rex-for-ea segment src dst)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x58)
+ (emit-ea segment src (reg-tn-encoding dst))))
+
+(define-instruction addss (segment dst src)
+; (:printer reg-reg/mem ((op #x10) (width 1))) ;wrong
+ (:emitter
+ (emit-byte segment #xf3)
+ (maybe-emit-rex-for-ea segment src dst)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x58)
+ (emit-ea segment src (reg-tn-encoding dst))))
+
+(define-instruction divsd (segment dst src)
+; (:printer reg-reg/mem ((op #x10) (width 1))) ;wrong
+ (:emitter
+ (emit-byte segment #xf2)
+ (maybe-emit-rex-for-ea segment src dst)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x5e)
+ (emit-ea segment src (reg-tn-encoding dst))))
+
+(define-instruction divss (segment dst src)
+; (:printer reg-reg/mem ((op #x10) (width 1))) ;wrong
+ (:emitter
+ (emit-byte segment #xf3)
+ (maybe-emit-rex-for-ea segment src dst)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x5e)
+ (emit-ea segment src (reg-tn-encoding dst))))
+
+(define-instruction mulsd (segment dst src)
+; (:printer reg-reg/mem ((op #x10) (width 1))) ;wrong
+ (:emitter
+ (emit-byte segment #xf2)
+ (maybe-emit-rex-for-ea segment src dst)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x59)
+ (emit-ea segment src (reg-tn-encoding dst))))
+
+(define-instruction mulss (segment dst src)
+; (:printer reg-reg/mem ((op #x10) (width 1))) ;wrong
+ (:emitter
+ (emit-byte segment #xf3)
+ (maybe-emit-rex-for-ea segment src dst)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x59)
+ (emit-ea segment src (reg-tn-encoding dst))))
+
+(define-instruction subsd (segment dst src)
+; (:printer reg-reg/mem ((op #x10) (width 1))) ;wrong
+ (:emitter
+ (emit-byte segment #xf2)
+ (maybe-emit-rex-for-ea segment src dst)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x5c)
+ (emit-ea segment src (reg-tn-encoding dst))))
+
+(define-instruction subss (segment dst src)
+; (:printer reg-reg/mem ((op #x10) (width 1))) ;wrong
+ (:emitter
+ (emit-byte segment #xf3)
+ (maybe-emit-rex-for-ea segment src dst)
+ (emit-byte segment #x0f)
+ (emit-byte segment #x5c)
+ (emit-ea segment src (reg-tn-encoding dst))))
+
+(define-instruction ldmxcsr (segment src)
+ (:emitter
+ (emit-byte segment #x0f)
+ (emit-byte segment #xae)
+ (emit-ea segment src 2)))
+
+(define-instruction stmxcsr (segment dst)
+ (:emitter
+ (emit-byte segment #x0f)
+ (emit-byte segment #xae)
+ (emit-ea segment dst 3)))
+