1 // RUN: llvm-mc -triple x86_64-unknown-unknown -x86-asm-syntax=intel %s > %t 2> %t.err 2 // RUN: FileCheck < %t %s 3 // RUN: FileCheck --check-prefix=CHECK-STDERR < %t.err %s 4 5 _test: 6 xor EAX, EAX 7 ret 8 9 .set number, 8 10 .global _foo 11 12 .text 13 .global main 14 main: 15 16 // CHECK: leaq _foo(%rbx,%rax,8), %rdx 17 lea RDX, [8 * RAX + RBX + _foo] 18 // CHECK: leaq _foo(%rbx,%rax,8), %rdx 19 lea RDX, [_foo + 8 * RAX + RBX] 20 // CHECK: leaq 8(%rcx,%rax,8), %rdx 21 lea RDX, [8 + RAX * 8 + RCX] 22 // CHECK: leaq 8(%rcx,%rax,8), %rdx 23 lea RDX, [number + 8 * RAX + RCX] 24 // CHECK: leaq _foo(,%rax,8), %rdx 25 lea RDX, [_foo + RAX * 8] 26 // CHECK: leaq _foo(%rbx,%rax,8), %rdx 27 lea RDX, [_foo + RAX * 8 + RBX] 28 // CHECK: leaq -8(%rax), %rdx 29 lea RDX, [RAX - number] 30 // CHECK: leaq -8(%rax), %rdx 31 lea RDX, [RAX - 8] 32 // CHECK: leaq _foo(%rax), %rdx 33 lea RDX, [RAX + _foo] 34 // CHECK: leaq 8(%rax), %rdx 35 lea RDX, [RAX + number] 36 // CHECK: leaq 8(%rax), %rdx 37 lea RDX, [RAX + 8] 38 // CHECK: leaq _foo(%rbx,%rax,8), %rdx 39 lea RDX, [RAX * number + RBX + _foo] 40 // CHECK: leaq _foo(%rbx,%rax,8), %rdx 41 lea RDX, [_foo + RAX * number + RBX] 42 // CHECK: leaq 8(%rcx,%rax,8), %rdx 43 lea RDX, [number + RAX * number + RCX] 44 // CHECK: leaq _foo(,%rax,8), %rdx 45 lea RDX, [_foo + RAX * number] 46 // CHECK: leaq _foo(%rbx,%rax,8), %rdx 47 lea RDX, [number * RAX + RBX + _foo] 48 // CHECK: leaq _foo(%rbx,%rax,8), %rdx 49 lea RDX, [_foo + number * RAX + RBX] 50 // CHECK: leaq 8(%rcx,%rax,8), %rdx 51 lea RDX, [8 + number * RAX + RCX] 52 // CHECK: leaq _foo(%rax), %rdx 53 lea RDX, [_foo + RAX] 54 // CHECK: leaq 8(%rax), %rdx 55 lea RDX, [number + RAX] 56 // CHECK: leaq 8(%rax), %rdx 57 lea RDX, [8 + RAX] 58 59 // CHECK: lcalll *(%rax) 60 call FWORD ptr [rax] 61 // CHECK: lcalll *(%rax) 62 lcall [rax] 63 // CHECK: ljmpl *(%rax) 64 jmp FWORD ptr [rax] 65 // CHECK: ljmpq *(%rax) 66 ljmp [rax] 67 68 // CHECK: movl $257, -4(%rsp) 69 mov DWORD PTR [RSP - 4], 257 70 // CHECK: movl $258, 4(%rsp) 71 mov DWORD PTR [RSP + 4], 258 72 // CHECK: movq $123, -16(%rsp) 73 mov QWORD PTR [RSP - 16], 123 74 // CHECK: movb $97, -17(%rsp) 75 mov BYTE PTR [RSP - 17], 97 76 // CHECK: movl -4(%rsp), %eax 77 mov EAX, DWORD PTR [RSP - 4] 78 // CHECK: movq (%rsp), %rax 79 mov RAX, QWORD PTR [RSP] 80 // CHECK: movabsq $4294967289, %rax 81 mov RAX, 4294967289 82 // CHECK: movl $-4, -4(%rsp) 83 mov DWORD PTR [RSP - 4], -4 84 // CHECK: movq 0, %rcx 85 mov RCX, QWORD PTR [0] 86 // CHECK: movl -24(%rsp,%rax,4), %eax 87 mov EAX, DWORD PTR [RSP + 4*RAX - 24] 88 // CHECK: movb %dil, (%rdx,%rcx) 89 mov BYTE PTR [RDX + RCX], DIL 90 // CHECK: movzwl 2(%rcx), %edi 91 movzx EDI, WORD PTR [RCX + 2] 92 // CHECK: callq _test 93 call _test 94 // CHECK: andw $12, %ax 95 and ax, 12 96 // CHECK: andw $-12, %ax 97 and ax, -12 98 // CHECK: andw $257, %ax 99 and ax, 257 100 // CHECK: andw $-257, %ax 101 and ax, -257 102 // CHECK: andl $12, %eax 103 and eax, 12 104 // CHECK: andl $-12, %eax 105 and eax, -12 106 // CHECK: andl $257, %eax 107 and eax, 257 108 // CHECK: andl $-257, %eax 109 and eax, -257 110 // CHECK: andq $12, %rax 111 and rax, 12 112 // CHECK: andq $-12, %rax 113 and rax, -12 114 // CHECK: andq $257, %rax 115 and rax, 257 116 // CHECK: andq $-257, %rax 117 and rax, -257 118 // CHECK: fld %st(0) 119 fld ST(0) 120 // CHECK: movl %fs:(%rdi), %eax 121 mov EAX, DWORD PTR FS:[RDI] 122 // CHECK: leal (,%rdi,4), %r8d 123 lea R8D, DWORD PTR [4*RDI] 124 // CHECK: movl _fnan(,%ecx,4), %ecx 125 mov ECX, DWORD PTR [4*ECX + _fnan] 126 // CHECK: movq %fs:320, %rax 127 mov RAX, QWORD PTR FS:[320] 128 // CHECK: movq %fs:320, %rax 129 mov RAX, QWORD PTR FS:320 130 // CHECK: movq %rax, %fs:320 131 mov QWORD PTR FS:320, RAX 132 // CHECK: movq %rax, %fs:20(%rbx) 133 mov QWORD PTR FS:20[rbx], RAX 134 // CHECK: vshufpd $1, %xmm2, %xmm1, %xmm0 135 vshufpd XMM0, XMM1, XMM2, 1 136 // CHECK: vpgatherdd %xmm8, (%r15,%xmm9,2), %xmm1 137 vpgatherdd XMM10, XMMWORD PTR [R15 + 2*XMM9], XMM8 138 // CHECK: movsd -8, %xmm5 139 movsd XMM5, QWORD PTR [-8] 140 // CHECK: movsl (%rsi), %es:(%rdi) 141 movsd 142 // CHECK: movl %ecx, (%eax) 143 mov [eax], ecx 144 // CHECK: movl %ecx, (,%ebx,4) 145 mov [4*ebx], ecx 146 // CHECK: movl %ecx, (,%ebx,4) 147 mov [ebx*4], ecx 148 // CHECK: movl %ecx, 1024 149 mov [1024], ecx 150 // CHECK: movl %ecx, 4132 151 mov [0x1024], ecx 152 // CHECK: movl %ecx, 32 153 mov [16 + 16], ecx 154 // CHECK: movl %ecx, 0 155 mov [16 - 16], ecx 156 // CHECK: movl %ecx, 32 157 mov [16][16], ecx 158 // CHECK: movl %ecx, (%eax,%ebx,4) 159 mov [eax + 4*ebx], ecx 160 // CHECK: movl %ecx, (%eax,%ebx,4) 161 mov [eax + ebx*4], ecx 162 // CHECK: movl %ecx, (%eax,%ebx,4) 163 mov [4*ebx + eax], ecx 164 // CHECK: movl %ecx, (%eax,%ebx,4) 165 mov [ebx*4 + eax], ecx 166 // CHECK: movl %ecx, (%eax,%ebx,4) 167 mov [eax][4*ebx], ecx 168 // CHECK: movl %ecx, (%eax,%ebx,4) 169 mov [eax][ebx*4], ecx 170 // CHECK: movl %ecx, (%eax,%ebx,4) 171 mov [4*ebx][eax], ecx 172 // CHECK: movl %ecx, (%eax,%ebx,4) 173 mov [ebx*4][eax], ecx 174 // CHECK: movl %ecx, 12(%eax) 175 mov [eax + 12], ecx 176 // CHECK: movl %ecx, 12(%eax) 177 mov [12 + eax], ecx 178 // CHECK: movl %ecx, 32(%eax) 179 mov [eax + 16 + 16], ecx 180 // CHECK: movl %ecx, 32(%eax) 181 mov [16 + eax + 16], ecx 182 // CHECK: movl %ecx, 32(%eax) 183 mov [16 + 16 + eax], ecx 184 // CHECK: movl %ecx, 12(%eax) 185 mov [eax][12], ecx 186 // CHECK: movl %ecx, 12(%eax) 187 mov [12][eax], ecx 188 // CHECK: movl %ecx, 32(%eax) 189 mov [eax][16 + 16], ecx 190 // CHECK: movl %ecx, 32(%eax) 191 mov [eax + 16][16], ecx 192 // CHECK: movl %ecx, 32(%eax) 193 mov [eax][16][16], ecx 194 // CHECK: movl %ecx, 32(%eax) 195 mov [16][eax + 16], ecx 196 // CHECK: movl %ecx, 32(%eax) 197 mov [16 + eax][16], ecx 198 // CHECK: movl %ecx, 32(%eax) 199 mov [16][16 + eax], ecx 200 // CHECK: movl %ecx, 32(%eax) 201 mov [16 + 16][eax], ecx 202 // CHECK: movl %ecx, 32(%eax) 203 mov [eax][16][16], ecx 204 // CHECK: movl %ecx, 32(%eax) 205 mov [16][eax][16], ecx 206 // CHECK: movl %ecx, 32(%eax) 207 mov [16][16][eax], ecx 208 // CHECK: movl %ecx, 16(,%ebx,4) 209 mov [4*ebx + 16], ecx 210 // CHECK: movl %ecx, 16(,%ebx,4) 211 mov [ebx*4 + 16], ecx 212 // CHECK: movl %ecx, 16(,%ebx,4) 213 mov [4*ebx][16], ecx 214 // CHECK: movl %ecx, 16(,%ebx,4) 215 mov [ebx*4][16], ecx 216 // CHECK: movl %ecx, 16(,%ebx,4) 217 mov [16 + 4*ebx], ecx 218 // CHECK: movl %ecx, 16(,%ebx,4) 219 mov [16 + ebx*4], ecx 220 // CHECK: movl %ecx, 16(,%ebx,4) 221 mov [16][4*ebx], ecx 222 // CHECK: movl %ecx, 16(,%ebx,4) 223 mov [16][ebx*4], ecx 224 // CHECK: movl %ecx, 16(%eax,%ebx,4) 225 mov [eax + 4*ebx + 16], ecx 226 // CHECK: movl %ecx, 16(%eax,%ebx,4) 227 mov [eax + 16 + 4*ebx], ecx 228 // CHECK: movl %ecx, 16(%eax,%ebx,4) 229 mov [4*ebx + eax + 16], ecx 230 // CHECK: movl %ecx, 16(%eax,%ebx,4) 231 mov [4*ebx + 16 + eax], ecx 232 // CHECK: movl %ecx, 16(%eax,%ebx,4) 233 mov [16 + eax + 4*ebx], ecx 234 // CHECK: movl %ecx, 16(%eax,%ebx,4) 235 mov [16 + eax + 4*ebx], ecx 236 // CHECK: movl %ecx, 16(%eax,%ebx,4) 237 mov [eax][4*ebx + 16], ecx 238 // CHECK: movl %ecx, 16(%eax,%ebx,4) 239 mov [eax][16 + 4*ebx], ecx 240 // CHECK: movl %ecx, 16(%eax,%ebx,4) 241 mov [4*ebx][eax + 16], ecx 242 // CHECK: movl %ecx, 16(%eax,%ebx,4) 243 mov [4*ebx][16 + eax], ecx 244 // CHECK: movl %ecx, 16(%eax,%ebx,4) 245 mov [16][eax + 4*ebx], ecx 246 // CHECK: movl %ecx, 16(%eax,%ebx,4) 247 mov [16][eax + 4*ebx], ecx 248 // CHECK: movl %ecx, 16(%eax,%ebx,4) 249 mov [eax + 4*ebx][16], ecx 250 // CHECK: movl %ecx, 16(%eax,%ebx,4) 251 mov [eax + 16][4*ebx], ecx 252 // CHECK: movl %ecx, 16(%eax,%ebx,4) 253 mov [4*ebx + eax][16], ecx 254 // CHECK: movl %ecx, 16(%eax,%ebx,4) 255 mov [4*ebx + 16][eax], ecx 256 // CHECK: movl %ecx, 16(%eax,%ebx,4) 257 mov [16 + eax][4*ebx], ecx 258 // CHECK: movl %ecx, 16(%eax,%ebx,4) 259 mov [16 + eax][4*ebx], ecx 260 // CHECK: movl %ecx, 16(%eax,%ebx,4) 261 mov [eax][4*ebx][16], ecx 262 // CHECK: movl %ecx, 16(%eax,%ebx,4) 263 mov [eax][16][4*ebx], ecx 264 // CHECK: movl %ecx, 16(%eax,%ebx,4) 265 mov [4*ebx][eax][16], ecx 266 // CHECK: movl %ecx, 16(%eax,%ebx,4) 267 mov [4*ebx][16][eax], ecx 268 // CHECK: movl %ecx, 16(%eax,%ebx,4) 269 mov [16][eax][4*ebx], ecx 270 // CHECK: movl %ecx, 16(%eax,%ebx,4) 271 mov [16][eax][4*ebx], ecx 272 // CHECK: movl %ecx, 16(%eax,%ebx,4) 273 mov [eax + ebx*4 + 16], ecx 274 // CHECK: movl %ecx, 16(%eax,%ebx,4) 275 mov [eax + 16 + ebx*4], ecx 276 // CHECK: movl %ecx, 16(%eax,%ebx,4) 277 mov [ebx*4 + eax + 16], ecx 278 // CHECK: movl %ecx, 16(%eax,%ebx,4) 279 mov [ebx*4 + 16 + eax], ecx 280 // CHECK: movl %ecx, 16(%eax,%ebx,4) 281 mov [16 + eax + ebx*4], ecx 282 // CHECK: movl %ecx, 16(%eax,%ebx,4) 283 mov [16 + eax + ebx*4], ecx 284 // CHECK: movl %ecx, 16(%eax,%ebx,4) 285 mov [eax][ebx*4 + 16], ecx 286 // CHECK: movl %ecx, 16(%eax,%ebx,4) 287 mov [eax][16 + ebx*4], ecx 288 // CHECK: movl %ecx, 16(%eax,%ebx,4) 289 mov [ebx*4][eax + 16], ecx 290 // CHECK: movl %ecx, 16(%eax,%ebx,4) 291 mov [ebx*4][16 + eax], ecx 292 // CHECK: movl %ecx, 16(%eax,%ebx,4) 293 mov [16][eax + ebx*4], ecx 294 // CHECK: movl %ecx, 16(%eax,%ebx,4) 295 mov [16][eax + ebx*4], ecx 296 // CHECK: movl %ecx, 16(%eax,%ebx,4) 297 mov [eax + ebx*4][16], ecx 298 // CHECK: movl %ecx, 16(%eax,%ebx,4) 299 mov [eax + 16][ebx*4], ecx 300 // CHECK: movl %ecx, 16(%eax,%ebx,4) 301 mov [ebx*4 + eax][16], ecx 302 // CHECK: movl %ecx, 16(%eax,%ebx,4) 303 mov [ebx*4 + 16][eax], ecx 304 // CHECK: movl %ecx, 16(%eax,%ebx,4) 305 mov [16 + eax][ebx*4], ecx 306 // CHECK: movl %ecx, 16(%eax,%ebx,4) 307 mov [16 + eax][ebx*4], ecx 308 // CHECK: movl %ecx, 16(%eax,%ebx,4) 309 mov [eax][ebx*4][16], ecx 310 // CHECK: movl %ecx, 16(%eax,%ebx,4) 311 mov [eax][16][ebx*4], ecx 312 // CHECK: movl %ecx, 16(%eax,%ebx,4) 313 mov [ebx*4][eax][16], ecx 314 // CHECK: movl %ecx, 16(%eax,%ebx,4) 315 mov [ebx*4][16][eax], ecx 316 // CHECK: movl %ecx, 16(%eax,%ebx,4) 317 mov [16][eax][ebx*4], ecx 318 // CHECK: movl %ecx, 16(%eax,%ebx,4) 319 mov [16][eax][ebx*4], ecx 320 // CHECK: movl %ecx, -16(%eax,%ebx,4) 321 mov [eax][ebx*4 - 16], ecx 322 323 // CHECK: prefetchnta 12800(%esi) 324 prefetchnta [esi + (200*64)] 325 // CHECK: prefetchnta 32(%esi) 326 prefetchnta [esi + (64/2)] 327 // CHECK: prefetchnta 128(%esi) 328 prefetchnta [esi + (64/2*4)] 329 // CHECK: prefetchnta 8(%esi) 330 prefetchnta [esi + (64/(2*4))] 331 // CHECK: prefetchnta 48(%esi) 332 prefetchnta [esi + (64/(2*4)+40)] 333 334 // CHECK: movl %ecx, -16(%eax,%ebx,4) 335 mov [eax][ebx*4 - 2*8], ecx 336 // CHECK: movl %ecx, -16(%eax,%ebx,4) 337 mov [eax][4*ebx - 2*8], ecx 338 // CHECK: movl %ecx, -16(%eax,%ebx,4) 339 mov [eax + 4*ebx - 2*8], ecx 340 // CHECK: movl %ecx, -16(%eax,%ebx,4) 341 mov [12 + eax + (4*ebx) - 2*14], ecx 342 // CHECK: movl %ecx, -16(%eax,%ebx,4) 343 mov [eax][ebx*4 - 2*2*2*2], ecx 344 // CHECK: movl %ecx, -16(%eax,%ebx,4) 345 mov [eax][ebx*4 - (2*8)], ecx 346 // CHECK: movl %ecx, -16(%eax,%ebx,4) 347 mov [eax][ebx*4 - 2 * 8 + 4 - 4], ecx 348 // CHECK: movl %ecx, -16(%eax,%ebx,4) 349 mov [eax + ebx*4 - 2 * 8 + 4 - 4], ecx 350 // CHECK: movl %ecx, -16(%eax,%ebx,4) 351 mov [eax + ebx*4 - 2 * ((8 + 4) - 4)], ecx 352 // CHECK: movl %ecx, -16(%eax,%ebx,4) 353 mov [-2 * ((8 + 4) - 4) + eax + ebx*4], ecx 354 // CHECK: movl %ecx, -16(%eax,%ebx,4) 355 mov [((-2) * ((8 + 4) - 4)) + eax + ebx*4], ecx 356 // CHECK: movl %ecx, -16(%eax,%ebx,4) 357 mov [eax + ((-2) * ((8 + 4) - 4)) + ebx*4], ecx 358 // CHECK: movl %ecx, 96(%eax,%ebx,4) 359 mov [eax + ((-2) * ((8 + 4) * -4)) + ebx*4], ecx 360 // CHECK: movl %ecx, -8(%eax,%ebx,4) 361 mov [eax][-8][ebx*4], ecx 362 // CHECK: movl %ecx, -2(%eax,%ebx,4) 363 mov [eax][16/-8][ebx*4], ecx 364 // CHECK: movl %ecx, -2(%eax,%ebx,4) 365 mov [eax][(16)/-8][ebx*4], ecx 366 367 // CHECK: setb %al 368 setc al 369 // CHECK: sete %al 370 setz al 371 // CHECK: setbe %al 372 setna al 373 // CHECK: setae %al 374 setnb al 375 // CHECK: setae %al 376 setnc al 377 // CHECK: setle %al 378 setng al 379 // CHECK: setge %al 380 setnl al 381 // CHECK: setne %al 382 setnz al 383 // CHECK: setp %al 384 setpe al 385 // CHECK: setnp %al 386 setpo al 387 // CHECK: setb %al 388 setnae al 389 // CHECK: seta %al 390 setnbe al 391 // CHECK: setl %al 392 setnge al 393 // CHECK: setg %al 394 setnle al 395 // CHECK: jne _foo 396 jnz _foo 397 // CHECK: outb %al, $4 398 out 4, al 399 ret 400 401 // CHECK: cmovbl %ebx, %eax 402 cmovc eax, ebx 403 // CHECK: cmovel %ebx, %eax 404 cmovz eax, ebx 405 // CHECK: cmovbel %ebx, %eax 406 cmovna eax, ebx 407 // CHECK: cmovael %ebx, %eax 408 cmovnb eax, ebx 409 // CHECK: cmovael %ebx, %eax 410 cmovnc eax, ebx 411 // CHECK: cmovlel %ebx, %eax 412 cmovng eax, ebx 413 // CHECK: cmovgel %ebx, %eax 414 cmovnl eax, ebx 415 // CHECK: cmovnel %ebx, %eax 416 cmovnz eax, ebx 417 // CHECK: cmovpl %ebx, %eax 418 cmovpe eax, ebx 419 // CHECK: cmovnpl %ebx, %eax 420 cmovpo eax, ebx 421 // CHECK: cmovbl %ebx, %eax 422 cmovnae eax, ebx 423 // CHECK: cmoval %ebx, %eax 424 cmovnbe eax, ebx 425 // CHECK: cmovll %ebx, %eax 426 cmovnge eax, ebx 427 // CHECK: cmovgl %ebx, %eax 428 cmovnle eax, ebx 429 430 // CHECK: shldw %cl, %bx, %dx 431 // CHECK: shldw %cl, %bx, %dx 432 // CHECK: shldw $1, %bx, %dx 433 // CHECK: shldw %cl, %bx, (%rax) 434 // CHECK: shldw %cl, %bx, (%rax) 435 // CHECK: shrdw %cl, %bx, %dx 436 // CHECK: shrdw %cl, %bx, %dx 437 // CHECK: shrdw $1, %bx, %dx 438 // CHECK: shrdw %cl, %bx, (%rax) 439 // CHECK: shrdw %cl, %bx, (%rax) 440 441 shld DX, BX 442 shld DX, BX, CL 443 shld DX, BX, 1 444 shld [RAX], BX 445 shld [RAX], BX, CL 446 shrd DX, BX 447 shrd DX, BX, CL 448 shrd DX, BX, 1 449 shrd [RAX], BX 450 shrd [RAX], BX, CL 451 452 // CHECK: btl $1, (%eax) 453 // CHECK: btsl $1, (%eax) 454 // CHECK: btrl $1, (%eax) 455 // CHECK: btcl $1, (%eax) 456 bt DWORD PTR [EAX], 1 457 bt DWORD PTR [EAX], 1 458 bts DWORD PTR [EAX], 1 459 btr DWORD PTR [EAX], 1 460 btc DWORD PTR [EAX], 1 461 462 //CHECK: divb %bl 463 //CHECK: divw %bx 464 //CHECK: divl %ecx 465 //CHECK: divl 3735928559(%ebx,%ecx,8) 466 //CHECK: divl 69 467 //CHECK: divl 32493 468 //CHECK: divl 3133065982 469 //CHECK: divl 305419896 470 //CHECK: idivb %bl 471 //CHECK: idivw %bx 472 //CHECK: idivl %ecx 473 //CHECK: idivl 3735928559(%ebx,%ecx,8) 474 //CHECK: idivl 69 475 //CHECK: idivl 32493 476 //CHECK: idivl 3133065982 477 //CHECK: idivl 305419896 478 div AL, BL 479 div AX, BX 480 div EAX, ECX 481 div EAX, [ECX*8+EBX+0xdeadbeef] 482 div EAX, [0x45] 483 div EAX, [0x7eed] 484 div EAX, [0xbabecafe] 485 div EAX, [0x12345678] 486 idiv AL, BL 487 idiv AX, BX 488 idiv EAX, ECX 489 idiv EAX, [ECX*8+EBX+0xdeadbeef] 490 idiv EAX, [0x45] 491 idiv EAX, [0x7eed] 492 idiv EAX, [0xbabecafe] 493 idiv EAX, [0x12345678] 494 495 496 // CHECK: inb %dx, %al 497 // CHECK: inw %dx, %ax 498 // CHECK: inl %dx, %eax 499 // CHECK: outb %al, %dx 500 // CHECK: outw %ax, %dx 501 // CHECK: outl %eax, %dx 502 inb DX 503 inw DX 504 inl DX 505 outb DX 506 outw DX 507 outl DX 508 509 // CHECK: xchgq %rcx, %rax 510 // CHECK: xchgq %rcx, %rax 511 // CHECK: xchgl %ecx, %eax 512 // CHECK: xchgl %ecx, %eax 513 // CHECK: xchgw %cx, %ax 514 // CHECK: xchgw %cx, %ax 515 xchg RAX, RCX 516 xchg RCX, RAX 517 xchg EAX, ECX 518 xchg ECX, EAX 519 xchg AX, CX 520 xchg CX, AX 521 522 // CHECK: xchgq %rax, (%ecx) 523 // CHECK: xchgq %rax, (%ecx) 524 // CHECK: xchgl %eax, (%ecx) 525 // CHECK: xchgl %eax, (%ecx) 526 // CHECK: xchgw %ax, (%ecx) 527 // CHECK: xchgw %ax, (%ecx) 528 xchg RAX, [ECX] 529 xchg [ECX], RAX 530 xchg EAX, [ECX] 531 xchg [ECX], EAX 532 xchg AX, [ECX] 533 xchg [ECX], AX 534 535 // CHECK: testq %rax, (%ecx) 536 // CHECK: testq %rax, (%ecx) 537 // CHECK: testl %eax, (%ecx) 538 // CHECK: testl %eax, (%ecx) 539 // CHECK: testw %ax, (%ecx) 540 // CHECK: testw %ax, (%ecx) 541 // CHECK: testb %al, (%ecx) 542 // CHECK: testb %al, (%ecx) 543 test RAX, [ECX] 544 test [ECX], RAX 545 test EAX, [ECX] 546 test [ECX], EAX 547 test AX, [ECX] 548 test [ECX], AX 549 test AL, [ECX] 550 test [ECX], AL 551 552 // CHECK: fnstsw %ax 553 // CHECK: fnstsw %ax 554 // CHECK: fnstsw (%eax) 555 fnstsw 556 fnstsw AX 557 fnstsw WORD PTR [EAX] 558 559 // CHECK: faddp %st(1) 560 // CHECK: fmulp %st(1) 561 // CHECK: fsubrp %st(1) 562 // CHECK: fsubp %st(1) 563 // CHECK: fdivrp %st(1) 564 // CHECK: fdivp %st(1) 565 faddp ST(1), ST(0) 566 fmulp ST(1), ST(0) 567 fsubp ST(1), ST(0) 568 fsubrp ST(1), ST(0) 569 fdivp ST(1), ST(0) 570 fdivrp ST(1), ST(0) 571 572 // CHECK: faddp %st(1) 573 // CHECK: fmulp %st(1) 574 // CHECK: fsubrp %st(1) 575 // CHECK: fsubp %st(1) 576 // CHECK: fdivrp %st(1) 577 // CHECK: fdivp %st(1) 578 faddp ST(0), ST(1) 579 fmulp ST(0), ST(1) 580 fsubp ST(0), ST(1) 581 fsubrp ST(0), ST(1) 582 fdivp ST(0), ST(1) 583 fdivrp ST(0), ST(1) 584 585 // CHECK: faddp %st(1) 586 // CHECK: fmulp %st(1) 587 // CHECK: fsubrp %st(1) 588 // CHECK: fsubp %st(1) 589 // CHECK: fdivrp %st(1) 590 // CHECK: fdivp %st(1) 591 faddp ST(1) 592 fmulp ST(1) 593 fsubp ST(1) 594 fsubrp ST(1) 595 fdivp ST(1) 596 fdivrp ST(1) 597 598 599 // CHECK: faddp %st(1) 600 // CHECK: fmulp %st(1) 601 // CHECK: fsubrp %st(1) 602 // CHECK: fsubp %st(1) 603 // CHECK: fdivrp %st(1) 604 // CHECK: fdivp %st(1) 605 fadd 606 fmul 607 fsub 608 fsubr 609 fdiv 610 fdivr 611 612 // CHECK: faddp %st(1) 613 // CHECK: fmulp %st(1) 614 // CHECK: fsubrp %st(1) 615 // CHECK: fsubp %st(1) 616 // CHECK: fdivrp %st(1) 617 // CHECK: fdivp %st(1) 618 faddp 619 fmulp 620 fsubp 621 fsubrp 622 fdivp 623 fdivrp 624 625 // CHECK: fadd %st(1) 626 // CHECK: fmul %st(1) 627 // CHECK: fsub %st(1) 628 // CHECK: fsubr %st(1) 629 // CHECK: fdiv %st(1) 630 // CHECK: fdivr %st(1) 631 fadd ST(0), ST(1) 632 fmul ST(0), ST(1) 633 fsub ST(0), ST(1) 634 fsubr ST(0), ST(1) 635 fdiv ST(0), ST(1) 636 fdivr ST(0), ST(1) 637 638 // CHECK: fadd %st(0), %st(1) 639 // CHECK: fmul %st(0), %st(1) 640 // CHECK: fsubr %st(0), %st(1) 641 // CHECK: fsub %st(0), %st(1) 642 // CHECK: fdivr %st(0), %st(1) 643 // CHECK: fdiv %st(0), %st(1) 644 fadd ST(1), ST(0) 645 fmul ST(1), ST(0) 646 fsub ST(1), ST(0) 647 fsubr ST(1), ST(0) 648 fdiv ST(1), ST(0) 649 fdivr ST(1), ST(0) 650 651 // CHECK: fadd %st(1) 652 // CHECK: fmul %st(1) 653 // CHECK: fsub %st(1) 654 // CHECK: fsubr %st(1) 655 // CHECK: fdiv %st(1) 656 // CHECK: fdivr %st(1) 657 fadd ST(1) 658 fmul ST(1) 659 fsub ST(1) 660 fsubr ST(1) 661 fdiv ST(1) 662 fdivr ST(1) 663 664 665 // CHECK: fxsave64 (%rax) 666 // CHECK: fxrstor64 (%rax) 667 fxsave64 [rax] 668 fxrstor64 [rax] 669 670 .bss 671 .globl _g0 672 .text 673 674 // CHECK: movq _g0, %rbx 675 // CHECK: movq _g0+8, %rcx 676 // CHECK: movq _g0+18(%rbp), %rax 677 // CHECK: movq _g0(,%rsi,4), %rax 678 mov rbx, qword ptr [_g0] 679 mov rcx, qword ptr [_g0 + 8] 680 mov rax, QWORD PTR _g0[rbp + 1 + (2 * 5) - 3 + 1<<1] 681 mov rax, QWORD PTR _g0[rsi*4] 682 683 "?half@?0??bar@@YAXXZ@4NA": 684 .quad 4602678819172646912 685 686 fadd dword ptr "?half@?0??bar@@YAXXZ@4NA" 687 fadd dword ptr "?half@?0??bar@@YAXXZ@4NA"@IMGREL 688 // CHECK: fadds "?half@?0??bar@@YAXXZ@4NA" 689 // CHECK: fadds "?half@?0??bar@@YAXXZ@4NA"@IMGREL 690 691 inc qword ptr [rax] 692 inc long ptr [rax] 693 inc dword ptr [rax] 694 inc word ptr [rax] 695 inc byte ptr [rax] 696 // CHECK: incq (%rax) 697 // CHECK: incl (%rax) 698 // CHECK: incl (%rax) 699 // CHECK: incw (%rax) 700 // CHECK: incb (%rax) 701 702 dec qword ptr [rax] 703 dec dword ptr [rax] 704 dec word ptr [rax] 705 dec byte ptr [rax] 706 // CHECK: decq (%rax) 707 // CHECK: decl (%rax) 708 // CHECK: decw (%rax) 709 // CHECK: decb (%rax) 710 711 add qword ptr [rax], 1 712 add dword ptr [rax], 1 713 add word ptr [rax], 1 714 add byte ptr [rax], 1 715 // CHECK: addq $1, (%rax) 716 // CHECK: addl $1, (%rax) 717 // CHECK: addw $1, (%rax) 718 // CHECK: addb $1, (%rax) 719 720 fstp tbyte ptr [rax] 721 fstp xword ptr [rax] 722 fstp qword ptr [rax] 723 fstp dword ptr [rax] 724 // CHECK: fstpt (%rax) 725 // CHECK: fstpt (%rax) 726 // CHECK: fstpl (%rax) 727 // CHECK: fstps (%rax) 728 729 fxsave [eax] 730 fsave [eax] 731 fxrstor [eax] 732 frstor [eax] 733 // CHECK: fxsave (%eax) 734 // CHECK: wait 735 // CHECK: fnsave (%eax) 736 // CHECK: fxrstor (%eax) 737 // CHECK: frstor (%eax) 738 739 // FIXME: Should we accept this? Masm accepts it, but gas does not. 740 fxsave dword ptr [eax] 741 fsave dword ptr [eax] 742 fxrstor dword ptr [eax] 743 frstor dword ptr [eax] 744 // CHECK: fxsave (%eax) 745 // CHECK: wait 746 // CHECK: fnsave (%eax) 747 // CHECK: fxrstor (%eax) 748 // CHECK: frstor (%eax) 749 750 // CHECK: cmpnless %xmm1, %xmm0 751 cmpnless xmm0, xmm1 752 753 insb 754 insw 755 insd 756 // CHECK: insb %dx, %es:(%rdi) 757 // CHECK: insw %dx, %es:(%rdi) 758 // CHECK: insl %dx, %es:(%rdi) 759 760 outsb 761 outsw 762 outsd 763 // CHECK: outsb (%rsi), %dx 764 // CHECK: outsw (%rsi), %dx 765 // CHECK: outsl (%rsi), %dx 766 767 imul bx, 123 768 imul ebx, 123 769 imul rbx, 123 770 // CHECK: imulw $123, %bx 771 // CHECK: imull $123, %ebx 772 // CHECK: imulq $123, %rbx 773 774 repe cmpsb 775 repz cmpsb 776 repne cmpsb 777 repnz cmpsb 778 // CHECK: rep 779 // CHECK: cmpsb %es:(%rdi), (%rsi) 780 // CHECK: rep 781 // CHECK: cmpsb %es:(%rdi), (%rsi) 782 // CHECK: repne 783 // CHECK: cmpsb %es:(%rdi), (%rsi) 784 // CHECK: repne 785 // CHECK: cmpsb %es:(%rdi), (%rsi) 786 787 sal eax, 123 788 // CHECK: shll $123, %eax 789 790 psignw mm0, MMWORD PTR t2 791 // CHECK: psignw t2, %mm0 792 793 comisd xmm0, QWORD PTR [eax] 794 comiss xmm0, DWORD PTR [eax] 795 vcomisd xmm0, QWORD PTR [eax] 796 vcomiss xmm0, DWORD PTR [eax] 797 798 // CHECK: comisd (%eax), %xmm0 799 // CHECK: comiss (%eax), %xmm0 800 // CHECK: vcomisd (%eax), %xmm0 801 // CHECK: vcomiss (%eax), %xmm0 802 803 fbld tbyte ptr [eax] 804 fbstp tbyte ptr [eax] 805 // CHECK: fbld (%eax) 806 // CHECK: fbstp (%eax) 807 808 fld float ptr [rax] 809 fld double ptr [rax] 810 // CHECK: flds (%rax) 811 // CHECK: fldl (%rax) 812 813 fcomip st, st(2) 814 fucomip st, st(2) 815 // CHECK: fcompi %st(2) 816 // CHECK: fucompi %st(2) 817 818 loopz _foo 819 loopnz _foo 820 // CHECK: loope _foo 821 // CHECK: loopne _foo 822 823 sidt fword ptr [eax] 824 // CHECK: sidtq (%eax) 825 826 ins byte ptr [eax], dx 827 // CHECK: insb %dx, %es:(%edi) 828 // CHECK-STDERR: memory operand is only for determining the size, ES:(R|E)DI will be used for the location 829 // CHECK-STDERR-NEXT: ins byte ptr [eax], dx 830 outs dx, word ptr [eax] 831 // CHECK: outsw (%esi), %dx 832 // CHECK-STDERR: memory operand is only for determining the size, ES:(R|E)SI will be used for the location 833 // CHECK-STDERR-NEXT: outs dx, word ptr [eax] 834 lods dword ptr [eax] 835 // CHECK: lodsl (%esi), %eax 836 // CHECK-STDERR: memory operand is only for determining the size, ES:(R|E)SI will be used for the location 837 // CHECK-STDERR-NEXT: lods dword ptr [eax] 838 stos qword ptr [eax] 839 // CHECK: stosq %rax, %es:(%edi) 840 // CHECK-STDERR: memory operand is only for determining the size, ES:(R|E)DI will be used for the location 841 // CHECK-STDERR-NEXT: stos qword ptr [eax] 842 scas byte ptr [eax] 843 // CHECK: scasb %es:(%edi), %al 844 // CHECK-STDERR: memory operand is only for determining the size, ES:(R|E)DI will be used for the location 845 // CHECK-STDERR-NEXT: scas byte ptr [eax] 846 cmps word ptr [eax], word ptr [ebx] 847 // CHECK: cmpsw %es:(%edi), (%esi) 848 // CHECK-STDERR: memory operand is only for determining the size, ES:(R|E)SI will be used for the location 849 // CHECK-STDERR-NEXT: cmps word ptr [eax], word ptr [ebx] 850 // CHECK-STDERR: memory operand is only for determining the size, ES:(R|E)DI will be used for the location 851 // CHECK-STDERR-NEXT: cmps word ptr [eax], word ptr [ebx] 852 movs dword ptr [eax], dword ptr [ebx] 853 // CHECK: movsl (%esi), %es:(%edi) 854 // CHECK-STDERR: memory operand is only for determining the size, ES:(R|E)DI will be used for the location 855 // CHECK-STDERR-NEXT: movs dword ptr [eax], dword ptr [ebx] 856 // CHECK-STDERR: memory operand is only for determining the size, ES:(R|E)SI will be used for the location 857 // CHECK-STDERR-NEXT: movs dword ptr [eax], dword ptr [ebx] 858 859 movsd qword ptr [rax], xmm0 860 // CHECK: movsd %xmm0, (%rax) 861 // CHECK-STDERR-NOT: movsd qword ptr [rax], xmm0 862 863 xlat byte ptr [eax] 864 // CHECK: xlatb 865 // CHECK-STDERR: memory operand is only for determining the size, (R|E)BX will be used for the location 866 867 // CHECK: punpcklbw 868 punpcklbw mm0, dword ptr [rsp] 869 // CHECK: punpcklwd 870 punpcklwd mm0, dword ptr [rsp] 871 // CHECK: punpckldq 872 punpckldq mm0, dword ptr [rsp] 873 874 // CHECK: lslq (%eax), %rbx 875 lsl rbx, word ptr [eax] 876 877 // CHECK: lsll (%eax), %ebx 878 lsl ebx, word ptr [eax] 879 880 // CHECK: lslw (%eax), %bx 881 lsl bx, word ptr [eax] 882 883 // CHECK: sysexitl 884 sysexit 885 // CHECK: sysexitq 886 sysexitq 887 // CHECK: sysretl 888 sysret 889 // CHECK: sysretq 890 sysretq 891 892 // CHECK: leaq (%rsp,%rax), %rax 893 lea rax, [rax+rsp] 894 // CHECK: leaq (%rsp,%rax), %rax 895 lea rax, [rsp+rax] 896 // CHECK: leal (%esp,%eax), %eax 897 lea eax, [eax+esp] 898 // CHECK: leal (%esp,%eax), %eax 899 lea eax, [esp+eax] 900 901 // CHECK: vpgatherdq %ymm2, (%rdi,%xmm1), %ymm0 902 vpgatherdq ymm0, [rdi+xmm1], ymm2 903 // CHECK: vpgatherdq %ymm2, (%rdi,%xmm1), %ymm0 904 vpgatherdq ymm0, [xmm1+rdi], ymm2 905