golang.org/x/arch@v0.17.0/x86/x86spec/format.go (about) 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 }