Skip to content

Commit 8ddb0fc

Browse files
authored
[X86] Correct operand order of UWRMSR. (#76389)
1 parent b3ef8dc commit 8ddb0fc

File tree

3 files changed

+27
-6
lines changed

3 files changed

+27
-6
lines changed

clang/lib/Headers/usermsrintrin.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,33 @@
1414
#define __USERMSRINTRIN_H
1515
#ifdef __x86_64__
1616

17+
/// Reads the contents of a 64-bit MSR specified in \a __A into \a dst.
18+
///
19+
/// This intrinsic corresponds to the <c> URDMSR </c> instruction.
20+
/// \param __A
21+
/// An unsigned long long.
22+
///
23+
/// \code{.operation}
24+
/// DEST := MSR[__A]
25+
/// \endcode
1726
static __inline__ unsigned long long
1827
__attribute__((__always_inline__, __nodebug__, __target__("usermsr")))
1928
_urdmsr(unsigned long long __A) {
2029
return __builtin_ia32_urdmsr(__A);
2130
}
2231

32+
/// Writes the contents of \a __B into the 64-bit MSR specified in \a __A.
33+
///
34+
/// This intrinsic corresponds to the <c> UWRMSR </c> instruction.
35+
///
36+
/// \param __A
37+
/// An unsigned long long.
38+
/// \param __B
39+
/// An unsigned long long.
40+
///
41+
/// \code{.operation}
42+
/// MSR[__A] := __B
43+
/// \endcode
2344
static __inline__ void
2445
__attribute__((__always_inline__, __nodebug__, __target__("usermsr")))
2546
_uwrmsr(unsigned long long __A, unsigned long long __B) {

llvm/lib/Target/X86/X86InstrSystem.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -446,11 +446,11 @@ let Predicates = [HasUSERMSR], mayLoad = 1 in {
446446
}
447447
let Predicates = [HasUSERMSR], mayStore = 1 in {
448448
def UWRMSRrr : I<0xf8, MRMSrcReg, (outs), (ins GR64:$src1, GR64:$src2),
449-
"uwrmsr\t{$src1, $src2|$src2, $src1}",
449+
"uwrmsr\t{$src2, $src1|$src1, $src2}",
450450
[(int_x86_uwrmsr GR64:$src1, GR64:$src2)]>, T8, XS;
451451
def UWRMSRir : Ii32<0xf8, MRM0r, (outs), (ins GR64:$src, i64i32imm:$imm),
452452
"uwrmsr\t{$src, $imm|$imm, $src}",
453-
[(int_x86_uwrmsr GR64:$src, i64immSExt32_su:$imm)]>, T_MAP7, XS, VEX;
453+
[(int_x86_uwrmsr i64immSExt32_su:$imm, GR64:$src)]>, T_MAP7, XS, VEX;
454454
}
455455
let Defs = [RAX, RDX], Uses = [ECX] in
456456
def RDPMC : I<0x33, RawFrm, (outs), (ins), "rdpmc", []>, TB;

llvm/test/CodeGen/X86/usermsr-intrinsics.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ declare i64 @llvm.x86.urdmsr(i64 %A)
3535
define void @test_int_x86_uwrmsr(i64 %A, i64 %B) nounwind {
3636
; X64-LABEL: test_int_x86_uwrmsr:
3737
; X64: # %bb.0:
38-
; X64-NEXT: uwrmsr %rdi, %rsi # encoding: [0xf3,0x0f,0x38,0xf8,0xfe]
38+
; X64-NEXT: uwrmsr %rsi, %rdi # encoding: [0xf3,0x0f,0x38,0xf8,0xfe]
3939
; X64-NEXT: retq # encoding: [0xc3]
4040
call void @llvm.x86.uwrmsr(i64 %A, i64 %B)
4141
ret void
@@ -46,7 +46,7 @@ define void @test_int_x86_uwrmsr_const(i64 %A) nounwind {
4646
; X64: # %bb.0:
4747
; X64-NEXT: uwrmsr %rdi, $123 # encoding: [0xc4,0xe7,0x7a,0xf8,0xc7,0x7b,0x00,0x00,0x00]
4848
; X64-NEXT: retq # encoding: [0xc3]
49-
call void @llvm.x86.uwrmsr(i64 %A, i64 123)
49+
call void @llvm.x86.uwrmsr(i64 123, i64 %A)
5050
ret void
5151
}
5252

@@ -55,9 +55,9 @@ define void @test_int_x86_uwrmsr_const_i64(i64 %A) nounwind {
5555
; X64: # %bb.0:
5656
; X64-NEXT: movabsq $8589934591, %rax # encoding: [0x48,0xb8,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00]
5757
; X64-NEXT: # imm = 0x1FFFFFFFF
58-
; X64-NEXT: uwrmsr %rdi, %rax # encoding: [0xf3,0x0f,0x38,0xf8,0xf8]
58+
; X64-NEXT: uwrmsr %rdi, %rax # encoding: [0xf3,0x0f,0x38,0xf8,0xc7]
5959
; X64-NEXT: retq # encoding: [0xc3]
60-
call void @llvm.x86.uwrmsr(i64 %A, i64 8589934591)
60+
call void @llvm.x86.uwrmsr(i64 8589934591, i64 %A)
6161
ret void
6262
}
6363

0 commit comments

Comments
 (0)