Skip to content

Commit

Permalink
[X86][MC] Allow to specify any of the 8/16/32/64 register names inter…
Browse files Browse the repository at this point in the history
…changeably for R16-R31 (#73421)
  • Loading branch information
KanRobert committed Nov 27, 2023
1 parent 659e401 commit 27c0bc9
Show file tree
Hide file tree
Showing 2 changed files with 226 additions and 32 deletions.
132 changes: 100 additions & 32 deletions llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -786,6 +786,10 @@ MCRegister llvm::getX86SubSuperRegister(MCRegister Reg, unsigned Size,
#define SP_SUB_SUPER(R) SUB_SUPER(SPL, SP, ESP, RSP, R)
#define NO_SUB_SUPER(NO, REG) \
SUB_SUPER(R##NO##B, R##NO##W, R##NO##D, R##NO, REG)
#define NO_SUB_SUPER_B(NO) NO_SUB_SUPER(NO, R##NO##B)
#define NO_SUB_SUPER_W(NO) NO_SUB_SUPER(NO, R##NO##W)
#define NO_SUB_SUPER_D(NO) NO_SUB_SUPER(NO, R##NO##D)
#define NO_SUB_SUPER_Q(NO) NO_SUB_SUPER(NO, R##NO)
switch (Size) {
default:
llvm_unreachable("illegal register size");
Expand All @@ -809,14 +813,30 @@ MCRegister llvm::getX86SubSuperRegister(MCRegister Reg, unsigned Size,
DI_SUB_SUPER(DIL)
BP_SUB_SUPER(BPL)
SP_SUB_SUPER(SPL)
NO_SUB_SUPER(8, R8B)
NO_SUB_SUPER(9, R9B)
NO_SUB_SUPER(10, R10B)
NO_SUB_SUPER(11, R11B)
NO_SUB_SUPER(12, R12B)
NO_SUB_SUPER(13, R13B)
NO_SUB_SUPER(14, R14B)
NO_SUB_SUPER(15, R15B)
NO_SUB_SUPER_B(8)
NO_SUB_SUPER_B(9)
NO_SUB_SUPER_B(10)
NO_SUB_SUPER_B(11)
NO_SUB_SUPER_B(12)
NO_SUB_SUPER_B(13)
NO_SUB_SUPER_B(14)
NO_SUB_SUPER_B(15)
NO_SUB_SUPER_B(16)
NO_SUB_SUPER_B(17)
NO_SUB_SUPER_B(18)
NO_SUB_SUPER_B(19)
NO_SUB_SUPER_B(20)
NO_SUB_SUPER_B(21)
NO_SUB_SUPER_B(22)
NO_SUB_SUPER_B(23)
NO_SUB_SUPER_B(24)
NO_SUB_SUPER_B(25)
NO_SUB_SUPER_B(26)
NO_SUB_SUPER_B(27)
NO_SUB_SUPER_B(28)
NO_SUB_SUPER_B(29)
NO_SUB_SUPER_B(30)
NO_SUB_SUPER_B(31)
}
}
case 16:
Expand All @@ -830,14 +850,30 @@ MCRegister llvm::getX86SubSuperRegister(MCRegister Reg, unsigned Size,
DI_SUB_SUPER(DI)
BP_SUB_SUPER(BP)
SP_SUB_SUPER(SP)
NO_SUB_SUPER(8, R8W)
NO_SUB_SUPER(9, R9W)
NO_SUB_SUPER(10, R10W)
NO_SUB_SUPER(11, R11W)
NO_SUB_SUPER(12, R12W)
NO_SUB_SUPER(13, R13W)
NO_SUB_SUPER(14, R14W)
NO_SUB_SUPER(15, R15W)
NO_SUB_SUPER_W(8)
NO_SUB_SUPER_W(9)
NO_SUB_SUPER_W(10)
NO_SUB_SUPER_W(11)
NO_SUB_SUPER_W(12)
NO_SUB_SUPER_W(13)
NO_SUB_SUPER_W(14)
NO_SUB_SUPER_W(15)
NO_SUB_SUPER_W(16)
NO_SUB_SUPER_W(17)
NO_SUB_SUPER_W(18)
NO_SUB_SUPER_W(19)
NO_SUB_SUPER_W(20)
NO_SUB_SUPER_W(21)
NO_SUB_SUPER_W(22)
NO_SUB_SUPER_W(23)
NO_SUB_SUPER_W(24)
NO_SUB_SUPER_W(25)
NO_SUB_SUPER_W(26)
NO_SUB_SUPER_W(27)
NO_SUB_SUPER_W(28)
NO_SUB_SUPER_W(29)
NO_SUB_SUPER_W(30)
NO_SUB_SUPER_W(31)
}
case 32:
switch (Reg.id()) {
Expand All @@ -850,14 +886,30 @@ MCRegister llvm::getX86SubSuperRegister(MCRegister Reg, unsigned Size,
DI_SUB_SUPER(EDI)
BP_SUB_SUPER(EBP)
SP_SUB_SUPER(ESP)
NO_SUB_SUPER(8, R8D)
NO_SUB_SUPER(9, R9D)
NO_SUB_SUPER(10, R10D)
NO_SUB_SUPER(11, R11D)
NO_SUB_SUPER(12, R12D)
NO_SUB_SUPER(13, R13D)
NO_SUB_SUPER(14, R14D)
NO_SUB_SUPER(15, R15D)
NO_SUB_SUPER_D(8)
NO_SUB_SUPER_D(9)
NO_SUB_SUPER_D(10)
NO_SUB_SUPER_D(11)
NO_SUB_SUPER_D(12)
NO_SUB_SUPER_D(13)
NO_SUB_SUPER_D(14)
NO_SUB_SUPER_D(15)
NO_SUB_SUPER_D(16)
NO_SUB_SUPER_D(17)
NO_SUB_SUPER_D(18)
NO_SUB_SUPER_D(19)
NO_SUB_SUPER_D(20)
NO_SUB_SUPER_D(21)
NO_SUB_SUPER_D(22)
NO_SUB_SUPER_D(23)
NO_SUB_SUPER_D(24)
NO_SUB_SUPER_D(25)
NO_SUB_SUPER_D(26)
NO_SUB_SUPER_D(27)
NO_SUB_SUPER_D(28)
NO_SUB_SUPER_D(29)
NO_SUB_SUPER_D(30)
NO_SUB_SUPER_D(31)
}
case 64:
switch (Reg.id()) {
Expand All @@ -870,14 +922,30 @@ MCRegister llvm::getX86SubSuperRegister(MCRegister Reg, unsigned Size,
DI_SUB_SUPER(RDI)
BP_SUB_SUPER(RBP)
SP_SUB_SUPER(RSP)
NO_SUB_SUPER(8, R8)
NO_SUB_SUPER(9, R9)
NO_SUB_SUPER(10, R10)
NO_SUB_SUPER(11, R11)
NO_SUB_SUPER(12, R12)
NO_SUB_SUPER(13, R13)
NO_SUB_SUPER(14, R14)
NO_SUB_SUPER(15, R15)
NO_SUB_SUPER_Q(8)
NO_SUB_SUPER_Q(9)
NO_SUB_SUPER_Q(10)
NO_SUB_SUPER_Q(11)
NO_SUB_SUPER_Q(12)
NO_SUB_SUPER_Q(13)
NO_SUB_SUPER_Q(14)
NO_SUB_SUPER_Q(15)
NO_SUB_SUPER_Q(16)
NO_SUB_SUPER_Q(17)
NO_SUB_SUPER_Q(18)
NO_SUB_SUPER_Q(19)
NO_SUB_SUPER_Q(20)
NO_SUB_SUPER_Q(21)
NO_SUB_SUPER_Q(22)
NO_SUB_SUPER_Q(23)
NO_SUB_SUPER_Q(24)
NO_SUB_SUPER_Q(25)
NO_SUB_SUPER_Q(26)
NO_SUB_SUPER_Q(27)
NO_SUB_SUPER_Q(28)
NO_SUB_SUPER_Q(29)
NO_SUB_SUPER_Q(30)
NO_SUB_SUPER_Q(31)
}
}
}
126 changes: 126 additions & 0 deletions llvm/test/CodeGen/X86/asm-mismatched-types.ll
Original file line number Diff line number Diff line change
Expand Up @@ -133,3 +133,129 @@ define void @reg8_as_16(i16 %p) {
call void asm sideeffect "# REG: $0", "{dil}"(i16 %p)
ret void
}

; CHECK-LABEL: egpr_reg64_as_32:
; CHECK: # REG: %r16d
define void @egpr_reg64_as_32(i32 %p) {
call void asm sideeffect "# REG: $0", "{r16}"(i32 %p)
ret void
}

; CHECK-LABEL: egpr_reg64_as_32_float:
; CHECK: # REG: %r16d
define void @egpr_reg64_as_32_float(float %p) {
call void asm sideeffect "# REG: $0", "{r16}"(float %p)
ret void
}

; CHECK-LABEL: egpr_reg64_as_16:
; CHECK: # REG: %r17w
define void @egpr_reg64_as_16(i16 %p) {
call void asm sideeffect "# REG: $0", "{r17}"(i16 %p)
ret void
}

; CHECK-LABEL: egpr_reg64_as_8:
; CHECK: # REG: %r21b
define void @egpr_reg64_as_8(i8 %p) {
call void asm sideeffect "# REG: $0", "{r21}"(i8 %p)
ret void
}

; CHECK-LABEL: egpr_reg32_as_16:
; CHECK: # REG: %r21w
define void @egpr_reg32_as_16(i16 %p) {
call void asm sideeffect "# REG: $0", "{r21d}"(i16 %p)
ret void
}

; CHECK-LABEL: egpr_reg32_as_8:
; CHECK: # REG: %r20b
define void @egpr_reg32_as_8(i8 %p) {
call void asm sideeffect "# REG: $0", "{r20d}"(i8 %p)
ret void
}

; CHECK-LABEL: egpr_reg16_as_8:
; CHECK: # REG: %r17b
define void @egpr_reg16_as_8(i8 %p) {
call void asm sideeffect "# REG: $0", "{r17w}"(i8 %p)
ret void
}

; CHECK-LABEL: egpr_reg32_as_64:
; CHECK: # REG: %r21
define void @egpr_reg32_as_64(i64 %p) {
call void asm sideeffect "# REG: $0", "{r21d}"(i64 %p)
ret void
}

; CHECK-LABEL: egpr_reg32_as_64_float:
; CHECK: # REG: %r21
define void @egpr_reg32_as_64_float(double %p) {
call void asm sideeffect "# REG: $0", "{r21d}"(double %p)
ret void
}

; CHECK-LABEL: egpr_reg16_as_64:
; CHECK: # REG: %r21
define void @egpr_reg16_as_64(i64 %p) {
call void asm sideeffect "# REG: $0", "{r21w}"(i64 %p)
ret void
}

; CHECK-LABEL: egpr_reg16_as_64_float:
; CHECK: # REG: %r21
define void @egpr_reg16_as_64_float(double %p) {
call void asm sideeffect "# REG: $0", "{r21w}"(double %p)
ret void
}

; CHECK-LABEL: egpr_reg8_as_64:
; CHECK: # REG: %r16
define void @egpr_reg8_as_64(i64 %p) {
call void asm sideeffect "# REG: $0", "{r16b}"(i64 %p)
ret void
}

; CHECK-LABEL: egpr_reg8_as_64_float:
; CHECK: # REG: %r16
define void @egpr_reg8_as_64_float(double %p) {
call void asm sideeffect "# REG: $0", "{r16b}"(double %p)
ret void
}

; CHECK-LABEL: egpr_reg16_as_32:
; CHECK: # REG: %r19d
define void @egpr_reg16_as_32(i32 %p) {
call void asm sideeffect "# REG: $0", "{r19w}"(i32 %p)
ret void
}

; CHECK-LABEL: egpr_reg16_as_32_float:
; CHECK: # REG: %r19d
define void @egpr_reg16_as_32_float(float %p) {
call void asm sideeffect "# REG: $0", "{r19w}"(float %p)
ret void
}

; CHECK-LABEL: egpr_reg8_as_32:
; CHECK: # REG: %r17d
define void @egpr_reg8_as_32(i32 %p) {
call void asm sideeffect "# REG: $0", "{r17b}"(i32 %p)
ret void
}

; CHECK-LABEL: egpr_reg8_as_32_float:
; CHECK: # REG: %r17d
define void @egpr_reg8_as_32_float(float %p) {
call void asm sideeffect "# REG: $0", "{r17b}"(float %p)
ret void
}

; CHECK-LABEL: egpr_reg8_as_16:
; CHECK: # REG: %r18w
define void @egpr_reg8_as_16(i16 %p) {
call void asm sideeffect "# REG: $0", "{r18b}"(i16 %p)
ret void
}

0 comments on commit 27c0bc9

Please sign in to comment.