[clang] [X86] Add support for MS inp functions. (PR #93804)
https://github.com/MalaySanghi edited https://github.com/llvm/llvm-project/pull/93804 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86] Add support for MS inp functions. (PR #93804)
@@ -63,6 +63,82 @@ unsigned __int64 test__emulu(unsigned int a, unsigned int b) { // CHECK: [[RES:%[0-9]+]] = mul nuw i64 [[Y]], [[X]] // CHECK: ret i64 [[RES]] + +int test_inp(unsigned short port) { + return _inp(port); +} +// CHECK-I386-LABEL: define dso_local i32 @test_inp( +// CHECK-I386-SAME: i16 noundef zeroext [[PORT:%.*]]) +// CHECK-I386-NEXT: entry: +// CHECK-I386-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:b}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-I386-NEXT:ret i32 [[TMP0]] +// +// CHECK-X64-LABEL: define dso_local i32 @test_inp( +// CHECK-X64-SAME: i16 noundef [[PORT:%.*]]) +// CHECK-X64-NEXT: entry: +// CHECK-X64-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:b}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-X64-NEXT:ret i32 [[TMP0]] phoebewang wrote: These can be merged as ``` // CHECK-LABEL: define dso_local i32 @test_inp( // CHECK-SAME: i16 noundef zeroext [[PORT:%.*]]) // CHECK-NEXT: entry: // CHECK-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:b}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) // CHECK-NEXT:ret i32 [[TMP0]] ``` The same to others. https://github.com/llvm/llvm-project/pull/93804 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86] Add support for MS inp functions. (PR #93804)
@@ -63,6 +63,82 @@ unsigned __int64 test__emulu(unsigned int a, unsigned int b) { // CHECK: [[RES:%[0-9]+]] = mul nuw i64 [[Y]], [[X]] // CHECK: ret i64 [[RES]] + +int test_inp(unsigned short port) { + return _inp(port); +} +// CHECK-I386-LABEL: define dso_local i32 @test_inp( +// CHECK-I386-SAME: i16 noundef zeroext [[PORT:%.*]]) phoebewang wrote: These can be put in one line now. https://github.com/llvm/llvm-project/pull/93804 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86] Add support for MS inp functions. (PR #93804)
@@ -63,6 +63,82 @@ unsigned __int64 test__emulu(unsigned int a, unsigned int b) { // CHECK: [[RES:%[0-9]+]] = mul nuw i64 [[Y]], [[X]] // CHECK: ret i64 [[RES]] + +int test_inp(unsigned short port) { + return _inp(port); +} +// CHECK-I386-LABEL: define dso_local i32 @test_inp( +// CHECK-I386-SAME: i16 noundef zeroext [[PORT:%.*]]) MalaySanghi wrote: No, I had tried that. A variable (PORT in this case) is not allowed in CHECK-LABEL https://github.com/llvm/llvm-project/pull/93804 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86] Add support for MS inp functions. (PR #93804)
@@ -63,6 +63,82 @@ unsigned __int64 test__emulu(unsigned int a, unsigned int b) { // CHECK: [[RES:%[0-9]+]] = mul nuw i64 [[Y]], [[X]] // CHECK: ret i64 [[RES]] + +int test_inp(unsigned short port) { + return _inp(port); +} +// CHECK-I386-LABEL: define dso_local i32 @test_inp( +// CHECK-I386-SAME: i16 noundef zeroext [[PORT:%.*]]) +// CHECK-I386-NEXT: entry: +// CHECK-I386-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:b}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-I386-NEXT:ret i32 [[TMP0]] +// +// CHECK-X64-LABEL: define dso_local i32 @test_inp( +// CHECK-X64-SAME: i16 noundef [[PORT:%.*]]) +// CHECK-X64-NEXT: entry: +// CHECK-X64-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:b}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-X64-NEXT:ret i32 [[TMP0]] MalaySanghi wrote: Note that the 32b case has a zeroext but the 64b case doesn't https://github.com/llvm/llvm-project/pull/93804 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86] Add support for MS inp functions. (PR #93804)
@@ -63,6 +63,82 @@ unsigned __int64 test__emulu(unsigned int a, unsigned int b) { // CHECK: [[RES:%[0-9]+]] = mul nuw i64 [[Y]], [[X]] // CHECK: ret i64 [[RES]] + +int test_inp(unsigned short port) { + return _inp(port); +} +// CHECK-I386-LABEL: define dso_local i32 @test_inp( +// CHECK-I386-SAME: i16 noundef zeroext [[PORT:%.*]]) +// CHECK-I386-NEXT: entry: +// CHECK-I386-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:b}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-I386-NEXT:ret i32 [[TMP0]] +// +// CHECK-X64-LABEL: define dso_local i32 @test_inp( +// CHECK-X64-SAME: i16 noundef [[PORT:%.*]]) +// CHECK-X64-NEXT: entry: +// CHECK-X64-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:b}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-X64-NEXT:ret i32 [[TMP0]] phoebewang wrote: I think we don't care about zeroext or not here, you can simple check `CHECK-LABEL: define dso_local i32 @test_inp(i16 noundef` and omit the rest. Then you can use CHECK now. https://github.com/llvm/llvm-project/pull/93804 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86] Add support for MS inp functions. (PR #93804)
https://github.com/MalaySanghi updated https://github.com/llvm/llvm-project/pull/93804 >From de79bf75b68825440b939f030e1d659d26f3d2ea Mon Sep 17 00:00:00 2001 From: Malay Sanghi Date: Thu, 30 May 2024 01:39:41 -0700 Subject: [PATCH 1/2] Add support for MS inp functions. support _inp, _inpw, _inpd, inp, inpw. These functions were removed from the Windows runtime library, but aare still supported for kernel mode development. --- clang/lib/Headers/intrin.h | 22 +++ clang/test/CodeGen/X86/ms-x86-intrinsics.c | 76 ++ 2 files changed, 98 insertions(+) diff --git a/clang/lib/Headers/intrin.h b/clang/lib/Headers/intrin.h index 5ceb986a1f652..67a062d2166b0 100644 --- a/clang/lib/Headers/intrin.h +++ b/clang/lib/Headers/intrin.h @@ -329,6 +329,28 @@ static __inline__ void __DEFAULT_FN_ATTRS __stosq(unsigned __int64 *__dst, static __inline__ void __DEFAULT_FN_ATTRS __halt(void) { __asm__ volatile("hlt"); } + +static inline int _inp(unsigned short port) { + int ret; + __asm__ volatile("inb %b1, %b0" : "=a"(ret) : "Nd"(port)); + return ret; +} + +static inline unsigned short _inpw(unsigned short port) { + unsigned short ret; + __asm__ volatile("inb %w1, %b0" : "=a"(ret) : "Nd"(port)); + return ret; +} + +static inline unsigned long _inpd(unsigned short port) { + unsigned long ret; + __asm__ volatile("inb %k1, %b0" : "=a"(ret) : "Nd"(port)); + return ret; +} + +#define inp(port) _inp((port)) +#define inpw(port) _inpw((port)) + #endif #if defined(__i386__) || defined(__x86_64__) || defined(__aarch64__) diff --git a/clang/test/CodeGen/X86/ms-x86-intrinsics.c b/clang/test/CodeGen/X86/ms-x86-intrinsics.c index aa557c8e19a83..c51f2d53ca771 100644 --- a/clang/test/CodeGen/X86/ms-x86-intrinsics.c +++ b/clang/test/CodeGen/X86/ms-x86-intrinsics.c @@ -63,6 +63,82 @@ unsigned __int64 test__emulu(unsigned int a, unsigned int b) { // CHECK: [[RES:%[0-9]+]] = mul nuw i64 [[Y]], [[X]] // CHECK: ret i64 [[RES]] + +int test_inp(unsigned short port) { + return _inp(port); +} +// CHECK-I386-LABEL: define dso_local i32 @test_inp( +// CHECK-I386-SAME: i16 noundef zeroext [[PORT:%.*]]) +// CHECK-I386-NEXT: entry: +// CHECK-I386-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:b}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-I386-NEXT:ret i32 [[TMP0]] +// +// CHECK-X64-LABEL: define dso_local i32 @test_inp( +// CHECK-X64-SAME: i16 noundef [[PORT:%.*]]) +// CHECK-X64-NEXT: entry: +// CHECK-X64-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:b}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-X64-NEXT:ret i32 [[TMP0]] + +unsigned short test_inpw(unsigned short port) { + return _inpw(port); +} +// CHECK-I386-LABEL: define dso_local zeroext i16 @test_inpw( +// CHECK-I386-SAME: i16 noundef zeroext [[PORT:%.*]]) +// CHECK-I386-NEXT: entry: +// CHECK-I386-NEXT:[[TMP0:%.*]] = tail call i16 asm sideeffect "inb ${1:w}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-I386-NEXT:ret i16 [[TMP0]] +// +// CHECK-X64-LABEL: define dso_local i16 @test_inpw( +// CHECK-X64-SAME: i16 noundef [[PORT:%.*]]) +// CHECK-X64-NEXT: entry: +// CHECK-X64-NEXT:[[TMP0:%.*]] = tail call i16 asm sideeffect "inb ${1:w}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-X64-NEXT:ret i16 [[TMP0]] + +unsigned long test_inpd(unsigned short port) { + return _inpd(port); +} +// CHECK-I386-LABEL: define dso_local i32 @test_inpd( +// CHECK-I386-SAME: i16 noundef zeroext [[PORT:%.*]]) +// CHECK-I386-NEXT: entry: +// CHECK-I386-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:k}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-I386-NEXT:ret i32 [[TMP0]] +// +// CHECK-X64-LABEL: define dso_local i32 @test_inpd( +// CHECK-X64-SAME: i16 noundef [[PORT:%.*]]) +// CHECK-X64-NEXT: entry: +// CHECK-X64-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:k}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-X64-NEXT:ret i32 [[TMP0]] + +int test_inp2(unsigned short port) { + return inp(port); +} +// CHECK-I386-LABEL: define dso_local i32 @test_inp2( +// CHECK-I386-SAME: i16 noundef zeroext [[PORT:%.*]]) +// CHECK-I386-NEXT: entry: +// CHECK-I386-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:b}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-I386-NEXT:ret i32 [[TMP0]] +// +// CHECK-X64-LABEL: define dso_local i32 @test_inp2( +// CHECK-X64-SAME: i16 noundef [[PORT:%.*]]) +// CHECK-X64-NEXT: entry: +// CHECK-X64-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:b}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-X64-NEXT:ret i32 [[TMP0]] + +unsigned short test_inpw2(unsigned short port) { + return inpw(port); +} +// CHECK-I386-LABEL: define dso_local zeroext i16 @test_inpw2( +
[clang] [X86] Add support for MS inp functions. (PR #93804)
@@ -63,6 +63,82 @@ unsigned __int64 test__emulu(unsigned int a, unsigned int b) { // CHECK: [[RES:%[0-9]+]] = mul nuw i64 [[Y]], [[X]] // CHECK: ret i64 [[RES]] + +int test_inp(unsigned short port) { + return _inp(port); +} +// CHECK-I386-LABEL: define dso_local i32 @test_inp( +// CHECK-I386-SAME: i16 noundef zeroext [[PORT:%.*]]) +// CHECK-I386-NEXT: entry: +// CHECK-I386-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:b}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-I386-NEXT:ret i32 [[TMP0]] +// +// CHECK-X64-LABEL: define dso_local i32 @test_inp( +// CHECK-X64-SAME: i16 noundef [[PORT:%.*]]) +// CHECK-X64-NEXT: entry: +// CHECK-X64-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:b}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-X64-NEXT:ret i32 [[TMP0]] MalaySanghi wrote: Updated https://github.com/llvm/llvm-project/pull/93804 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86] Add support for MS inp functions. (PR #93804)
@@ -329,6 +329,28 @@ static __inline__ void __DEFAULT_FN_ATTRS __stosq(unsigned __int64 *__dst, static __inline__ void __DEFAULT_FN_ATTRS __halt(void) { __asm__ volatile("hlt"); } + +static inline int _inp(unsigned short port) { + int ret; + __asm__ volatile("inb %b1, %b0" : "=a"(ret) : "Nd"(port)); + return ret; +} + +static inline unsigned short _inpw(unsigned short port) { + unsigned short ret; + __asm__ volatile("inb %w1, %b0" : "=a"(ret) : "Nd"(port)); phoebewang wrote: You need `inw` here. https://github.com/llvm/llvm-project/pull/93804 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86] Add support for MS inp functions. (PR #93804)
@@ -329,6 +329,28 @@ static __inline__ void __DEFAULT_FN_ATTRS __stosq(unsigned __int64 *__dst, static __inline__ void __DEFAULT_FN_ATTRS __halt(void) { __asm__ volatile("hlt"); } + +static inline int _inp(unsigned short port) { + int ret; + __asm__ volatile("inb %b1, %b0" : "=a"(ret) : "Nd"(port)); + return ret; +} + +static inline unsigned short _inpw(unsigned short port) { + unsigned short ret; + __asm__ volatile("inb %w1, %b0" : "=a"(ret) : "Nd"(port)); + return ret; +} + +static inline unsigned long _inpd(unsigned short port) { + unsigned long ret; + __asm__ volatile("inb %k1, %b0" : "=a"(ret) : "Nd"(port)); phoebewang wrote: `inl` https://github.com/llvm/llvm-project/pull/93804 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86] Add support for MS inp functions. (PR #93804)
https://github.com/MalaySanghi updated https://github.com/llvm/llvm-project/pull/93804 >From de79bf75b68825440b939f030e1d659d26f3d2ea Mon Sep 17 00:00:00 2001 From: Malay Sanghi Date: Thu, 30 May 2024 01:39:41 -0700 Subject: [PATCH 1/3] Add support for MS inp functions. support _inp, _inpw, _inpd, inp, inpw. These functions were removed from the Windows runtime library, but aare still supported for kernel mode development. --- clang/lib/Headers/intrin.h | 22 +++ clang/test/CodeGen/X86/ms-x86-intrinsics.c | 76 ++ 2 files changed, 98 insertions(+) diff --git a/clang/lib/Headers/intrin.h b/clang/lib/Headers/intrin.h index 5ceb986a1f652..67a062d2166b0 100644 --- a/clang/lib/Headers/intrin.h +++ b/clang/lib/Headers/intrin.h @@ -329,6 +329,28 @@ static __inline__ void __DEFAULT_FN_ATTRS __stosq(unsigned __int64 *__dst, static __inline__ void __DEFAULT_FN_ATTRS __halt(void) { __asm__ volatile("hlt"); } + +static inline int _inp(unsigned short port) { + int ret; + __asm__ volatile("inb %b1, %b0" : "=a"(ret) : "Nd"(port)); + return ret; +} + +static inline unsigned short _inpw(unsigned short port) { + unsigned short ret; + __asm__ volatile("inb %w1, %b0" : "=a"(ret) : "Nd"(port)); + return ret; +} + +static inline unsigned long _inpd(unsigned short port) { + unsigned long ret; + __asm__ volatile("inb %k1, %b0" : "=a"(ret) : "Nd"(port)); + return ret; +} + +#define inp(port) _inp((port)) +#define inpw(port) _inpw((port)) + #endif #if defined(__i386__) || defined(__x86_64__) || defined(__aarch64__) diff --git a/clang/test/CodeGen/X86/ms-x86-intrinsics.c b/clang/test/CodeGen/X86/ms-x86-intrinsics.c index aa557c8e19a83..c51f2d53ca771 100644 --- a/clang/test/CodeGen/X86/ms-x86-intrinsics.c +++ b/clang/test/CodeGen/X86/ms-x86-intrinsics.c @@ -63,6 +63,82 @@ unsigned __int64 test__emulu(unsigned int a, unsigned int b) { // CHECK: [[RES:%[0-9]+]] = mul nuw i64 [[Y]], [[X]] // CHECK: ret i64 [[RES]] + +int test_inp(unsigned short port) { + return _inp(port); +} +// CHECK-I386-LABEL: define dso_local i32 @test_inp( +// CHECK-I386-SAME: i16 noundef zeroext [[PORT:%.*]]) +// CHECK-I386-NEXT: entry: +// CHECK-I386-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:b}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-I386-NEXT:ret i32 [[TMP0]] +// +// CHECK-X64-LABEL: define dso_local i32 @test_inp( +// CHECK-X64-SAME: i16 noundef [[PORT:%.*]]) +// CHECK-X64-NEXT: entry: +// CHECK-X64-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:b}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-X64-NEXT:ret i32 [[TMP0]] + +unsigned short test_inpw(unsigned short port) { + return _inpw(port); +} +// CHECK-I386-LABEL: define dso_local zeroext i16 @test_inpw( +// CHECK-I386-SAME: i16 noundef zeroext [[PORT:%.*]]) +// CHECK-I386-NEXT: entry: +// CHECK-I386-NEXT:[[TMP0:%.*]] = tail call i16 asm sideeffect "inb ${1:w}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-I386-NEXT:ret i16 [[TMP0]] +// +// CHECK-X64-LABEL: define dso_local i16 @test_inpw( +// CHECK-X64-SAME: i16 noundef [[PORT:%.*]]) +// CHECK-X64-NEXT: entry: +// CHECK-X64-NEXT:[[TMP0:%.*]] = tail call i16 asm sideeffect "inb ${1:w}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-X64-NEXT:ret i16 [[TMP0]] + +unsigned long test_inpd(unsigned short port) { + return _inpd(port); +} +// CHECK-I386-LABEL: define dso_local i32 @test_inpd( +// CHECK-I386-SAME: i16 noundef zeroext [[PORT:%.*]]) +// CHECK-I386-NEXT: entry: +// CHECK-I386-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:k}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-I386-NEXT:ret i32 [[TMP0]] +// +// CHECK-X64-LABEL: define dso_local i32 @test_inpd( +// CHECK-X64-SAME: i16 noundef [[PORT:%.*]]) +// CHECK-X64-NEXT: entry: +// CHECK-X64-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:k}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-X64-NEXT:ret i32 [[TMP0]] + +int test_inp2(unsigned short port) { + return inp(port); +} +// CHECK-I386-LABEL: define dso_local i32 @test_inp2( +// CHECK-I386-SAME: i16 noundef zeroext [[PORT:%.*]]) +// CHECK-I386-NEXT: entry: +// CHECK-I386-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:b}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-I386-NEXT:ret i32 [[TMP0]] +// +// CHECK-X64-LABEL: define dso_local i32 @test_inp2( +// CHECK-X64-SAME: i16 noundef [[PORT:%.*]]) +// CHECK-X64-NEXT: entry: +// CHECK-X64-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:b}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-X64-NEXT:ret i32 [[TMP0]] + +unsigned short test_inpw2(unsigned short port) { + return inpw(port); +} +// CHECK-I386-LABEL: define dso_local zeroext i16 @test_inpw2( +
[clang] [X86] Add support for MS inp functions. (PR #93804)
@@ -329,6 +329,28 @@ static __inline__ void __DEFAULT_FN_ATTRS __stosq(unsigned __int64 *__dst, static __inline__ void __DEFAULT_FN_ATTRS __halt(void) { __asm__ volatile("hlt"); } + +static inline int _inp(unsigned short port) { + int ret; + __asm__ volatile("inb %b1, %b0" : "=a"(ret) : "Nd"(port)); + return ret; +} + +static inline unsigned short _inpw(unsigned short port) { + unsigned short ret; + __asm__ volatile("inb %w1, %b0" : "=a"(ret) : "Nd"(port)); MalaySanghi wrote: Thanks for spotting this. I Forgot to update opcode after pasting. https://github.com/llvm/llvm-project/pull/93804 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86] Add support for MS inp functions. (PR #93804)
@@ -63,6 +63,47 @@ unsigned __int64 test__emulu(unsigned int a, unsigned int b) { // CHECK: [[RES:%[0-9]+]] = mul nuw i64 [[Y]], [[X]] // CHECK: ret i64 [[RES]] + +int test_inp(unsigned short port) { + return _inp(port); +} +// CHECK-LABEL: i32 @test_inp(i16 noundef +// CHECK-SAME: [[PORT:%.*]]) +// CHECK: [[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:b}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-NEXT: ret i32 [[TMP0]] + +unsigned short test_inpw(unsigned short port) { + return _inpw(port); +} +// CHECK-LABEL: i16 @test_inpw(i16 noundef +// CHECK-SAME: [[PORT:%.*]]) +// CHECK: [[TMP0:%.*]] = tail call i16 asm sideeffect "inw ${1:w}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-NEXT: ret i16 [[TMP0]] + +unsigned long test_inpd(unsigned short port) { + return _inpd(port); +} +// CHECK-LABEL: i32 @test_inpd(i16 noundef +// CHECK-SAME: [[PORT:%.*]]) +// CHECK: [[TMP0:%.*]] = tail call i32 asm sideeffect "inl ${1:k}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) phoebewang wrote: Shouldn't it be `={eax}` for 32-bit? https://github.com/llvm/llvm-project/pull/93804 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86] Add support for MS inp functions. (PR #93804)
https://github.com/MalaySanghi updated https://github.com/llvm/llvm-project/pull/93804 >From de79bf75b68825440b939f030e1d659d26f3d2ea Mon Sep 17 00:00:00 2001 From: Malay Sanghi Date: Thu, 30 May 2024 01:39:41 -0700 Subject: [PATCH 1/4] Add support for MS inp functions. support _inp, _inpw, _inpd, inp, inpw. These functions were removed from the Windows runtime library, but aare still supported for kernel mode development. --- clang/lib/Headers/intrin.h | 22 +++ clang/test/CodeGen/X86/ms-x86-intrinsics.c | 76 ++ 2 files changed, 98 insertions(+) diff --git a/clang/lib/Headers/intrin.h b/clang/lib/Headers/intrin.h index 5ceb986a1f652..67a062d2166b0 100644 --- a/clang/lib/Headers/intrin.h +++ b/clang/lib/Headers/intrin.h @@ -329,6 +329,28 @@ static __inline__ void __DEFAULT_FN_ATTRS __stosq(unsigned __int64 *__dst, static __inline__ void __DEFAULT_FN_ATTRS __halt(void) { __asm__ volatile("hlt"); } + +static inline int _inp(unsigned short port) { + int ret; + __asm__ volatile("inb %b1, %b0" : "=a"(ret) : "Nd"(port)); + return ret; +} + +static inline unsigned short _inpw(unsigned short port) { + unsigned short ret; + __asm__ volatile("inb %w1, %b0" : "=a"(ret) : "Nd"(port)); + return ret; +} + +static inline unsigned long _inpd(unsigned short port) { + unsigned long ret; + __asm__ volatile("inb %k1, %b0" : "=a"(ret) : "Nd"(port)); + return ret; +} + +#define inp(port) _inp((port)) +#define inpw(port) _inpw((port)) + #endif #if defined(__i386__) || defined(__x86_64__) || defined(__aarch64__) diff --git a/clang/test/CodeGen/X86/ms-x86-intrinsics.c b/clang/test/CodeGen/X86/ms-x86-intrinsics.c index aa557c8e19a83..c51f2d53ca771 100644 --- a/clang/test/CodeGen/X86/ms-x86-intrinsics.c +++ b/clang/test/CodeGen/X86/ms-x86-intrinsics.c @@ -63,6 +63,82 @@ unsigned __int64 test__emulu(unsigned int a, unsigned int b) { // CHECK: [[RES:%[0-9]+]] = mul nuw i64 [[Y]], [[X]] // CHECK: ret i64 [[RES]] + +int test_inp(unsigned short port) { + return _inp(port); +} +// CHECK-I386-LABEL: define dso_local i32 @test_inp( +// CHECK-I386-SAME: i16 noundef zeroext [[PORT:%.*]]) +// CHECK-I386-NEXT: entry: +// CHECK-I386-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:b}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-I386-NEXT:ret i32 [[TMP0]] +// +// CHECK-X64-LABEL: define dso_local i32 @test_inp( +// CHECK-X64-SAME: i16 noundef [[PORT:%.*]]) +// CHECK-X64-NEXT: entry: +// CHECK-X64-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:b}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-X64-NEXT:ret i32 [[TMP0]] + +unsigned short test_inpw(unsigned short port) { + return _inpw(port); +} +// CHECK-I386-LABEL: define dso_local zeroext i16 @test_inpw( +// CHECK-I386-SAME: i16 noundef zeroext [[PORT:%.*]]) +// CHECK-I386-NEXT: entry: +// CHECK-I386-NEXT:[[TMP0:%.*]] = tail call i16 asm sideeffect "inb ${1:w}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-I386-NEXT:ret i16 [[TMP0]] +// +// CHECK-X64-LABEL: define dso_local i16 @test_inpw( +// CHECK-X64-SAME: i16 noundef [[PORT:%.*]]) +// CHECK-X64-NEXT: entry: +// CHECK-X64-NEXT:[[TMP0:%.*]] = tail call i16 asm sideeffect "inb ${1:w}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-X64-NEXT:ret i16 [[TMP0]] + +unsigned long test_inpd(unsigned short port) { + return _inpd(port); +} +// CHECK-I386-LABEL: define dso_local i32 @test_inpd( +// CHECK-I386-SAME: i16 noundef zeroext [[PORT:%.*]]) +// CHECK-I386-NEXT: entry: +// CHECK-I386-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:k}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-I386-NEXT:ret i32 [[TMP0]] +// +// CHECK-X64-LABEL: define dso_local i32 @test_inpd( +// CHECK-X64-SAME: i16 noundef [[PORT:%.*]]) +// CHECK-X64-NEXT: entry: +// CHECK-X64-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:k}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-X64-NEXT:ret i32 [[TMP0]] + +int test_inp2(unsigned short port) { + return inp(port); +} +// CHECK-I386-LABEL: define dso_local i32 @test_inp2( +// CHECK-I386-SAME: i16 noundef zeroext [[PORT:%.*]]) +// CHECK-I386-NEXT: entry: +// CHECK-I386-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:b}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-I386-NEXT:ret i32 [[TMP0]] +// +// CHECK-X64-LABEL: define dso_local i32 @test_inp2( +// CHECK-X64-SAME: i16 noundef [[PORT:%.*]]) +// CHECK-X64-NEXT: entry: +// CHECK-X64-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:b}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-X64-NEXT:ret i32 [[TMP0]] + +unsigned short test_inpw2(unsigned short port) { + return inpw(port); +} +// CHECK-I386-LABEL: define dso_local zeroext i16 @test_inpw2( +
[clang] [X86] Add support for MS inp functions. (PR #93804)
@@ -63,6 +63,47 @@ unsigned __int64 test__emulu(unsigned int a, unsigned int b) { // CHECK: [[RES:%[0-9]+]] = mul nuw i64 [[Y]], [[X]] // CHECK: ret i64 [[RES]] + +int test_inp(unsigned short port) { + return _inp(port); +} +// CHECK-LABEL: i32 @test_inp(i16 noundef +// CHECK-SAME: [[PORT:%.*]]) +// CHECK: [[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:b}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-NEXT: ret i32 [[TMP0]] + +unsigned short test_inpw(unsigned short port) { + return _inpw(port); +} +// CHECK-LABEL: i16 @test_inpw(i16 noundef +// CHECK-SAME: [[PORT:%.*]]) +// CHECK: [[TMP0:%.*]] = tail call i16 asm sideeffect "inw ${1:w}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-NEXT: ret i16 [[TMP0]] + +unsigned long test_inpd(unsigned short port) { + return _inpd(port); +} +// CHECK-LABEL: i32 @test_inpd(i16 noundef +// CHECK-SAME: [[PORT:%.*]]) +// CHECK: [[TMP0:%.*]] = tail call i32 asm sideeffect "inl ${1:k}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) MalaySanghi wrote: In llvm-IR this remain ax. There were other issues which I fixed. I had only tested the outp end-end and modelled this after the outp intrinsic. I've tested this end-end now. ``` _ind(port) ``` becomes ``` %0 = tail call i32 asm sideeffect "inl ${1:w}, ${0:k}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 %port) #3, !srcloc !6 ``` and eventually ``` inl %dx, %eax ``` https://github.com/llvm/llvm-project/pull/93804 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86] Add support for MS inp functions. (PR #93804)
@@ -329,6 +329,28 @@ static __inline__ void __DEFAULT_FN_ATTRS __stosq(unsigned __int64 *__dst, static __inline__ void __DEFAULT_FN_ATTRS __halt(void) { __asm__ volatile("hlt"); } + +static inline int _inp(unsigned short port) { + int ret; + __asm__ volatile("inb %w1, %b0" : "=a"(ret) : "Nd"(port)); + return ret; +} + +static inline unsigned short _inpw(unsigned short port) { + unsigned short ret; + __asm__ volatile("inw %w1, %w0" : "=a"(ret) : "Nd"(port)); + return ret; +} + +static inline unsigned long _inpd(unsigned short port) { + unsigned long ret; + __asm__ volatile("inl %w1, %k0" : "=a"(ret) : "Nd"(port)); + return ret; +} + +#define inp(port) _inp((port)) +#define inpw(port) _inpw((port)) phoebewang wrote: >From MSVC doc: > The inp and inpw names are older, deprecated names for the _inp and _inpw > functions. Maybe we don't need to provide them now. https://github.com/llvm/llvm-project/pull/93804 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86] Add support for MS inp functions. (PR #93804)
@@ -329,6 +329,28 @@ static __inline__ void __DEFAULT_FN_ATTRS __stosq(unsigned __int64 *__dst, static __inline__ void __DEFAULT_FN_ATTRS __halt(void) { __asm__ volatile("hlt"); } + +static inline int _inp(unsigned short port) { + int ret; + __asm__ volatile("inb %w1, %b0" : "=a"(ret) : "Nd"(port)); + return ret; +} + +static inline unsigned short _inpw(unsigned short port) { + unsigned short ret; + __asm__ volatile("inw %w1, %w0" : "=a"(ret) : "Nd"(port)); + return ret; +} + +static inline unsigned long _inpd(unsigned short port) { + unsigned long ret; + __asm__ volatile("inl %w1, %k0" : "=a"(ret) : "Nd"(port)); + return ret; +} + +#define inp(port) _inp((port)) +#define inpw(port) _inpw((port)) MalaySanghi wrote: I don't have a strong preference. I can remove them https://github.com/llvm/llvm-project/pull/93804 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86] Add support for MS inp functions. (PR #93804)
https://github.com/MalaySanghi updated https://github.com/llvm/llvm-project/pull/93804 >From de79bf75b68825440b939f030e1d659d26f3d2ea Mon Sep 17 00:00:00 2001 From: Malay Sanghi Date: Thu, 30 May 2024 01:39:41 -0700 Subject: [PATCH 1/5] Add support for MS inp functions. support _inp, _inpw, _inpd, inp, inpw. These functions were removed from the Windows runtime library, but aare still supported for kernel mode development. --- clang/lib/Headers/intrin.h | 22 +++ clang/test/CodeGen/X86/ms-x86-intrinsics.c | 76 ++ 2 files changed, 98 insertions(+) diff --git a/clang/lib/Headers/intrin.h b/clang/lib/Headers/intrin.h index 5ceb986a1f652..67a062d2166b0 100644 --- a/clang/lib/Headers/intrin.h +++ b/clang/lib/Headers/intrin.h @@ -329,6 +329,28 @@ static __inline__ void __DEFAULT_FN_ATTRS __stosq(unsigned __int64 *__dst, static __inline__ void __DEFAULT_FN_ATTRS __halt(void) { __asm__ volatile("hlt"); } + +static inline int _inp(unsigned short port) { + int ret; + __asm__ volatile("inb %b1, %b0" : "=a"(ret) : "Nd"(port)); + return ret; +} + +static inline unsigned short _inpw(unsigned short port) { + unsigned short ret; + __asm__ volatile("inb %w1, %b0" : "=a"(ret) : "Nd"(port)); + return ret; +} + +static inline unsigned long _inpd(unsigned short port) { + unsigned long ret; + __asm__ volatile("inb %k1, %b0" : "=a"(ret) : "Nd"(port)); + return ret; +} + +#define inp(port) _inp((port)) +#define inpw(port) _inpw((port)) + #endif #if defined(__i386__) || defined(__x86_64__) || defined(__aarch64__) diff --git a/clang/test/CodeGen/X86/ms-x86-intrinsics.c b/clang/test/CodeGen/X86/ms-x86-intrinsics.c index aa557c8e19a83..c51f2d53ca771 100644 --- a/clang/test/CodeGen/X86/ms-x86-intrinsics.c +++ b/clang/test/CodeGen/X86/ms-x86-intrinsics.c @@ -63,6 +63,82 @@ unsigned __int64 test__emulu(unsigned int a, unsigned int b) { // CHECK: [[RES:%[0-9]+]] = mul nuw i64 [[Y]], [[X]] // CHECK: ret i64 [[RES]] + +int test_inp(unsigned short port) { + return _inp(port); +} +// CHECK-I386-LABEL: define dso_local i32 @test_inp( +// CHECK-I386-SAME: i16 noundef zeroext [[PORT:%.*]]) +// CHECK-I386-NEXT: entry: +// CHECK-I386-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:b}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-I386-NEXT:ret i32 [[TMP0]] +// +// CHECK-X64-LABEL: define dso_local i32 @test_inp( +// CHECK-X64-SAME: i16 noundef [[PORT:%.*]]) +// CHECK-X64-NEXT: entry: +// CHECK-X64-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:b}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-X64-NEXT:ret i32 [[TMP0]] + +unsigned short test_inpw(unsigned short port) { + return _inpw(port); +} +// CHECK-I386-LABEL: define dso_local zeroext i16 @test_inpw( +// CHECK-I386-SAME: i16 noundef zeroext [[PORT:%.*]]) +// CHECK-I386-NEXT: entry: +// CHECK-I386-NEXT:[[TMP0:%.*]] = tail call i16 asm sideeffect "inb ${1:w}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-I386-NEXT:ret i16 [[TMP0]] +// +// CHECK-X64-LABEL: define dso_local i16 @test_inpw( +// CHECK-X64-SAME: i16 noundef [[PORT:%.*]]) +// CHECK-X64-NEXT: entry: +// CHECK-X64-NEXT:[[TMP0:%.*]] = tail call i16 asm sideeffect "inb ${1:w}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-X64-NEXT:ret i16 [[TMP0]] + +unsigned long test_inpd(unsigned short port) { + return _inpd(port); +} +// CHECK-I386-LABEL: define dso_local i32 @test_inpd( +// CHECK-I386-SAME: i16 noundef zeroext [[PORT:%.*]]) +// CHECK-I386-NEXT: entry: +// CHECK-I386-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:k}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-I386-NEXT:ret i32 [[TMP0]] +// +// CHECK-X64-LABEL: define dso_local i32 @test_inpd( +// CHECK-X64-SAME: i16 noundef [[PORT:%.*]]) +// CHECK-X64-NEXT: entry: +// CHECK-X64-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:k}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-X64-NEXT:ret i32 [[TMP0]] + +int test_inp2(unsigned short port) { + return inp(port); +} +// CHECK-I386-LABEL: define dso_local i32 @test_inp2( +// CHECK-I386-SAME: i16 noundef zeroext [[PORT:%.*]]) +// CHECK-I386-NEXT: entry: +// CHECK-I386-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:b}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-I386-NEXT:ret i32 [[TMP0]] +// +// CHECK-X64-LABEL: define dso_local i32 @test_inp2( +// CHECK-X64-SAME: i16 noundef [[PORT:%.*]]) +// CHECK-X64-NEXT: entry: +// CHECK-X64-NEXT:[[TMP0:%.*]] = tail call i32 asm sideeffect "inb ${1:b}, ${0:b}", "={ax},N{dx},~{dirflag},~{fpsr},~{flags}"(i16 [[PORT]]) +// CHECK-X64-NEXT:ret i32 [[TMP0]] + +unsigned short test_inpw2(unsigned short port) { + return inpw(port); +} +// CHECK-I386-LABEL: define dso_local zeroext i16 @test_inpw2( +
[clang] [X86] Add support for MS inp functions. (PR #93804)
https://github.com/MalaySanghi edited https://github.com/llvm/llvm-project/pull/93804 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86] Add support for MS inp functions. (PR #93804)
@@ -329,6 +329,25 @@ static __inline__ void __DEFAULT_FN_ATTRS __stosq(unsigned __int64 *__dst, static __inline__ void __DEFAULT_FN_ATTRS __halt(void) { __asm__ volatile("hlt"); } + +static inline int _inp(unsigned short port) { + int ret; + __asm__ volatile("inb %w1, %b0" : "=a"(ret) : "Nd"(port)); phoebewang wrote: I took a look at the Clang code, it seems these `b`, `w` modifiers are only meaningful to ARM/AArch64. We don't need them for X86 assembly. https://github.com/llvm/llvm-project/pull/93804 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86] Add support for MS inp functions. (PR #93804)
@@ -329,6 +329,25 @@ static __inline__ void __DEFAULT_FN_ATTRS __stosq(unsigned __int64 *__dst, static __inline__ void __DEFAULT_FN_ATTRS __halt(void) { __asm__ volatile("hlt"); } + +static inline int _inp(unsigned short port) { + int ret; + __asm__ volatile("inb %w1, %b0" : "=a"(ret) : "Nd"(port)); phoebewang wrote: I have a check, they are still required. https://github.com/llvm/llvm-project/pull/93804 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86] Add support for MS inp functions. (PR #93804)
https://github.com/phoebewang approved this pull request. LGTM. https://github.com/llvm/llvm-project/pull/93804 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86] Add support for MS inp functions. (PR #93804)
https://github.com/phoebewang closed https://github.com/llvm/llvm-project/pull/93804 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86] Add support for MS inp functions. (PR #93804)
https://github.com/RKSimon commented: Maybe add this to ReleaseNotes? https://github.com/llvm/llvm-project/pull/93804 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits