diff options
-rw-r--r-- | clang/lib/Parse/ParseStmt.cpp | 5 | ||||
-rw-r--r-- | clang/test/CodeGen/ms-inline-asm.c | 9 |
2 files changed, 14 insertions, 0 deletions
diff --git a/clang/lib/Parse/ParseStmt.cpp b/clang/lib/Parse/ParseStmt.cpp index 038d7dad0ea..7254eb3c117 100644 --- a/clang/lib/Parse/ParseStmt.cpp +++ b/clang/lib/Parse/ParseStmt.cpp @@ -2211,6 +2211,11 @@ StmtResult Parser::ParseMicrosoftAsmStatement(SourceLocation AsmLoc) { Clobbers, MII, IP, Callback)) return StmtError(); + // Filter out "fpsw". Clang doesn't accept it, and it always lists flags and + // fpsr as clobbers. + auto End = std::remove(Clobbers.begin(), Clobbers.end(), "fpsw"); + Clobbers.erase(End, Clobbers.end()); + // Build the vector of clobber StringRefs. unsigned NumClobbers = Clobbers.size(); ClobberRefs.resize(NumClobbers); diff --git a/clang/test/CodeGen/ms-inline-asm.c b/clang/test/CodeGen/ms-inline-asm.c index 318d509cfa4..6395e428ed6 100644 --- a/clang/test/CodeGen/ms-inline-asm.c +++ b/clang/test/CodeGen/ms-inline-asm.c @@ -460,3 +460,12 @@ void t39() { // CHECK: call void asm sideeffect inteldialect "mov eax, [eax] .4", "~{eax},~{dirflag},~{fpsr},~{flags}"() // CHECK: call void asm sideeffect inteldialect "mov eax, fs:[$$0] .4", "~{eax},~{dirflag},~{fpsr},~{flags}"() } + +void t40(float a) { + int i; + __asm fld a + __asm fistp i + // CHECK-LABEL: define void @t40 + // CHECK: call void asm sideeffect inteldialect "fld dword ptr $0", "*m,~{dirflag},~{fpsr},~{flags}"(float* {{.*}}) + // CHECK: call void asm sideeffect inteldialect "fistp dword ptr $0", "=*m,~{dirflag},~{fpsr},~{flags}"(i32* {{.*}}) +} |