...

Source file src/golang.org/x/arch/x86/x86spec/format.go

Documentation: golang.org/x/arch/x86/x86spec

     1  // Copyright 2016 The Go Authors.  All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // Derive format specifications.
     6  
     7  package main
     8  
     9  import (
    10  	"sort"
    11  	"strings"
    12  )
    13  
    14  func format(insts []*instruction) {
    15  	// Determine opcodes that come in multiple sizes
    16  	// and could need disambiguating suffixes.
    17  	// Mark those with multisize=true.
    18  	sort.Sort(bySyntax(insts))
    19  	needSize := make(map[string]bool)
    20  	for i := 0; i < 2; i++ {
    21  		seen := make(map[string]bool)
    22  		for _, inst := range insts {
    23  			if hasTag(inst, "pseudo") || hasTag(inst, "pseudo64") {
    24  				continue
    25  			}
    26  			switch i {
    27  			case 0:
    28  				if inst.valid32 != "V" {
    29  					continue
    30  				}
    31  			case 1:
    32  				if inst.valid64 != "V" {
    33  					continue
    34  				}
    35  			}
    36  			unsized := stripSize.Replace(inst.syntax)
    37  			if seen[unsized] {
    38  				op, _ := splitSyntax(inst.syntax)
    39  				needSize[op] = true
    40  			}
    41  			seen[unsized] = true
    42  		}
    43  	}
    44  
    45  	for _, inst := range insts {
    46  		op, _ := splitSyntax(inst.syntax)
    47  		if needSize[op] || forceNeedSize[op] {
    48  			inst.multisize = "Y"
    49  		}
    50  	}
    51  
    52  	// Assign data sizes.
    53  	for _, inst := range insts {
    54  		if inst.multisize != "Y" {
    55  			continue
    56  		}
    57  		op, args := splitSyntax(inst.syntax)
    58  	Args:
    59  		for i := startArg[op]; i < len(args); i++ {
    60  			switch args[i] {
    61  			case "AL", "r8", "r8op", "r/m8":
    62  				inst.datasize = 8
    63  				break Args
    64  			case "AX", "r16", "r16op", "r/m16":
    65  				inst.datasize = 16
    66  				break Args
    67  			case "EAX", "r32", "r32op", "r/m32", "rmr32", "m32fp", "m32int":
    68  				inst.datasize = 32
    69  				break Args
    70  			case "RAX", "r64", "r64op", "r/m64", "rmr64", "m64fp", "m64int":
    71  				inst.datasize = 64
    72  				break Args
    73  			case "m80fp":
    74  				inst.datasize = 80
    75  				break Args
    76  			case "xmm2/m128":
    77  				inst.datasize = 128
    78  				break Args
    79  			case "ymm2/m256":
    80  				inst.datasize = 256
    81  				break Args
    82  			}
    83  		}
    84  	}
    85  
    86  	// Determine GNU syntax for instructions.
    87  	// With a few exceptions, it's the Intel opcode plus an optional suffix,
    88  	// followed by the reversed argument list.
    89  	for _, inst := range insts {
    90  		op, args := splitSyntax(inst.syntax)
    91  		intelOp := op
    92  		op = strings.ToLower(op)
    93  		if custom, ok := gnuOpcode[inst.syntax]; ok {
    94  			op = custom
    95  		} else {
    96  			if inst.multisize == "Y" {
    97  				suffix := defaultSizeSuffix[inst.datasize]
    98  				if custom, ok := gnuSizeSuffix[op]; ok {
    99  					suffix = custom[inst.datasize]
   100  				}
   101  				op += suffix
   102  			}
   103  		}
   104  		switch intelOp {
   105  		case "BOUND", "ENTER":
   106  			// no reversal
   107  		default:
   108  			for i, j := 0, len(args)-1; i < j; i, j = i+1, j-1 {
   109  				args[i], args[j] = args[j], args[i]
   110  			}
   111  		}
   112  		inst.gnuSyntax = joinSyntax(op, args)
   113  	}
   114  
   115  	// Determine Go syntax for instructions.
   116  	// Similar to GNU syntax (really they are both similar to "AT&T" syntax)
   117  	// but upper case and not reversing the argument list for a few instructions,
   118  	// like comparisons.
   119  	for _, inst := range insts {
   120  		intelOp, args := splitSyntax(inst.syntax)
   121  
   122  		// start with GNU op, because it has suffixes already
   123  		op, _ := splitSyntax(inst.gnuSyntax)
   124  		op = strings.ToUpper(op)
   125  		if custom, ok := goOpcode[inst.syntax]; ok {
   126  			op = custom
   127  		} else if custom, ok := goOpcode[intelOp]; ok {
   128  			op = custom
   129  		} else if custom, ok := goOpcode[op]; ok {
   130  			op = custom
   131  		} else if suffix, ok := goSizeSuffix[op]; ok {
   132  			op += suffix[inst.datasize]
   133  		}
   134  
   135  		switch intelOp {
   136  		case "CMP":
   137  			// no reversal
   138  		case "CMPPD", "CMPPS", "CMPSD", "CMPSS":
   139  			// rotate destination to end but don't swap comparison operands
   140  			if len(args) == 3 {
   141  				args[0], args[1], args[2] = args[2], args[0], args[1]
   142  				break
   143  			}
   144  			fallthrough
   145  		default:
   146  			for i, j := 0, len(args)-1; i < j; i, j = i+1, j-1 {
   147  				args[i], args[j] = args[j], args[i]
   148  			}
   149  		}
   150  		inst.goSyntax = joinSyntax(op, args)
   151  	}
   152  }
   153  
   154  var forceNeedSize = map[string]bool{
   155  	"SAL": true,
   156  }
   157  
   158  var stripSize = strings.NewReplacer(
   159  	"rel8", "rel8", // leave these alone
   160  	"rel16", "rel16",
   161  	"rel32", "rel32",
   162  	"8", "#",
   163  	"16", "#",
   164  	"32", "#",
   165  	"64", "#",
   166  	"xmm2/m128", "xy/#",
   167  	"ymm2/m256", "xy/#",
   168  	"EAX", "AX",
   169  )
   170  
   171  var defaultSizeSuffix = map[int]string{
   172  	8:  "b",
   173  	16: "w",
   174  	32: "l",
   175  	64: "q",
   176  }
   177  
   178  var gnuSizeSuffix = map[string]map[int]string{
   179  	"cvtsd2si":   {64: "q"},
   180  	"cvtss2si":   {64: "q"},
   181  	"cvttsd2si":  {64: "q"},
   182  	"cvttss2si":  {64: "q"},
   183  	"vcvtsd2si":  {64: "q"},
   184  	"vcvtss2si":  {64: "q"},
   185  	"vcvttsd2si": {64: "q"},
   186  	"vcvttss2si": {64: "q"},
   187  
   188  	"vcvtpd2dq":  {128: "x", 256: "y"},
   189  	"vcvtpd2ps":  {128: "x", 256: "y"},
   190  	"vcvttpd2dq": {128: "x", 256: "y"},
   191  	"vcvttpd2ps": {128: "x", 256: "y"},
   192  
   193  	"fadd":  {32: "s", 64: "l"},
   194  	"fcom":  {32: "s", 64: "l"},
   195  	"fcomp": {32: "s", 64: "l"},
   196  	"fdiv":  {32: "s", 64: "l"},
   197  	"fdivr": {32: "s", 64: "l"},
   198  	"fmul":  {32: "s", 64: "l"},
   199  	"fsub":  {32: "s", 64: "l"},
   200  	"fsubr": {32: "s", 64: "l"},
   201  
   202  	"fld":  {32: "s", 64: "l", 80: "t"},
   203  	"fst":  {32: "s", 64: "l", 80: "t"},
   204  	"fstp": {32: "s", 64: "l", 80: "t"},
   205  
   206  	"fiadd":  {32: "l"},
   207  	"ficom":  {32: "l"},
   208  	"ficomp": {32: "l"},
   209  	"fidiv":  {32: "l"},
   210  	"fidivr": {32: "l"},
   211  	"fimul":  {32: "l"},
   212  	"fist":   {32: "l"},
   213  	"fisub":  {32: "l"},
   214  	"fisubr": {32: "l"},
   215  
   216  	"fild":   {32: "l", 64: "ll"},
   217  	"fistp":  {32: "l", 64: "ll"},
   218  	"fisttp": {32: "l", 64: "ll"},
   219  
   220  	"fldenv": {64: "l"},
   221  
   222  	// These can be distinguished by register name (%rcx vs %ecx)
   223  	// and objdump refuses to put suffixes on them.
   224  	"bswap":    {},
   225  	"rdfsbase": {},
   226  	"rdgsbase": {},
   227  	"rdrand":   {},
   228  	"rdseed":   {},
   229  	"wrfsbase": {},
   230  	"wrgsbase": {},
   231  }
   232  
   233  var gnuOpcode = map[string]string{
   234  	// Simple name changes.
   235  	"CBW":    "cbtw",
   236  	"CDQ":    "cltd",
   237  	"CDQE":   "cltq",
   238  	"CMPSD":  "cmpsl",
   239  	"CQO":    "cqto",
   240  	"CWD":    "cwtd",
   241  	"CWDE":   "cwtl",
   242  	"INSD":   "insl",
   243  	"LODSD":  "lodsl",
   244  	"MOVSD":  "movsl",
   245  	"OUTSD":  "outsl",
   246  	"PUSHAD": "pushal",
   247  	"PUSHFD": "pushfl",
   248  	"POPAD":  "popal",
   249  	"POPFD":  "popfl",
   250  	"STOSD":  "stosl",
   251  	"XLATB":  "xlat",
   252  	"POPA":   "popaw",
   253  	"POPF":   "popfw",
   254  	"PUSHA":  "pushaw",
   255  	"PUSHF":  "pushfw",
   256  	"SCASD":  "scasl",
   257  
   258  	// Two-operand FDIV and FDIVR are inverted, but only for the ST(i), ST(0) form.
   259  	// I think this is a bug in the GNU tools but perhaps one that must be historically maintained.
   260  	"FDIV ST(i), ST(0)":   "fdivr",
   261  	"FDIVR ST(i), ST(0)":  "fdiv",
   262  	"FDIVP ST(i), ST(0)":  "fdivrp",
   263  	"FDIVRP ST(i), ST(0)": "fdivp",
   264  	"FSUB ST(i), ST(0)":   "fsubr",
   265  	"FSUBR ST(i), ST(0)":  "fsub",
   266  	"FSUBP ST(i), ST(0)":  "fsubrp",
   267  	"FSUBRP ST(i), ST(0)": "fsubp",
   268  
   269  	"MOV r64op, imm64": "movabsq",
   270  	"MOV moffs64, RAX": "movabsq",
   271  	"MOV RAX, moffs64": "movabsq",
   272  
   273  	"MOV moffs8, AL": "movb/movb/movabsb",
   274  	"MOV AL, moffs8": "movb/movb/movabsb",
   275  
   276  	"LGDT m16&32": "lgdtw/lgdtl",
   277  	"LIDT m16&32": "lidtw/lidtl",
   278  	"SGDT m":      "sgdtw/sgdtl/sgdt",
   279  	"SIDT m":      "sidtw/sidtl/sidt",
   280  	"LEAVE":       "leavew/leavel/leaveq",
   281  
   282  	"MOVBE r16, m16": "movbeww",
   283  	"MOVBE m16, r16": "movbeww",
   284  	"MOVBE m32, r32": "movbell",
   285  	"MOVBE r32, m32": "movbell",
   286  	"MOVBE m64, r64": "movbeqq",
   287  	"MOVBE r64, m64": "movbeqq",
   288  
   289  	"MOVSX r16, r/m16":  "movsww",
   290  	"MOVSX r16, r/m8":   "movsbw",
   291  	"MOVSX r32, r/m16":  "movswl",
   292  	"MOVSX r32, r/m8":   "movsbl",
   293  	"MOVSX r64, r/m16":  "movswq",
   294  	"MOVSX r64, r/m8":   "movsbq",
   295  	"MOVSXD r64, r/m32": "movslq",
   296  	"MOVZX r16, r/m16":  "movzww",
   297  	"MOVZX r16, r/m8":   "movzbw",
   298  	"MOVZX r32, r/m16":  "movzwl",
   299  	"MOVZX r32, r/m8":   "movzbl",
   300  	"MOVZX r64, r/m16":  "movzwq",
   301  	"MOVZX r64, r/m8":   "movzbq",
   302  
   303  	"CALL r/m16": "callw*",
   304  	"CALL r/m32": "calll*",
   305  	"CALL r/m64": "callq*",
   306  
   307  	"JMP r/m16": "jmpw*",
   308  	"JMP r/m32": "jmpl*",
   309  	"JMP r/m64": "jmpq*",
   310  
   311  	"CALL_FAR m16:16": "lcallw*",
   312  	"CALL_FAR m16:32": "lcalll*",
   313  	"CALL_FAR m16:64": "lcallq*",
   314  
   315  	"JMP_FAR m16:16": "ljmpw*",
   316  	"JMP_FAR m16:32": "ljmpl*",
   317  	"JMP_FAR m16:64": "ljmpq*",
   318  
   319  	"CALL_FAR ptr16:16": "lcallw",
   320  	"CALL_FAR ptr16:32": "lcalll",
   321  	"JMP_FAR ptr16:16":  "ljmpw",
   322  	"JMP_FAR ptr16:32":  "ljmpl",
   323  
   324  	"STR r32/m16":       "str{l/w}",
   325  	"SMSW r32/m16":      "smsw{l/w}",
   326  	"SLDT r32/m16":      "sldt{l/w}",
   327  	"MOV Sreg, r32/m16": "mov{l/w}",
   328  	"MOV r32/m16, Sreg": "mov{l/w}",
   329  
   330  	"STR r64/m16":       "str{q/w}",
   331  	"SMSW r64/m16":      "smsw{q/w}",
   332  	"SLDT r64/m16":      "sldt{q/w}",
   333  	"MOV Sreg, r64/m16": "mov{q/w}",
   334  	"MOV r64/m16, Sreg": "mov{q/w}",
   335  
   336  	"FLDENV m14/28byte":  "fldenvs/fldenvl",
   337  	"FNSAVE m94/108byte": "fnsaves/fnsavel",
   338  	"FNSTENV m14/28byte": "fnstenvs/fnstenvl",
   339  	"FRSTOR m94/108byte": "frstors/frstorl",
   340  
   341  	"IRETD":              "iretl",
   342  	"IRET":               "iretw",
   343  	"RET_FAR imm16u":     "lretw/lretl/lretl",
   344  	"RET_FAR":            "lretw/lretl/lretl",
   345  	"ENTER imm16, imm8b": "enterw/enterl/enterq",
   346  	"RET":                "retw/retl/retq",
   347  	"SYSRET":             "sysretw/sysretl/sysretl",
   348  
   349  	"RET imm16u": "retw/retl/retq",
   350  
   351  	"PUSH CS": "pushw/pushl/pushq",
   352  	"PUSH DS": "pushw/pushl/pushq",
   353  	"PUSH ES": "pushw/pushl/pushq",
   354  	"PUSH FS": "pushw/pushl/pushq",
   355  	"PUSH GS": "pushw/pushl/pushq",
   356  	"PUSH SS": "pushw/pushl/pushq",
   357  
   358  	"PUSH imm16": "pushw",
   359  
   360  	"POP CS": "popw/popl/popq",
   361  	"POP DS": "popw/popl/popq",
   362  	"POP ES": "popw/popl/popq",
   363  	"POP FS": "popw/popl/popq",
   364  	"POP GS": "popw/popl/popq",
   365  	"POP SS": "popw/popl/popq",
   366  
   367  	"PUSH imm32": "-/pushl/pushq",
   368  	"PUSH imm8":  "pushw/pushl/pushq",
   369  }
   370  
   371  var startArg = map[string]int{
   372  	"CRC32": 1,
   373  }
   374  
   375  var goSizeSuffix = map[string]map[int]string{
   376  	"BSWAP": {16: "W", 32: "L", 64: "Q"},
   377  }
   378  
   379  var goOpcode = map[string]string{
   380  	// Overriding the GNU rewrites.
   381  	"CBW":     "CBW",
   382  	"CDQ":     "CDQ",
   383  	"CDQE":    "CDQE",
   384  	"CQO":     "CQO",
   385  	"CWD":     "CWD",
   386  	"CWDE":    "CWDE",
   387  	"SYSRET":  "SYSRET",
   388  	"MOVABSQ": "MOVQ",
   389  
   390  	// Our own rewrites, of either GNU or Intel syntax.
   391  	"CVTPD2DQ":   "CVTPD2PL",
   392  	"CVTDQ2PD":   "CVTPL2PD",
   393  	"CVTDQ2PS":   "CVTPL2PS",
   394  	"CVTPS2DQ":   "CVTPS2PL",
   395  	"CVTSD2SI":   "CVTSD2SL",
   396  	"CVTSD2SIQ":  "CVTSD2SQ",
   397  	"CVTSI2SDL":  "CVTSL2SD",
   398  	"CVTSI2SDQ":  "CVTSQ2SD",
   399  	"CVTSI2SSL":  "CVTSL2SS",
   400  	"CVTSI2SSQ":  "CVTSQ2SS",
   401  	"CVTSS2SI":   "CVTSS2SL",
   402  	"CVTSS2SIQ":  "CVTSS2SQ",
   403  	"CVTTPD2DQ":  "CVTTPD2PL",
   404  	"CVTTPS2DQ":  "CVTTPS2PL",
   405  	"CVTTSD2SI":  "CVTTSD2SL",
   406  	"CVTTSD2SIQ": "CVTTSD2SQ",
   407  	"CVTTSS2SI":  "CVTTSS2SL",
   408  	"CVTTSS2SIQ": "CVTTSS2SQ",
   409  
   410  	"LOOPE":      "LOOPEQ",
   411  	"MASKMOVDQU": "MASKMOVOU",
   412  	"MOVDQA":     "MOVO",
   413  	"MOVDQU":     "MOVOU",
   414  	"MOVNTDQ":    "MOVNTO",
   415  	"MOVQ2DQ":    "MOVQOZX",
   416  	"MOVDQ2Q":    "MOVQ",
   417  	"MOVSBL":     "MOVBLSX",
   418  	"MOVSBQ":     "MOVBQSX",
   419  	"MOVSBW":     "MOVBWSX",
   420  	"MOVSLQ":     "MOVLQSX",
   421  	"MOVSWL":     "MOVWLSX",
   422  	"MOVSWQ":     "MOVWQSX",
   423  	"MOVZBL":     "MOVBLZX",
   424  	"MOVZBQ":     "MOVBQZX",
   425  	"MOVZBW":     "MOVBWZX",
   426  	"MOVZLQ":     "MOVLQZX",
   427  	"MOVZWL":     "MOVWLZX",
   428  	"MOVZWQ":     "MOVWQZX",
   429  	"PACKSSDW":   "PACKSSLW",
   430  	"PADDD":      "PADDL",
   431  	"PCMPEQD":    "PCMPEQL",
   432  	"PCMPGTD":    "PCMPGTL",
   433  	"PMADDWD":    "PMADDWL",
   434  	"PMULUDQ":    "PMULULQ",
   435  	"PSLLD":      "PSLLL",
   436  	"PSLLDQ":     "PSLLO",
   437  	"PSRAD":      "PSRAL",
   438  	"PSRLD":      "PSRLL",
   439  	"PSRLDQ":     "PSRLO",
   440  	"PSUBD":      "PSUBL",
   441  	"PUNPCKLWD":  "PUNPCKLWL",
   442  	"PUNPCKHDQ":  "PUNPCKHLQ",
   443  	"PUNPCKHWD":  "PUNPCKHWL",
   444  	"PUNPCKLDQ":  "PUNPCKLLQ",
   445  	"PUSHA":      "PUSHAW",
   446  	"PUSHAD":     "PUSHAL",
   447  	"PUSHF":      "PUSHFW",
   448  	"PUSHFD":     "PUSHFL",
   449  	"RET_FAR":    "RETFW/RETFL/RETFQ",
   450  	"CALLQ":      "CALL",
   451  	"CALLL":      "CALL",
   452  	"CALLW":      "CALL",
   453  	"MOVSXDW":    "MOVWQSX",
   454  	"MOVSXDL":    "MOVLQSX",
   455  
   456  	"SHLDW": "SHLW",
   457  	"SHLDL": "SHLL",
   458  	"SHLDQ": "SHLQ",
   459  	"SHRDW": "SHRW",
   460  	"SHRDL": "SHRL",
   461  	"SHRDQ": "SHRQ",
   462  
   463  	"CMOVAW":   "CMOVWHI",
   464  	"CMOVAEW":  "CMOVWCC",
   465  	"CMOVBW":   "CMOVWCS",
   466  	"CMOVBEW":  "CMOVWLS",
   467  	"CMOVCW":   "CMOVWCS",
   468  	"CMOVCCW":  "CMOVWCC",
   469  	"CMOVCSW":  "CMOVWCS",
   470  	"CMOVEW":   "CMOVWEQ",
   471  	"CMOVEQW":  "CMOVWEQ",
   472  	"CMOVGW":   "CMOVWGT",
   473  	"CMOVGEW":  "CMOVWGE",
   474  	"CMOVGTW":  "CMOVWGT",
   475  	"CMOVHIW":  "CMOVWHI",
   476  	"CMOVHSW":  "CMOVWCC",
   477  	"CMOVLW":   "CMOVWLT",
   478  	"CMOVLEW":  "CMOVWLE",
   479  	"CMOVLSW":  "CMOVWLS",
   480  	"CMOVLTW":  "CMOVWLT",
   481  	"CMOVLOW":  "CMOVWCS",
   482  	"CMOVMIW":  "CMOVWMI",
   483  	"CMOVNAW":  "CMOVWLS",
   484  	"CMOVNAEW": "CMOVWCS",
   485  	"CMOVNBW":  "CMOVWCC",
   486  	"CMOVNBEW": "CMOVWHI",
   487  	"CMOVNCW":  "CMOVWCC",
   488  	"CMOVNEW":  "CMOVWNE",
   489  	"CMOVNGW":  "CMOVWLE",
   490  	"CMOVNGEW": "CMOVWLT",
   491  	"CMOVNLW":  "CMOVWGE",
   492  	"CMOVNLEW": "CMOVWGT",
   493  	"CMOVNOW":  "CMOVWOC",
   494  	"CMOVNPW":  "CMOVWPC",
   495  	"CMOVNSW":  "CMOVWPL",
   496  	"CMOVNZW":  "CMOVWNE",
   497  	"CMOVOW":   "CMOVWOS",
   498  	"CMOVOCW":  "CMOVWOC",
   499  	"CMOVOSW":  "CMOVWOS",
   500  	"CMOVPW":   "CMOVWPS",
   501  	"CMOVPCW":  "CMOVWPC",
   502  	"CMOVPEW":  "CMOVWPS",
   503  	"CMOVPOW":  "CMOVWPC",
   504  	"CMOVPSW":  "CMOVWPS",
   505  	"CMOVSW":   "CMOVWMI",
   506  	"CMOVZW":   "CMOVWEQ",
   507  
   508  	"CMOVAL":   "CMOVLHI",
   509  	"CMOVAEL":  "CMOVLCC",
   510  	"CMOVBL":   "CMOVLCS",
   511  	"CMOVBEL":  "CMOVLLS",
   512  	"CMOVCL":   "CMOVLCS",
   513  	"CMOVCCL":  "CMOVLCC",
   514  	"CMOVCSL":  "CMOVLCS",
   515  	"CMOVEL":   "CMOVLEQ",
   516  	"CMOVEQL":  "CMOVLEQ",
   517  	"CMOVGL":   "CMOVLGT",
   518  	"CMOVGEL":  "CMOVLGE",
   519  	"CMOVGTL":  "CMOVLGT",
   520  	"CMOVHIL":  "CMOVLHI",
   521  	"CMOVHSL":  "CMOVLCC",
   522  	"CMOVLL":   "CMOVLLT",
   523  	"CMOVLEL":  "CMOVLLE",
   524  	"CMOVLSL":  "CMOVLLS",
   525  	"CMOVLTL":  "CMOVLLT",
   526  	"CMOVLOL":  "CMOVLCS",
   527  	"CMOVMIL":  "CMOVLMI",
   528  	"CMOVNAL":  "CMOVLLS",
   529  	"CMOVNAEL": "CMOVLCS",
   530  	"CMOVNBL":  "CMOVLCC",
   531  	"CMOVNBEL": "CMOVLHI",
   532  	"CMOVNCL":  "CMOVLCC",
   533  	"CMOVNEL":  "CMOVLNE",
   534  	"CMOVNGL":  "CMOVLLE",
   535  	"CMOVNGEL": "CMOVLLT",
   536  	"CMOVNLL":  "CMOVLGE",
   537  	"CMOVNLEL": "CMOVLGT",
   538  	"CMOVNOL":  "CMOVLOC",
   539  	"CMOVNPL":  "CMOVLPC",
   540  	"CMOVNSL":  "CMOVLPL",
   541  	"CMOVNZL":  "CMOVLNE",
   542  	"CMOVOL":   "CMOVLOS",
   543  	"CMOVOCL":  "CMOVLOC",
   544  	"CMOVOSL":  "CMOVLOS",
   545  	"CMOVPL":   "CMOVLPS",
   546  	"CMOVPCL":  "CMOVLPC",
   547  	"CMOVPEL":  "CMOVLPS",
   548  	"CMOVPOL":  "CMOVLPC",
   549  	"CMOVPSL":  "CMOVLPS",
   550  	"CMOVSL":   "CMOVLMI",
   551  	"CMOVZL":   "CMOVLEQ",
   552  
   553  	"CMOVAQ":   "CMOVQHI",
   554  	"CMOVAEQ":  "CMOVQCC",
   555  	"CMOVBQ":   "CMOVQCS",
   556  	"CMOVBEQ":  "CMOVQLS",
   557  	"CMOVCQ":   "CMOVQCS",
   558  	"CMOVCCQ":  "CMOVQCC",
   559  	"CMOVCSQ":  "CMOVQCS",
   560  	"CMOVEQ":   "CMOVQEQ",
   561  	"CMOVEQQ":  "CMOVQEQ",
   562  	"CMOVGQ":   "CMOVQGT",
   563  	"CMOVGEQ":  "CMOVQGE",
   564  	"CMOVGTQ":  "CMOVQGT",
   565  	"CMOVHIQ":  "CMOVQHI",
   566  	"CMOVHSQ":  "CMOVQCC",
   567  	"CMOVLQ":   "CMOVQLT",
   568  	"CMOVLEQ":  "CMOVQLE",
   569  	"CMOVLSQ":  "CMOVQLS",
   570  	"CMOVLTQ":  "CMOVQLT",
   571  	"CMOVLOQ":  "CMOVQCS",
   572  	"CMOVMIQ":  "CMOVQMI",
   573  	"CMOVNAQ":  "CMOVQLS",
   574  	"CMOVNAEQ": "CMOVQCS",
   575  	"CMOVNBQ":  "CMOVQCC",
   576  	"CMOVNBEQ": "CMOVQHI",
   577  	"CMOVNCQ":  "CMOVQCC",
   578  	"CMOVNEQ":  "CMOVQNE",
   579  	"CMOVNGQ":  "CMOVQLE",
   580  	"CMOVNGEQ": "CMOVQLT",
   581  	"CMOVNLQ":  "CMOVQGE",
   582  	"CMOVNLEQ": "CMOVQGT",
   583  	"CMOVNOQ":  "CMOVQOC",
   584  	"CMOVNPQ":  "CMOVQPC",
   585  	"CMOVNSQ":  "CMOVQPL",
   586  	"CMOVNZQ":  "CMOVQNE",
   587  	"CMOVOQ":   "CMOVQOS",
   588  	"CMOVOCQ":  "CMOVQOC",
   589  	"CMOVOSQ":  "CMOVQOS",
   590  	"CMOVPQ":   "CMOVQPS",
   591  	"CMOVPCQ":  "CMOVQPC",
   592  	"CMOVPEQ":  "CMOVQPS",
   593  	"CMOVPOQ":  "CMOVQPC",
   594  	"CMOVPSQ":  "CMOVQPS",
   595  	"CMOVSQ":   "CMOVQMI",
   596  	"CMOVZQ":   "CMOVQEQ",
   597  
   598  	"SETA":   "SETHI",
   599  	"SETAE":  "SETCC",
   600  	"SETB":   "SETCS",
   601  	"SETBE":  "SETLS",
   602  	"SETC":   "SETCS",
   603  	"SETCC":  "SETCC",
   604  	"SETCS":  "SETCS",
   605  	"SETE":   "SETEQ",
   606  	"SETEQ":  "SETEQ",
   607  	"SETG":   "SETGT",
   608  	"SETGE":  "SETGE",
   609  	"SETGT":  "SETGT",
   610  	"SETHI":  "SETHI",
   611  	"SETHS":  "SETCC",
   612  	"SETL":   "SETLT",
   613  	"SETLE":  "SETLE",
   614  	"SETLS":  "SETLS",
   615  	"SETLT":  "SETLT",
   616  	"SETLO":  "SETCS",
   617  	"SETMI":  "SETMI",
   618  	"SETNA":  "SETLS",
   619  	"SETNAE": "SETCS",
   620  	"SETNB":  "SETCC",
   621  	"SETNBE": "SETHI",
   622  	"SETNC":  "SETCC",
   623  	"SETNE":  "SETNE",
   624  	"SETNG":  "SETLE",
   625  	"SETNGE": "SETLT",
   626  	"SETNL":  "SETGE",
   627  	"SETNLE": "SETGT",
   628  	"SETNO":  "SETOC",
   629  	"SETNP":  "SETPC",
   630  	"SETNS":  "SETPL",
   631  	"SETNZ":  "SETNE",
   632  	"SETO":   "SETOS",
   633  	"SETOC":  "SETOC",
   634  	"SETOS":  "SETOS",
   635  	"SETP":   "SETPS",
   636  	"SETPC":  "SETPC",
   637  	"SETPE":  "SETPS",
   638  	"SETPO":  "SETPC",
   639  	"SETPS":  "SETPS",
   640  	"SETS":   "SETMI",
   641  	"SETZ":   "SETEQ",
   642  
   643  	"FADD":   "FADDD",
   644  	"FADDP":  "FADDDP",
   645  	"FADDS":  "FADDF",
   646  	"FCOM":   "FCOMD",
   647  	"FCOMS":  "FCOMF",
   648  	"FCOMPS": "FCOMFP",
   649  	"FDIV":   "FDIVD",
   650  	"FDIVS":  "FDIVF",
   651  	"FDIVRS": "FDIVFR",
   652  }
   653  

View as plain text