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