From dba2234b1bee67fc49810c73dcca138d9b327dc3 Mon Sep 17 00:00:00 2001 From: Hans Wennborg Date: Thu, 18 Sep 2014 20:24:04 +0000 Subject: [PATCH] [X86, inline-asm] Allow 256-bit wide operands for the 'x' constraints The 'x' constraint is for "any SSE register", and GCC seems to include the 256-bit ymm registers in that concept. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@218073 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Basic/Targets.cpp | 3 ++- test/CodeGen/x86_32-inline-asm.c | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index 8ff30d9a04..7f30ac551b 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -3079,11 +3079,12 @@ bool X86TargetInfo::validateOperandSize(StringRef Constraint, default: break; case 'y': return Size <= 64; - case 'x': case 'f': case 't': case 'u': return Size <= 128; + case 'x': + return Size <= 256; } return true; diff --git a/test/CodeGen/x86_32-inline-asm.c b/test/CodeGen/x86_32-inline-asm.c index 18fe4d0e14..25745212e9 100644 --- a/test/CodeGen/x86_32-inline-asm.c +++ b/test/CodeGen/x86_32-inline-asm.c @@ -12,9 +12,11 @@ typedef u_int64_t uint64_t; typedef float __m128 __attribute__ ((vector_size (16))); typedef float __m256 __attribute__ ((vector_size (32))); +typedef float __m512 __attribute__ ((vector_size (64))); __m128 val128; __m256 val256; +__m512 val512; int func1() { // Error out if size is > 32-bits. @@ -43,6 +45,8 @@ int func1() { __asm__ volatile("foo1 %0" : : "f" (val256)); // expected-error {{invalid input size for constraint 'f'}} __asm__ volatile("foo1 %0" : : "t" (val256)); // expected-error {{invalid input size for constraint 't'}} __asm__ volatile("foo1 %0" : : "u" (val256)); // expected-error {{invalid input size for constraint 'u'}} + __asm__ volatile("foo1 %0" : : "x" (val256)); // No error. + __asm__ volatile("foo1 %0" : : "x" (val512)); // expected-error {{invalid input size for constraint 'x'}} __asm__ volatile("foo1 %0" : "=R" (val)); // expected-error {{invalid output size for constraint '=R'}} __asm__ volatile("foo1 %0" : "=q" (val)); // expected-error {{invalid output size for constraint '=q'}} @@ -56,4 +60,6 @@ int func1() { __asm__ volatile("foo1 %0" : "=A" (val128)); // expected-error {{invalid output size for constraint '=A'}} __asm__ volatile("foo1 %0" : "=t" (val256)); // expected-error {{invalid output size for constraint '=t'}} __asm__ volatile("foo1 %0" : "=u" (val256)); // expected-error {{invalid output size for constraint '=u'}} + __asm__ volatile("foo1 %0" : "=x" (val256)); // No error. + __asm__ volatile("foo1 %0" : "=x" (val512)); // expected-error {{invalid output size for constraint '=x'}} } -- 2.50.1