Skip to content

Commit a9183b8

Browse files
committed
[X86][MC] Fix encoding bug for CCMP introduced in llvm#85175
1 parent 38bed81 commit a9183b8

File tree

3 files changed

+39
-13
lines changed

3 files changed

+39
-13
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,8 @@ static bool optimizeToShortImmediateForm(MCInst &MI) {
481481
return false;
482482
#include "X86EncodingOptimizationForImmediate.def"
483483
}
484-
MCOperand &LastOp = MI.getOperand(MI.getNumOperands() - 1);
484+
unsigned SkipOperands = X86::isCCMPCC(MI.getOpcode()) ? 2 : 0;
485+
MCOperand &LastOp = MI.getOperand(MI.getNumOperands() - 1 - SkipOperands);
485486
if (LastOp.isExpr()) {
486487
const MCSymbolRefExpr *SRE = dyn_cast<MCSymbolRefExpr>(LastOp.getExpr());
487488
if (!SRE || SRE->getKind() != MCSymbolRefExpr::VK_X86_ABS8)

llvm/test/CodeGen/X86/apx/ccmp.ll

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -505,7 +505,7 @@ define void @ccmp16ri_zf(i16 noundef %a, i16 noundef %b, i16 noundef %c) {
505505
; CHECK: # %bb.0: # %entry
506506
; CHECK-NEXT: cmpw %dx, %di # encoding: [0x66,0x39,0xd7]
507507
; CHECK-NEXT: movswl %si, %eax # encoding: [0x0f,0xbf,0xc6]
508-
; CHECK-NEXT: ccmpael {dfv=sf} $1234, %eax # encoding: [0x62,0xf4,0x24,0x03,0x83,0xf8,0xd2]
508+
; CHECK-NEXT: ccmpael {dfv=sf} $1234, %eax # encoding: [0x62,0xf4,0x24,0x03,0x81,0xf8,0xd2,0x04,0x00,0x00]
509509
; CHECK-NEXT: # imm = 0x4D2
510510
; CHECK-NEXT: jge .LBB12_1 # encoding: [0x7d,A]
511511
; CHECK-NEXT: # fixup A - offset: 1, value: .LBB12_1-1, kind: FK_PCRel_1
@@ -521,7 +521,7 @@ define void @ccmp16ri_zf(i16 noundef %a, i16 noundef %b, i16 noundef %c) {
521521
; NDD: # %bb.0: # %entry
522522
; NDD-NEXT: cmpw %dx, %di # encoding: [0x66,0x39,0xd7]
523523
; NDD-NEXT: movswl %si, %eax # encoding: [0x0f,0xbf,0xc6]
524-
; NDD-NEXT: ccmpael {dfv=sf} $1234, %eax # encoding: [0x62,0xf4,0x24,0x03,0x83,0xf8,0xd2]
524+
; NDD-NEXT: ccmpael {dfv=sf} $1234, %eax # encoding: [0x62,0xf4,0x24,0x03,0x81,0xf8,0xd2,0x04,0x00,0x00]
525525
; NDD-NEXT: # imm = 0x4D2
526526
; NDD-NEXT: jge .LBB12_1 # encoding: [0x7d,A]
527527
; NDD-NEXT: # fixup A - offset: 1, value: .LBB12_1-1, kind: FK_PCRel_1
@@ -550,7 +550,7 @@ define void @ccmp32ri_cf(i32 noundef %a, i32 noundef %b, i32 noundef %c) {
550550
; CHECK-LABEL: ccmp32ri_cf:
551551
; CHECK: # %bb.0: # %entry
552552
; CHECK-NEXT: cmpl %edx, %edi # encoding: [0x39,0xd7]
553-
; CHECK-NEXT: ccmpbl {dfv=cf} $1048577, %esi # encoding: [0x62,0xf4,0x0c,0x02,0x83,0xfe,0x01]
553+
; CHECK-NEXT: ccmpbl {dfv=cf} $1048577, %esi # encoding: [0x62,0xf4,0x0c,0x02,0x81,0xfe,0x01,0x00,0x10,0x00]
554554
; CHECK-NEXT: # imm = 0x100001
555555
; CHECK-NEXT: jae .LBB13_1 # encoding: [0x73,A]
556556
; CHECK-NEXT: # fixup A - offset: 1, value: .LBB13_1-1, kind: FK_PCRel_1
@@ -565,7 +565,7 @@ define void @ccmp32ri_cf(i32 noundef %a, i32 noundef %b, i32 noundef %c) {
565565
; NDD-LABEL: ccmp32ri_cf:
566566
; NDD: # %bb.0: # %entry
567567
; NDD-NEXT: cmpl %edx, %edi # encoding: [0x39,0xd7]
568-
; NDD-NEXT: ccmpbl {dfv=cf} $1048577, %esi # encoding: [0x62,0xf4,0x0c,0x02,0x83,0xfe,0x01]
568+
; NDD-NEXT: ccmpbl {dfv=cf} $1048577, %esi # encoding: [0x62,0xf4,0x0c,0x02,0x81,0xfe,0x01,0x00,0x10,0x00]
569569
; NDD-NEXT: # imm = 0x100001
570570
; NDD-NEXT: jae .LBB13_1 # encoding: [0x73,A]
571571
; NDD-NEXT: # fixup A - offset: 1, value: .LBB13_1-1, kind: FK_PCRel_1
@@ -594,7 +594,7 @@ define void @ccmp64ri32_zf(i64 noundef %a, i64 noundef %b, i64 noundef %c) {
594594
; CHECK-LABEL: ccmp64ri32_zf:
595595
; CHECK: # %bb.0: # %entry
596596
; CHECK-NEXT: cmpq %rdx, %rdi # encoding: [0x48,0x39,0xd7]
597-
; CHECK-NEXT: ccmpbeq {dfv=sf} $123456, %rsi # encoding: [0x62,0xf4,0xa4,0x06,0x83,0xfe,0x40]
597+
; CHECK-NEXT: ccmpbeq {dfv=sf} $123456, %rsi # encoding: [0x62,0xf4,0xa4,0x06,0x81,0xfe,0x40,0xe2,0x01,0x00]
598598
; CHECK-NEXT: # imm = 0x1E240
599599
; CHECK-NEXT: jge .LBB14_1 # encoding: [0x7d,A]
600600
; CHECK-NEXT: # fixup A - offset: 1, value: .LBB14_1-1, kind: FK_PCRel_1
@@ -609,7 +609,7 @@ define void @ccmp64ri32_zf(i64 noundef %a, i64 noundef %b, i64 noundef %c) {
609609
; NDD-LABEL: ccmp64ri32_zf:
610610
; NDD: # %bb.0: # %entry
611611
; NDD-NEXT: cmpq %rdx, %rdi # encoding: [0x48,0x39,0xd7]
612-
; NDD-NEXT: ccmpbeq {dfv=sf} $123456, %rsi # encoding: [0x62,0xf4,0xa4,0x06,0x83,0xfe,0x40]
612+
; NDD-NEXT: ccmpbeq {dfv=sf} $123456, %rsi # encoding: [0x62,0xf4,0xa4,0x06,0x81,0xfe,0x40,0xe2,0x01,0x00]
613613
; NDD-NEXT: # imm = 0x1E240
614614
; NDD-NEXT: jge .LBB14_1 # encoding: [0x7d,A]
615615
; NDD-NEXT: # fixup A - offset: 1, value: .LBB14_1-1, kind: FK_PCRel_1
@@ -1025,7 +1025,7 @@ define void @ccmp16mi_zf(i16 noundef %a, i16 noundef %c, ptr %ptr) {
10251025
; CHECK-LABEL: ccmp16mi_zf:
10261026
; CHECK: # %bb.0: # %entry
10271027
; CHECK-NEXT: cmpw %si, %di # encoding: [0x66,0x39,0xf7]
1028-
; CHECK-NEXT: ccmplew {dfv=sf} $1234, (%rdx) # encoding: [0x62,0xf4,0x25,0x0e,0x83,0x3a,0xd2]
1028+
; CHECK-NEXT: ccmplew {dfv=sf} $1234, (%rdx) # encoding: [0x62,0xf4,0x25,0x0e,0x81,0x3a,0xd2,0x04]
10291029
; CHECK-NEXT: # imm = 0x4D2
10301030
; CHECK-NEXT: jge .LBB24_1 # encoding: [0x7d,A]
10311031
; CHECK-NEXT: # fixup A - offset: 1, value: .LBB24_1-1, kind: FK_PCRel_1
@@ -1040,7 +1040,7 @@ define void @ccmp16mi_zf(i16 noundef %a, i16 noundef %c, ptr %ptr) {
10401040
; NDD-LABEL: ccmp16mi_zf:
10411041
; NDD: # %bb.0: # %entry
10421042
; NDD-NEXT: cmpw %si, %di # encoding: [0x66,0x39,0xf7]
1043-
; NDD-NEXT: ccmplew {dfv=sf} $1234, (%rdx) # encoding: [0x62,0xf4,0x25,0x0e,0x83,0x3a,0xd2]
1043+
; NDD-NEXT: ccmplew {dfv=sf} $1234, (%rdx) # encoding: [0x62,0xf4,0x25,0x0e,0x81,0x3a,0xd2,0x04]
10441044
; NDD-NEXT: # imm = 0x4D2
10451045
; NDD-NEXT: jge .LBB24_1 # encoding: [0x7d,A]
10461046
; NDD-NEXT: # fixup A - offset: 1, value: .LBB24_1-1, kind: FK_PCRel_1
@@ -1070,7 +1070,7 @@ define void @ccmp32mi_cf(i32 noundef %a, i32 noundef %c, ptr %ptr) {
10701070
; CHECK-LABEL: ccmp32mi_cf:
10711071
; CHECK: # %bb.0: # %entry
10721072
; CHECK-NEXT: cmpl %esi, %edi # encoding: [0x39,0xf7]
1073-
; CHECK-NEXT: ccmpnel {dfv=cf} $123457, (%rdx) # encoding: [0x62,0xf4,0x0c,0x05,0x83,0x3a,0x41]
1073+
; CHECK-NEXT: ccmpnel {dfv=cf} $123457, (%rdx) # encoding: [0x62,0xf4,0x0c,0x05,0x81,0x3a,0x41,0xe2,0x01,0x00]
10741074
; CHECK-NEXT: # imm = 0x1E241
10751075
; CHECK-NEXT: jae .LBB25_1 # encoding: [0x73,A]
10761076
; CHECK-NEXT: # fixup A - offset: 1, value: .LBB25_1-1, kind: FK_PCRel_1
@@ -1085,7 +1085,7 @@ define void @ccmp32mi_cf(i32 noundef %a, i32 noundef %c, ptr %ptr) {
10851085
; NDD-LABEL: ccmp32mi_cf:
10861086
; NDD: # %bb.0: # %entry
10871087
; NDD-NEXT: cmpl %esi, %edi # encoding: [0x39,0xf7]
1088-
; NDD-NEXT: ccmpnel {dfv=cf} $123457, (%rdx) # encoding: [0x62,0xf4,0x0c,0x05,0x83,0x3a,0x41]
1088+
; NDD-NEXT: ccmpnel {dfv=cf} $123457, (%rdx) # encoding: [0x62,0xf4,0x0c,0x05,0x81,0x3a,0x41,0xe2,0x01,0x00]
10891089
; NDD-NEXT: # imm = 0x1E241
10901090
; NDD-NEXT: jae .LBB25_1 # encoding: [0x73,A]
10911091
; NDD-NEXT: # fixup A - offset: 1, value: .LBB25_1-1, kind: FK_PCRel_1
@@ -1115,7 +1115,7 @@ define void @ccmp64mi32_zf(i64 noundef %a, i64 noundef %c, ptr %ptr) {
11151115
; CHECK-LABEL: ccmp64mi32_zf:
11161116
; CHECK: # %bb.0: # %entry
11171117
; CHECK-NEXT: cmpq %rsi, %rdi # encoding: [0x48,0x39,0xf7]
1118-
; CHECK-NEXT: ccmpleq {dfv=sf} $123456, (%rdx) # encoding: [0x62,0xf4,0xa4,0x0e,0x83,0x3a,0x40]
1118+
; CHECK-NEXT: ccmpleq {dfv=sf} $123456, (%rdx) # encoding: [0x62,0xf4,0xa4,0x0e,0x81,0x3a,0x40,0xe2,0x01,0x00]
11191119
; CHECK-NEXT: # imm = 0x1E240
11201120
; CHECK-NEXT: jge .LBB26_1 # encoding: [0x7d,A]
11211121
; CHECK-NEXT: # fixup A - offset: 1, value: .LBB26_1-1, kind: FK_PCRel_1
@@ -1130,7 +1130,7 @@ define void @ccmp64mi32_zf(i64 noundef %a, i64 noundef %c, ptr %ptr) {
11301130
; NDD-LABEL: ccmp64mi32_zf:
11311131
; NDD: # %bb.0: # %entry
11321132
; NDD-NEXT: cmpq %rsi, %rdi # encoding: [0x48,0x39,0xf7]
1133-
; NDD-NEXT: ccmpleq {dfv=sf} $123456, (%rdx) # encoding: [0x62,0xf4,0xa4,0x0e,0x83,0x3a,0x40]
1133+
; NDD-NEXT: ccmpleq {dfv=sf} $123456, (%rdx) # encoding: [0x62,0xf4,0xa4,0x0e,0x81,0x3a,0x40,0xe2,0x01,0x00]
11341134
; NDD-NEXT: # imm = 0x1E240
11351135
; NDD-NEXT: jge .LBB26_1 # encoding: [0x7d,A]
11361136
; NDD-NEXT: # fixup A - offset: 1, value: .LBB26_1-1, kind: FK_PCRel_1

llvm/test/MC/X86/apx/ccmp-encopt.s

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# RUN: llvm-mc -triple x86_64 -show-encoding %s | FileCheck %s
2+
3+
# CHECK: ccmpew {dfv=} $123, %ax
4+
# CHECK: encoding: [0x62,0xf4,0x05,0x04,0x83,0xf8,0x7b]
5+
ccmpew {dfv=} $123, %ax
6+
7+
# CHECK: ccmpel {dfv=} $123, %eax
8+
# CHECK: encoding: [0x62,0xf4,0x04,0x04,0x83,0xf8,0x7b]
9+
ccmpel {dfv=} $123, %eax
10+
11+
# CHECK: ccmpeq {dfv=} $123, %rax
12+
# CHECK: encoding: [0x62,0xf4,0x84,0x04,0x83,0xf8,0x7b]
13+
ccmpeq {dfv=} $123, %rax
14+
15+
# CHECK: ccmpew {dfv=} $123, (%rdx)
16+
# CHECK: encoding: [0x62,0xf4,0x05,0x04,0x83,0x3a,0x7b]
17+
ccmpew {dfv=} $123, (%rdx)
18+
19+
# CHECK: ccmpel {dfv=} $123, (%rdx)
20+
# CHECK: encoding: [0x62,0xf4,0x04,0x04,0x83,0x3a,0x7b]
21+
ccmpel {dfv=} $123, (%rdx)
22+
23+
# CHECK: ccmpeq {dfv=} $123, (%rdx)
24+
# CHECK: encoding: [0x62,0xf4,0x84,0x04,0x83,0x3a,0x7b]
25+
ccmpeq {dfv=} $123, (%rdx)

0 commit comments

Comments
 (0)