Skip to content

Commit 7d2182f

Browse files
committed
[x86][MC]: Fix data16 and data32.
1 parent af19927 commit 7d2182f

File tree

6 files changed

+27
-30
lines changed

6 files changed

+27
-30
lines changed

llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3580,7 +3580,6 @@ bool X86AsmParser::parseInstruction(ParseInstructionInfo &Info, StringRef Name,
35803580
if (Next == "lgdt") {
35813581
if (is64BitMode()) {
35823582
// Use the special lgdtq variant with OpSize16 flag.
3583-
// I think the CPU ignores the prefix anyway--but hey.
35843583
Next = "lgdtq16";
35853584
} else {
35863585
Next = "lgdtw";
@@ -3606,9 +3605,9 @@ bool X86AsmParser::parseInstruction(ParseInstructionInfo &Info, StringRef Name,
36063605
getLexer().Lex();
36073606
// data32 effectively changes the instruction suffix.
36083607
// TODO Generalize.
3609-
if (Next == "callw")
3608+
if (Next == "call")
36103609
Next = "calll";
3611-
if (Next == "ljmpw")
3610+
if (Next == "ljmp")
36123611
Next = "ljmpl";
36133612

36143613
Name = Next;

llvm/lib/Target/X86/X86InstrAsmAlias.td

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,12 @@ defm : CMPCCXADD_Aliases<"g", 15>;
249249
def : MnemonicAlias<"call", "callw", "att">, Requires<[In16BitMode]>;
250250
def : MnemonicAlias<"call", "calll", "att">, Requires<[In32BitMode]>;
251251
def : MnemonicAlias<"call", "callq", "att">, Requires<[In64BitMode]>;
252+
def : MnemonicAlias<"call", "callw", "intel">, Requires<[In16BitMode]>;
253+
def : MnemonicAlias<"call", "calll", "intel">, Requires<[In32BitMode]>;
254+
def : MnemonicAlias<"call", "callq", "intel">, Requires<[In64BitMode]>;
255+
256+
def : MnemonicAlias<"ljmp", "ljmpw", "intel">, Requires<[In16BitMode]>;
257+
def : MnemonicAlias<"ljmp", "ljmpl", "intel">, Requires<[In32BitMode]>;
252258

253259
def : MnemonicAlias<"cbw", "cbtw", "att">;
254260
def : MnemonicAlias<"cwde", "cwtl", "att">;
@@ -668,6 +674,11 @@ def : InstAlias<"jmpw\t$seg, $off", (FARJMP16i i16imm:$off, i16imm:$seg)>, Req
668674
def : InstAlias<"calll\t$seg, $off", (FARCALL32i i32imm:$off, i16imm:$seg)>, Requires<[Not64BitMode]>;
669675
def : InstAlias<"jmpl\t$seg, $off", (FARJMP32i i32imm:$off, i16imm:$seg)>, Requires<[Not64BitMode]>;
670676

677+
// Near call aliases for data16/data32 prefix support
678+
def : InstAlias<"callw\t$dst", (CALLpcrel16 i16imm_brtarget:$dst)>;
679+
def : InstAlias<"calll\t$dst", (CALLpcrel32 i32imm_brtarget:$dst)>, Requires<[Not64BitMode]>;
680+
def : InstAlias<"callq\t$dst", (CALL64pcrel32 i64i32imm_brtarget:$dst)>, Requires<[In64BitMode]>;
681+
671682
// Match 'movq <largeimm>, <reg>' as an alias for movabsq.
672683
def : InstAlias<"mov{q}\t{$imm, $reg|$reg, $imm}", (MOV64ri GR64:$reg, i64imm:$imm), 0>;
673684

@@ -727,6 +738,7 @@ def : InstAlias<"shrd{q}\t{$reg, $mem|$mem, $reg}", (SHRD64mrCL i64mem:$mem, GR6
727738

728739
// test: We accept "testX <reg>, <mem>" and "testX <mem>, <reg>" as synonyms.
729740
def : InstAlias<"ljmpw\t$seg, $off", (FARJMP16i i16imm:$off, i16imm:$seg)>, Requires<[Not64BitMode]>;
741+
def : InstAlias<"ljmpl\t$seg, $off", (FARJMP32i i32imm:$off, i16imm:$seg)>, Requires<[Not64BitMode]>;
730742
def : InstAlias<"test{b}\t{$mem, $val|$val, $mem}",
731743
(TEST8mr i8mem :$mem, GR8 :$val), 0>;
732744
def : InstAlias<"test{w}\t{$mem, $val|$val, $mem}",

llvm/lib/Target/X86/X86InstrControl.td

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -166,16 +166,16 @@ let isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1 in {
166166
Requires<[In64BitMode]>, Sched<[WriteJumpLd]>, NOTRACK;
167167
}
168168

169-
let Predicates = [Not64BitMode], AsmVariantName = "att" in {
169+
let Predicates = [Not64BitMode], AsmVariantName = "att" in
170170
def FARJMP32i : Iseg32<0xEA, RawFrmImm16, (outs),
171171
(ins i32imm:$off, i16imm:$seg),
172172
"ljmp{l}\t$seg, $off", []>,
173173
OpSize32, Sched<[WriteJump]>;
174+
let AsmVariantName = "att" in
174175
def FARJMP16i : Iseg16<0xEA, RawFrmImm16, (outs),
175176
(ins i16imm:$off, i16imm:$seg),
176177
"ljmp{w}\t$seg, $off", []>,
177178
OpSize16, Sched<[WriteJump]>;
178-
}
179179
let mayLoad = 1 in {
180180
def FARJMP64m : RI<0xFF, MRM5m, (outs), (ins opaquemem:$dst),
181181
"ljmp{q}\t{*}$dst", []>, Sched<[WriteJump]>, Requires<[In64BitMode]>;
@@ -214,11 +214,6 @@ let isCall = 1 in
214214
(outs), (ins i32imm_brtarget:$dst),
215215
"call{l}\t$dst", []>, OpSize32,
216216
Requires<[Not64BitMode]>, Sched<[WriteJump]>;
217-
let hasSideEffects = 0 in
218-
def CALLpcrel16 : Ii16PCRel<0xE8, RawFrm,
219-
(outs), (ins i16imm_brtarget:$dst),
220-
"call{w}\t$dst", []>, OpSize16,
221-
Requires<[Not64BitMode]>, Sched<[WriteJump]>;
222217
def CALL16r : I<0xFF, MRM2r, (outs), (ins GR16:$dst),
223218
"call{w}\t{*}$dst", [(X86call GR16:$dst)]>,
224219
OpSize16, Requires<[Not64BitMode]>, Sched<[WriteJump]>;
@@ -329,6 +324,11 @@ let isCall = 1, Uses = [RSP, SSP], SchedRW = [WriteJump] in {
329324
(outs), (ins i64i32imm_brtarget:$dst),
330325
"call{q}\t$dst", []>, OpSize32,
331326
Requires<[In64BitMode]>;
327+
let hasSideEffects = 0 in
328+
def CALLpcrel16 : Ii16PCRel<0xE8, RawFrm,
329+
(outs), (ins i16imm_brtarget:$dst),
330+
"call{w}\t$dst", []>, OpSize16,
331+
Sched<[WriteJump]>;
332332
def CALL64r : I<0xFF, MRM2r, (outs), (ins GR64:$dst),
333333
"call{q}\t{*}$dst", [(X86call GR64:$dst)]>,
334334
Requires<[In64BitMode,NotUseIndirectThunkCalls,ImportCallOptimizationDisabled]>;

llvm/test/MC/X86/data-prefix-fail.s

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,12 @@
1111
// X86-16-SAME: encoding: [0x66,0x0f,0x01,0x16,0x00,0x00]
1212
data32 lgdt 0
1313

14-
// X86-64: data16
15-
// X86-64: encoding: [0x66]
16-
// X86-64: lgdtq 0
17-
// X86-64: encoding: [0x0f,0x01,0x14,0x25,0x00,0x00,0x00,0x00]
18-
// X86-32: data16
19-
// X86-32: encoding: [0x66]
20-
// X86-32: lgdtl 0
21-
// X86-32: encoding: [0x0f,0x01,0x15,0x00,0x00,0x00,0x00]
14+
// X86-64: encoding: [0x66,0x0f,0x01,0x14,0x25,0x00,0x00,0x00,0x00]
15+
// X86-32: encoding: [0x66,0x0f,0x01,0x15,0x00,0x00,0x00,0x00]
2216
// ERR16: error: redundant data16 prefix
2317
data16 lgdt 0
2418

25-
// X86-64: data16 # encoding: [0x66]
26-
// X86-64-NEXT: callq 0 # encoding: [0xe8,A,A,A,A]
27-
// X86-32: data16 # encoding: [0x66]
28-
// X86-32-NEXT: calll 0 # encoding: [0xe8,A,A,A,A]
19+
// X86-64: callw 0 # encoding: [0x66,0xe8,A,A]
20+
// X86-32: callw 0 # encoding: [0x66,0xe8,A,A]
2921
// ERR16: {{.*}}.s:[[#@LINE+1]]:1: error: redundant data16 prefix
3022
data16 call 0

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1101,10 +1101,7 @@ lretw
11011101
// CHECK: encoding: [0x66]
11021102
data16
11031103

1104-
// CHECK: data16
1105-
// CHECK: encoding: [0x66]
1106-
// CHECK: lgdtl 4(%eax)
1107-
// CHECK: encoding: [0x0f,0x01,0x50,0x04]
1104+
// CHECK: encoding: [0x66,0x0f,0x01,0x50,0x04]
11081105
data16 lgdt 4(%eax)
11091106

11101107
// CHECK: rdpid %eax

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1081,10 +1081,7 @@ movq %mm5, %rbx // CHECK: movq %mm5, %rbx # encoding: [0x48,0x0f,0x7e,0xeb]
10811081
rex64 // CHECK: rex64 # encoding: [0x48]
10821082
data16 // CHECK: data16 # encoding: [0x66]
10831083

1084-
// CHECK: data16
1085-
// CHECK: encoding: [0x66]
1086-
// CHECK: lgdtq 4(%rax)
1087-
// CHECK: encoding: [0x0f,0x01,0x50,0x04]
1084+
// CHECK: encoding: [0x66,0x0f,0x01,0x50,0x04]
10881085
data16 lgdt 4(%rax)
10891086

10901087
// PR8855

0 commit comments

Comments
 (0)