1*f4a2713aSLionel Sambuc // REQUIRES: x86-64-registered-target 2*f4a2713aSLionel Sambuc // RUN: %clang_cc1 %s -triple i386-apple-darwin10 -fasm-blocks -emit-llvm -o - | FileCheck %s 3*f4a2713aSLionel Sambuc 4*f4a2713aSLionel Sambuc void t1() { 5*f4a2713aSLionel Sambuc // CHECK: @t1 6*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() 7*f4a2713aSLionel Sambuc // CHECK: ret void 8*f4a2713aSLionel Sambuc __asm {} 9*f4a2713aSLionel Sambuc } 10*f4a2713aSLionel Sambuc 11*f4a2713aSLionel Sambuc void t2() { 12*f4a2713aSLionel Sambuc // CHECK: @t2 13*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "nop", "~{dirflag},~{fpsr},~{flags}"() 14*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "nop", "~{dirflag},~{fpsr},~{flags}"() 15*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "nop", "~{dirflag},~{fpsr},~{flags}"() 16*f4a2713aSLionel Sambuc // CHECK: ret void 17*f4a2713aSLionel Sambuc __asm nop 18*f4a2713aSLionel Sambuc __asm nop 19*f4a2713aSLionel Sambuc __asm nop 20*f4a2713aSLionel Sambuc } 21*f4a2713aSLionel Sambuc 22*f4a2713aSLionel Sambuc void t3() { 23*f4a2713aSLionel Sambuc // CHECK: @t3 24*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "nop\0A\09nop\0A\09nop", "~{dirflag},~{fpsr},~{flags}"() 25*f4a2713aSLionel Sambuc // CHECK: ret void 26*f4a2713aSLionel Sambuc __asm nop __asm nop __asm nop 27*f4a2713aSLionel Sambuc } 28*f4a2713aSLionel Sambuc 29*f4a2713aSLionel Sambuc void t4(void) { 30*f4a2713aSLionel Sambuc // CHECK: @t4 31*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov ebx, eax", "~{ebx},~{dirflag},~{fpsr},~{flags}"() 32*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov ecx, ebx", "~{ecx},~{dirflag},~{fpsr},~{flags}"() 33*f4a2713aSLionel Sambuc // CHECK: ret void 34*f4a2713aSLionel Sambuc __asm mov ebx, eax 35*f4a2713aSLionel Sambuc __asm mov ecx, ebx 36*f4a2713aSLionel Sambuc } 37*f4a2713aSLionel Sambuc 38*f4a2713aSLionel Sambuc void t5(void) { 39*f4a2713aSLionel Sambuc // CHECK: @t5 40*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov ebx, eax\0A\09mov ecx, ebx", "~{ebx},~{ecx},~{dirflag},~{fpsr},~{flags}"() 41*f4a2713aSLionel Sambuc // CHECK: ret void 42*f4a2713aSLionel Sambuc __asm mov ebx, eax __asm mov ecx, ebx 43*f4a2713aSLionel Sambuc } 44*f4a2713aSLionel Sambuc 45*f4a2713aSLionel Sambuc void t6(void) { 46*f4a2713aSLionel Sambuc __asm int 0x2c 47*f4a2713aSLionel Sambuc // CHECK: t6 48*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "int $$0x2c", "~{dirflag},~{fpsr},~{flags}"() 49*f4a2713aSLionel Sambuc } 50*f4a2713aSLionel Sambuc 51*f4a2713aSLionel Sambuc void t7() { 52*f4a2713aSLionel Sambuc __asm { 53*f4a2713aSLionel Sambuc int 0x2c ; } asm comments are fun! }{ 54*f4a2713aSLionel Sambuc } 55*f4a2713aSLionel Sambuc __asm {} 56*f4a2713aSLionel Sambuc // CHECK: t7 57*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "int $$0x2c", "~{dirflag},~{fpsr},~{flags}"() 58*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() 59*f4a2713aSLionel Sambuc } 60*f4a2713aSLionel Sambuc 61*f4a2713aSLionel Sambuc int t8() { 62*f4a2713aSLionel Sambuc __asm int 4 ; } comments for single-line asm 63*f4a2713aSLionel Sambuc __asm {} 64*f4a2713aSLionel Sambuc __asm int 4 65*f4a2713aSLionel Sambuc return 10; 66*f4a2713aSLionel Sambuc // CHECK: t8 67*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "int $$4", "~{dirflag},~{fpsr},~{flags}"() 68*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() 69*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "int $$4", "~{dirflag},~{fpsr},~{flags}"() 70*f4a2713aSLionel Sambuc // CHECK: ret i32 10 71*f4a2713aSLionel Sambuc } 72*f4a2713aSLionel Sambuc 73*f4a2713aSLionel Sambuc void t9() { 74*f4a2713aSLionel Sambuc __asm { 75*f4a2713aSLionel Sambuc push ebx 76*f4a2713aSLionel Sambuc mov ebx, 0x07 77*f4a2713aSLionel Sambuc pop ebx 78*f4a2713aSLionel Sambuc } 79*f4a2713aSLionel Sambuc // CHECK: t9 80*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, $$0x07\0A\09pop ebx", "~{ebx},~{dirflag},~{fpsr},~{flags}"() 81*f4a2713aSLionel Sambuc } 82*f4a2713aSLionel Sambuc 83*f4a2713aSLionel Sambuc unsigned t10(void) { 84*f4a2713aSLionel Sambuc unsigned i = 1, j; 85*f4a2713aSLionel Sambuc __asm { 86*f4a2713aSLionel Sambuc mov eax, i 87*f4a2713aSLionel Sambuc mov j, eax 88*f4a2713aSLionel Sambuc } 89*f4a2713aSLionel Sambuc return j; 90*f4a2713aSLionel Sambuc // CHECK: t10 91*f4a2713aSLionel Sambuc // CHECK: [[I:%[a-zA-Z0-9]+]] = alloca i32, align 4 92*f4a2713aSLionel Sambuc // CHECK: [[J:%[a-zA-Z0-9]+]] = alloca i32, align 4 93*f4a2713aSLionel Sambuc // CHECK: store i32 1, i32* [[I]], align 4 94*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $1\0A\09mov dword ptr $0, eax", "=*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}}) 95*f4a2713aSLionel Sambuc // CHECK: [[RET:%[a-zA-Z0-9]+]] = load i32* [[J]], align 4 96*f4a2713aSLionel Sambuc // CHECK: ret i32 [[RET]] 97*f4a2713aSLionel Sambuc } 98*f4a2713aSLionel Sambuc 99*f4a2713aSLionel Sambuc void t11(void) { 100*f4a2713aSLionel Sambuc __asm mov eax, 1 101*f4a2713aSLionel Sambuc // CHECK: t11 102*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() 103*f4a2713aSLionel Sambuc } 104*f4a2713aSLionel Sambuc 105*f4a2713aSLionel Sambuc unsigned t12(void) { 106*f4a2713aSLionel Sambuc unsigned i = 1, j, l = 1, m; 107*f4a2713aSLionel Sambuc __asm { 108*f4a2713aSLionel Sambuc mov eax, i 109*f4a2713aSLionel Sambuc mov j, eax 110*f4a2713aSLionel Sambuc mov eax, l 111*f4a2713aSLionel Sambuc mov m, eax 112*f4a2713aSLionel Sambuc } 113*f4a2713aSLionel Sambuc return j + m; 114*f4a2713aSLionel Sambuc // CHECK: t12 115*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $2\0A\09mov dword ptr $0, eax\0A\09mov eax, dword ptr $3\0A\09mov dword ptr $1, eax", "=*m,=*m,*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}}) 116*f4a2713aSLionel Sambuc } 117*f4a2713aSLionel Sambuc 118*f4a2713aSLionel Sambuc void t13() { 119*f4a2713aSLionel Sambuc char i = 1; 120*f4a2713aSLionel Sambuc short j = 2; 121*f4a2713aSLionel Sambuc __asm movzx eax, i 122*f4a2713aSLionel Sambuc __asm movzx eax, j 123*f4a2713aSLionel Sambuc // CHECK: t13 124*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "movzx eax, byte ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i8* %{{.*}}) 125*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "movzx eax, word ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i16* %{{.*}}) 126*f4a2713aSLionel Sambuc } 127*f4a2713aSLionel Sambuc 128*f4a2713aSLionel Sambuc void t14() { 129*f4a2713aSLionel Sambuc unsigned i = 1, j = 2; 130*f4a2713aSLionel Sambuc __asm { 131*f4a2713aSLionel Sambuc .if 1 132*f4a2713aSLionel Sambuc mov eax, i 133*f4a2713aSLionel Sambuc .else 134*f4a2713aSLionel Sambuc mov ebx, j 135*f4a2713aSLionel Sambuc .endif 136*f4a2713aSLionel Sambuc } 137*f4a2713aSLionel Sambuc // CHECK: t14 138*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect ".if 1\0A\09mov eax, dword ptr $0\0A\09.else\0A\09mov ebx, j\0A\09.endif", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) 139*f4a2713aSLionel Sambuc } 140*f4a2713aSLionel Sambuc 141*f4a2713aSLionel Sambuc int gvar = 10; 142*f4a2713aSLionel Sambuc void t15() { 143*f4a2713aSLionel Sambuc int lvar = 10; 144*f4a2713aSLionel Sambuc __asm mov eax, lvar ; eax = 10 145*f4a2713aSLionel Sambuc __asm mov eax, offset lvar ; eax = address of lvar 146*f4a2713aSLionel Sambuc __asm mov eax, offset gvar ; eax = address of gvar 147*f4a2713aSLionel Sambuc // CHECK: t15 148*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) 149*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $0", "r,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) 150*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $0", "r,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* @{{.*}}) 151*f4a2713aSLionel Sambuc } 152*f4a2713aSLionel Sambuc 153*f4a2713aSLionel Sambuc void t16() { 154*f4a2713aSLionel Sambuc int var = 10; 155*f4a2713aSLionel Sambuc __asm mov [eax], offset var 156*f4a2713aSLionel Sambuc // CHECK: t16 157*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov [eax], $0", "r,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) 158*f4a2713aSLionel Sambuc } 159*f4a2713aSLionel Sambuc 160*f4a2713aSLionel Sambuc void t17() { 161*f4a2713aSLionel Sambuc __asm _emit 0x4A 162*f4a2713aSLionel Sambuc __asm _emit 0x43 163*f4a2713aSLionel Sambuc __asm _emit 0x4B 164*f4a2713aSLionel Sambuc __asm _EMIT 0x4B 165*f4a2713aSLionel Sambuc // CHECK: t17 166*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect ".byte 0x4A", "~{dirflag},~{fpsr},~{flags}"() 167*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect ".byte 0x43", "~{dirflag},~{fpsr},~{flags}"() 168*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect ".byte 0x4B", "~{dirflag},~{fpsr},~{flags}"() 169*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect ".byte 0x4B", "~{dirflag},~{fpsr},~{flags}"() 170*f4a2713aSLionel Sambuc } 171*f4a2713aSLionel Sambuc 172*f4a2713aSLionel Sambuc void t20() { 173*f4a2713aSLionel Sambuc char bar; 174*f4a2713aSLionel Sambuc int foo; 175*f4a2713aSLionel Sambuc char _bar[2]; 176*f4a2713aSLionel Sambuc int _foo[4]; 177*f4a2713aSLionel Sambuc 178*f4a2713aSLionel Sambuc __asm mov eax, LENGTH foo 179*f4a2713aSLionel Sambuc __asm mov eax, LENGTH bar 180*f4a2713aSLionel Sambuc __asm mov eax, LENGTH _foo 181*f4a2713aSLionel Sambuc __asm mov eax, LENGTH _bar 182*f4a2713aSLionel Sambuc // CHECK: t20 183*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() 184*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() 185*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"() 186*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$2", "~{eax},~{dirflag},~{fpsr},~{flags}"() 187*f4a2713aSLionel Sambuc 188*f4a2713aSLionel Sambuc __asm mov eax, TYPE foo 189*f4a2713aSLionel Sambuc __asm mov eax, TYPE bar 190*f4a2713aSLionel Sambuc __asm mov eax, TYPE _foo 191*f4a2713aSLionel Sambuc __asm mov eax, TYPE _bar 192*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"() 193*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() 194*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"() 195*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() 196*f4a2713aSLionel Sambuc 197*f4a2713aSLionel Sambuc __asm mov eax, SIZE foo 198*f4a2713aSLionel Sambuc __asm mov eax, SIZE bar 199*f4a2713aSLionel Sambuc __asm mov eax, SIZE _foo 200*f4a2713aSLionel Sambuc __asm mov eax, SIZE _bar 201*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"() 202*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() 203*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$16", "~{eax},~{dirflag},~{fpsr},~{flags}"() 204*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$2", "~{eax},~{dirflag},~{fpsr},~{flags}"() 205*f4a2713aSLionel Sambuc } 206*f4a2713aSLionel Sambuc 207*f4a2713aSLionel Sambuc void t21() { 208*f4a2713aSLionel Sambuc __asm { 209*f4a2713aSLionel Sambuc __asm push ebx 210*f4a2713aSLionel Sambuc __asm mov ebx, 0x07 211*f4a2713aSLionel Sambuc __asm pop ebx 212*f4a2713aSLionel Sambuc } 213*f4a2713aSLionel Sambuc // CHECK: t21 214*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, $$0x07\0A\09pop ebx", "~{ebx},~{dirflag},~{fpsr},~{flags}"() 215*f4a2713aSLionel Sambuc } 216*f4a2713aSLionel Sambuc 217*f4a2713aSLionel Sambuc extern void t22_helper(int x); 218*f4a2713aSLionel Sambuc void t22() { 219*f4a2713aSLionel Sambuc int x = 0; 220*f4a2713aSLionel Sambuc __asm { 221*f4a2713aSLionel Sambuc __asm push ebx 222*f4a2713aSLionel Sambuc __asm mov ebx, esp 223*f4a2713aSLionel Sambuc } 224*f4a2713aSLionel Sambuc t22_helper(x); 225*f4a2713aSLionel Sambuc __asm { 226*f4a2713aSLionel Sambuc __asm mov esp, ebx 227*f4a2713aSLionel Sambuc __asm pop ebx 228*f4a2713aSLionel Sambuc } 229*f4a2713aSLionel Sambuc // CHECK: t22 230*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, esp", "~{ebx},~{dirflag},~{fpsr},~{flags}"() 231*f4a2713aSLionel Sambuc // CHECK: call void @t22_helper 232*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov esp, ebx\0A\09pop ebx", "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"() 233*f4a2713aSLionel Sambuc } 234*f4a2713aSLionel Sambuc 235*f4a2713aSLionel Sambuc void t23() { 236*f4a2713aSLionel Sambuc __asm { 237*f4a2713aSLionel Sambuc the_label: 238*f4a2713aSLionel Sambuc } 239*f4a2713aSLionel Sambuc // CHECK: t23 240*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "the_label:", "~{dirflag},~{fpsr},~{flags}"() 241*f4a2713aSLionel Sambuc } 242*f4a2713aSLionel Sambuc 243*f4a2713aSLionel Sambuc void t24_helper(void) {} 244*f4a2713aSLionel Sambuc void t24() { 245*f4a2713aSLionel Sambuc __asm call t24_helper 246*f4a2713aSLionel Sambuc // CHECK: t24 247*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "call $0", "r,~{dirflag},~{fpsr},~{flags}"(void ()* @t24_helper) 248*f4a2713aSLionel Sambuc } 249*f4a2713aSLionel Sambuc 250*f4a2713aSLionel Sambuc void t25() { 251*f4a2713aSLionel Sambuc __asm mov eax, 0ffffffffh 252*f4a2713aSLionel Sambuc __asm mov eax, 0fh 253*f4a2713aSLionel Sambuc __asm mov eax, 0a2h 254*f4a2713aSLionel Sambuc __asm mov eax, 0xa2h 255*f4a2713aSLionel Sambuc __asm mov eax, 0xa2 256*f4a2713aSLionel Sambuc // CHECK: t25 257*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$4294967295", "~{eax},~{dirflag},~{fpsr},~{flags}"() 258*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$15", "~{eax},~{dirflag},~{fpsr},~{flags}"() 259*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$162", "~{eax},~{dirflag},~{fpsr},~{flags}"() 260*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$0xa2h", "~{eax},~{dirflag},~{fpsr},~{flags}"() 261*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$0xa2", "~{eax},~{dirflag},~{fpsr},~{flags}"() 262*f4a2713aSLionel Sambuc } 263*f4a2713aSLionel Sambuc 264*f4a2713aSLionel Sambuc void t26() { 265*f4a2713aSLionel Sambuc __asm pushad 266*f4a2713aSLionel Sambuc __asm mov eax, 0 267*f4a2713aSLionel Sambuc __asm __emit 0fh 268*f4a2713aSLionel Sambuc __asm __emit 0a2h 269*f4a2713aSLionel Sambuc __asm __EMIT 0a2h 270*f4a2713aSLionel Sambuc __asm popad 271*f4a2713aSLionel Sambuc // CHECK: t26 272*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "pushad", "~{dirflag},~{fpsr},~{flags}"() 273*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$0", "~{eax},~{dirflag},~{fpsr},~{flags}"() 274*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect ".byte 0fh", "~{dirflag},~{fpsr},~{flags}"() 275*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect ".byte 0a2h", "~{dirflag},~{fpsr},~{flags}"() 276*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect ".byte 0a2h", "~{dirflag},~{fpsr},~{flags}"() 277*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "popad", "~{dirflag},~{fpsr},~{flags}"() 278*f4a2713aSLionel Sambuc } 279*f4a2713aSLionel Sambuc 280*f4a2713aSLionel Sambuc void t27() { 281*f4a2713aSLionel Sambuc __asm mov eax, fs:[0h] 282*f4a2713aSLionel Sambuc // CHECK: t27 283*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, fs:[$$0h]", "~{eax},~{dirflag},~{fpsr},~{flags}"() 284*f4a2713aSLionel Sambuc } 285*f4a2713aSLionel Sambuc 286*f4a2713aSLionel Sambuc void t28() { 287*f4a2713aSLionel Sambuc __asm align 8 288*f4a2713aSLionel Sambuc __asm align 16; 289*f4a2713aSLionel Sambuc __asm align 128; 290*f4a2713aSLionel Sambuc __asm ALIGN 256; 291*f4a2713aSLionel Sambuc // CHECK: t28 292*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect ".align 3", "~{dirflag},~{fpsr},~{flags}"() 293*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect ".align 4", "~{dirflag},~{fpsr},~{flags}"() 294*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect ".align 7", "~{dirflag},~{fpsr},~{flags}"() 295*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect ".align 8", "~{dirflag},~{fpsr},~{flags}"() 296*f4a2713aSLionel Sambuc } 297*f4a2713aSLionel Sambuc 298*f4a2713aSLionel Sambuc void t29() { 299*f4a2713aSLionel Sambuc int arr[2] = {0, 0}; 300*f4a2713aSLionel Sambuc int olen = 0, osize = 0, otype = 0; 301*f4a2713aSLionel Sambuc __asm mov olen, LENGTH arr 302*f4a2713aSLionel Sambuc __asm mov osize, SIZE arr 303*f4a2713aSLionel Sambuc __asm mov otype, TYPE arr 304*f4a2713aSLionel Sambuc // CHECK: t29 305*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, $$2", "=*m,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) 306*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, $$8", "=*m,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) 307*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, $$4", "=*m,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) 308*f4a2713aSLionel Sambuc } 309*f4a2713aSLionel Sambuc 310*f4a2713aSLionel Sambuc int results[2] = {13, 37}; 311*f4a2713aSLionel Sambuc int *t30() 312*f4a2713aSLionel Sambuc { 313*f4a2713aSLionel Sambuc int *res; 314*f4a2713aSLionel Sambuc __asm lea edi, results 315*f4a2713aSLionel Sambuc __asm mov res, edi 316*f4a2713aSLionel Sambuc return res; 317*f4a2713aSLionel Sambuc // CHECK: t30 318*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "lea edi, dword ptr $0", "*m,~{edi},~{dirflag},~{fpsr},~{flags}"([2 x i32]* @{{.*}}) 319*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, edi", "=*m,~{dirflag},~{fpsr},~{flags}"(i32** %{{.*}}) 320*f4a2713aSLionel Sambuc } 321*f4a2713aSLionel Sambuc 322*f4a2713aSLionel Sambuc void t31() { 323*f4a2713aSLionel Sambuc __asm pushad 324*f4a2713aSLionel Sambuc __asm popad 325*f4a2713aSLionel Sambuc // CHECK: t31 326*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "pushad", "~{dirflag},~{fpsr},~{flags}"() 327*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "popad", "~{dirflag},~{fpsr},~{flags}"() 328*f4a2713aSLionel Sambuc } 329*f4a2713aSLionel Sambuc 330*f4a2713aSLionel Sambuc void t32() { 331*f4a2713aSLionel Sambuc int i; 332*f4a2713aSLionel Sambuc __asm mov eax, i 333*f4a2713aSLionel Sambuc __asm mov eax, dword ptr i 334*f4a2713aSLionel Sambuc __asm mov ax, word ptr i 335*f4a2713aSLionel Sambuc __asm mov al, byte ptr i 336*f4a2713aSLionel Sambuc // CHECK: t32 337*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) 338*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) 339*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov ax, word ptr $0", "*m,~{ax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) 340*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov al, byte ptr $0", "*m,~{al},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) 341*f4a2713aSLionel Sambuc } 342*f4a2713aSLionel Sambuc 343*f4a2713aSLionel Sambuc void t33() { 344*f4a2713aSLionel Sambuc int i; 345*f4a2713aSLionel Sambuc __asm mov eax, [i] 346*f4a2713aSLionel Sambuc __asm mov eax, dword ptr [i] 347*f4a2713aSLionel Sambuc __asm mov ax, word ptr [i] 348*f4a2713aSLionel Sambuc __asm mov al, byte ptr [i] 349*f4a2713aSLionel Sambuc // CHECK: t33 350*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) 351*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) 352*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov ax, word ptr $0", "*m,~{ax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) 353*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov al, byte ptr $0", "*m,~{al},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) 354*f4a2713aSLionel Sambuc } 355*f4a2713aSLionel Sambuc 356*f4a2713aSLionel Sambuc void t34() { 357*f4a2713aSLionel Sambuc __asm prefetchnta 64[eax] 358*f4a2713aSLionel Sambuc __asm mov eax, dword ptr 4[eax] 359*f4a2713aSLionel Sambuc // CHECK: t34 360*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "prefetchnta $$64[eax]", "~{dirflag},~{fpsr},~{flags}"() 361*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4[eax]", "~{eax},~{dirflag},~{fpsr},~{flags}"() 362*f4a2713aSLionel Sambuc } 363*f4a2713aSLionel Sambuc 364*f4a2713aSLionel Sambuc void t35() { 365*f4a2713aSLionel Sambuc __asm prefetchnta [eax + (200*64)] 366*f4a2713aSLionel Sambuc __asm mov eax, dword ptr [eax + (200*64)] 367*f4a2713aSLionel Sambuc // CHECK: t35 368*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "prefetchnta [eax + ($$200*$$64)]", "~{dirflag},~{fpsr},~{flags}"() 369*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr [eax + ($$200*$$64)]", "~{eax},~{dirflag},~{fpsr},~{flags}"() 370*f4a2713aSLionel Sambuc } 371*f4a2713aSLionel Sambuc 372*f4a2713aSLionel Sambuc void t36() { 373*f4a2713aSLionel Sambuc int arr[4]; 374*f4a2713aSLionel Sambuc __asm mov eax, 4[arr] 375*f4a2713aSLionel Sambuc __asm mov eax, 4[arr + 4] 376*f4a2713aSLionel Sambuc __asm mov eax, 8[arr + 4 + 32*2 - 4] 377*f4a2713aSLionel Sambuc __asm mov eax, 12[4 + arr] 378*f4a2713aSLionel Sambuc __asm mov eax, 4[4 + arr + 4] 379*f4a2713aSLionel Sambuc __asm mov eax, 4[64 + arr + (2*32)] 380*f4a2713aSLionel Sambuc __asm mov eax, 4[64 + arr - 2*32] 381*f4a2713aSLionel Sambuc __asm mov eax, [arr + 4] 382*f4a2713aSLionel Sambuc __asm mov eax, [arr + 4 + 32*2 - 4] 383*f4a2713aSLionel Sambuc __asm mov eax, [4 + arr] 384*f4a2713aSLionel Sambuc __asm mov eax, [4 + arr + 4] 385*f4a2713aSLionel Sambuc __asm mov eax, [64 + arr + (2*32)] 386*f4a2713aSLionel Sambuc __asm mov eax, [64 + arr - 2*32] 387*f4a2713aSLionel Sambuc // CHECK: t36 388*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) 389*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) 390*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$72$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) 391*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$16$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) 392*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$12$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) 393*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$132$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) 394*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) 395*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) 396*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$64$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) 397*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) 398*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) 399*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$128$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) 400*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) 401*f4a2713aSLionel Sambuc } 402*f4a2713aSLionel Sambuc 403*f4a2713aSLionel Sambuc void t37() { 404*f4a2713aSLionel Sambuc __asm mov eax, 4 + 8 405*f4a2713aSLionel Sambuc __asm mov eax, 4 + 8 * 16 406*f4a2713aSLionel Sambuc __asm mov eax, -4 + 8 * 16 407*f4a2713aSLionel Sambuc __asm mov eax, (4 + 4) * 16 408*f4a2713aSLionel Sambuc __asm mov eax, 4 + 8 * -16 409*f4a2713aSLionel Sambuc __asm mov eax, 4 + 16 / -8 410*f4a2713aSLionel Sambuc __asm mov eax, (16 + 16) / -8 411*f4a2713aSLionel Sambuc // CHECK: t37 412*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$12", "~{eax},~{dirflag},~{fpsr},~{flags}"() 413*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$132", "~{eax},~{dirflag},~{fpsr},~{flags}"() 414*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$124", "~{eax},~{dirflag},~{fpsr},~{flags}"() 415*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$128", "~{eax},~{dirflag},~{fpsr},~{flags}"() 416*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$4294967172", "~{eax},~{dirflag},~{fpsr},~{flags}"() 417*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$2", "~{eax},~{dirflag},~{fpsr},~{flags}"() 418*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, $$4294967292", "~{eax},~{dirflag},~{fpsr},~{flags}"() 419*f4a2713aSLionel Sambuc } 420*f4a2713aSLionel Sambuc 421*f4a2713aSLionel Sambuc void t38() { 422*f4a2713aSLionel Sambuc int arr[4]; 423*f4a2713aSLionel Sambuc __asm mov eax, 4+4[arr] 424*f4a2713aSLionel Sambuc __asm mov eax, (4+4)[arr + 4] 425*f4a2713aSLionel Sambuc __asm mov eax, 8*2[arr + 4 + 32*2 - 4] 426*f4a2713aSLionel Sambuc __asm mov eax, 12+20[4 + arr] 427*f4a2713aSLionel Sambuc __asm mov eax, 4*16+4[4 + arr + 4] 428*f4a2713aSLionel Sambuc __asm mov eax, 4*4[64 + arr + (2*32)] 429*f4a2713aSLionel Sambuc __asm mov eax, 4*(4-2)[64 + arr - 2*32] 430*f4a2713aSLionel Sambuc __asm mov eax, 32*(4-2)[arr - 2*32] 431*f4a2713aSLionel Sambuc // CHECK: t38 432*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) 433*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$12$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) 434*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$80$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) 435*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$36$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) 436*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$76$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) 437*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$144$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) 438*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) 439*f4a2713aSLionel Sambuc // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$0$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) 440*f4a2713aSLionel Sambuc } 441