add aliases for movs between seg registers and mem. There are multiple
authorChris Lattner <sabre@nondot.org>
Sat, 6 Nov 2010 22:35:34 +0000 (22:35 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 6 Nov 2010 22:35:34 +0000 (22:35 +0000)
different forms of this instruction (movw/movl/movq) which we reported
as being ambiguous.  Since they all do the same thing, gas just picks the
one with the shortest encoding.  Follow its lead here.

This implements rdar://8208615

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118362 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86InstrInfo.td
test/MC/X86/x86-64.s

index fb6c7a5fd3fdb972f4cac6e5450121b7bc5de498..bd0e86f94127752b04bd8ef4c81cd638ae1ed10d 100644 (file)
@@ -1465,6 +1465,11 @@ def : InstAlias<"jmpw $seg, $off",  (FARJMP16i  i16imm:$off, i16imm:$seg)>;
 def : InstAlias<"calll $seg, $off", (FARCALL32i i32imm:$off, i16imm:$seg)>;
 def : InstAlias<"jmpl $seg, $off",  (FARJMP32i  i32imm:$off, i16imm:$seg)>;
 
+// Force mov without a suffix with a segment and mem to prefer the 'l' form of
+// the move.  All segment/mem forms are equivalent, this has the shortest
+// encoding.
+def : InstAlias<"mov $mem, $seg", (MOV32sm SEGMENT_REG:$seg, i32mem:$mem)>;
+def : InstAlias<"mov $seg, $mem", (MOV32ms i32mem:$mem, SEGMENT_REG:$seg)>;
 
 // Match 'movq <largeimm>, <reg>' as an alias for movabsq.
 def : InstAlias<"movq $imm, $reg", (MOV64ri GR64:$reg, i64imm:$imm)>;
index 3df90217d8d5e5de376b1bfe05f738cd77773a89..6a24e3921993a2832d5f1fd3275f210755d8eb70 100644 (file)
@@ -873,3 +873,10 @@ decl %eax // CHECK:        decl    %eax # encoding: [0xff,0xc8]
 // CHECK: sidt 4(%rax)
 // CHECK:  encoding: [0x0f,0x01,0x48,0x04]
                sidtq   4(%rax)
+
+
+// rdar://8208615
+mov (%rsi), %gs  // CHECK: movl        (%rsi), %gs # encoding: [0x8e,0x2e]
+mov %gs, (%rsi)  // CHECK: movl        %gs, (%rsi) # encoding: [0x8c,0x2e]
+
+