mirror of
https://github.com/intel/llvm.git
synced 2026-01-27 14:50:42 +08:00
[x86][inline-asm] Add support for curly brackets escape using "%" in extended inline asm.
Commit on behalf of mharoush
After LGTM and check all:
This patch is a compatibility fix for clang, matching GCC support for charter escape when using extended in-line assembly (i.e, "%{" ,"%}" --> "{" ,"}" ).
It is meant to enable support for advanced features such as AVX512 conditional\masked vector instructions/broadcast assembly syntax.
Reviewer: 1. rnk
Differential Revision: https://reviews.llvm.org/D25012
llvm-svn: 285585
This commit is contained in:
@@ -533,15 +533,17 @@ unsigned GCCAsmStmt::AnalyzeAsmString(SmallVectorImpl<AsmStringPiece>&Pieces,
|
||||
DiagOffs = CurPtr-StrStart-1;
|
||||
return diag::err_asm_invalid_escape;
|
||||
}
|
||||
|
||||
// Handle escaped char and continue looping over the asm string.
|
||||
char EscapedChar = *CurPtr++;
|
||||
if (EscapedChar == '%') { // %% -> %
|
||||
// Escaped percentage sign.
|
||||
CurStringPiece += '%';
|
||||
switch (EscapedChar) {
|
||||
default:
|
||||
break;
|
||||
case '%': // %% -> %
|
||||
case '{': // %{ -> {
|
||||
case '}': // %} -> }
|
||||
CurStringPiece += EscapedChar;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (EscapedChar == '=') { // %= -> Generate an unique ID.
|
||||
case '=': // %= -> Generate a unique ID.
|
||||
CurStringPiece += "${:uid}";
|
||||
continue;
|
||||
}
|
||||
|
||||
8
clang/test/CodeGen/x86_inlineasm_curly_bracket_escape.c
Normal file
8
clang/test/CodeGen/x86_inlineasm_curly_bracket_escape.c
Normal file
@@ -0,0 +1,8 @@
|
||||
// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin -target-cpu skylake-avx512 -O0 -S -emit-llvm -o - -Wall -Werror | FileCheck %s
|
||||
// This test checks validity of inline assembly using curly brackets syntax
|
||||
// for extended inline asm.
|
||||
|
||||
void test_curly_brackets() {
|
||||
//CHECK: %xmm1,%xmm0,%xmm1 {%k1}{z}
|
||||
asm("vpaddb\t %%xmm1,%%xmm0,%%xmm1 %{%%k1%}%{z%}\t":::);
|
||||
}
|
||||
Reference in New Issue
Block a user