Skip to content

Commit 2c4e38f

Browse files
committed
[X86] Emit REX prefix immediately before the opcode
Fix prefix emission order to emit REX immediately before the opcode (SDM vol2, 2.1, Figure 2-1). According to SDM vol2 2.2.1, "Other placements are ignored". This fix has a side effect of outputting segment override prefix in a different order than previously (benign). Follow-up to https://reviews.llvm.org/D120592 Reviewed By: skan, craig.topper Differential Revision: https://reviews.llvm.org/D120871
1 parent 1d37198 commit 2c4e38f

File tree

11 files changed

+78
-77
lines changed

11 files changed

+78
-77
lines changed

llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -617,14 +617,6 @@ bool X86MCCodeEmitter::emitPrefixImpl(unsigned &CurOp, const MCInst &MI,
617617
Flags & X86::IP_HAS_AD_SIZE)
618618
emitByte(0x67, OS);
619619

620-
// Encoding type for this instruction.
621-
uint64_t Encoding = TSFlags & X86II::EncodingMask;
622-
bool HasREX = false;
623-
if (Encoding)
624-
emitVEXOpcodePrefix(MemoryOperand, MI, OS);
625-
else
626-
HasREX = emitOpcodePrefix(MemoryOperand, MI, STI, OS);
627-
628620
uint64_t Form = TSFlags & X86II::FormMask;
629621
switch (Form) {
630622
default:
@@ -654,6 +646,15 @@ bool X86MCCodeEmitter::emitPrefixImpl(unsigned &CurOp, const MCInst &MI,
654646
}
655647
}
656648

649+
// REX prefix is optional, but if used must be immediately before the opcode
650+
// Encoding type for this instruction.
651+
uint64_t Encoding = TSFlags & X86II::EncodingMask;
652+
bool HasREX = false;
653+
if (Encoding)
654+
emitVEXOpcodePrefix(MemoryOperand, MI, OS);
655+
else
656+
HasREX = emitOpcodePrefix(MemoryOperand, MI, STI, OS);
657+
657658
return HasREX;
658659
}
659660

llvm/test/MC/Disassembler/X86/moffs.txt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@
3737
# 64: movw 0x5a5a5a5a, %ax # encoding: [0x67,0x66,0xa1,0x5a,0x5a,0x5a,0x5a]
3838
0x67 0x66 0xa1 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a
3939

40-
# 16: movl %es:0x5a5a5a5a, %eax # encoding: [0x67,0x66,0x26,0xa1,0x5a,0x5a,0x5a,0x5a]
41-
# 32: movw %es:0x5a5a, %ax # encoding: [0x67,0x66,0x26,0xa1,0x5a,0x5a]
42-
# 64: movw %es:0x5a5a5a5a, %ax # encoding: [0x67,0x66,0x26,0xa1,0x5a,0x5a,0x5a,0x5a]
40+
# 16: movl %es:0x5a5a5a5a, %eax # encoding: [0x67,0x26,0x66,0xa1,0x5a,0x5a,0x5a,0x5a]
41+
# 32: movw %es:0x5a5a, %ax # encoding: [0x67,0x26,0x66,0xa1,0x5a,0x5a]
42+
# 64: movw %es:0x5a5a5a5a, %ax # encoding: [0x67,0x26,0x66,0xa1,0x5a,0x5a,0x5a,0x5a]
4343
0x67 0x26 0x66 0xa1 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a # encoding: [0xa0,0x5a,0x5a]
4444

4545

@@ -79,8 +79,8 @@
7979
# 64: movw %ax, 0x5a5a5a5a # encoding: [0x67,0x66,0xa3,0x5a,0x5a,0x5a,0x5a]
8080
0x67 0x66 0xa3 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a
8181

82-
# 16: movl %eax, %es:0x5a5a5a5a # encoding: [0x67,0x66,0x26,0xa3,0x5a,0x5a,0x5a,0x5a]
83-
# 32: movw %ax, %es:0x5a5a # encoding: [0x67,0x66,0x26,0xa3,0x5a,0x5a]
84-
# 64: movw %ax, %es:0x5a5a5a5a # encoding: [0x67,0x66,0x26,0xa3,0x5a,0x5a,0x5a,0x5a]
82+
# 16: movl %eax, %es:0x5a5a5a5a # encoding: [0x67,0x26,0x66,0xa3,0x5a,0x5a,0x5a,0x5a]
83+
# 32: movw %ax, %es:0x5a5a # encoding: [0x67,0x26,0x66,0xa3,0x5a,0x5a]
84+
# 64: movw %ax, %es:0x5a5a5a5a # encoding: [0x67,0x26,0x66,0xa3,0x5a,0x5a,0x5a,0x5a]
8585
0x67 0x26 0x66 0xa3 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a
8686

llvm/test/MC/X86/I186-32.s

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ outsb %es:(%esi), %dx
5757
outsl %es:(%esi), %dx
5858

5959
// CHECK: outsw %es:(%esi), %dx
60-
// CHECK: encoding: [0x66,0x26,0x6f]
60+
// CHECK: encoding: [0x26,0x66,0x6f]
6161
outsw %es:(%esi), %dx
6262

6363
// CHECK: popal
@@ -269,7 +269,7 @@ repne outsb %es:(%esi), %dx
269269
repne outsl %es:(%esi), %dx
270270

271271
// CHECK: repne outsw %es:(%esi), %dx
272-
// CHECK: encoding: [0xf2,0x66,0x26,0x6f]
272+
// CHECK: encoding: [0xf2,0x26,0x66,0x6f]
273273
repne outsw %es:(%esi), %dx
274274

275275
// CHECK: rep outsb %es:(%esi), %dx
@@ -281,7 +281,7 @@ rep outsb %es:(%esi), %dx
281281
rep outsl %es:(%esi), %dx
282282

283283
// CHECK: rep outsw %es:(%esi), %dx
284-
// CHECK: encoding: [0xf3,0x66,0x26,0x6f]
284+
// CHECK: encoding: [0xf3,0x26,0x66,0x6f]
285285
rep outsw %es:(%esi), %dx
286286

287287
// CHECK: rolb $0, -485498096(%edx,%eax,4)

llvm/test/MC/X86/I186-64.s

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ outsb %gs:(%rsi), %dx
3333
outsl %gs:(%rsi), %dx
3434

3535
// CHECK: outsw %gs:(%rsi), %dx
36-
// CHECK: encoding: [0x66,0x65,0x6f]
36+
// CHECK: encoding: [0x65,0x66,0x6f]
3737
outsw %gs:(%rsi), %dx
3838

3939
// CHECK: pushq $0
@@ -289,7 +289,7 @@ repne outsb %gs:(%rsi), %dx
289289
repne outsl %gs:(%rsi), %dx
290290

291291
// CHECK: repne outsw %gs:(%rsi), %dx
292-
// CHECK: encoding: [0xf2,0x66,0x65,0x6f]
292+
// CHECK: encoding: [0xf2,0x65,0x66,0x6f]
293293
repne outsw %gs:(%rsi), %dx
294294

295295
// CHECK: rep outsb %gs:(%rsi), %dx
@@ -301,7 +301,7 @@ rep outsb %gs:(%rsi), %dx
301301
rep outsl %gs:(%rsi), %dx
302302

303303
// CHECK: rep outsw %gs:(%rsi), %dx
304-
// CHECK: encoding: [0xf3,0x66,0x65,0x6f]
304+
// CHECK: encoding: [0xf3,0x65,0x66,0x6f]
305305
rep outsw %gs:(%rsi), %dx
306306

307307
// CHECK: rolb $0, 485498096

llvm/test/MC/X86/I386-32.s

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ cmpsb %es:(%edi), %es:(%esi)
153153
cmpsl %es:(%edi), %es:(%esi)
154154

155155
// CHECK: cmpsw %es:(%edi), %es:(%esi)
156-
// CHECK: encoding: [0x66,0x26,0xa7]
156+
// CHECK: encoding: [0x26,0x66,0xa7]
157157
cmpsw %es:(%edi), %es:(%esi)
158158

159159
// CHECK: insb %dx, %es:(%edi)
@@ -193,7 +193,7 @@ movsb %es:(%esi), %es:(%edi)
193193
movsl %es:(%esi), %es:(%edi)
194194

195195
// CHECK: movsw %es:(%esi), %es:(%edi)
196-
// CHECK: encoding: [0x66,0x26,0xa5]
196+
// CHECK: encoding: [0x26,0x66,0xa5]
197197
movsw %es:(%esi), %es:(%edi)
198198

199199
// CHECK: outsb %es:(%esi), %dx
@@ -205,7 +205,7 @@ outsb %es:(%esi), %dx
205205
outsl %es:(%esi), %dx
206206

207207
// CHECK: outsw %es:(%esi), %dx
208-
// CHECK: encoding: [0x66,0x26,0x6f]
208+
// CHECK: encoding: [0x26,0x66,0x6f]
209209
outsw %es:(%esi), %dx
210210

211211
// CHECK: popal
@@ -249,7 +249,7 @@ rep cmpsb %es:(%edi), %es:(%esi)
249249
rep cmpsl %es:(%edi), %es:(%esi)
250250

251251
// CHECK: rep cmpsw %es:(%edi), %es:(%esi)
252-
// CHECK: encoding: [0xf3,0x66,0x26,0xa7]
252+
// CHECK: encoding: [0xf3,0x26,0x66,0xa7]
253253
rep cmpsw %es:(%edi), %es:(%esi)
254254

255255
// CHECK: rep insb %dx, %es:(%edi)
@@ -277,7 +277,7 @@ rep movsb %es:(%esi), %es:(%edi)
277277
rep movsl %es:(%esi), %es:(%edi)
278278

279279
// CHECK: rep movsw %es:(%esi), %es:(%edi)
280-
// CHECK: encoding: [0xf3,0x66,0x26,0xa5]
280+
// CHECK: encoding: [0xf3,0x26,0x66,0xa5]
281281
rep movsw %es:(%esi), %es:(%edi)
282282

283283
// CHECK: repne cmpsb %es:(%edi), %es:(%esi)
@@ -289,7 +289,7 @@ repne cmpsb %es:(%edi), %es:(%esi)
289289
repne cmpsl %es:(%edi), %es:(%esi)
290290

291291
// CHECK: repne cmpsw %es:(%edi), %es:(%esi)
292-
// CHECK: encoding: [0xf2,0x66,0x26,0xa7]
292+
// CHECK: encoding: [0xf2,0x26,0x66,0xa7]
293293
repne cmpsw %es:(%edi), %es:(%esi)
294294

295295
// CHECK: repne insb %dx, %es:(%edi)
@@ -317,7 +317,7 @@ repne movsb %es:(%esi), %es:(%edi)
317317
repne movsl %es:(%esi), %es:(%edi)
318318

319319
// CHECK: repne movsw %es:(%esi), %es:(%edi)
320-
// CHECK: encoding: [0xf2,0x66,0x26,0xa5]
320+
// CHECK: encoding: [0xf2,0x26,0x66,0xa5]
321321
repne movsw %es:(%esi), %es:(%edi)
322322

323323
// CHECK: repne outsb %es:(%esi), %dx
@@ -329,7 +329,7 @@ repne outsb %es:(%esi), %dx
329329
repne outsl %es:(%esi), %dx
330330

331331
// CHECK: repne outsw %es:(%esi), %dx
332-
// CHECK: encoding: [0xf2,0x66,0x26,0x6f]
332+
// CHECK: encoding: [0xf2,0x26,0x66,0x6f]
333333
repne outsw %es:(%esi), %dx
334334

335335
// CHECK: repne scasl %es:(%edi), %eax
@@ -349,7 +349,7 @@ rep outsb %es:(%esi), %dx
349349
rep outsl %es:(%esi), %dx
350350

351351
// CHECK: rep outsw %es:(%esi), %dx
352-
// CHECK: encoding: [0xf3,0x66,0x26,0x6f]
352+
// CHECK: encoding: [0xf3,0x26,0x66,0x6f]
353353
rep outsw %es:(%esi), %dx
354354

355355
// CHECK: rep scasl %es:(%edi), %eax

llvm/test/MC/X86/I386-64.s

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -226,11 +226,11 @@ cmpsb %es:(%rdi), %gs:(%rsi)
226226
cmpsl %es:(%rdi), %gs:(%rsi)
227227

228228
// CHECK: cmpsq %es:(%rdi), %gs:(%rsi)
229-
// CHECK: encoding: [0x48,0x65,0xa7]
229+
// CHECK: encoding: [0x65,0x48,0xa7]
230230
cmpsq %es:(%rdi), %gs:(%rsi)
231231

232232
// CHECK: cmpsw %es:(%rdi), %gs:(%rsi)
233-
// CHECK: encoding: [0x66,0x65,0xa7]
233+
// CHECK: encoding: [0x65,0x66,0xa7]
234234
cmpsw %es:(%rdi), %gs:(%rsi)
235235

236236
// CHECK: insb %dx, %es:(%rdi)
@@ -306,11 +306,11 @@ movsbl (%rdx), %r13d
306306
movsl %gs:(%rsi), %es:(%rdi)
307307

308308
// CHECK: movsq %gs:(%rsi), %es:(%rdi)
309-
// CHECK: encoding: [0x48,0x65,0xa5]
309+
// CHECK: encoding: [0x65,0x48,0xa5]
310310
movsq %gs:(%rsi), %es:(%rdi)
311311

312312
// CHECK: movsw %gs:(%rsi), %es:(%rdi)
313-
// CHECK: encoding: [0x66,0x65,0xa5]
313+
// CHECK: encoding: [0x65,0x66,0xa5]
314314
movsw %gs:(%rsi), %es:(%rdi)
315315

316316
// CHECK: movswl 485498096, %r13d
@@ -418,7 +418,7 @@ outsb %gs:(%rsi), %dx
418418
outsl %gs:(%rsi), %dx
419419

420420
// CHECK: outsw %gs:(%rsi), %dx
421-
// CHECK: encoding: [0x66,0x65,0x6f]
421+
// CHECK: encoding: [0x65,0x66,0x6f]
422422
outsw %gs:(%rsi), %dx
423423

424424
// CHECK: rep cmpsb %es:(%rdi), %gs:(%rsi)
@@ -430,11 +430,11 @@ rep cmpsb %es:(%rdi), %gs:(%rsi)
430430
rep cmpsl %es:(%rdi), %gs:(%rsi)
431431

432432
// CHECK: rep cmpsq %es:(%rdi), %gs:(%rsi)
433-
// CHECK: encoding: [0xf3,0x48,0x65,0xa7]
433+
// CHECK: encoding: [0xf3,0x65,0x48,0xa7]
434434
rep cmpsq %es:(%rdi), %gs:(%rsi)
435435

436436
// CHECK: rep cmpsw %es:(%rdi), %gs:(%rsi)
437-
// CHECK: encoding: [0xf3,0x66,0x65,0xa7]
437+
// CHECK: encoding: [0xf3,0x65,0x66,0xa7]
438438
rep cmpsw %es:(%rdi), %gs:(%rsi)
439439

440440
// CHECK: rep insb %dx, %es:(%rdi)
@@ -462,11 +462,11 @@ rep movsb %gs:(%rsi), %es:(%rdi)
462462
rep movsl %gs:(%rsi), %es:(%rdi)
463463

464464
// CHECK: rep movsq %gs:(%rsi), %es:(%rdi)
465-
// CHECK: encoding: [0xf3,0x48,0x65,0xa5]
465+
// CHECK: encoding: [0xf3,0x65,0x48,0xa5]
466466
rep movsq %gs:(%rsi), %es:(%rdi)
467467

468468
// CHECK: rep movsw %gs:(%rsi), %es:(%rdi)
469-
// CHECK: encoding: [0xf3,0x66,0x65,0xa5]
469+
// CHECK: encoding: [0xf3,0x65,0x66,0xa5]
470470
rep movsw %gs:(%rsi), %es:(%rdi)
471471

472472
// CHECK: repne cmpsb %es:(%rdi), %gs:(%rsi)
@@ -478,11 +478,11 @@ repne cmpsb %es:(%rdi), %gs:(%rsi)
478478
repne cmpsl %es:(%rdi), %gs:(%rsi)
479479

480480
// CHECK: repne cmpsq %es:(%rdi), %gs:(%rsi)
481-
// CHECK: encoding: [0xf2,0x48,0x65,0xa7]
481+
// CHECK: encoding: [0xf2,0x65,0x48,0xa7]
482482
repne cmpsq %es:(%rdi), %gs:(%rsi)
483483

484484
// CHECK: repne cmpsw %es:(%rdi), %gs:(%rsi)
485-
// CHECK: encoding: [0xf2,0x66,0x65,0xa7]
485+
// CHECK: encoding: [0xf2,0x65,0x66,0xa7]
486486
repne cmpsw %es:(%rdi), %gs:(%rsi)
487487

488488
// CHECK: repne insb %dx, %es:(%rdi)
@@ -510,11 +510,11 @@ repne movsb %gs:(%rsi), %es:(%rdi)
510510
repne movsl %gs:(%rsi), %es:(%rdi)
511511

512512
// CHECK: repne movsq %gs:(%rsi), %es:(%rdi)
513-
// CHECK: encoding: [0xf2,0x48,0x65,0xa5]
513+
// CHECK: encoding: [0xf2,0x65,0x48,0xa5]
514514
repne movsq %gs:(%rsi), %es:(%rdi)
515515

516516
// CHECK: repne movsw %gs:(%rsi), %es:(%rdi)
517-
// CHECK: encoding: [0xf2,0x66,0x65,0xa5]
517+
// CHECK: encoding: [0xf2,0x65,0x66,0xa5]
518518
repne movsw %gs:(%rsi), %es:(%rdi)
519519

520520
// CHECK: repne outsb %gs:(%rsi), %dx
@@ -526,7 +526,7 @@ repne outsb %gs:(%rsi), %dx
526526
repne outsl %gs:(%rsi), %dx
527527

528528
// CHECK: repne outsw %gs:(%rsi), %dx
529-
// CHECK: encoding: [0xf2,0x66,0x65,0x6f]
529+
// CHECK: encoding: [0xf2,0x65,0x66,0x6f]
530530
repne outsw %gs:(%rsi), %dx
531531

532532
// CHECK: repne scasl %es:(%rdi), %eax
@@ -546,7 +546,7 @@ rep outsb %gs:(%rsi), %dx
546546
rep outsl %gs:(%rsi), %dx
547547

548548
// CHECK: rep outsw %gs:(%rsi), %dx
549-
// CHECK: encoding: [0xf3,0x66,0x65,0x6f]
549+
// CHECK: encoding: [0xf3,0x65,0x66,0x6f]
550550
rep outsw %gs:(%rsi), %dx
551551

552552
// CHECK: rep scasl %es:(%rdi), %eax

llvm/test/MC/X86/I86-32.s

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -565,7 +565,7 @@ cmpsb %es:(%edi), %es:(%esi)
565565
cmpsl %es:(%edi), %es:(%esi)
566566

567567
// CHECK: cmpsw %es:(%edi), %es:(%esi)
568-
// CHECK: encoding: [0x66,0x26,0xa7]
568+
// CHECK: encoding: [0x26,0x66,0xa7]
569569
cmpsw %es:(%edi), %es:(%esi)
570570

571571
// CHECK: cmpw $0, -485498096(%edx,%eax,4)
@@ -1197,7 +1197,7 @@ lock xchgl %eax, (%edx)
11971197
lodsb %es:(%esi), %al
11981198

11991199
// CHECK: lodsw %es:(%esi), %ax
1200-
// CHECK: encoding: [0x66,0x26,0xad]
1200+
// CHECK: encoding: [0x26,0x66,0xad]
12011201
lodsw %es:(%esi), %ax
12021202

12031203
// CHECK: loop 64
@@ -1345,7 +1345,7 @@ movsb %es:(%esi), %es:(%edi)
13451345
movsl %es:(%esi), %es:(%edi)
13461346

13471347
// CHECK: movsw %es:(%esi), %es:(%edi)
1348-
// CHECK: encoding: [0x66,0x26,0xa5]
1348+
// CHECK: encoding: [0x26,0x66,0xa5]
13491349
movsw %es:(%esi), %es:(%edi)
13501350

13511351
// CHECK: movw $0, -485498096(%edx,%eax,4)
@@ -2221,15 +2221,15 @@ rep cmpsb %es:(%edi), %es:(%esi)
22212221
rep cmpsl %es:(%edi), %es:(%esi)
22222222

22232223
// CHECK: rep cmpsw %es:(%edi), %es:(%esi)
2224-
// CHECK: encoding: [0xf3,0x66,0x26,0xa7]
2224+
// CHECK: encoding: [0xf3,0x26,0x66,0xa7]
22252225
rep cmpsw %es:(%edi), %es:(%esi)
22262226

22272227
// CHECK: rep lodsb %es:(%esi), %al
22282228
// CHECK: encoding: [0xf3,0x26,0xac]
22292229
rep lodsb %es:(%esi), %al
22302230

22312231
// CHECK: rep lodsw %es:(%esi), %ax
2232-
// CHECK: encoding: [0xf3,0x66,0x26,0xad]
2232+
// CHECK: encoding: [0xf3,0x26,0x66,0xad]
22332233
rep lodsw %es:(%esi), %ax
22342234

22352235
// CHECK: rep movsb %es:(%esi), %es:(%edi)
@@ -2241,7 +2241,7 @@ rep movsb %es:(%esi), %es:(%edi)
22412241
rep movsl %es:(%esi), %es:(%edi)
22422242

22432243
// CHECK: rep movsw %es:(%esi), %es:(%edi)
2244-
// CHECK: encoding: [0xf3,0x66,0x26,0xa5]
2244+
// CHECK: encoding: [0xf3,0x26,0x66,0xa5]
22452245
rep movsw %es:(%esi), %es:(%edi)
22462246

22472247
// CHECK: repne cmpsb %es:(%edi), %es:(%esi)
@@ -2253,15 +2253,15 @@ repne cmpsb %es:(%edi), %es:(%esi)
22532253
repne cmpsl %es:(%edi), %es:(%esi)
22542254

22552255
// CHECK: repne cmpsw %es:(%edi), %es:(%esi)
2256-
// CHECK: encoding: [0xf2,0x66,0x26,0xa7]
2256+
// CHECK: encoding: [0xf2,0x26,0x66,0xa7]
22572257
repne cmpsw %es:(%edi), %es:(%esi)
22582258

22592259
// CHECK: repne lodsb %es:(%esi), %al
22602260
// CHECK: encoding: [0xf2,0x26,0xac]
22612261
repne lodsb %es:(%esi), %al
22622262

22632263
// CHECK: repne lodsw %es:(%esi), %ax
2264-
// CHECK: encoding: [0xf2,0x66,0x26,0xad]
2264+
// CHECK: encoding: [0xf2,0x26,0x66,0xad]
22652265
repne lodsw %es:(%esi), %ax
22662266

22672267
// CHECK: repne movsb %es:(%esi), %es:(%edi)
@@ -2273,7 +2273,7 @@ repne movsb %es:(%esi), %es:(%edi)
22732273
repne movsl %es:(%esi), %es:(%edi)
22742274

22752275
// CHECK: repne movsw %es:(%esi), %es:(%edi)
2276-
// CHECK: encoding: [0xf2,0x66,0x26,0xa5]
2276+
// CHECK: encoding: [0xf2,0x26,0x66,0xa5]
22772277
repne movsw %es:(%esi), %es:(%edi)
22782278

22792279
// CHECK: repne scasb %es:(%edi), %al

0 commit comments

Comments
 (0)