282 lines · c
1// RUN: %clang_cc1 -triple i686 %s -emit-llvm -o - | FileCheck %s2// RUN: %clang_cc1 -triple x86_64 %s -emit-llvm -o - | FileCheck %s3// RUN: %clang_cc1 -triple arm %s -emit-llvm -o - | FileCheck %s4// RUN: %clang_cc1 -triple mips %s -emit-llvm -o - | FileCheck %s5// RUN: %clang_cc1 -triple mipsel %s -emit-llvm -o - | FileCheck %s6// RUN: %clang_cc1 -triple powerpc %s -emit-llvm -o - | FileCheck %s7// RUN: %clang_cc1 -triple powerpc64 %s -emit-llvm -o - | FileCheck %s8// RUN: %clang_cc1 -triple s390x %s -emit-llvm -o - | FileCheck %s9// RUN: %clang_cc1 -triple sparc %s -emit-llvm -o - | FileCheck %s10// RUN: %clang_cc1 -triple sparcv9 %s -emit-llvm -o - | FileCheck %s11// RUN: %clang_cc1 -triple thumb %s -emit-llvm -o - | FileCheck %s12 13int mout0;14int min1;15int marray[2];16 17// CHECK: @single_m18void single_m(void)19{20 // CHECK: call void asm "foo $1,$0", "=*m,*m[[CLOBBERS:[a-zA-Z0-9@%{},~_$ ]*\"]](ptr elementtype(i32) {{[a-zA-Z0-9@%]+}}, ptr elementtype(i32) {{[a-zA-Z0-9@%]+}})21 asm("foo %1,%0" : "=m" (mout0) : "m" (min1));22}23 24// CHECK: @single_o25void single_o(void)26{27 register int out0 = 0;28 register int index = 1;29 // Doesn't really do an offset...30 //asm("foo %1, %2,%0" : "=r" (out0) : "o" (min1));31}32 33// CHECK: @single_V34void single_V(void)35{36// asm("foo %1,%0" : "=m" (mout0) : "V" (min1));37}38 39// CHECK: @single_lt40void single_lt(void)41{42 register int out0 = 0;43 register int in1 = 1;44 // CHECK: call i32 asm "foo $1,$0", "=r,<r[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})45 asm("foo %1,%0" : "=r" (out0) : "<r" (in1));46 // CHECK: call i32 asm "foo $1,$0", "=r,r<[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})47 asm("foo %1,%0" : "=r" (out0) : "r<" (in1));48}49 50// CHECK: @single_gt51void single_gt(void)52{53 register int out0 = 0;54 register int in1 = 1;55 // CHECK: call i32 asm "foo $1,$0", "=r,>r[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})56 asm("foo %1,%0" : "=r" (out0) : ">r" (in1));57 // CHECK: call i32 asm "foo $1,$0", "=r,r>[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})58 asm("foo %1,%0" : "=r" (out0) : "r>" (in1));59}60 61// CHECK: @single_r62void single_r(void)63{64 register int out0 = 0;65 register int in1 = 1;66 // CHECK: call i32 asm "foo $1,$0", "=r,r[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})67 asm("foo %1,%0" : "=r" (out0) : "r" (in1));68}69 70// CHECK: @single_i71void single_i(void)72{73 register int out0 = 0;74 // CHECK: call i32 asm "foo $1,$0", "=r,i[[CLOBBERS]](i32 1)75 asm("foo %1,%0" : "=r" (out0) : "i" (1));76}77 78// CHECK: @single_n79void single_n(void)80{81 register int out0 = 0;82 // CHECK: call i32 asm "foo $1,$0", "=r,n[[CLOBBERS]](i32 1)83 asm("foo %1,%0" : "=r" (out0) : "n" (1));84}85 86// CHECK: @single_E87void single_E(void)88{89 register double out0 = 0.0;90 // CHECK: call double asm "foo $1,$0", "=r,E[[CLOBBERS]](double {{[0-9.eE+-]+}})91 asm("foo %1,%0" : "=r" (out0) : "E" (1.0e+01));92}93 94// CHECK: @single_F95void single_F(void)96{97 register double out0 = 0.0;98 // CHECK: call double asm "foo $1,$0", "=r,F[[CLOBBERS]](double {{[0-9.eE+-]+}})99 asm("foo %1,%0" : "=r" (out0) : "F" (1.0));100}101 102// CHECK: @single_s103void single_s(void)104{105 register int out0 = 0;106 //asm("foo %1,%0" : "=r" (out0) : "s" (single_s));107}108 109// CHECK: @single_g110void single_g(void)111{112 register int out0 = 0;113 register int in1 = 1;114 // CHECK: call i32 asm "foo $1,$0", "=r,imr[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})115 asm("foo %1,%0" : "=r" (out0) : "g" (in1));116 // CHECK: call i32 asm "foo $1,$0", "=r,imr[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})117 asm("foo %1,%0" : "=r" (out0) : "g" (min1));118 // CHECK: call i32 asm "foo $1,$0", "=r,imr[[CLOBBERS]](i32 1)119 asm("foo %1,%0" : "=r" (out0) : "g" (1));120}121 122// CHECK: @single_X123void single_X(void)124{125 register int out0 = 0;126 register int in1 = 1;127 // CHECK: call i32 asm "foo $1,$0", "=r,X[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})128 asm("foo %1,%0" : "=r" (out0) : "X" (in1));129 // CHECK: call i32 asm "foo $1,$0", "=r,X[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})130 asm("foo %1,%0" : "=r" (out0) : "X" (min1));131 // CHECK: call i32 asm "foo $1,$0", "=r,X[[CLOBBERS]](i32 1)132 asm("foo %1,%0" : "=r" (out0) : "X" (1));133 // CHECK: call i32 asm "foo $1,$0", "=r,X[[CLOBBERS]](ptr {{[a-zA-Z0-9@%]+}})134 asm("foo %1,%0" : "=r" (out0) : "X" (marray));135 // CHECK: call i32 asm "foo $1,$0", "=r,X[[CLOBBERS]](double {{[0-9.eE+-]+}})136 asm("foo %1,%0" : "=r" (out0) : "X" (1.0e+01));137 // CHECK: call i32 asm "foo $1,$0", "=r,X[[CLOBBERS]](double {{[0-9.eE+-]+}})138 asm("foo %1,%0" : "=r" (out0) : "X" (1.0));139}140 141// CHECK: @single_p142void single_p(void)143{144 register int out0 = 0;145 // Constraint converted differently on different platforms moved to platform-specific.146 // : call i32 asm "foo $1,$0", "=r,im[[CLOBBERS]](ptr getelementptr inbounds ([2 x i32], ptr {{[a-zA-Z0-9@%]+}}, i{{32|64}} 0, i{{32|64}} 0))147 asm("foo %1,%0" : "=r" (out0) : "p" (marray));148}149 150// CHECK: @multi_m151void multi_m(void)152{153 // CHECK: call void asm "foo $1,$0", "=*m|r,m|r[[CLOBBERS]](ptr elementtype(i32) {{[a-zA-Z0-9@%]+}}, i32 {{[a-zA-Z0-9@%]+}})154 asm("foo %1,%0" : "=m,r" (mout0) : "m,r" (min1));155}156 157// CHECK: @multi_o158void multi_o(void)159{160 register int out0 = 0;161 register int index = 1;162 // Doesn't really do an offset...163 //asm("foo %1, %2,%0" : "=r,r" (out0) : "r,o" (min1));164}165 166// CHECK: @multi_V167void multi_V(void)168{169// asm("foo %1,%0" : "=m,r" (mout0) : "r,V" (min1));170}171 172// CHECK: @multi_lt173void multi_lt(void)174{175 register int out0 = 0;176 register int in1 = 1;177 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|<r[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})178 asm("foo %1,%0" : "=r,r" (out0) : "r,<r" (in1));179 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|r<[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})180 asm("foo %1,%0" : "=r,r" (out0) : "r,r<" (in1));181}182 183// CHECK: @multi_gt184void multi_gt(void)185{186 register int out0 = 0;187 register int in1 = 1;188 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|>r[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})189 asm("foo %1,%0" : "=r,r" (out0) : "r,>r" (in1));190 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|r>[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})191 asm("foo %1,%0" : "=r,r" (out0) : "r,r>" (in1));192}193 194// CHECK: @multi_r195void multi_r(void)196{197 register int out0 = 0;198 register int in1 = 1;199 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|m[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})200 asm("foo %1,%0" : "=r,r" (out0) : "r,m" (in1));201}202 203// CHECK: @multi_i204void multi_i(void)205{206 register int out0 = 0;207 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|i[[CLOBBERS]](i32 1)208 asm("foo %1,%0" : "=r,r" (out0) : "r,i" (1));209}210 211// CHECK: @multi_n212void multi_n(void)213{214 register int out0 = 0;215 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|n[[CLOBBERS]](i32 1)216 asm("foo %1,%0" : "=r,r" (out0) : "r,n" (1));217}218 219// CHECK: @multi_E220void multi_E(void)221{222 register double out0 = 0.0;223 // CHECK: call double asm "foo $1,$0", "=r|r,r|E[[CLOBBERS]](double {{[0-9.eE+-]+}})224 asm("foo %1,%0" : "=r,r" (out0) : "r,E" (1.0e+01));225}226 227// CHECK: @multi_F228void multi_F(void)229{230 register double out0 = 0.0;231 // CHECK: call double asm "foo $1,$0", "=r|r,r|F[[CLOBBERS]](double {{[0-9.eE+-]+}})232 asm("foo %1,%0" : "=r,r" (out0) : "r,F" (1.0));233}234 235// CHECK: @multi_s236void multi_s(void)237{238 register int out0 = 0;239 //asm("foo %1,%0" : "=r,r" (out0) : "r,s" (multi_s));240}241 242// CHECK: @multi_g243void multi_g(void)244{245 register int out0 = 0;246 register int in1 = 1;247 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|imr[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})248 asm("foo %1,%0" : "=r,r" (out0) : "r,g" (in1));249 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|imr[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})250 asm("foo %1,%0" : "=r,r" (out0) : "r,g" (min1));251 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|imr[[CLOBBERS]](i32 1)252 asm("foo %1,%0" : "=r,r" (out0) : "r,g" (1));253}254 255// CHECK: @multi_X256void multi_X(void)257{258 register int out0 = 0;259 register int in1 = 1;260 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|X[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})261 asm("foo %1,%0" : "=r,r" (out0) : "r,X" (in1));262 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|X[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})263 asm("foo %1,%0" : "=r,r" (out0) : "r,X" (min1));264 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|X[[CLOBBERS]](i32 1)265 asm("foo %1,%0" : "=r,r" (out0) : "r,X" (1));266 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|X[[CLOBBERS]](ptr {{[a-zA-Z0-9@%]+}})267 asm("foo %1,%0" : "=r,r" (out0) : "r,X" (marray));268 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|X[[CLOBBERS]](double {{[0-9.eE+-]+}})269 asm("foo %1,%0" : "=r,r" (out0) : "r,X" (1.0e+01));270 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|X[[CLOBBERS]](double {{[0-9.eE+-]+}})271 asm("foo %1,%0" : "=r,r" (out0) : "r,X" (1.0));272}273 274// CHECK: @multi_p275void multi_p(void)276{277 register int out0 = 0;278 // Constraint converted differently on different platforms moved to platform-specific.279 // : call i32 asm "foo $1,$0", "=r|r,r|im[[CLOBBERS]](ptr getelementptr inbounds ([2 x i32], ptr {{[a-zA-Z0-9@%]+}}, {{i[0-9]*}} 0, {{i[0-9]*}} 0))280 asm("foo %1,%0" : "=r,r" (out0) : "r,p" (marray));281}282