- Timestamp:
- Aug 2, 2007, 11:58:27 AM (17 years ago)
- File:
-
- 1 edited
-
branches/ia32/compiler/X86/x86-asm.lisp (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/ia32/compiler/X86/x86-asm.lisp
r6465 r6988 330 330 (defconstant +operand-type-Label+ #x100000000) 331 331 332 ;;; 4 bytes and a :reloc; otherwise just like a 32-bit immediate 333 (defconstant +operand-type-Self+ #x200000000) 334 332 335 (defconstant +operand-type-Reg+ (logior +operand-type-Reg8+ +operand-type-Reg16+ +operand-type-Reg32+ +operand-type-Reg64+)) ; gen'l register 333 336 (defconstant +operand-type-WordReg+ (logior +operand-type-Reg16+ +operand-type-Reg32+ +operand-type-Reg64+)) … … 397 400 (:ByteMem . ,+operand-type-ByteMem+) 398 401 (:Label . ,+operand-type-Label+) 402 (:Self . ,+operand-type-Self+) 399 403 )) 400 404 … … 564 568 :insert-reg4-pseudo-rm-high 565 569 :insert-reg4-pseudo-rm-low 570 :insert-self 566 571 )) 567 572 … … 705 710 (x86-memory-operand-scale operand) 706 711 (x86-memory-operand-type operand))) 712 713 (defmacro def-x86-opcode (name&flags types-and-classes base-opcode 714 modrm-byte &rest prefixes) 715 `(%make-x86-opcode-template 716 :mnemonic ,(parse-x86-opcode-name name&flags) 717 :flags ,(parse-x86-opcode-flags name&flags) 718 :operand-types ,(parse-x86-opcode-operand-types types-and-classes) 719 :operand-classes ,(parse-x86-opcode-operand-classes types-and-classes) 720 :base-opcode ,base-opcode 721 :prefixes ',prefixes 722 :rex-prefix 0 723 :modrm-byte ,modrm-byte)) 724 725 (defparameter *x86-32-bit-only-opcode-templates* 726 (vector 727 ;; call 728 (def-x86-opcode call ((:reg32 :insert-modrm-rm)) 729 #xff #o320) 730 731 ;; dec (single byte encoding) 732 (def-x86-opcode decl ((:reg32 :insert-opcode-reg)) 733 #x48 nil) 734 (def-x86-opcode decw ((:reg16 :insert-opcode-reg)) 735 #x48 nil #x66) 736 737 ;; inc (single byte encoding) 738 (def-x86-opcode incl ((:reg32 :insert-opcode-reg)) 739 #x40 nil) 740 (def-x86-opcode incw ((:reg16 :insert-opcode-reg)) 741 #x40 nil #x66) 742 743 ;; UUOs. Expect lots more, some of which may take pseudo-operands. 744 (def-x86-opcode uuo-error-slot-unbound ((:reg32 :insert-opcode-reg4) 745 (:reg32 :insert-reg4-pseudo-rm-high) 746 (:reg32 :insert-reg4-pseudo-rm-low)) 747 #xcd70 0) 748 749 ;;; DON'T use #xcd8x: doing so will make Mach angry and confused. 750 751 (def-x86-opcode uuo-error-unbound ((:reg32 :insert-opcode-reg4)) 752 #xcd90 nil) 753 754 (def-x86-opcode uuo-error-udf ((:reg32 :insert-opcode-reg4)) 755 #xcda0 nil) 756 757 (def-x86-opcode uuo-error-reg-not-type ((:reg32 :insert-opcode-reg4) (:imm8 :insert-imm8)) 758 #xcdb0 nil) 759 760 (def-x86-opcode uuo-error-too-few-args () 761 #xcdc0 nil) 762 (def-x86-opcode uuo-error-too-many-args () 763 #xcdc1 nil) 764 (def-x86-opcode uuo-error-wrong-number-of-args () 765 #xcdc2 nil) 766 (def-x86-opcode uuo-error-array-rank ((:reg32 :insert-reg4-pseudo-rm-high) 767 (:reg32 :insert-reg4-pseudo-rm-low)) 768 #xcdc3 0) 769 770 (def-x86-opcode uuo-gc-trap () 771 #xcdc4 nil) 772 (def-x86-opcode uuo-alloc () 773 #xcdc5 nil) 774 (def-x86-opcode uuo-error-not-callable () 775 #xcdc6 nil) 776 (def-x86-opcode uuo-error-udf-call () 777 #xcdc7 nil) 778 779 (def-x86-opcode uuo-error-vector-bounds ((:reg32 :insert-reg4-pseudo-rm-high) 780 (:reg32 :insert-reg4-pseudo-rm-low)) 781 #xcdc8 0) 782 783 (def-x86-opcode uuo-error-call-macro-or-special-operator () 784 #xcdc9 nil) 785 786 (def-x86-opcode uuo-error-debug-trap () 787 #xcdca nil) 788 789 (def-x86-opcode uuo-error-array-bounds ((:reg32 :insert-reg4-pseudo-rm-high) 790 (:reg32 :insert-reg4-pseudo-rm-low)) 791 #xcdcb 0) 792 793 (def-x86-opcode uuo-error-eep-unresolved ((:reg32 :insert-reg4-pseudo-rm-high) 794 (:reg32 :insert-reg4-pseudo-rm-low)) 795 #xcdcc 0) 796 797 (def-x86-opcode uuo-error-debug-trap-with-string () 798 #xcdcd nil) 799 800 (def-x86-opcode uuo-error-reg-not-tag ((:reg32 :insert-opcode-reg4) 801 (:imm8 :insert-imm8)) 802 #xcdd0 nil) 803 (def-x86-opcode uuo-error-reg-not-list ((:reg32 :insert-opcode-reg4)) 804 #xcde0 nil) 805 (def-x86-opcode uuo-error-reg-not-fixnum ((:reg32 :insert-opcode-reg4)) 806 #xcdf0 nil) 807 )) 808 809 810 (defparameter *x86-common-opcode-templates* 811 (vector 812 ;; adc 813 (def-x86-opcode adcl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm)) 814 #x11 #o300) 815 (def-x86-opcode adcl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 816 #x13 #o000) 817 (def-x86-opcode adcl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory)) 818 #x11 #x00) 819 (def-x86-opcode adcl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm)) 820 #x83 #o320) 821 (def-x86-opcode adcl ((:imm32s :insert-imm32s) (:acc :insert-nothing)) 822 #x15 nil) 823 (def-x86-opcode adcl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm)) 824 #x81 #o320) 825 (def-x86-opcode adcl ((:imm8s :insert-imm8s) (:anymem :insert-memory)) 826 #x83 #o020) 827 (def-x86-opcode adcl ((:imm32s :insert-imm32s) (:anymem :insert-memory)) 828 #x81 #o020) 829 830 (def-x86-opcode adcw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm)) 831 #x11 #o300 #x66) 832 (def-x86-opcode adcw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 833 #x13 #o000 #x66) 834 (def-x86-opcode adcw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory)) 835 #x11 #x00 #x66) 836 (def-x86-opcode adcw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm)) 837 #x83 #o320 #x66) 838 (def-x86-opcode adcw ((:imm16 :insert-imm16) (:acc :insert-nothing)) 839 #x15 nil #x66) 840 (def-x86-opcode adcw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm)) 841 #x81 #o320 #x66) 842 (def-x86-opcode adcw ((:imm8s :insert-imm8s) (:anymem :insert-memory)) 843 #x83 #o020 #x66) 844 (def-x86-opcode adcw ((:imm16 :insert-imm16) (:anymem :insert-memory)) 845 #x81 #o020 #x66) 846 847 (def-x86-opcode adcb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm)) 848 #x10 #o300) 849 (def-x86-opcode adcb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg)) 850 #x12 #o000) 851 (def-x86-opcode adcb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory)) 852 #x10 #x00) 853 (def-x86-opcode adcb ((:imm8 :insert-imm8) (:acc :insert-nothing)) 854 #x14 nil) 855 (def-x86-opcode adcb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm)) 856 #x80 #o320) 857 (def-x86-opcode adcb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm)) 858 #x80 #o320) 859 (def-x86-opcode adcb ((:imm8 :insert-imm8) (:anymem :insert-memory)) 860 #x80 #o020) 861 862 ;; add 863 (def-x86-opcode addl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm)) 864 #x01 #o300) 865 (def-x86-opcode addl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 866 #x03 #o000) 867 (def-x86-opcode addl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory)) 868 #x01 #x00) 869 (def-x86-opcode addl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm)) 870 #x83 #o300) 871 (def-x86-opcode addl ((:imm32s :insert-imm32s) (:acc :insert-nothing)) 872 #x05 nil) 873 (def-x86-opcode addl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm)) 874 #x81 #o300) 875 (def-x86-opcode addl ((:imm8s :insert-imm8s) (:anymem :insert-memory)) 876 #x83 #o000) 877 (def-x86-opcode addl ((:imm32s :insert-imm32s) (:anymem :insert-memory)) 878 #x81 #o000) 879 880 (def-x86-opcode addw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm)) 881 #x01 #o300 #x66) 882 (def-x86-opcode addw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 883 #x03 #o000 #x66) 884 (def-x86-opcode addw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory)) 885 #x01 #x00 #x66) 886 (def-x86-opcode addw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm)) 887 #x83 #o300 #x66) 888 (def-x86-opcode addw ((:imm16 :insert-imm16) (:acc :insert-nothing)) 889 #x05 nil #x66) 890 (def-x86-opcode addw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm)) 891 #x81 #o300 #x66) 892 (def-x86-opcode addw ((:imm8s :insert-imm8s) (:anymem :insert-memory)) 893 #x83 #o000 #x66) 894 (def-x86-opcode addw ((:imm16 :insert-imm16) (:anymem :insert-memory)) 895 #x81 #o000 #x66) 896 897 (def-x86-opcode addb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm)) 898 #x00 #o300) 899 (def-x86-opcode addb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg)) 900 #x02 #o000) 901 (def-x86-opcode addb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory)) 902 #x00 #x00) 903 (def-x86-opcode addb ((:imm8s :insert-imm8s) (:acc :insert-nothing)) 904 #x04 nil) 905 (def-x86-opcode addb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm)) 906 #x80 #o300) 907 (def-x86-opcode addb ((:imm8s :insert-imm8s) (:anymem :insert-memory)) 908 #x80 #o000) 909 910 ;; and 911 (def-x86-opcode andl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm)) 912 #x21 #o300) 913 (def-x86-opcode andl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 914 #x23 #o000) 915 (def-x86-opcode andl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory)) 916 #x21 #x00) 917 (def-x86-opcode andl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm)) 918 #x83 #o340) 919 (def-x86-opcode andl ((:imm32s :insert-imm32s) (:acc :insert-nothing)) 920 #x25 nil) 921 (def-x86-opcode andl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm)) 922 #x81 #o340) 923 (def-x86-opcode andl ((:imm8s :insert-imm8s) (:anymem :insert-memory)) 924 #x83 #o040) 925 (def-x86-opcode andl ((:imm32s :insert-imm32s) (:anymem :insert-memory)) 926 #x81 #o040) 927 928 (def-x86-opcode andw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm)) 929 #x21 #o300 #x66) 930 (def-x86-opcode andw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 931 #x23 #o000 #x66) 932 (def-x86-opcode andw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory)) 933 #x21 #x00 #x66) 934 (def-x86-opcode andw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm)) 935 #x83 #o340 #x66) 936 (def-x86-opcode andw ((:imm16 :insert-imm16) (:acc :insert-nothing)) 937 #x25 nil #x66) 938 (def-x86-opcode andw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm)) 939 #x81 #o340 #x66) 940 (def-x86-opcode andw ((:imm8s :insert-imm8s) (:anymem :insert-memory)) 941 #x83 #o040 #x66) 942 (def-x86-opcode andw ((:imm16 :insert-imm16) (:anymem :insert-memory)) 943 #x81 #o040 #x66) 944 945 (def-x86-opcode andb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm)) 946 #x20 #o300) 947 (def-x86-opcode andb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg)) 948 #x22 #o000) 949 (def-x86-opcode andb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory)) 950 #x20 #o000) 951 (def-x86-opcode andb ((:imm8s :insert-imm8s) (:acc :insert-nothing)) 952 #x24 nil) 953 (def-x86-opcode andb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm)) 954 #x80 #o340) 955 (def-x86-opcode andb ((:imm8s :insert-imm8s) (:anymem :insert-memory)) 956 #x80 #o040) 957 958 ;; bsf 959 (def-x86-opcode bsfl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg)) 960 #x0fbc #o300) 961 (def-x86-opcode bsfl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 962 #x0fbc #o000) 963 964 (def-x86-opcode bsfw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg)) 965 #x0fbc #o300 #x66) 966 (def-x86-opcode bsfw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 967 #x0fbc #o000 #x66) 968 969 ;; bsr 970 (def-x86-opcode bsrl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg)) 971 #x0fbd #o300) 972 (def-x86-opcode bsrl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 973 #x0fbd #o000) 974 975 (def-x86-opcode bsrw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg)) 976 #x0fbd #o300 #x66) 977 (def-x86-opcode bsrw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 978 #x0fbd #o000 #x66) 979 980 ;; bswap 981 (def-x86-opcode bswapl ((:reg64 :insert-opcode-reg)) 982 #x0fc8 nil) 983 984 ;; bt 985 (def-x86-opcode btl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm)) 986 #x0fba #o340) 987 (def-x86-opcode btl ((:imm8 :insert-imm8) (:anymem :insert-memory)) 988 #x0fba #o040) 989 (def-x86-opcode btl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm)) 990 #x0fa3 #o300) 991 (def-x86-opcode btl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory)) 992 #x0fa3 #o000) 993 994 (def-x86-opcode btw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm)) 995 #x0fba #o340 #x66) 996 (def-x86-opcode btw ((:imm8 :insert-imm8) (:anymem :insert-memory)) 997 #x0fba #o040 #x66) 998 (def-x86-opcode btw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm)) 999 #x0fa3 #o300 #x66) 1000 (def-x86-opcode btw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory)) 1001 #x0fa3 #o000 #x66) 1002 1003 ;; btc 1004 (def-x86-opcode btcl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm)) 1005 #x0fba #o370) 1006 (def-x86-opcode btcl ((:imm8 :insert-imm8) (:anymem :insert-memory)) 1007 #x0fba #o070) 1008 (def-x86-opcode btcl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm)) 1009 #x0fbb #o300) 1010 (def-x86-opcode btcl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory)) 1011 #x0fbb #o000) 1012 1013 (def-x86-opcode btcw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm)) 1014 #x0fba #o370 #x66) 1015 (def-x86-opcode btcw ((:imm8 :insert-imm8) (:anymem :insert-memory)) 1016 #x0fba #o070 #x66) 1017 (def-x86-opcode btcw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm)) 1018 #x0fbb #o300 #x66) 1019 (def-x86-opcode btcw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory)) 1020 #x0fbb #o000 #x66) 1021 1022 ;; btr 1023 (def-x86-opcode btrl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm)) 1024 #x0fba #o360) 1025 (def-x86-opcode btrl ((:imm8 :insert-imm8) (:anymem :insert-memory)) 1026 #x0fba #o060) 1027 (def-x86-opcode btrl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm)) 1028 #x0fb3 #o300) 1029 (def-x86-opcode btrl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory)) 1030 #x0fb3 #o000) 1031 1032 (def-x86-opcode btrw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm)) 1033 #x0fba #o360 #x66) 1034 (def-x86-opcode btrw ((:imm8 :insert-imm8) (:anymem :insert-memory)) 1035 #x0fba #o060 #x66) 1036 (def-x86-opcode btrw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm)) 1037 #x0fb3 #o300 #x66) 1038 (def-x86-opcode btrw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory)) 1039 #x0fb3 #o000 #x66) 1040 1041 ;; bts 1042 (def-x86-opcode btsl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm)) 1043 #x0fba #o350) 1044 (def-x86-opcode btsl ((:imm8 :insert-imm8) (:anymem :insert-memory)) 1045 #x0fba #o050) 1046 (def-x86-opcode btsl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm)) 1047 #x0fab #o300) 1048 (def-x86-opcode btsl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory)) 1049 #x0fab #o000) 1050 1051 (def-x86-opcode btsw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm)) 1052 #x0fba #o350 #x66) 1053 (def-x86-opcode btsw ((:imm8 :insert-imm8) (:anymem :insert-memory)) 1054 #x0fba #o050 #x66) 1055 (def-x86-opcode btsw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm)) 1056 #x0fab #o300 #x66) 1057 (def-x86-opcode btsw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory)) 1058 #x0fab #o000 #x66) 1059 1060 ;; call 1061 (def-x86-opcode call ((:label :insert-label)) 1062 #xe8 nil) 1063 (def-x86-opcode call ((:anymem :insert-memory)) 1064 #xff #o020) 1065 1066 ;; cbtw 1067 (def-x86-opcode cbtw () 1068 #x98 nil #x66) 1069 1070 ;; clc 1071 (def-x86-opcode clc () 1072 #xf8 nil) 1073 1074 ;; cld 1075 (def-x86-opcode cld () 1076 #xfc nil) 1077 1078 ;; cltd 1079 (def-x86-opcode cltd () 1080 #x99 nil) 1081 1082 ;; cmc 1083 (def-x86-opcode cmc () 1084 #xf5 nil) 1085 1086 ;; cmovCC 1087 (def-x86-opcode cmovccl 1088 ((:imm8 :insert-cc) (:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg)) 1089 #x0f40 #o300) 1090 (def-x86-opcode cmovccl 1091 ((:imm8 :insert-cc) (:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 1092 #x0f40 #o000) 1093 (def-x86-opcode cmovccw 1094 ((:imm8 :insert-cc) (:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg)) 1095 #x0f40 #o300 #x66) 1096 (def-x86-opcode cmovccw 1097 ((:imm8 :insert-cc) (:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 1098 #x0f40 #o000 #x66) 1099 1100 (def-x86-opcode cmovol ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg)) 1101 #x0f40 #o300) 1102 (def-x86-opcode cmovol ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 1103 #x0f40 #o000) 1104 (def-x86-opcode cmovow ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg)) 1105 #x0f40 #o300 #x66) 1106 (def-x86-opcode cmovow ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 1107 #x0f40 #o000 #x66) 1108 1109 (def-x86-opcode cmovnol ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg)) 1110 #x0f41 #o300) 1111 (def-x86-opcode cmovnol ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 1112 #x0f41 #o000) 1113 (def-x86-opcode cmovnow ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg)) 1114 #x0f41 #o300 #x66) 1115 (def-x86-opcode cmovnow ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 1116 #x0f41 #o000 #x66) 1117 1118 (def-x86-opcode cmovbl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg)) 1119 #x0f42 #o300) 1120 (def-x86-opcode cmovbl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 1121 #x0f42 #o000) 1122 (def-x86-opcode cmovbw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg)) 1123 #x0f42 #o300 #x66) 1124 (def-x86-opcode cmovbw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 1125 #x0f42 #o000 #x66) 1126 1127 (def-x86-opcode cmovael ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg)) 1128 #x0f43 #o300) 1129 (def-x86-opcode cmovael ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 1130 #x0f43 #o000) 1131 (def-x86-opcode cmovaew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg)) 1132 #x0f43 #o300 #x66) 1133 (def-x86-opcode cmovaew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 1134 #x0f43 #o000 #x66) 1135 1136 (def-x86-opcode cmovel ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg)) 1137 #x0f44 #o300) 1138 (def-x86-opcode cmovel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 1139 #x0f44 #o000) 1140 (def-x86-opcode cmovew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg)) 1141 #x0f44 #o300 #x66) 1142 (def-x86-opcode cmovew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 1143 #x0f44 #o000 #x66) 1144 1145 (def-x86-opcode cmovnel ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg)) 1146 #x0f45 #o300) 1147 (def-x86-opcode cmovnel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 1148 #x0f45 #o000) 1149 (def-x86-opcode cmovnew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg)) 1150 #x0f45 #o300 #x66) 1151 (def-x86-opcode cmovnew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 1152 #x0f45 #o000 #x66) 1153 1154 (def-x86-opcode cmovbel ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-reg)) 1155 #x0f46 #o300) 1156 (def-x86-opcode cmovbel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 1157 #x0f46 #o000) 1158 (def-x86-opcode cmovbew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg)) 1159 #x0f46 #o300 #x66) 1160 (def-x86-opcode cmovbew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 1161 #x0f46 #o000 #x66) 1162 1163 (def-x86-opcode cmoval ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg)) 1164 #x0f47 #o300) 1165 (def-x86-opcode cmoval ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 1166 #x0f47 #o000) 1167 (def-x86-opcode cmovaw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg)) 1168 #x0f47 #o300 #x66) 1169 (def-x86-opcode cmovaw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 1170 #x0f47 #o000 #x66) 1171 1172 (def-x86-opcode cmovsl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg)) 1173 #x0f48 #o300) 1174 (def-x86-opcode cmovsl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 1175 #x0f48 #o000) 1176 (def-x86-opcode cmovsw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg)) 1177 #x0f48 #o300 #x66) 1178 (def-x86-opcode cmovsw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 1179 #x0f48 #o000 #x66) 1180 1181 (def-x86-opcode cmovnsl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg)) 1182 #x0f49 #o300) 1183 (def-x86-opcode cmovnsl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 1184 #x0f49 #o000) 1185 (def-x86-opcode cmovnsw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg)) 1186 #x0f49 #o300 #x66) 1187 (def-x86-opcode cmovnsw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 1188 #x0f49 #o000 #x66) 1189 1190 (def-x86-opcode cmovpel ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg)) 1191 #x0f4a #o300) 1192 (def-x86-opcode cmovpel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 1193 #x0f4a #o000) 1194 (def-x86-opcode cmovpew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg)) 1195 #x0f4a #o300 #x66) 1196 (def-x86-opcode cmovpew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 1197 #x0f4a #o000 #x66) 1198 1199 (def-x86-opcode cmovpol ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg)) 1200 #x0f4b #o300) 1201 (def-x86-opcode cmovpol ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 1202 #x0f4b #o000) 1203 (def-x86-opcode cmovpow ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg)) 1204 #x0f4b #o300 #x66) 1205 (def-x86-opcode cmovpow ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 1206 #x0f4b #o000 #x66) 1207 1208 (def-x86-opcode cmovll ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg)) 1209 #x0f4c #o300) 1210 (def-x86-opcode cmovll ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 1211 #x0f4c #o000) 1212 (def-x86-opcode cmovlw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg)) 1213 #x0f4c #o300 #x66) 1214 (def-x86-opcode cmovlw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 1215 #x0f4c #o000 #x66) 1216 1217 (def-x86-opcode cmovgel ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg)) 1218 #x0f4d #o300) 1219 (def-x86-opcode cmovgel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 1220 #x0f4d #o000) 1221 (def-x86-opcode cmovgew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg)) 1222 #x0f4d #o300 #x66) 1223 (def-x86-opcode cmovgew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 1224 #x0f4d #o000 #x66) 1225 1226 (def-x86-opcode cmovlel ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg)) 1227 #x0f4e #o300) 1228 (def-x86-opcode cmovlel ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 1229 #x0f4e #o000) 1230 (def-x86-opcode cmovlew ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg)) 1231 #x0f4e #o300 #x66) 1232 (def-x86-opcode cmovlew ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 1233 #x0f4e #o000 #x66) 1234 1235 (def-x86-opcode cmovgl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg)) 1236 #x0f4f #o300) 1237 (def-x86-opcode cmovgl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 1238 #x0f4f #o000) 1239 (def-x86-opcode cmovgw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg)) 1240 #x0f4f #o300 #x66) 1241 (def-x86-opcode cmovgw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 1242 #x0f4f #o000 #x66) 1243 1244 ;; cmp 1245 (def-x86-opcode cmpl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm)) 1246 #x39 #o300) 1247 (def-x86-opcode rcmpl ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg)) 1248 #x39 #o300) 1249 (def-x86-opcode cmpl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 1250 #x3b #o000) 1251 (def-x86-opcode rcmpl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory)) 1252 #x3b #o000) 1253 (def-x86-opcode cmpl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory)) 1254 #x39 #x00) 1255 (def-x86-opcode rcmpl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 1256 #x39 #x00) 1257 (def-x86-opcode cmpl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm)) 1258 #x83 #o370) 1259 (def-x86-opcode rcmpl ((:reg32 :insert-modrm-rm) (:imm8s :insert-imm8s)) 1260 #x83 #o370) 1261 (def-x86-opcode cmpl ((:imm32s :insert-imm32s) (:acc :insert-nothing)) 1262 #x3d nil) 1263 (def-x86-opcode rcmpl ((:acc :insert-nothing) (:imm32s :insert-imm32s)) 1264 #x3d nil) 1265 (def-x86-opcode cmpl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm)) 1266 #x81 #o370) 1267 (def-x86-opcode rcmpl ((:reg32 :insert-modrm-rm) (:imm32s :insert-imm32s)) 1268 #x81 #o370) 1269 (def-x86-opcode cmpl ((:imm8s :insert-imm8s) (:anymem :insert-memory)) 1270 #x83 #o070) 1271 (def-x86-opcode rcmpl ((:anymem :insert-memory) (:imm8s :insert-imm8s)) 1272 #x83 #o070) 1273 (def-x86-opcode cmpl ((:imm32s :insert-imm32s) (:anymem :insert-memory)) 1274 #x81 #o070) 1275 (def-x86-opcode rcmpl ((:anymem :insert-memory) (:imm32s :insert-imm32s)) 1276 #x81 #o070) 1277 1278 (def-x86-opcode cmpw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm)) 1279 #x39 #o300 #x66) 1280 (def-x86-opcode rcmpw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg)) 1281 #x39 #o300 #x66) 1282 (def-x86-opcode cmpw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 1283 #x3b #o000 #x66) 1284 (def-x86-opcode rcmpw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory)) 1285 #x3b #o000 #x00) 1286 (def-x86-opcode cmpw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory)) 1287 #x39 #x00 #x00 ) 1288 (def-x86-opcode rcmpw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 1289 #x39 #x00 #x00 ) 1290 (def-x86-opcode cmpw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm)) 1291 #x83 #o370 #x00) 1292 (def-x86-opcode rcmpw ((:reg16 :insert-modrm-rm) (:imm8s :insert-imm8s)) 1293 #x83 #o370 #x00) 1294 (def-x86-opcode cmpw ((:imm16 :insert-imm16) (:acc :insert-nothing)) 1295 #x3d nil #x66) 1296 (def-x86-opcode rcmpw ((:acc :insert-nothing) (:imm16 :insert-imm16)) 1297 #x3d nil #x66) 1298 (def-x86-opcode cmpw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm)) 1299 #x81 #o370 #x66) 1300 (def-x86-opcode rcmpw ((:reg16 :insert-modrm-rm) (:imm16 :insert-imm16)) 1301 #x81 #o370 #x66) 1302 (def-x86-opcode cmpw ((:imm8s :insert-imm8s) (:anymem :insert-memory)) 1303 #x83 #o070 #x66) 1304 (def-x86-opcode rcmpw ((:anymem :insert-memory) (:imm8s :insert-imm8s)) 1305 #x83 #o070 #x66) 1306 (def-x86-opcode cmpw ((:imm16 :insert-imm16) (:anymem :insert-memory)) 1307 #x81 #o070 #x66) 1308 (def-x86-opcode rcmpw ((:anymem :insert-memory) (:imm16 :insert-imm16)) 1309 #x81 #o070 #x66) 1310 1311 (def-x86-opcode cmpb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm)) 1312 #x38 #o300) 1313 (def-x86-opcode rcmpb ((:reg8 :insert-modrm-rm) (:reg8 :insert-modrm-reg)) 1314 #x38 #o300) 1315 (def-x86-opcode cmpb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg)) 1316 #x3a #o000) 1317 (def-x86-opcode rcmpb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory)) 1318 #x3a #o000) 1319 (def-x86-opcode cmpb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory)) 1320 #x38 #x00) 1321 (def-x86-opcode rcmpb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg)) 1322 #x38 #x00) 1323 (def-x86-opcode cmpb (((:imm8s :imm8) :insert-imm8s) (:acc :insert-nothing)) 1324 #x3c nil) 1325 (def-x86-opcode rcmpb ((:acc :insert-nothing) ((:imm8s :imm8) :insert-imm8s)) 1326 #x3c nil) 1327 (def-x86-opcode cmpb (((:imm8s :imm8) :insert-imm8s) (:reg8 :insert-modrm-rm)) 1328 #x80 #o370) 1329 (def-x86-opcode rcmpb ((:reg8 :insert-modrm-rm) ((:imm8s :imm8) :insert-imm8s)) 1330 #x80 #o370) 1331 (def-x86-opcode cmpb (((:imm8s :imm8) :insert-imm8s) (:anymem :insert-memory)) 1332 #x80 #o070) 1333 (def-x86-opcode rcmpb ((:anymem :insert-memory) ((:imm8s :imm8) :insert-imm8s)) 1334 #x80 #o070) 1335 1336 ;; cmps 1337 (def-x86-opcode cmpsl () 1338 #xa7 nil) 1339 1340 (def-x86-opcode cmpsw () 1341 #xa7 nil #x66) 1342 1343 (def-x86-opcode cmpsb () 1344 #xa6 nil) 1345 1346 ;; cmpxchg 1347 (def-x86-opcode cmpxchgl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm)) 1348 #x0fb1 #o300) 1349 (def-x86-opcode cmpxchgl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory)) 1350 #x0fb1 #o000) 1351 1352 (def-x86-opcode cmpxchgw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm)) 1353 #x0fb1 #o300 #x66) 1354 (def-x86-opcode cmpxchgw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory)) 1355 #x0fb1 #o000 #x66) 1356 1357 (def-x86-opcode cmpxchgb ((:reg8 :insert-modrm-reg) (:reg16 :insert-modrm-rm)) 1358 #x0fb0 #o300) 1359 (def-x86-opcode cmpxchgb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory)) 1360 #x0fb0 #o000) 1361 1362 ;; cpuid 1363 (def-x86-opcode cpuid () 1364 #x0fa2 nil) 1365 1366 ;; cwtd 1367 (def-x86-opcode cwtd () 1368 #x99 nil #x66) 1369 1370 ;; cwtl 1371 (def-x86-opcode cwtl () 1372 #x98 nil) 1373 1374 ;; dec 1375 (def-x86-opcode decl ((:anymem :insert-memory)) 1376 #xff #o010) 1377 1378 (def-x86-opcode decw ((:anymem :insert-memory)) 1379 #xff #o010 #x66) 1380 1381 (def-x86-opcode decb ((:reg8 :insert-modrm-rm)) 1382 #xfe #o310) 1383 (def-x86-opcode decb ((:anymem :insert-memory)) 1384 #xfe #o010) 1385 1386 ;; div 1387 (def-x86-opcode divl ((:reg32 :insert-modrm-rm)) 1388 #xf7 #o360) 1389 (def-x86-opcode divl ((:anymem :insert-memory)) 1390 #xf7 #o060) 1391 1392 (def-x86-opcode divw ((:reg16 :insert-modrm-rm)) 1393 #xf7 #o360 #x66) 1394 (def-x86-opcode divw ((:anymem :insert-memory)) 1395 #xf7 #o060 #x66) 1396 1397 (def-x86-opcode divb ((:reg8 :insert-modrm-rm)) 1398 #xf6 #o360) 1399 (def-x86-opcode divl ((:anymem :insert-memory)) 1400 #xf6 #o060) 1401 1402 ;; enter 1403 (def-x86-opcode enter ((:imm16 :insert-imm16) (:imm8 :insert-extra)) 1404 #xc8 nil) 1405 1406 ;; hlt 1407 (def-x86-opcode hlt () 1408 #xf4 nil) 1409 1410 ;; idiv. Note that GAS doesn't know about newer(?) idiv forms 1411 (def-x86-opcode idivl ((:reg32 :insert-modrm-rm)) 1412 #xf7 #o370) 1413 (def-x86-opcode idivl ((:anymem :insert-memory)) 1414 #xf7 #o070) 1415 1416 (def-x86-opcode idivw ((:reg16 :insert-modrm-rm)) 1417 #xf7 #o370 #x66) 1418 (def-x86-opcode idivw ((:anymem :insert-memory)) 1419 #xf7 #o070 #x66) 1420 1421 (def-x86-opcode idivb ((:reg8 :insert-modrm-rm)) 1422 #xf6 #o370) 1423 (def-x86-opcode idivl ((:anymem :insert-memory)) 1424 #xf6 #o070) 1425 1426 ;; imul 1427 (def-x86-opcode imull ((:reg32 :insert-modrm-rm)) 1428 #xf7 #o350) 1429 (def-x86-opcode imull ((:anymem :insert-memory)) 1430 #xf7 #o050) 1431 1432 (def-x86-opcode imull ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg)) 1433 #x6b #o300) 1434 (def-x86-opcode imull ((:imm8s :insert-imm8s) (:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 1435 #x6b #o000) 1436 (def-x86-opcode imull ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg)) 1437 #x69 #o300) 1438 (def-x86-opcode imull ((:imm32s :insert-imm32s) (:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 1439 #x69 #o000) 1440 (def-x86-opcode imull ((:reg32 :insert-modrm-rm) (:reg32 :insert-modrm-reg)) 1441 #x0faf #o300) 1442 (def-x86-opcode imull ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 1443 #x0faf #o000) 1444 1445 (def-x86-opcode imulw ((:reg16 :insert-modrm-rm)) 1446 #xf7 #o350 #x66) 1447 (def-x86-opcode imulw ((:anymem :insert-memory)) 1448 #xf7 #o050 #x66) 1449 1450 (def-x86-opcode imulw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg)) 1451 #x6b #o300 #x66) 1452 (def-x86-opcode imulw ((:imm8s :insert-imm8s) (:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 1453 #x6b #o000 #x66) 1454 (def-x86-opcode imulw ((:imm32s :insert-imm32s) (:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg)) 1455 #x69 #o300 #x66) 1456 (def-x86-opcode imulw ((:imm32s :insert-imm32s) (:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 1457 #x69 #o000 #x66) 1458 (def-x86-opcode imulw ((:reg16 :insert-modrm-rm) (:reg16 :insert-modrm-reg)) 1459 #x0faf #o300 #x66) 1460 (def-x86-opcode imulw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 1461 #x0faf #o000 #x66) 1462 1463 (def-x86-opcode imulb ((:reg8 :insert-modrm-rm)) 1464 #xf6 #o350) 1465 (def-x86-opcode imulb ((:anymem :insert-memory)) 1466 #xf6 #o050) 1467 1468 ;; inc 1469 (def-x86-opcode incl ((:anymem :insert-memory)) 1470 #xff #o000) 1471 1472 (def-x86-opcode incw ((:anymem :insert-memory)) 1473 #xff #o000 #x66) 1474 1475 (def-x86-opcode incb ((:reg8 :insert-modrm-rm)) 1476 #xfe #o300) 1477 (def-x86-opcode incb ((:anymem :insert-memory)) 1478 #xfe #o000) 1479 1480 ;; int. See also UUOs. 1481 (def-x86-opcode int ((:imm8 :insert-imm8-for-int)) 1482 #xcd nil) 1483 1484 ;; Jcc. Generate the short form here; maybe relax later. 1485 (def-x86-opcode (jcc :jump) ((:imm8 :insert-cc) (:label :insert-label)) 1486 #x70 nil) 1487 (def-x86-opcode (jcc.pt :jump) ((:imm8 :insert-cc) (:label :insert-label)) 1488 #x70 nil #x3e) 1489 (def-x86-opcode (jcc.pn :jump) ((:imm8 :insert-cc) (:label :insert-label)) 1490 #x70 nil #x2e) 1491 1492 (def-x86-opcode (jo :jump) ((:label :insert-label)) 1493 #x70 nil) 1494 (def-x86-opcode (jo.pt :jump) ((:label :insert-label)) 1495 #x70 nil #x3e) 1496 (def-x86-opcode (jo.pn :jump) ((:label :insert-label)) 1497 #x70 nil #x2e) 1498 (def-x86-opcode (jno :jump) ((:label :insert-label)) 1499 #x71 nil) 1500 (def-x86-opcode (jno.pt :jump) ((:label :insert-label)) 1501 #x71 nil #x3e) 1502 (def-x86-opcode (jno.pn :jump) ((:label :insert-label)) 1503 #x71 nil #x2e) 1504 (def-x86-opcode (jb :jump) ((:label :insert-label)) 1505 #x72 nil) 1506 (def-x86-opcode (jb.pt :jump) ((:label :insert-label)) 1507 #x72 nil #x3e) 1508 (def-x86-opcode (jb.pn :jump) ((:label :insert-label)) 1509 #x72 nil #x2e) 1510 (def-x86-opcode (jae :jump) ((:label :insert-label)) 1511 #x73 nil) 1512 (def-x86-opcode (jae.pt :jump) ((:label :insert-label)) 1513 #x73 nil #x3e) 1514 (def-x86-opcode (jae.pn :jump) ((:label :insert-label)) 1515 #x73 nil #x2e) 1516 (def-x86-opcode (je :jump) ((:label :insert-label)) 1517 #x74 nil) 1518 (def-x86-opcode (je.pt :jump) ((:label :insert-label)) 1519 #x74 nil #x3e) 1520 (def-x86-opcode (je.pn :jump) ((:label :insert-label)) 1521 #x74 nil #x2e) 1522 (def-x86-opcode (jz :jump) ((:label :insert-label)) 1523 #x74 nil) 1524 (def-x86-opcode (jz.pt :jump) ((:label :insert-label)) 1525 #x74 nil #x3e) 1526 (def-x86-opcode (jz.pn :jump) ((:label :insert-label)) 1527 #x74 nil #x2e) 1528 (def-x86-opcode (jne :jump) ((:label :insert-label)) 1529 #x75 nil) 1530 (def-x86-opcode (jne.pt :jump) ((:label :insert-label)) 1531 #x75 nil #x3e) 1532 (def-x86-opcode (jne.pn :jump) ((:label :insert-label)) 1533 #x75 nil #x2e) 1534 (def-x86-opcode (jnz :jump) ((:label :insert-label)) 1535 #x75 nil) 1536 (def-x86-opcode (jnz.pt :jump) ((:label :insert-label)) 1537 #x75 nil #x3e) 1538 (def-x86-opcode (jnz.pn :jump) ((:label :insert-label)) 1539 #x75 nil #x2e) 1540 (def-x86-opcode (jbe :jump) ((:label :insert-label)) 1541 #x76 nil) 1542 (def-x86-opcode (jbe.pt :jump) ((:label :insert-label)) 1543 #x76 nil #x3e) 1544 (def-x86-opcode (jbe.pn :jump) ((:label :insert-label)) 1545 #x76 nil #x2e) 1546 (def-x86-opcode (ja :jump) ((:label :insert-label)) 1547 #x77 nil) 1548 (def-x86-opcode (ja.pt :jump) ((:label :insert-label)) 1549 #x77 nil #x3e) 1550 (def-x86-opcode (ja.pn :jump) ((:label :insert-label)) 1551 #x77 nil #x2e) 1552 (def-x86-opcode (js :jump) ((:label :insert-label)) 1553 #x78 nil) 1554 (def-x86-opcode (js.pt :jump) ((:label :insert-label)) 1555 #x78 nil #x3e) 1556 (def-x86-opcode (js.pn :jump) ((:label :insert-label)) 1557 #x78 nil #x2e) 1558 (def-x86-opcode (jns :jump) ((:label :insert-label)) 1559 #x79 nil) 1560 (def-x86-opcode (jns.pt :jump) ((:label :insert-label)) 1561 #x79 nil #x3e) 1562 (def-x86-opcode (jns.pn :jump) ((:label :insert-label)) 1563 #x79 nil #x2e) 1564 (def-x86-opcode (jpe :jump) ((:label :insert-label)) 1565 #x7a nil) 1566 (def-x86-opcode (jpe.pt :jump) ((:label :insert-label)) 1567 #x7a nil #x3e) 1568 (def-x86-opcode (jpe.pn :jump) ((:label :insert-label)) 1569 #x7a nil #x2e) 1570 (def-x86-opcode (jpo :jump) ((:label :insert-label)) 1571 #x7b nil) 1572 (def-x86-opcode (jpo.pt :jump) ((:label :insert-label)) 1573 #x7b nil #x3e) 1574 (def-x86-opcode (jpo.pn :jump) ((:label :insert-label)) 1575 #x7b nil #x2e) 1576 (def-x86-opcode (jl :jump) ((:label :insert-label)) 1577 #x7c nil) 1578 (def-x86-opcode (jl.pt :jump) ((:label :insert-label)) 1579 #x7c nil #x3e) 1580 (def-x86-opcode (jl.pn :jump) ((:label :insert-label)) 1581 #x7c nil #x2e) 1582 (def-x86-opcode (jge :jump) ((:label :insert-label)) 1583 #x7d nil) 1584 (def-x86-opcode (jge.pt :jump) ((:label :insert-label)) 1585 #x7d nil #x3e) 1586 (def-x86-opcode (jge.pn :jump) ((:label :insert-label)) 1587 #x7d nil #x2e) 1588 (def-x86-opcode (jle :jump) ((:label :insert-label)) 1589 #x7e nil) 1590 (def-x86-opcode (jle.pt :jump) ((:label :insert-label)) 1591 #x7e nil #x3e) 1592 (def-x86-opcode (jle.pn :jump) ((:label :insert-label)) 1593 #x7e nil #x2e) 1594 (def-x86-opcode (jg :jump) ((:label :insert-label)) 1595 #x7f nil) 1596 (def-x86-opcode (jg.pt :jump) ((:label :insert-label)) 1597 #x7f nil #x3e) 1598 (def-x86-opcode (jg.pn :jump) ((:label :insert-label)) 1599 #x7f nil #x2e) 1600 1601 ;; jmp . Translating the 8-bit pc-relative version to the 32-bit 1602 ;; pc-relative version happens during relaxation. 1603 (def-x86-opcode (jmp :jump) ((:label :insert-label)) 1604 #xeb nil) 1605 (def-x86-opcode jmp ((:reg32 :insert-modrm-rm)) 1606 #xff #o340) 1607 (def-x86-opcode jmp ((:anymem :insert-memory)) 1608 #xff #o040) 1609 1610 ;; lea 1611 (def-x86-opcode leal ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 1612 #x8d 0) 1613 1614 (def-x86-opcode leaw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 1615 #x8d 0 #x66) 1616 1617 ;; leave 1618 (def-x86-opcode leave () 1619 #xc9 nil) 1620 1621 ;; lock 1622 (def-x86-opcode lock () 1623 #xf0 nil) 1624 1625 ;; lods 1626 (def-x86-opcode lodsl () 1627 #xac nil) 1628 1629 ;; loop 1630 (def-x86-opcode loopl ((:label :insert-label)) 1631 #xe2 nil) 1632 (def-x86-opcode loopzl ((:label :insert-label)) 1633 #xe1 nil) 1634 (def-x86-opcode loopnzl ((:label :insert-label)) 1635 #xe0 nil) 1636 1637 ;; mov, including the MMX/XMM variants. 1638 (def-x86-opcode movq ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg)) 1639 #x0f6f #o300) 1640 (def-x86-opcode movq ((:regmmx :insert-mmx-reg) (:anymem :insert-memory)) 1641 #x0f7f #o0) 1642 (def-x86-opcode movq ((:anymem :insert-memory) (:regmmx :insert-mmx-reg)) 1643 #x0f6f #o0) 1644 (def-x86-opcode movq ((:regxmm :insert-xmm-reg) (:regxmm :insert-xmm-rm)) 1645 #x0f7e #o300 #xf3) 1646 (def-x86-opcode movq ((:anymem :insert-memory) (:regxmm :insert-xmm-reg)) 1647 #x0f7e #o000 #xf3) 1648 (def-x86-opcode movq ((:regxmm :insert-xmm-reg) (:anymem :insert-memory)) 1649 #x0fd6 #o000 #x66) 1650 1651 (def-x86-opcode movl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm)) 1652 #x89 #o300) 1653 (def-x86-opcode movl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 1654 #x8b #o0) 1655 (def-x86-opcode movl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory)) 1656 #x89 #o0) 1657 (def-x86-opcode movl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm)) 1658 #xc7 #o300) 1659 (def-x86-opcode movl ((:imm32s :insert-imm32s) (:anymem :insert-memory)) 1660 #xc7 #o000) 1661 (def-x86-opcode movl ((:self :insert-self) (:reg32 :insert-modrm-rm)) 1662 #xc7 #o300) 1663 1664 (def-x86-opcode movw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm)) 1665 #x89 #o300 #x66) 1666 (def-x86-opcode movw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 1667 #x8b #o0 #x66) 1668 (def-x86-opcode movw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory)) 1669 #x89 #o0 #x66) 1670 (def-x86-opcode movw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm)) 1671 #xc7 #o300 #x66) 1672 (def-x86-opcode movw ((:imm16 :insert-imm16) (:anymem :insert-memory)) 1673 #xc7 #o000 #x66) 1674 1675 (def-x86-opcode movb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm)) 1676 #x88 #o300) 1677 (def-x86-opcode movb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg)) 1678 #x8a #o0) 1679 (def-x86-opcode movb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory)) 1680 #x88 #o0) 1681 (def-x86-opcode movb ((:imm8s :insert-imm8s) (:reg8 :insert-opcode-reg)) 1682 #xb0 nil) 1683 (def-x86-opcode movb ((:imm8s :insert-imm8s) (:anymem :insert-memory)) 1684 #xc6 #o000) 1685 1686 ;; movd 1687 (def-x86-opcode movd ((:reg32 :insert-modrm-rm) (:regmmx :insert-mmx-reg)) 1688 #x0f6e #o300) 1689 (def-x86-opcode movd ((:anymem :insert-memory) (:regmmx :insert-mmx-reg)) 1690 #x0f6e #o000) 1691 (def-x86-opcode movd ((:regmmx :insert-mmx-reg) (:reg32 :insert-modrm-rm)) 1692 #x0f7e #o300) 1693 (def-x86-opcode movd ((:regmmx :insert-mmx-reg) (:anymem :insert-memory)) 1694 #x0f7e #o000) 1695 1696 (def-x86-opcode movd ((:reg32 :insert-modrm-rm) (:regxmm :insert-xmm-reg)) 1697 #x0f6e #o300 #x66) 1698 (def-x86-opcode movd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg)) 1699 #x0f6e #o000 #x66) 1700 (def-x86-opcode movd ((:regxmm :insert-xmm-reg) (:reg32 :insert-modrm-rm)) 1701 #x0f7e #o300 #x66) 1702 (def-x86-opcode movd ((:regxmm :insert-xmm-reg) (:anymem :insert-memory)) 1703 #x0f7e #o000 #x66) 1704 1705 ;; sign-extending mov 1706 (def-x86-opcode movsbl ((:reg8 :insert-modrm-rm) (:reg32 :insert-modrm-reg)) 1707 #x0fbe #o300) 1708 (def-x86-opcode movsbl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 1709 #x0fbe #o000) 1710 (def-x86-opcode movsbw ((:reg8 :insert-modrm-reg) (:reg16 :insert-modrm-rm)) 1711 #x0fbe #o300 #x66) 1712 (def-x86-opcode movsbw ((:anymem :insert-memory) (:reg16 :insert-modrm-rm)) 1713 #x0fbe #o300 #x66) 1714 (def-x86-opcode movswl ((:reg16 :insert-modrm-rm) (:reg32 :insert-modrm-reg)) 1715 #x0fbf #o300) 1716 (def-x86-opcode movswl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 1717 #x0fbf #o000) 1718 1719 ;; zero-extending MOVs 1720 (def-x86-opcode movzbl ((:reg8 :insert-modrm-rm) (:reg32 :insert-modrm-reg)) 1721 #x0fb6 #o300) 1722 (def-x86-opcode movzbl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 1723 #x0fb6 #o000) 1724 (def-x86-opcode movzbw ((:reg8 :insert-modrm-rm) (:reg16 :insert-modrm-reg)) 1725 #x0fb6 #o300 #x66) 1726 (def-x86-opcode movzbw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 1727 #x0fb6 #o300 #x66) 1728 (def-x86-opcode movzwl ((:reg16 :insert-modrm-rm) (:reg32 :insert-modrm-reg)) 1729 #x0fb7 #o300) 1730 (def-x86-opcode movzwl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 1731 #x0fb7 #o000) 1732 1733 ;; mul 1734 (def-x86-opcode mull ((:reg32 :insert-modrm-rm)) 1735 #xf7 #o340) 1736 (def-x86-opcode mull ((:anymem :insert-memory)) 1737 #xf7 #o040) 1738 1739 (def-x86-opcode mulw ((:reg16 :insert-modrm-rm)) 1740 #xf7 #o340 #x66) 1741 (def-x86-opcode mulw ((:anymem :insert-memory)) 1742 #xf7 #o040 #x66) 1743 1744 (def-x86-opcode mulb ((:reg8 :insert-modrm-rm)) 1745 #xf6 #o340) 1746 (def-x86-opcode mull ((:anymem :insert-memory)) 1747 #xf6 #o040) 1748 1749 ;; neg 1750 (def-x86-opcode negl ((:reg32 :insert-modrm-rm)) 1751 #xf7 #o330) 1752 (def-x86-opcode negl ((:anymem :insert-memory)) 1753 #xf7 #o030) 1754 1755 (def-x86-opcode negw ((:reg16 :insert-modrm-rm)) 1756 #xf7 #o330 #x66) 1757 (def-x86-opcode negw ((:anymem :insert-memory)) 1758 #xf7 #o030 #x66) 1759 1760 (def-x86-opcode negb ((:reg8 :insert-modrm-rm)) 1761 #xf6 #o330) 1762 (def-x86-opcode negb ((:anymem :insert-memory)) 1763 #xf6 #o030) 1764 1765 ;; nop 1766 (def-x86-opcode nop () 1767 #x90 nil) 1768 1769 ;; not 1770 (def-x86-opcode notl ((:reg32 :insert-modrm-rm)) 1771 #xf7 #o320) 1772 (def-x86-opcode notl ((:anymem :insert-memory)) 1773 #xf7 #o020) 1774 (def-x86-opcode notw ((:reg16 :insert-modrm-rm)) 1775 #xf7 #o320 #x66) 1776 (def-x86-opcode notw ((:anymem :insert-memory)) 1777 #xf7 #o020 #x66) 1778 (def-x86-opcode notb ((:reg8 :insert-modrm-rm)) 1779 #xf6 #o320) 1780 (def-x86-opcode notb ((:anymem :insert-memory)) 1781 #xf6 #o020) 1782 1783 ;; or 1784 (def-x86-opcode orl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm)) 1785 #x09 #o300) 1786 (def-x86-opcode orl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 1787 #x0b #o000) 1788 (def-x86-opcode orl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory)) 1789 #x09 #x00) 1790 (def-x86-opcode orl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm)) 1791 #x83 #o310) 1792 (def-x86-opcode orl ((:imm32s :insert-imm32s) (:acc :insert-nothing)) 1793 #x0d nil) 1794 (def-x86-opcode orl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm)) 1795 #x81 #o310) 1796 (def-x86-opcode orl ((:imm8s :insert-imm8s) (:anymem :insert-memory)) 1797 #x83 #o010) 1798 (def-x86-opcode orl ((:imm32s :insert-imm32s) (:anymem :insert-memory)) 1799 #x81 #o010) 1800 1801 (def-x86-opcode orw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm)) 1802 #x09 #o300 #x66) 1803 (def-x86-opcode orw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 1804 #x0b #o000 #x66) 1805 (def-x86-opcode orw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory)) 1806 #x09 #x00 #x66) 1807 (def-x86-opcode orw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm)) 1808 #x83 #o310 #x66) 1809 (def-x86-opcode orw ((:imm16 :insert-imm16) (:acc :insert-nothing)) 1810 #x0d nil #x66) 1811 (def-x86-opcode orw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm)) 1812 #x81 #o310 #x66) 1813 (def-x86-opcode orw ((:imm8s :insert-imm8s) (:anymem :insert-memory)) 1814 #x83 #o010 #x66) 1815 (def-x86-opcode orw ((:imm16 :insert-imm16) (:anymem :insert-memory)) 1816 #x81 #o010 #x66) 1817 1818 (def-x86-opcode orb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm)) 1819 #x08 #o300) 1820 (def-x86-opcode orb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg)) 1821 #x0a #o000) 1822 (def-x86-opcode orb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory)) 1823 #x08 #x000) 1824 (def-x86-opcode orb ((:imm8s :insert-imm8s) (:acc :insert-nothing)) 1825 #x0c nil) 1826 (def-x86-opcode orb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm)) 1827 #x80 #o310) 1828 (def-x86-opcode orb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm)) 1829 #x80 #o310) 1830 (def-x86-opcode orb ((:imm8s :insert-imm8s) (:anymem :insert-memory)) 1831 #x80 #o010) 1832 1833 ;; pop 1834 (def-x86-opcode popl ((:reg32 :insert-opcode-reg)) 1835 #x58 nil) 1836 (def-x86-opcode popl ((:anymem :insert-memory)) 1837 #x8f #o000) 1838 (def-x86-opcode popw ((:reg16 :insert-opcode-reg)) 1839 #x58 nil #x66) 1840 (def-x86-opcode popw ((:anymem :insert-memory)) 1841 #x8f #o000 #x66) 1842 1843 ;; popf 1844 (def-x86-opcode popfl () 1845 #x9d nil) 1846 1847 ;; push . It's not clear how "pushw $imm16" is encoded. 1848 (def-x86-opcode pushl ((:reg64 :insert-opcode-reg)) 1849 #x50 nil) 1850 (def-x86-opcode pushl ((:anymem :insert-memory)) 1851 #xff #o060) 1852 (def-x86-opcode pushl ((:imm8s :insert-imm8s)) 1853 #x6a nil) 1854 (def-x86-opcode pushl ((:imm32s :insert-imm32s)) 1855 #x68 nil) 1856 1857 (def-x86-opcode pushw ((:reg16 :insert-opcode-reg)) 1858 #x50 nil #x66) 1859 (def-x86-opcode pushw ((:anymem :insert-memory)) 1860 #xff #o060 #x66) 1861 1862 ;; pushf 1863 (def-x86-opcode pushfl () 1864 #x9c nil) 1865 (def-x86-opcode pushfw () 1866 #x9c nil #x66) 1867 1868 ;; rcl. Note that the :ShiftCount operand type only matches %cl. 1869 (def-x86-opcode rcll ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm)) 1870 #xd1 #o320) 1871 (def-x86-opcode rcll ((:imm1 :insert-nothing) (:anymem :insert-memory)) 1872 #xd1 #o020) 1873 (def-x86-opcode rcll ((:reg32 :insert-modrm-rm)) 1874 #xd1 #o320) 1875 (def-x86-opcode rcll ((:anymem :insert-memory)) 1876 #xd1 #o020) 1877 (def-x86-opcode rcll ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm)) 1878 #xc1 #o320) 1879 (def-x86-opcode rcll ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm)) 1880 #xd3 #o320) 1881 1882 (def-x86-opcode rclw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm)) 1883 #xd1 #o320 #x66) 1884 (def-x86-opcode rclw ((:imm1 :insert-nothing) (:anymem :insert-memory)) 1885 #xd1 #o020 #x66) 1886 (def-x86-opcode rclw ((:reg16 :insert-modrm-rm)) 1887 #xd1 #o320 #x66) 1888 (def-x86-opcode rclw ((:anymem :insert-memory)) 1889 #xd1 #o020 #x66) 1890 (def-x86-opcode rclw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm)) 1891 #xc1 #o320 #x66) 1892 (def-x86-opcode rclw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm)) 1893 #xd3 #o320 #x66) 1894 1895 (def-x86-opcode rclb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm)) 1896 #xd0 #o320) 1897 (def-x86-opcode rclb ((:imm1 :insert-nothing) (:anymem :insert-memory)) 1898 #xd0 #o020) 1899 (def-x86-opcode rclb ((:reg8 :insert-modrm-rm)) 1900 #xd0 #o320) 1901 (def-x86-opcode rclb ((:anymem :insert-memory)) 1902 #xd0 #o020) 1903 (def-x86-opcode rclb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm)) 1904 #xc0 #o320) 1905 (def-x86-opcode rclb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm)) 1906 #xd2 #o320) 1907 1908 ;; rcr 1909 (def-x86-opcode rcrl ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm)) 1910 #xd1 #o330) 1911 (def-x86-opcode rcrl ((:imm1 :insert-nothing) (:anymem :insert-memory)) 1912 #xd1 #o030) 1913 (def-x86-opcode rcrl ((:reg32 :insert-modrm-rm)) 1914 #xd1 #o330) 1915 (def-x86-opcode rcrl ((:anymem :insert-memory)) 1916 #xd1 #o030) 1917 (def-x86-opcode rcrl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm)) 1918 #xc1 #o330) 1919 (def-x86-opcode rcrl ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm)) 1920 #xd3 #o330) 1921 1922 (def-x86-opcode rcrw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm)) 1923 #xd1 #o330 #x66) 1924 (def-x86-opcode rcrw ((:imm1 :insert-nothing) (:anymem :insert-memory)) 1925 #xd1 #o030 #x66) 1926 (def-x86-opcode rcrw ((:reg16 :insert-modrm-rm)) 1927 #xd1 #o330 #x66) 1928 (def-x86-opcode rcrw ((:anymem :insert-memory)) 1929 #xd1 #o030 #x66) 1930 (def-x86-opcode rcrw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm)) 1931 #xc1 #o330 #x66) 1932 (def-x86-opcode rcrw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm)) 1933 #xd3 #o330 #x66) 1934 1935 (def-x86-opcode rcrb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm)) 1936 #xd0 #o330) 1937 (def-x86-opcode rcrb ((:imm1 :insert-nothing) (:anymem :insert-memory)) 1938 #xd0 #o030) 1939 (def-x86-opcode rcrb ((:reg8 :insert-modrm-rm)) 1940 #xd0 #o330) 1941 (def-x86-opcode rcrb ((:anymem :insert-memory)) 1942 #xd0 #o030) 1943 (def-x86-opcode rcrb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm)) 1944 #xc0 #o330) 1945 (def-x86-opcode rcrb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm)) 1946 #xd2 #o330) 1947 1948 ;; repe, repne. These are really prefixes, that should 1949 ;; only be used before string instructions. 1950 (def-x86-opcode repe () 1951 #xf3 nil) 1952 (def-x86-opcode repne () 1953 #xf2 nil) 1954 1955 ;; ret 1956 (def-x86-opcode ret () 1957 #xc3 nil) 1958 (def-x86-opcode ret ((:imm16 :insert-imm16)) 1959 #xc2 nil) 1960 1961 ;; rol 1962 (def-x86-opcode roll ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm)) 1963 #xd1 #o300) 1964 (def-x86-opcode roll ((:imm1 :insert-nothing) (:anymem :insert-memory)) 1965 #xd1 #o000) 1966 (def-x86-opcode roll ((:reg32 :insert-modrm-rm)) 1967 #xd1 #o300) 1968 (def-x86-opcode roll ((:anymem :insert-memory)) 1969 #xd1 #o000) 1970 (def-x86-opcode roll ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm)) 1971 #xc1 #o300) 1972 (def-x86-opcode roll ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm)) 1973 #xd3 #o300) 1974 1975 (def-x86-opcode rolw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm)) 1976 #xd1 #o300 #x66) 1977 (def-x86-opcode rolw ((:imm1 :insert-nothing) (:anymem :insert-memory)) 1978 #xd1 #o000 #x66) 1979 (def-x86-opcode rolw ((:reg16 :insert-modrm-rm)) 1980 #xd1 #o300 #x66) 1981 (def-x86-opcode rolw ((:anymem :insert-memory)) 1982 #xd1 #o000 #x66) 1983 (def-x86-opcode rolw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm)) 1984 #xc1 #o300 #x66) 1985 (def-x86-opcode rolw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm)) 1986 #xd3 #o300 #x66) 1987 1988 (def-x86-opcode rolb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm)) 1989 #xd0 #o300) 1990 (def-x86-opcode rolb ((:imm1 :insert-nothing) (:anymem :insert-memory)) 1991 #xd0 #o000) 1992 (def-x86-opcode rolb ((:reg8 :insert-modrm-rm)) 1993 #xd0 #o300) 1994 (def-x86-opcode rolb ((:anymem :insert-memory)) 1995 #xd0 #o000) 1996 (def-x86-opcode rolb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm)) 1997 #xc0 #o300) 1998 (def-x86-opcode rolb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm)) 1999 #xd2 #o300) 2000 2001 ;; ror 2002 (def-x86-opcode rorl ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm)) 2003 #xd1 #o310) 2004 (def-x86-opcode rorl ((:imm1 :insert-nothing) (:anymem :insert-memory)) 2005 #xd1 #o010) 2006 (def-x86-opcode rorl ((:reg32 :insert-modrm-rm)) 2007 #xd1 #o310) 2008 (def-x86-opcode rorl ((:anymem :insert-memory)) 2009 #xd1 #o010) 2010 (def-x86-opcode rorl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm)) 2011 #xc1 #o310) 2012 (def-x86-opcode rorl ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm)) 2013 #xd3 #o310) 2014 2015 (def-x86-opcode rorw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm)) 2016 #xd1 #o310 #x66) 2017 (def-x86-opcode rorw ((:imm1 :insert-nothing) (:anymem :insert-memory)) 2018 #xd1 #o010 #x66) 2019 (def-x86-opcode rorw ((:reg16 :insert-modrm-rm)) 2020 #xd1 #o310 #x66) 2021 (def-x86-opcode rorw ((:anymem :insert-memory)) 2022 #xd1 #o010 #x66) 2023 (def-x86-opcode rorw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm)) 2024 #xc1 #o310 #x66) 2025 (def-x86-opcode rorw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm)) 2026 #xd3 #o310 #x66) 2027 2028 (def-x86-opcode rorb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm)) 2029 #xd0 #o310) 2030 (def-x86-opcode rorb ((:imm1 :insert-nothing) (:anymem :insert-memory)) 2031 #xd0 #o010) 2032 (def-x86-opcode rorb ((:reg8 :insert-modrm-rm)) 2033 #xd0 #o310) 2034 (def-x86-opcode rorb ((:anymem :insert-memory)) 2035 #xd0 #o010) 2036 (def-x86-opcode rorb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm)) 2037 #xc0 #o310) 2038 (def-x86-opcode rorb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm)) 2039 #xd2 #o310) 2040 2041 ;; sar 2042 (def-x86-opcode sarl ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm)) 2043 #xd1 #o370) 2044 (def-x86-opcode sarl ((:imm1 :insert-nothing) (:anymem :insert-memory)) 2045 #xd1 #o070) 2046 (def-x86-opcode sarl ((:reg32 :insert-modrm-rm)) 2047 #xd1 #o370) 2048 (def-x86-opcode sarl ((:anymem :insert-memory)) 2049 #xd1 #o070) 2050 (def-x86-opcode sarl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm)) 2051 #xc1 #o370) 2052 (def-x86-opcode sarl ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm)) 2053 #xd3 #o370) 2054 2055 (def-x86-opcode sarw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm)) 2056 #xd1 #o370 #x66) 2057 (def-x86-opcode sarw ((:imm1 :insert-nothing) (:anymem :insert-memory)) 2058 #xd1 #o070 #x66) 2059 (def-x86-opcode sarw ((:reg16 :insert-modrm-rm)) 2060 #xd1 #o370 #x66) 2061 (def-x86-opcode sarw ((:anymem :insert-memory)) 2062 #xd1 #o070 #x66) 2063 (def-x86-opcode sarw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm)) 2064 #xc1 #o370 #x66) 2065 (def-x86-opcode sarw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm)) 2066 #xd3 #o370 #x66) 2067 2068 (def-x86-opcode sarb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm)) 2069 #xd0 #o370) 2070 (def-x86-opcode sarb ((:imm1 :insert-nothing) (:anymem :insert-memory)) 2071 #xd0 #o070) 2072 (def-x86-opcode sarb ((:reg8 :insert-modrm-rm)) 2073 #xd0 #o370) 2074 (def-x86-opcode sarb ((:anymem :insert-memory)) 2075 #xd0 #o070) 2076 (def-x86-opcode sarb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm)) 2077 #xc0 #o370) 2078 (def-x86-opcode sarb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm)) 2079 #xd2 #o370) 2080 2081 ;; sbb 2082 (def-x86-opcode sbbl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm)) 2083 #x19 #o300) 2084 (def-x86-opcode sbbl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 2085 #x1b #o000) 2086 (def-x86-opcode sbbl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory)) 2087 #x19 #x00) 2088 (def-x86-opcode sbbl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm)) 2089 #x83 #o330) 2090 (def-x86-opcode sbbl ((:imm32s :insert-imm32s) (:acc :insert-nothing)) 2091 #x1d nil) 2092 (def-x86-opcode sbbl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm)) 2093 #x81 #o330) 2094 (def-x86-opcode sbbl ((:imm8s :insert-imm8s) (:anymem :insert-memory)) 2095 #x83 #o030) 2096 (def-x86-opcode sbbl ((:imm32s :insert-imm32s) (:anymem :insert-memory)) 2097 #x81 #o030) 2098 2099 (def-x86-opcode sbbw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm)) 2100 #x19 #o300 #x66) 2101 (def-x86-opcode sbbw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 2102 #x1b #o000 #x66) 2103 (def-x86-opcode sbbw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory)) 2104 #x19 #x00 #x66) 2105 (def-x86-opcode sbbw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm)) 2106 #x83 #o330 #x66) 2107 (def-x86-opcode sbbw ((:imm16 :insert-imm16) (:acc :insert-nothing)) 2108 #x1d nil #x66) 2109 (def-x86-opcode sbbw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm)) 2110 #x81 #o330 #x66) 2111 (def-x86-opcode sbbw ((:imm8s :insert-imm8s) (:anymem :insert-memory)) 2112 #x83 #o030 #x66) 2113 (def-x86-opcode sbbw ((:imm16 :insert-imm16) (:anymem :insert-memory)) 2114 #x81 #o030 #x66) 2115 2116 (def-x86-opcode sbbb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm)) 2117 #x18 #o300) 2118 (def-x86-opcode sbbb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg)) 2119 #x1a #o000) 2120 (def-x86-opcode sbbb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory)) 2121 #x18 #x00) 2122 (def-x86-opcode sbbb ((:imm8 :insert-imm8) (:acc :insert-nothing)) 2123 #x1c nil) 2124 (def-x86-opcode sbbb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm)) 2125 #x80 #o330) 2126 (def-x86-opcode sbbb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm)) 2127 #x80 #o330) 2128 (def-x86-opcode sbbb ((:imm8s :insert-imm8s) (:anymem :insert-memory)) 2129 #x80 #o030) 2130 2131 ;; scas 2132 (def-x86-opcode scasl () 2133 #xaf nil) 2134 (def-x86-opcode scasw () 2135 #xaf nil #x66) 2136 (def-x86-opcode scasb () 2137 #xae nil) 2138 2139 ;; setcc 2140 (def-x86-opcode setcc ((:imm8 :insert-cc) (:reg8 :insert-modrm-rm)) 2141 #x0f90 #o300) 2142 (def-x86-opcode seto ((:reg8 :insert-modrm-rm)) 2143 #x0f90 #o300) 2144 (def-x86-opcode seto ((:anymem :insert-memory)) 2145 #x0f90 #o000) 2146 (def-x86-opcode setno ((:reg8 :insert-modrm-rm)) 2147 #x0f91 #o300) 2148 (def-x86-opcode setno ((:anymem :insert-memory)) 2149 #x0f91 #o000) 2150 (def-x86-opcode setb ((:reg8 :insert-modrm-rm)) 2151 #x0f92 #o300) 2152 (def-x86-opcode setb ((:anymem :insert-memory)) 2153 #x0f92 #o000) 2154 (def-x86-opcode setc ((:reg8 :insert-modrm-rm)) 2155 #x0f92 #o300) 2156 (def-x86-opcode setc ((:anymem :insert-memory)) 2157 #x0f92 #o000) 2158 (def-x86-opcode setae ((:reg8 :insert-modrm-rm)) 2159 #x0f93 #o300) 2160 (def-x86-opcode setae ((:anymem :insert-memory)) 2161 #x0f93 #o000) 2162 (def-x86-opcode sete ((:reg8 :insert-modrm-rm)) 2163 #x0f94 #o300) 2164 (def-x86-opcode sete ((:anymem :insert-memory)) 2165 #x0f94 #o000) 2166 (def-x86-opcode setne ((:reg8 :insert-modrm-rm)) 2167 #x0f95 #o300) 2168 (def-x86-opcode setne ((:anymem :insert-memory)) 2169 #x0f95 #o000) 2170 (def-x86-opcode setbe ((:reg8 :insert-modrm-rm)) 2171 #x0f96 #o300) 2172 (def-x86-opcode setbe ((:anymem :insert-memory)) 2173 #x0f96 #o000) 2174 (def-x86-opcode seta ((:reg8 :insert-modrm-rm)) 2175 #x0f97 #o300) 2176 (def-x86-opcode seta ((:anymem :insert-memory)) 2177 #x0f97 #o000) 2178 (def-x86-opcode sets ((:reg8 :insert-modrm-rm)) 2179 #x0f98 #o300) 2180 (def-x86-opcode sets ((:anymem :insert-memory)) 2181 #x0f98 #o000) 2182 (def-x86-opcode setns ((:reg8 :insert-modrm-rm)) 2183 #x0f99 #o300) 2184 (def-x86-opcode setns ((:anymem :insert-memory)) 2185 #x0f99 #o000) 2186 (def-x86-opcode setpe ((:reg8 :insert-modrm-rm)) 2187 #x0f9a #o300) 2188 (def-x86-opcode setpe ((:anymem :insert-memory)) 2189 #x0f9a #o000) 2190 (def-x86-opcode setpo ((:reg8 :insert-modrm-rm)) 2191 #x0f9b #o300) 2192 (def-x86-opcode setpo ((:anymem :insert-memory)) 2193 #x0f9b #o000) 2194 (def-x86-opcode setl ((:reg8 :insert-modrm-rm)) 2195 #x0f9c #o300) 2196 (def-x86-opcode setl ((:anymem :insert-memory)) 2197 #x0f9c #o000) 2198 (def-x86-opcode setge ((:reg8 :insert-modrm-rm)) 2199 #x0f9d #o300) 2200 (def-x86-opcode setge ((:anymem :insert-memory)) 2201 #x0f9d #o000) 2202 (def-x86-opcode setle ((:reg8 :insert-modrm-rm)) 2203 #x0f9e #o300) 2204 (def-x86-opcode setle ((:anymem :insert-memory)) 2205 #x0f9e #o000) 2206 (def-x86-opcode setg ((:reg8 :insert-modrm-rm)) 2207 #x0f9f #o300) 2208 (def-x86-opcode setg ((:anymem :insert-memory)) 2209 #x0f9f #o000) 2210 2211 ;; shl 2212 (def-x86-opcode shll ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm)) 2213 #xd1 #o340) 2214 (def-x86-opcode shll ((:imm1 :insert-nothing) (:anymem :insert-memory)) 2215 #xd1 #o040) 2216 (def-x86-opcode shll ((:reg32 :insert-modrm-rm)) 2217 #xd1 #o340) 2218 (def-x86-opcode shll ((:anymem :insert-memory)) 2219 #xd1 #o040) 2220 (def-x86-opcode shll ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm)) 2221 #xc1 #o340) 2222 (def-x86-opcode shll ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm)) 2223 #xd3 #o340) 2224 2225 (def-x86-opcode shlw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm)) 2226 #xd1 #o340 #x66) 2227 (def-x86-opcode shlw ((:imm1 :insert-nothing) (:anymem :insert-memory)) 2228 #xd1 #o040 #x66) 2229 (def-x86-opcode shlw ((:reg16 :insert-modrm-rm)) 2230 #xd1 #o340 #x66) 2231 (def-x86-opcode shlw ((:anymem :insert-memory)) 2232 #xd1 #o040 #x66) 2233 (def-x86-opcode shlw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm)) 2234 #xc1 #o340 #x66) 2235 (def-x86-opcode shlw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm)) 2236 #xd3 #o340 #x66) 2237 2238 (def-x86-opcode shlb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm)) 2239 #xd0 #o340) 2240 (def-x86-opcode shlb ((:imm1 :insert-nothing) (:anymem :insert-memory)) 2241 #xd0 #o040) 2242 (def-x86-opcode shlb ((:reg8 :insert-modrm-rm)) 2243 #xd0 #o340) 2244 (def-x86-opcode shlb ((:anymem :insert-memory)) 2245 #xd0 #o040) 2246 (def-x86-opcode shlb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm)) 2247 #xc0 #o340) 2248 (def-x86-opcode shlb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm)) 2249 #xd2 #o340) 2250 2251 ;; shld 2252 (def-x86-opcode shldl ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm)) 2253 #x0fa4 #o300) 2254 (def-x86-opcode shldl ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:anymem :insert-memory)) 2255 #x0fa4 #o000) 2256 (def-x86-opcode shldl ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm)) 2257 #x0fa5 #o300) 2258 (def-x86-opcode shldl ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:anymem :insert-memory)) 2259 #x0fa5 #o000) 2260 (def-x86-opcode shldl ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm)) 2261 #x0fa5 #o300) 2262 (def-x86-opcode shldl ((:reg64 :insert-modrm-reg) (:anymem :insert-memory)) 2263 #x0fa5 #o000) 2264 2265 (def-x86-opcode shldw ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm)) 2266 #x0fa4 #o300 #x66) 2267 (def-x86-opcode shldw ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:anymem :insert-memory)) 2268 #x0fa4 #o000 #x66) 2269 (def-x86-opcode shldw ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm)) 2270 #x0fa5 #o300 #x66) 2271 (def-x86-opcode shldw ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:anymem :insert-memory)) 2272 #x0fa5 #o000 #x66) 2273 (def-x86-opcode shldw ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm)) 2274 #x0fa5 #o300 #x66) 2275 (def-x86-opcode shldw ((:reg64 :insert-modrm-reg) (:anymem :insert-memory)) 2276 #x0fa5 #o000 #x66) 2277 2278 ;; shr 2279 (def-x86-opcode shrl ((:imm1 :insert-nothing) (:reg32 :insert-modrm-rm)) 2280 #xd1 #o350) 2281 (def-x86-opcode shrl ((:imm1 :insert-nothing) (:anymem :insert-memory)) 2282 #xd1 #o050) 2283 (def-x86-opcode shrl ((:reg32 :insert-modrm-rm)) 2284 #xd1 #o350) 2285 (def-x86-opcode shrl ((:anymem :insert-memory)) 2286 #xd1 #o050) 2287 (def-x86-opcode shrl ((:imm8 :insert-imm8) (:reg32 :insert-modrm-rm)) 2288 #xc1 #o350) 2289 (def-x86-opcode shrl ((:shiftcount :insert-nothing) (:reg32 :insert-modrm-rm)) 2290 #xd3 #o350) 2291 2292 (def-x86-opcode shrw ((:imm1 :insert-nothing) (:reg16 :insert-modrm-rm)) 2293 #xd1 #o350 #x66) 2294 (def-x86-opcode shrw ((:imm1 :insert-nothing) (:anymem :insert-memory)) 2295 #xd1 #o050 #x66) 2296 (def-x86-opcode shrw ((:reg16 :insert-modrm-rm)) 2297 #xd1 #o350 #x66) 2298 (def-x86-opcode shrw ((:anymem :insert-memory)) 2299 #xd1 #o050 #x66) 2300 (def-x86-opcode shrw ((:imm8 :insert-imm8) (:reg16 :insert-modrm-rm)) 2301 #xc1 #o350 #x66) 2302 (def-x86-opcode shrw ((:shiftcount :insert-nothing) (:reg16 :insert-modrm-rm)) 2303 #xd3 #o350 #x66) 2304 2305 (def-x86-opcode shrb ((:imm1 :insert-nothing) (:reg8 :insert-modrm-rm)) 2306 #xd0 #o350) 2307 (def-x86-opcode shrb ((:imm1 :insert-nothing) (:anymem :insert-memory)) 2308 #xd0 #o050) 2309 (def-x86-opcode shrb ((:reg8 :insert-modrm-rm)) 2310 #xd0 #o350) 2311 (def-x86-opcode shrb ((:anymem :insert-memory)) 2312 #xd0 #o050) 2313 (def-x86-opcode shrb ((:imm8 :insert-imm8) (:reg8 :insert-modrm-rm)) 2314 #xc0 #o350) 2315 (def-x86-opcode shrb ((:shiftcount :insert-nothing) (:reg8 :insert-modrm-rm)) 2316 #xd2 #o350) 2317 2318 ;; shrd 2319 (def-x86-opcode shrdl ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm)) 2320 #x0fac #o300) 2321 (def-x86-opcode shrdl ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:anymem :insert-memory)) 2322 #x0fac #o000) 2323 (def-x86-opcode shrdl ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm)) 2324 #x0fad #o300) 2325 (def-x86-opcode shrdl ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:anymem :insert-memory)) 2326 #x0fad #o000) 2327 (def-x86-opcode shrdl ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm)) 2328 #x0fad #o300) 2329 (def-x86-opcode shrdl ((:reg64 :insert-modrm-reg) (:anymem :insert-memory)) 2330 #x0fad #o000) 2331 2332 (def-x86-opcode shrdw ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm)) 2333 #x0fac #o300 #x66) 2334 (def-x86-opcode shrdw ((:imm8 :insert-imm8) (:reg64 :insert-modrm-reg) (:anymem :insert-memory)) 2335 #x0fac #o000 #x66) 2336 (def-x86-opcode shrdw ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm)) 2337 #x0fad #o300 #x66) 2338 (def-x86-opcode shrdw ((:shiftcount :insert-nothing) (:reg64 :insert-modrm-reg) (:anymem :insert-memory)) 2339 #x0fad #o000 #x66) 2340 (def-x86-opcode shrdw ((:reg64 :insert-modrm-reg) (:reg64 :insert-modrm-rm)) 2341 #x0fad #o300 #x66) 2342 (def-x86-opcode shrdw ((:reg64 :insert-modrm-reg) (:anymem :insert-memory)) 2343 #x0fad #o000 #x66) 2344 2345 ;; stc 2346 (def-x86-opcode stc () 2347 #xf9 nil) 2348 2349 ;; std 2350 (def-x86-opcode std () 2351 #xfd nil) 2352 2353 ;; sub 2354 (def-x86-opcode subl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm)) 2355 #x29 #o300) 2356 (def-x86-opcode subl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 2357 #x2b #o000) 2358 (def-x86-opcode subl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory)) 2359 #x29 #x00) 2360 (def-x86-opcode subl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm)) 2361 #x83 #o350) 2362 (def-x86-opcode subl ((:imm32s :insert-imm32s) (:acc :insert-nothing)) 2363 #x2d nil) 2364 (def-x86-opcode subl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm)) 2365 #x81 #o350) 2366 (def-x86-opcode subl ((:imm8s :insert-imm8s) (:anymem :insert-memory)) 2367 #x83 #o050) 2368 (def-x86-opcode subl ((:imm32s :insert-imm32s) (:anymem :insert-memory)) 2369 #x81 #o050) 2370 2371 (def-x86-opcode subw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm)) 2372 #x29 #o300 #x66) 2373 (def-x86-opcode subw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 2374 #x2b #o000 #x66) 2375 (def-x86-opcode subw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory)) 2376 #x29 #x00 #x66) 2377 (def-x86-opcode subw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm)) 2378 #x83 #o350 #x66) 2379 (def-x86-opcode subw ((:imm16 :insert-imm16) (:acc :insert-nothing)) 2380 #x2d nil #x66) 2381 (def-x86-opcode subw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm)) 2382 #x81 #o350 #x66) 2383 (def-x86-opcode subw ((:imm8s :insert-imm8s) (:anymem :insert-memory)) 2384 #x83 #o050 #x66) 2385 (def-x86-opcode subw ((:imm16 :insert-imm16) (:anymem :insert-memory)) 2386 #x81 #o050 #x66) 2387 2388 (def-x86-opcode subb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm)) 2389 #x28 #o300) 2390 (def-x86-opcode subb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg)) 2391 #x2a #o000) 2392 (def-x86-opcode subb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory)) 2393 #x2a #x00) 2394 (def-x86-opcode subb ((:imm8s :insert-imm8s) (:acc :insert-nothing)) 2395 #x2c nil) 2396 (def-x86-opcode subb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm)) 2397 #x80 #o350) 2398 (def-x86-opcode subb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm)) 2399 #x80 #o350) 2400 (def-x86-opcode subb ((:imm8s :insert-imm8s) (:anymem :insert-memory)) 2401 #x80 #o050) 2402 2403 ;; test 2404 (def-x86-opcode testl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm)) 2405 #x85 #o300) 2406 (def-x86-opcode testl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory)) 2407 #x85 #o000) 2408 (def-x86-opcode testl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 2409 #x87 #o000) 2410 (def-x86-opcode testl ((:imm32s :insert-imm32s) (:acc :insert-nothing)) 2411 #xa9 nil) 2412 (def-x86-opcode testl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm)) 2413 #xf7 #o300) 2414 (def-x86-opcode testl ((:imm32s :insert-imm32s) (:anymem :insert-memory)) 2415 #xf7 #o000) 2416 2417 (def-x86-opcode testw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm)) 2418 #x85 #o300 #x66) 2419 (def-x86-opcode testw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory)) 2420 #x85 #o000 #x66) 2421 (def-x86-opcode testw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 2422 #x87 #o000 #x66) 2423 (def-x86-opcode testw ((:imm16 :insert-imm16) (:acc :insert-nothing)) 2424 #xa9 nil #x66) 2425 (def-x86-opcode testw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm)) 2426 #xf7 #o300 #x66) 2427 (def-x86-opcode testw ((:imm16 :insert-imm16) (:anymem :insert-memory)) 2428 #xf7 #o000 #x66) 2429 2430 (def-x86-opcode testb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm)) 2431 #x84 #o300) 2432 (def-x86-opcode testb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory)) 2433 #x84 #o000) 2434 (def-x86-opcode testb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg)) 2435 #x86 #o000) 2436 (def-x86-opcode testb ((:imm8s :insert-imm8s) (:acc :insert-nothing)) 2437 #xa8 nil) 2438 (def-x86-opcode testb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm)) 2439 #xf6 #o300) 2440 (def-x86-opcode testb ((:imm8s :insert-imm8s) (:anymem :insert-memory)) 2441 #xf6 #o000) 2442 2443 ;; ud2a (not to be confused with all of the other undefined/accidental 2444 ;; instructions) is "officially undefined". 2445 (def-x86-opcode ud2a () 2446 #x0f0b nil) 2447 2448 (def-x86-opcode ud2b () 2449 #x0fb9 nil) 2450 2451 ;; xadd 2452 (def-x86-opcode xaddl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm)) 2453 #x0fc1 #o300) 2454 (def-x86-opcode xaddl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory)) 2455 #x0fc1 #o000) 2456 2457 (def-x86-opcode xaddw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm)) 2458 #x0fc1 #o300 #x66) 2459 (def-x86-opcode xaddw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory)) 2460 #x0fc1 #o000 #x66) 2461 2462 (def-x86-opcode xaddb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm)) 2463 #x0fc0 #o300) 2464 (def-x86-opcode xaddb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory)) 2465 #x0fc0 #o000) 2466 2467 ;; xchg 2468 ;; Allegedly, using the opcode #x9x to implement "(xchg (% eax) (% eax))" 2469 ;; doesn't zero-extend eax to rax on x86-64. (So don't special-case 2470 ;; :acc as source or destination, and use #x86 and a modrm byte in all cases.) 2471 (def-x86-opcode xchgl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm)) 2472 #x87 #o300) 2473 (def-x86-opcode xchgl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory)) 2474 #x87 #o000) 2475 (def-x86-opcode xchgl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 2476 #x89 #o000) 2477 2478 (def-x86-opcode xchgw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm)) 2479 #x87 #o300 #x66) 2480 (def-x86-opcode xchgw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory)) 2481 #x87 #o000 #x66) 2482 (def-x86-opcode xchgw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 2483 #x89 #o000 #x66) 2484 2485 (def-x86-opcode xchgl ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm)) 2486 #x86 #o300) 2487 (def-x86-opcode xchgl ((:reg8 :insert-modrm-reg) (:anymem :insert-memory)) 2488 #x86 #o000) 2489 (def-x86-opcode xchgl ((:anymem :insert-memory) (:reg8 :insert-modrm-reg)) 2490 #x88 #o000) 2491 2492 ;; xlat 2493 (def-x86-opcode xlatb () 2494 #xd7 nil) 2495 2496 ;; xor 2497 (def-x86-opcode xorl ((:reg32 :insert-modrm-reg) (:reg32 :insert-modrm-rm)) 2498 #x31 #o300) 2499 (def-x86-opcode xorl ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 2500 #x33 #o000) 2501 (def-x86-opcode xorl ((:reg32 :insert-modrm-reg) (:anymem :insert-memory)) 2502 #x31 #x00) 2503 (def-x86-opcode xorl ((:imm8s :insert-imm8s) (:reg32 :insert-modrm-rm)) 2504 #x83 #o360) 2505 (def-x86-opcode xorl ((:imm32s :insert-imm32s) (:acc :insert-nothing)) 2506 #x35 nil) 2507 (def-x86-opcode xorl ((:imm32s :insert-imm32s) (:reg32 :insert-modrm-rm)) 2508 #x81 #o360) 2509 (def-x86-opcode xorl ((:imm8s :insert-imm8s) (:anymem :insert-memory)) 2510 #x83 #o060) 2511 (def-x86-opcode xorl ((:imm32s :insert-imm32s) (:anymem :insert-memory)) 2512 #x81 #o060) 2513 2514 (def-x86-opcode xorw ((:reg16 :insert-modrm-reg) (:reg16 :insert-modrm-rm)) 2515 #x31 #o300 #x66) 2516 (def-x86-opcode xorw ((:anymem :insert-memory) (:reg16 :insert-modrm-reg)) 2517 #x33 #o000 #x66) 2518 (def-x86-opcode xorw ((:reg16 :insert-modrm-reg) (:anymem :insert-memory)) 2519 #x31 #x00 #x66) 2520 (def-x86-opcode xorw ((:imm8s :insert-imm8s) (:reg16 :insert-modrm-rm)) 2521 #x83 #o360 #x66) 2522 (def-x86-opcode xorw ((:imm16 :insert-imm16) (:acc :insert-nothing)) 2523 #x35 nil #x66) 2524 (def-x86-opcode xorw ((:imm16 :insert-imm16) (:reg16 :insert-modrm-rm)) 2525 #x81 #o360 #x66) 2526 (def-x86-opcode xorw ((:imm8s :insert-imm8s) (:anymem :insert-memory)) 2527 #x83 #o060 #x66) 2528 (def-x86-opcode xorw ((:imm16 :insert-imm16) (:anymem :insert-memory)) 2529 #x81 #o060 #x66) 2530 2531 (def-x86-opcode xorb ((:reg8 :insert-modrm-reg) (:reg8 :insert-modrm-rm)) 2532 #x30 #o300) 2533 (def-x86-opcode xorb ((:anymem :insert-memory) (:reg8 :insert-modrm-reg)) 2534 #x32 #o000) 2535 (def-x86-opcode xorb ((:reg8 :insert-modrm-reg) (:anymem :insert-memory)) 2536 #x30 #x00) 2537 (def-x86-opcode xorb ((:imm8s :insert-imm8s) (:acc :insert-nothing)) 2538 #x34 nil) 2539 (def-x86-opcode xorb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm)) 2540 #x80 #o360) 2541 (def-x86-opcode xorb ((:imm8s :insert-imm8s) (:reg8 :insert-modrm-rm)) 2542 #x80 #o360) 2543 (def-x86-opcode xorb ((:imm8s :insert-imm8s) (:anymem :insert-memory)) 2544 #x80 #o060) 2545 2546 ;; fxsave 2547 (def-x86-opcode fxsaveq ((:anymem :insert-memory)) 2548 #x0fae #o000) 2549 2550 ;; fxrstor 2551 (def-x86-opcode fxrstor ((:anymem :insert-memory)) 2552 #x0fae #o010) 2553 2554 ;; clflush 2555 (def-x86-opcode clflush ((:anymem :insert-memory)) 2556 #x0fae #o070) 2557 2558 ;; lfence 2559 (def-x86-opcode lfence () 2560 #x0fae #xe8) 2561 2562 ;; mfence 2563 (def-x86-opcode mfence () 2564 #x0fae #xf0) 2565 2566 ;; pause 2567 (def-x86-opcode pause () 2568 #xf390 nil) 2569 2570 ;; I don't want to have to define all mmx/sse/sse2 instructions at the 2571 ;; moment, but it wouldn't hurt to define those that the lisp is 2572 ;; likely to use. 2573 2574 ;; Useful mmx/sse2 instructions, other than movd/movq: 2575 2576 ;; emms 2577 (def-x86-opcode emms () 2578 #x0f77 nil) 2579 2580 ;; addsd 2581 (def-x86-opcode addsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg)) 2582 #x0f58 #o000 #xf2) 2583 (def-x86-opcode addsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg)) 2584 #x0f58 #o300 #xf2) 2585 2586 ;; addss 2587 (def-x86-opcode addss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg)) 2588 #x0f58 #o000 #xf3) 2589 (def-x86-opcode addss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg)) 2590 #x0f58 #o300 #xf3) 2591 2592 ;; subsd 2593 (def-x86-opcode subsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg)) 2594 #x0f5c #o000 #xf2) 2595 (def-x86-opcode subsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg)) 2596 #x0f5c #o300 #xf2) 2597 2598 ;; subss 2599 (def-x86-opcode subss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg)) 2600 #x0f5c #o000 #xf3) 2601 (def-x86-opcode subss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg)) 2602 #x0f5c #o300 #xf3) 2603 2604 ;; movapd 2605 (def-x86-opcode movapd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg)) 2606 #x0f28 #o300 #x66) 2607 (def-x86-opcode movapd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg)) 2608 #x0f28 #o000 #x66) 2609 (def-x86-opcode movapd ((:regxmm :insert-xmm-reg) (:anymem :insert-memory)) 2610 #x0f29 #o000 #x66) 2611 2612 ;; mulsd 2613 (def-x86-opcode mulsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg)) 2614 #x0f59 #o000 #xf2) 2615 (def-x86-opcode mulsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg)) 2616 #x0f59 #o300 #xf2) 2617 2618 ;; mulss 2619 (def-x86-opcode mulss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg)) 2620 #x0f59 #o000 #xf3) 2621 (def-x86-opcode mulss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg)) 2622 #x0f59 #o300 #xf3) 2623 2624 ;; divsd 2625 (def-x86-opcode divsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg)) 2626 #x0f5e #o000 #xf2) 2627 (def-x86-opcode divsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg)) 2628 #x0f5e #o300 #xf2) 2629 2630 ;; divss 2631 (def-x86-opcode divss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg)) 2632 #x0f5e #o000 #xf3) 2633 (def-x86-opcode divss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg)) 2634 #x0f5e #o300 #xf3) 2635 2636 2637 ;; sqrtsd 2638 (def-x86-opcode sqrtsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg)) 2639 #x0f51 #o000 #xf2) 2640 (def-x86-opcode sqrtsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg)) 2641 #x0f51 #o300 #xf2) 2642 2643 ;; sqrtss 2644 (def-x86-opcode sqrtss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg)) 2645 #x0f51 #o000 #xf3) 2646 (def-x86-opcode sqrtss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg)) 2647 #x0f51 #o300 #xf3) 2648 2649 ;; comisd 2650 (def-x86-opcode comisd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg)) 2651 #x0f2f #o000 #x66) 2652 (def-x86-opcode comisd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg)) 2653 #x0f2f #o300 #x66) 2654 2655 ;; ucomisd 2656 (def-x86-opcode ucomisd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg)) 2657 #x0f2e #o000 #x66) 2658 (def-x86-opcode ucomisd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg)) 2659 #x0f2e #o300 #x66) 2660 2661 ;; comiss 2662 (def-x86-opcode comiss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg)) 2663 #x0f2f #o000) 2664 (def-x86-opcode comiss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg)) 2665 #x0f2f #o300) 2666 2667 ;; ucomiss 2668 (def-x86-opcode ucomiss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg)) 2669 #x0f2e #o000) 2670 (def-x86-opcode ucomiss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg)) 2671 #x0f2e #o300) 2672 2673 ;; movsd 2674 (def-x86-opcode movsd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg)) 2675 #x0f10 #o300 #xf2) 2676 (def-x86-opcode movsd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg)) 2677 #x0f10 #o300 #xf2) 2678 (def-x86-opcode movsd ((:regxmm :insert-xmm-reg) (:anymem :insert-memory)) 2679 #x0f11 #o000 #xf2) 2680 2681 ;; movss 2682 (def-x86-opcode movss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg)) 2683 #x0f10 #o300 #xf3) 2684 (def-x86-opcode movss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg)) 2685 #x0f10 #o300 #xf3) 2686 (def-x86-opcode movss ((:regxmm :insert-xmm-reg) (:anymem :insert-memory)) 2687 #x0f11 #o000 #xf3) 2688 2689 ;;; cvtsd2si. This does rounding (as opposed to truncation). 2690 (def-x86-opcode cvtsd2sil ((:regxmm :insert-xmm-rm) (:reg32 :insert-modrm-reg)) 2691 #x0f2d #o300 #xf2) 2692 (def-x86-opcode cvtsd2sil ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 2693 #x0f2d #o000 #xf2) 2694 2695 ;;; cvtss2si. This does rounding (as opposed to truncation). 2696 (def-x86-opcode cvtss2sil ((:regxmm :insert-xmm-rm) (:reg32 :insert-modrm-reg)) 2697 #x0f2d #o300 #xf3) 2698 (def-x86-opcode cvtss2sil ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 2699 #x0f2d #o000 #xf3) 2700 2701 ;;; cvttsd2si. This does truncation (as opposed to rounding). 2702 (def-x86-opcode cvttsd2sil ((:regxmm :insert-xmm-rm) (:reg32 :insert-modrm-reg)) 2703 #x0f2c #o300 #xf2) 2704 (def-x86-opcode cvtsd2sil ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 2705 #x0f2c #o000 #xf2) 2706 2707 ;;; cvtss2si. This does rounding (as opposed to truncation). 2708 (def-x86-opcode cvttss2sil ((:regxmm :insert-xmm-rm) (:reg32 :insert-modrm-reg)) 2709 #x0f2d #o300 #xf3) 2710 (def-x86-opcode cvttss2sil ((:anymem :insert-memory) (:reg32 :insert-modrm-reg)) 2711 #x0f2c #o000 #xf3) 2712 2713 ;; cvtsi2sd 2714 (def-x86-opcode cvtsi2sdl ((:reg32 :insert-modrm-rm) (:regxmm :insert-xmm-reg)) 2715 #x0f2a #o300 #xf2) 2716 (def-x86-opcode cvtsi2sdl ((:anymem :insert-memory) (:regxmm :insert-xmm-reg)) 2717 #x0f2a #o000 #xf2) 2718 2719 ;; cvtsd2ss 2720 (def-x86-opcode cvtsd2ss ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg)) 2721 #x0f5a #o300 #xf2) 2722 (def-x86-opcode cvtsd2ss ((:anymem :insert-memory) (:regxmm :insert-xmm-reg)) 2723 #x0f5a #o000 #xf2) 2724 2725 ;; cvtsi2sd 2726 (def-x86-opcode cvtsi2sdl ((:reg32 :insert-modrm-rm) (:regxmm :insert-xmm-reg)) 2727 #x0f2a #o300 #xf2) 2728 (def-x86-opcode cvtsi2sdl ((:anymem :insert-memory) (:regxmm :insert-xmm-reg)) 2729 #x0f2a #o000 #xf2) 2730 2731 ;; cvtsi2ss 2732 (def-x86-opcode cvtsi2ssl ((:reg32 :insert-modrm-rm) (:regxmm :insert-xmm-reg)) 2733 #x0f2a #o300 #xf3) 2734 (def-x86-opcode cvtsi2ssl ((:anymem :insert-memory) (:regxmm :insert-xmm-reg)) 2735 #x0f2a #o000 #xf3) 2736 2737 ;;; cvtss2sd 2738 (def-x86-opcode cvtss2sd ((:regxmm :insert-xmm-rm) (:regxmm :insert-xmm-reg)) 2739 #x0f5a #o300 #xf3) 2740 (def-x86-opcode cvtss2sd ((:anymem :insert-memory) (:regxmm :insert-xmm-reg)) 2741 #x0f5a #o000 #xf3) 2742 2743 ;; pand 2744 (def-x86-opcode pand ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg)) 2745 #x0fdb #o300) 2746 (def-x86-opcode pand ((:anymem :insert-memory) (:regmmx :insert-mmx-reg)) 2747 #x0fdb #o000) 2748 (def-x86-opcode pand ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg)) 2749 #x0fef #o300 #x66) 2750 (def-x86-opcode pand ((:anymem :insert-memory) (:regxmm :insert-modrm-reg)) 2751 #x0fdb #o000 #x66) 2752 2753 ;; pandn 2754 (def-x86-opcode pandn ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg)) 2755 #x0fdf #o300) 2756 (def-x86-opcode pandn ((:anymem :insert-memory) (:regmmx :insert-mmx-reg)) 2757 #x0fdf #o000) 2758 (def-x86-opcode pandn ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg)) 2759 #x0fdf #o300 #x66) 2760 (def-x86-opcode pandn ((:anymem :insert-memory) (:regxmm :insert-modrm-reg)) 2761 #x0fdf #o000 #x66) 2762 2763 ;; por 2764 (def-x86-opcode por ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg)) 2765 #x0feb #o300) 2766 (def-x86-opcode por ((:anymem :insert-memory) (:regmmx :insert-mmx-reg)) 2767 #x0feb #o000) 2768 (def-x86-opcode por ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg)) 2769 #x0feb #o300 #x66) 2770 (def-x86-opcode por ((:anymem :insert-memory) (:regxmm :insert-modrm-reg)) 2771 #x0feb #o000 #x66) 2772 2773 ;; pxor 2774 (def-x86-opcode pxor ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg)) 2775 #x0fef #o300) 2776 (def-x86-opcode pxor ((:anymem :insert-memory) (:regmmx :insert-mmx-reg)) 2777 #x0fef #o000) 2778 (def-x86-opcode pxor ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg)) 2779 #x0fef #o300 #x66) 2780 (def-x86-opcode pxor ((:anymem :insert-memory) (:regxmm :insert-modrm-reg)) 2781 #x0fef #o000 #x66) 2782 2783 ;; psllq 2784 (def-x86-opcode psllq ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg)) 2785 #x0ff3 #o300) 2786 (def-x86-opcode psllq ((:anymem :insert-memory) (:regmmx :insert-mmx-reg)) 2787 #x0ff3 #o000) 2788 (def-x86-opcode psllq ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg)) 2789 #x0ff3 #o300 #x66) 2790 (def-x86-opcode psllq ((:anymem :insert-memory) (:regxmm :insert-modrm-reg)) 2791 #x0ff3 #o000 #x66) 2792 (def-x86-opcode psllq ((:imm8 :insert-imm8) (:regxmm :insert-xmm-rm)) 2793 #x0f73 #o360 #x66) 2794 2795 ;; psllw 2796 2797 ;; pslld 2798 2799 ;; pslldq 2800 (def-x86-opcode pslldq ((:imm8 :insert-imm8) (:regxmm :insert-xmm-rm)) 2801 #x0f73 #o370 #x66) 2802 2803 ;; psrlq 2804 (def-x86-opcode psrlq ((:regmmx :insert-mmx-rm) (:regmmx :insert-mmx-reg)) 2805 #x0fd3 #o300) 2806 (def-x86-opcode psrlq ((:anymem :insert-memory) (:regmmx :insert-mmx-reg)) 2807 #x0fd3 #o000) 2808 (def-x86-opcode psrlq ((:regxmm :insert-modrm-rm) (:regxmm :insert-modrm-reg)) 2809 #x0fd3 #o300 #x66) 2810 (def-x86-opcode psrlq ((:anymem :insert-memory) (:regxmm :insert-modrm-reg)) 2811 #x0fd3 #o000 #x66) 2812 (def-x86-opcode psrlq ((:imm8 :insert-imm8) (:regxmm :insert-xmm-rm)) 2813 #x0f73 #o320 #x66) 2814 2815 ;; psrld 2816 2817 ;; psrldq 2818 (def-x86-opcode psrldq ((:imm8 :insert-imm8) (:regxmm :insert-xmm-rm)) 2819 #x0f73 #o330 #x66) 2820 2821 ;; psrlw 2822 2823 ;;; End of list of useful mmx instructions 2824 (def-x86-opcode ldmxcsr ((:anymem :insert-memory)) 2825 #x0fae #o020) 2826 2827 (def-x86-opcode stmxcsr ((:anymem :insert-memory)) 2828 #x0fae #o030) 2829 2830 )) 2831 2832 ;;; wastes space 2833 (defparameter *x8632-opcode-templates* 2834 (concatenate 'vector *x86-common-opcode-templates* 2835 *x86-32-bit-only-opcode-templates*)) 2836 2837 (dotimes (i (length *x8632-opcode-templates*)) 2838 (setf (x86-opcode-template-ordinal (svref *x8632-opcode-templates* i)) i)) 2839 707 2840 708 2841 … … 3434 5567 (name (x86-opcode-template-mnemonic template))) 3435 5568 (push template (gethash name hash)))))) 3436 #+notyet3437 5569 (setup-templates-hash 3438 5570 *x86-32-opcode-template-lists* … … 3455 5587 3456 5588 (defparameter *x86-32-operand-insert-functions* 3457 #(tbd)) 5589 #(insert-nothing 5590 insert-modrm-reg 5591 insert-modrm-rm 5592 insert-memory 5593 insert-opcode-reg 5594 insert-opcode-reg4 5595 insert-cc 5596 insert-label 5597 insert-imm8-for-int 5598 insert-extra 5599 insert-imm8 5600 insert-imm8s 5601 insert-imm16 5602 insert-imm32s 5603 insert-imm32 5604 insert-mmx-reg 5605 insert-mmx-rm 5606 insert-xmm-reg 5607 insert-xmm-rm 5608 insert-reg4-pseudo-rm-high 5609 insert-reg4-pseudo-rm-low 5610 insert-self 5611 )) 3458 5612 3459 5613 (defparameter *x86-64-operand-insert-functions* … … 3479 5633 insert-xmm-rm 3480 5634 insert-reg4-pseudo-rm-high 3481 insert-reg4-pseudo-rm-low)) 5635 insert-reg4-pseudo-rm-low 5636 insert-self ;just for testing. should go away. 5637 )) 3482 5638 3483 5639 (defvar *x86-operand-insert-functions* ()) … … 4446 6602 (setf (x86-instruction-extra instruction) 4447 6603 (x86::x86-label-operand-label operand))) 6604 6605 (defun insert-self (instruction operand) 6606 (format t "~&insert-self: instruction = ~a operand = ~a" 6607 instruction operand) 6608 (setf (x86-immediate-operand-type operand) 6609 (encode-operand-type :self)) 6610 (setf (x86-instruction-imm instruction) operand)) 6611 6612 (defparameter *x8632-register-entries* 6613 (flet ((register-entry (name) 6614 (let* ((r (gethash name *x86-registers*))) 6615 (unless r (error "unknown register ~s" name)) 6616 r))) 6617 (vector 6618 ;; 32-bit registers 6619 (register-entry "eax") 6620 (register-entry "ecx") 6621 (register-entry "edx") 6622 (register-entry "ebx") 6623 (register-entry "esp") 6624 (register-entry "ebp") 6625 (register-entry "esi") 6626 (register-entry "edi") 6627 ;; 16-bit-registers 6628 (register-entry "ax") 6629 (register-entry "cx") 6630 (register-entry "dx") 6631 (register-entry "bx") 6632 (register-entry "sp") 6633 (register-entry "bp") 6634 (register-entry "si") 6635 (register-entry "di") 6636 ;; 8-bit registers 6637 (register-entry "al") 6638 (register-entry "cl") 6639 (register-entry "dl") 6640 (register-entry "bl") 6641 (register-entry "spl") 6642 (register-entry "bpl") 6643 (register-entry "sil") 6644 (register-entry "dil") 6645 ;;; xmm registers 6646 (register-entry "xmm0") 6647 (register-entry "xmm1") 6648 (register-entry "xmm2") 6649 (register-entry "xmm3") 6650 (register-entry "xmm4") 6651 (register-entry "xmm5") 6652 (register-entry "xmm6") 6653 (register-entry "xmm7") 6654 ;; MMX registers 6655 (register-entry "mm0") 6656 (register-entry "mm1") 6657 (register-entry "mm2") 6658 (register-entry "mm3") 6659 (register-entry "mm4") 6660 (register-entry "mm5") 6661 (register-entry "mm6") 6662 (register-entry "mm7") 6663 ;; x87 FP regs. May or may not be useful. 6664 (register-entry "st[0]") 6665 (register-entry "st[1]") 6666 (register-entry "st[2]") 6667 (register-entry "st[3]") 6668 (register-entry "st[4]") 6669 (register-entry "st[5]") 6670 (register-entry "st[6]") 6671 (register-entry "st[7]") 6672 ;; Our friends, the segment registers 6673 (register-entry "cs") 6674 (register-entry "ds") 6675 (register-entry "ss") 6676 (register-entry "es") 6677 (register-entry "fs") 6678 (register-entry "gs") 6679 ))) 6680 6681 (dotimes (i (length *x8632-register-entries*)) 6682 (let* ((entry (svref *x8632-register-entries* i))) 6683 (when entry 6684 (setf (reg-entry-ordinal32 entry) i)))) 6685 6686 (defconstant +x8632-32-bit-register+ #x0) 6687 (defconstant +x8632-16-bit-register+ #x8) 6688 (defconstant +x8632-8-bit-register+ #x10) 6689 (defconstant +x8632-xmm-register-offset+ #x18) 6690 (defconstant +x8632-mmx-register-offset+ #x20) 6691 (defconstant +x8632-fpu-register-offset+ #x28) 6692 (defconstant +x8632-segment-register-offset+ #x30) 4448 6693 4449 6694 (defparameter *x8664-register-entries* … … 4571 6816 (setf (reg-entry-ordinal64 entry) i)))) 4572 6817 4573 6818 ;;; "x86" here really means "x8664" 4574 6819 (defconstant +x86-64-bit-register+ #x00) 4575 6820 (defconstant +x86-32-bit-register+ #x10) … … 4584 6829 (if (and (typep i 'unsigned-byte) 4585 6830 (< i 6)) 4586 (svref *x8664-register-entries* (+ +x86-segment-register-offset+ i)))) 6831 (ccl::target-arch-case 6832 (:x8632 6833 (svref *x8632-register-entries* (+ +x8632-segment-register-offset+ i))) 6834 (:x8664 6835 (svref *x8664-register-entries* (+ +x86-segment-register-offset+ i)))))) 4587 6836 4588 6837 (defun x86-xmm-register (i) 4589 (if (typep i '(mod 16)) 4590 (svref *x8664-register-entries* (+ +x86-xmm-register-offset+ i)))) 6838 (ccl::target-arch-case 6839 (:x8632 6840 (if (typep i '(mod 8)) 6841 (svref *x8632-register-entries* (+ +x8632-xmm-register-offset+ i)))) 6842 (:x8664 6843 (if (typep i '(mod 16)) 6844 (svref *x8664-register-entries* (+ +x86-xmm-register-offset+ i)))))) 4591 6845 4592 6846 (defun x86-mmx-register (i) 4593 6847 (if (typep i '(mod 8)) 4594 (svref *x8664-register-entries* (+ +x86-mmx-register-offset+ i)))) 6848 (ccl::target-arch-case 6849 (:x8632 6850 (svref *x8632-register-entries* (+ +x8632-mmx-register-offset+ i))) 6851 (:x8664 6852 (svref *x8664-register-entries* (+ +x86-mmx-register-offset+ i)))))) 4595 6853 4596 6854 4597 6855 (defun gpr-ordinal (r) 4598 (or 4599 (etypecase r 4600 ((mod 64) r) 4601 ((or string symbol) 4602 (let* ((entry (gethash r *x86-registers*))) 4603 (if entry 4604 (reg-entry-ordinal64 entry)))) 4605 (reg-entry (reg-entry-ordinal64 r)) 4606 (x86-register-operand 4607 (reg-entry-ordinal64 (x86-register-operand-entry r)))) 4608 (error "Can't determine register ordinal of ~s" r))) 4609 6856 (ccl::target-arch-case 6857 (:x8632 6858 (or 6859 (etypecase r 6860 ((mod 32) r) ;??? 6861 ((or string symbol) 6862 (let* ((entry (gethash r *x86-registers*))) 6863 (if entry 6864 (reg-entry-ordinal32 entry)))) 6865 (reg-entry (reg-entry-ordinal32 r)) 6866 (x86-register-operand 6867 (reg-entry-ordinal32 (x86-register-operand-entry r)))) 6868 (error "Can't determine register ordinal of ~s" r))) 6869 (:x8664 6870 (or 6871 (etypecase r 6872 ((mod 64) r) 6873 ((or string symbol) 6874 (let* ((entry (gethash r *x86-registers*))) 6875 (if entry 6876 (reg-entry-ordinal64 entry)))) 6877 (reg-entry (reg-entry-ordinal64 r)) 6878 (x86-register-operand 6879 (reg-entry-ordinal64 (x86-register-operand-entry r)))) 6880 (error "Can't determine register ordinal of ~s" r))))) 6881 4610 6882 4611 6883 (defun x86-reg8 (r) 4612 (svref *x8664-register-entries* (dpb (gpr-ordinal r) 4613 (byte 4 0) 4614 +x86-8-bit-register+))) 6884 (ccl::target-arch-case 6885 (:x8632 6886 (svref *x8632-register-entries* (dpb (gpr-ordinal r) 6887 (byte 3 0) 6888 +x8632-8-bit-register+))) 6889 (:x8664 6890 (svref *x8664-register-entries* (dpb (gpr-ordinal r) 6891 (byte 4 0) 6892 +x86-8-bit-register+))))) 4615 6893 4616 6894 (defun x86-reg16 (r) 4617 (svref *x8664-register-entries* (dpb (gpr-ordinal r) 4618 (byte 4 0) 4619 +x86-16-bit-register+))) 6895 (ccl::target-arch-case 6896 (:x8632 6897 (svref *x8632-register-entries* (dpb (gpr-ordinal r) 6898 (byte 3 0) 6899 +x8632-16-bit-register+))) 6900 (:x8664 6901 (svref *x8664-register-entries* (dpb (gpr-ordinal r) 6902 (byte 4 0) 6903 +x86-16-bit-register+))))) 4620 6904 4621 6905 (defun x86-reg32 (r) 4622 (svref *x8664-register-entries* (dpb (gpr-ordinal r) 4623 (byte 4 0) 4624 +x86-32-bit-register+))) 6906 (ccl::target-arch-case 6907 (:x8632 6908 (svref *x8632-register-entries* (dpb (gpr-ordinal r) 6909 (byte 3 0) 6910 +x8632-32-bit-register+))) 6911 (:x8664 6912 (svref *x8664-register-entries* (dpb (gpr-ordinal r) 6913 (byte 4 0) 6914 +x86-32-bit-register+))))) 4625 6915 4626 6916 (defun x86-reg64 (r) 4627 (svref *x8664-register-entries* (dpb (gpr-ordinal r) 4628 (byte 4 0) 4629 +x86-64-bit-register+))) 6917 (ccl::target-arch-case 6918 (:x8632 6919 (error "x8632 doesn't have 64 bit register ~s" r)) 6920 (:x8664 6921 (svref *x8664-register-entries* (dpb (gpr-ordinal r) 6922 (byte 4 0) 6923 +x86-64-bit-register+))))) 4630 6924 4631 6925
Note:
See TracChangeset
for help on using the changeset viewer.
