1176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// REQUIRES: x86-registered-target
2176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// RUN: %clang_cc1 %s -triple i386-pc-windows-msvc -fms-extensions -S -o - | FileCheck %s
3176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
4176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Yes, this is an assembly test from Clang, because we need to make it all the
5176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// way through code generation to know if our call became a direct, pc-relative
6176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// call or an indirect call through memory.
7176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
8176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesint k(int);
9176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines__declspec(dllimport) int kimport(int);
10176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesint (*kptr)(int);
11176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesint (*gptr())(int);
12176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
13176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesint foo() {
14176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // CHECK-LABEL: _foo:
15176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int (*r)(int) = gptr();
16176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
17176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // Simple case: direct call.
18176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  __asm call k;
19176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // CHECK:     calll   _k
20176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
21176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // Marginally harder: indirect calls, via dllimport or function pointer.
22176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  __asm call r;
23176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // CHECK:     calll   *({{.*}})
24176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  __asm call kimport;
25176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // CHECK:     calll   *({{.*}})
26176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
27176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // Broken case: Call through a global function pointer.
28176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  __asm call kptr;
29176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // CHECK:     calll   _kptr
30176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // CHECK-FIXME: calll   *_kptr
31176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
32176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
33176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesint bar() {
34176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // CHECK-LABEL: _bar:
35176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  __asm jmp k;
36176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // CHECK:     jmp     _k
37176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
38176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
39176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesint baz() {
40176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // CHECK-LABEL: _baz:
41176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  __asm mov eax, k;
42176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // CHECK: movl    _k, %eax
43176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  __asm mov eax, kptr;
44176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // CHECK: movl    _kptr, %eax
45176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
46176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
47176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Test that this asm blob doesn't require more registers than available.  This
48176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// has to be an LLVM code generation test.
49176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
50176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid __declspec(naked) naked() {
51176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  __asm pusha
52176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  __asm call k
53176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  __asm popa
54176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  __asm ret
55176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // CHECK-LABEL: _naked:
56176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // CHECK: pushal
57176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // CHECK-NEXT: calll _k
58176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // CHECK-NEXT: popal
59176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // CHECK-NEXT: retl
60176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
61