-;;;; that part of the description of the x86 instruction set (for
-;;;; 80386 and above) which can live on the cross-compilation host
+;;;; that part of the description of the x86-64 instruction set
+;;;; which can live on the cross-compilation host
;;;; This software is part of the SBCL system. See the README file for
;;;; more information.
(if (= index-reg #b100) nil index-reg)
(ash 1 index-scale))))))
((and (= mod #b00) (= r/m #b101))
- (list nil (sb!disassem:read-signed-suffix 32 dstate)) )
+ (list 'rip (sb!disassem:read-signed-suffix 32 dstate)) )
((= mod #b00)
(list full-reg))
((= mod #b01)
*default-address-size*))
dstate)))
+(sb!disassem:define-arg-type imm-data-upto-dword
+ :prefilter (lambda (value dstate)
+ (declare (ignore value)) ; always nil anyway
+ (let ((width (width-bits
+ (or (sb!disassem:dstate-get-prop dstate 'width)
+ *default-address-size*))))
+ (if (= width 64)
+ (sb!disassem:read-signed-suffix 32 dstate)
+ (sb!disassem:read-suffix width dstate)))))
+
(sb!disassem:define-arg-type signed-imm-data
:prefilter (lambda (value dstate)
(declare (ignore value)) ; always nil anyway
:include 'rex-simple
:default-printer '(:name
:tab accum ", " imm))
- (imm :type 'imm-data))
+ (imm :type 'imm-data-upto-dword))
(sb!disassem:define-instruction-format (reg-no-width 8
:default-printer '(:name :tab reg))
:default-printer
'(:name :tab reg/mem ", " imm))
(reg/mem :type 'sized-rex-reg/mem)
- (imm :type 'imm-data))
+ (imm :type 'imm-data-upto-dword))
;;; Same as reg/mem, but with using the accumulator in the default printer
(sb!disassem:define-instruction-format
(:printer rex-reg-reg/mem-dir ((op #b100010)))
;; immediate to register/memory
(:printer reg/mem-imm ((op '(#b1100011 #b000))))
- (:printer rex-reg/mem-imm ((op '(#b1100011 #b000))))
+ ;; doesn't work for 8-bit register yet
+ (:printer rex-reg/mem-imm ((op '(#b11000111 #b000))))
(:emitter
(let ((size (matching-operand-size dst src)))
(:printer reg-no-width ((op #b10010)) '(:name :tab accum ", " reg))
;; Register/Memory with Register.
(:printer reg-reg/mem ((op #b1000011)))
+ ;; doesn't work for 8-bit register yet
+ (:printer rex-reg-reg/mem ((op #b10000111)))
(:emitter
(let ((size (matching-operand-size operand1 operand2)))
(maybe-emit-operand-size-prefix segment size)
(t
(unless (or (ea-p where) (tn-p where))
(error "don't know what to do with ~A" where))
- (maybe-emit-rex-for-ea segment where nil)
+ ;; near jump defaults to 64 bit
+ ;; w-bit in rex prefix is unnecessary
+ (maybe-emit-rex-for-ea segment where nil :operand-size :dword)
(emit-byte segment #b11111111)
(emit-ea segment where #b100)))))