title: Gcc x64 function calling
body: <p>As far as I know, there are two possible calling conventions for the <code>x64</code> code - <code>Microsoft x64</code> and <code>AMD64</code>.</p>
  
  <p>Now, <code>gcc</code> can be launched with the <code>-mregparm=0</code> parameter, which doesn't work if we are working using the <code>AMD64</code> calling convention. <em>This happens because the <code>AMD64</code> convention mandates the usage of the registers for the first 6 variables</em> (I'm not really sure why this is done, but I suspect it's implemented due do possibly stack security issues).</p>
  
  <p><strong>So, here is the question:</strong></p>
  
  <p>Are there some strict rules like this <em>(forced register usage)</em> when compiling using <code>gcc</code> under <code>Microsoft x64</code> convention? And, if yes, how can they be bypassed without breaking the <code>ABI</code> compatibility?</p>