<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[135976] trunk/dports/science/volk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="https://trac.macports.org/changeset/135976">135976</a></dd>
<dt>Author</dt> <dd>michaelld@macports.org</dd>
<dt>Date</dt> <dd>2015-05-08 07:40:35 -0700 (Fri, 08 May 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>volk: add back using &lt;cpuid.h&gt; if found, and otherwise providing a local copy of it, to make older GCC (&lt;= 4.2) compilers happy. Does not hurt when using Clang or GCC &gt;= 4.3. Redo compiler blacklisting accordingly.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkdportssciencevolkPortfile">trunk/dports/science/volk/Portfile</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li>trunk/dports/science/volk/files/</li>
<li><a href="#trunkdportssciencevolkfilespatchaddbackcpuiddiff">trunk/dports/science/volk/files/patch-add-back-cpuid.diff</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkdportssciencevolkPortfile"></a>
<div class="modfile"><h4>Modified: trunk/dports/science/volk/Portfile (135975 => 135976)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/dports/science/volk/Portfile        2015-05-08 14:19:48 UTC (rev 135975)
+++ trunk/dports/science/volk/Portfile        2015-05-08 14:40:35 UTC (rev 135976)
</span><span class="lines">@@ -29,10 +29,11 @@
</span><span class="cx"> depends_build-append port:pkgconfig
</span><span class="cx"> depends_lib-append   port:boost
</span><span class="cx"> 
</span><del>-# blacklist GCC &lt; 4.3, since it does not provide &lt;cpuid.h&gt;, which is a
-# required header when compiling using GCC as of 4c967ef1 (2015-05-04).
</del><ins>+# patch to add back using &lt;cpuid.h&gt; if found, and otherwise providing
+# a local copy of it, to make older GCC compilers happy. Does not hurt
+# when using Clang or GCC &gt;= 4.3.
</ins><span class="cx"> 
</span><del>-compiler.blacklist-append *gcc-3.* {*gcc-4.[0-2]}
</del><ins>+patchfiles-append patch-add-back-cpuid.diff
</ins><span class="cx"> 
</span><span class="cx"> # do VPATH (out of source tree) build
</span><span class="cx"> 
</span><span class="lines">@@ -124,9 +125,8 @@
</span><span class="cx"> 
</span><span class="cx">         # Blacklist GCC compilers not supporting C++11 and all CLANG.
</span><span class="cx">         # This is probably not necessary, but it's good practice.
</span><del>-        # GCC 3* and 4.[0-2] are already blacklisted above.
</del><span class="cx"> 
</span><del>-        compiler.blacklist-append *clang* {*gcc-4.[3-6]}
</del><ins>+        compiler.blacklist-append *clang* *gcc-3.* {*gcc-4.[0-6]}
</ins><span class="cx"> 
</span><span class="cx">         # and whitelist those we do want to use. wish there were a better way.
</span><span class="cx">         # these will be used in the order provided.
</span></span></pre></div>
<a id="trunkdportssciencevolkfilespatchaddbackcpuiddiff"></a>
<div class="addfile"><h4>Added: trunk/dports/science/volk/files/patch-add-back-cpuid.diff (0 => 135976)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/dports/science/volk/files/patch-add-back-cpuid.diff                                (rev 0)
+++ trunk/dports/science/volk/files/patch-add-back-cpuid.diff        2015-05-08 14:40:35 UTC (rev 135976)
</span><span class="lines">@@ -0,0 +1,206 @@
</span><ins>+--- /dev/null
++++ lib/gcc_x86_cpuid.h
+@@ -0,0 +1,188 @@
++/*
++ * Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
++ *
++ * This file is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 3, or (at your option) any
++ * later version.
++ *
++ * This file is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * General Public License for more details.
++ *
++ * Under Section 7 of GPL version 3, you are granted additional
++ * permissions described in the GCC Runtime Library Exception, version
++ * 3.1, as published by the Free Software Foundation.
++ *
++ * You should have received a copy of the GNU General Public License and
++ * a copy of the GCC Runtime Library Exception along with this program;
++ * see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
++ * &lt;http://www.gnu.org/licenses/&gt;.
++ */
++
++/* %ecx */
++#define bit_SSE3        (1 &lt;&lt; 0)
++#define bit_PCLMUL        (1 &lt;&lt; 1)
++#define bit_SSSE3        (1 &lt;&lt; 9)
++#define bit_FMA                (1 &lt;&lt; 12)
++#define bit_CMPXCHG16B        (1 &lt;&lt; 13)
++#define bit_SSE4_1        (1 &lt;&lt; 19)
++#define bit_SSE4_2        (1 &lt;&lt; 20)
++#define bit_MOVBE        (1 &lt;&lt; 22)
++#define bit_POPCNT        (1 &lt;&lt; 23)
++#define bit_AES                (1 &lt;&lt; 25)
++#define bit_XSAVE        (1 &lt;&lt; 26)
++#define bit_OSXSAVE        (1 &lt;&lt; 27)
++#define bit_AVX                (1 &lt;&lt; 28)
++#define bit_F16C        (1 &lt;&lt; 29)
++#define bit_RDRND        (1 &lt;&lt; 30)
++
++/* %edx */
++#define bit_CMPXCHG8B        (1 &lt;&lt; 8)
++#define bit_CMOV        (1 &lt;&lt; 15)
++#define bit_MMX                (1 &lt;&lt; 23)
++#define bit_FXSAVE        (1 &lt;&lt; 24)
++#define bit_SSE                (1 &lt;&lt; 25)
++#define bit_SSE2        (1 &lt;&lt; 26)
++
++/* Extended Features */
++/* %ecx */
++#define bit_LAHF_LM        (1 &lt;&lt; 0)
++#define bit_ABM                (1 &lt;&lt; 5)
++#define bit_SSE4a        (1 &lt;&lt; 6)
++#define bit_XOP         (1 &lt;&lt; 11)
++#define bit_LWP         (1 &lt;&lt; 15)
++#define bit_FMA4        (1 &lt;&lt; 16)
++#define bit_TBM         (1 &lt;&lt; 21)
++
++/* %edx */
++#define bit_MMXEXT        (1 &lt;&lt; 22)
++#define bit_LM                (1 &lt;&lt; 29)
++#define bit_3DNOWP        (1 &lt;&lt; 30)
++#define bit_3DNOW        (1 &lt;&lt; 31)
++
++/* Extended Features (%eax == 7) */
++#define bit_FSGSBASE        (1 &lt;&lt; 0)
++#define bit_BMI                (1 &lt;&lt; 3)
++
++#if defined(__i386__) &amp;&amp; defined(__PIC__)
++/* %ebx may be the PIC register.  */
++#if __GNUC__ &gt;= 3
++#define __cpuid(level, a, b, c, d)                        \
++  __asm__ (&quot;xchg{l}\t{%%}ebx, %1\n\t&quot;                        \
++           &quot;cpuid\n\t&quot;                                        \
++           &quot;xchg{l}\t{%%}ebx, %1\n\t&quot;                        \
++           : &quot;=a&quot; (a), &quot;=r&quot; (b), &quot;=c&quot; (c), &quot;=d&quot; (d)        \
++           : &quot;0&quot; (level))
++
++#define __cpuid_count(level, count, a, b, c, d)                \
++  __asm__ (&quot;xchg{l}\t{%%}ebx, %1\n\t&quot;                        \
++           &quot;cpuid\n\t&quot;                                        \
++           &quot;xchg{l}\t{%%}ebx, %1\n\t&quot;                        \
++           : &quot;=a&quot; (a), &quot;=r&quot; (b), &quot;=c&quot; (c), &quot;=d&quot; (d)        \
++           : &quot;0&quot; (level), &quot;2&quot; (count))
++#else
++/* Host GCCs older than 3.0 weren't supporting Intel asm syntax
++   nor alternatives in i386 code.  */
++#define __cpuid(level, a, b, c, d)                        \
++  __asm__ (&quot;xchgl\t%%ebx, %1\n\t&quot;                        \
++           &quot;cpuid\n\t&quot;                                        \
++           &quot;xchgl\t%%ebx, %1\n\t&quot;                        \
++           : &quot;=a&quot; (a), &quot;=r&quot; (b), &quot;=c&quot; (c), &quot;=d&quot; (d)        \
++           : &quot;0&quot; (level))
++
++#define __cpuid_count(level, count, a, b, c, d)                \
++  __asm__ (&quot;xchgl\t%%ebx, %1\n\t&quot;                        \
++           &quot;cpuid\n\t&quot;                                        \
++           &quot;xchgl\t%%ebx, %1\n\t&quot;                        \
++           : &quot;=a&quot; (a), &quot;=r&quot; (b), &quot;=c&quot; (c), &quot;=d&quot; (d)        \
++           : &quot;0&quot; (level), &quot;2&quot; (count))
++#endif
++#else
++#define __cpuid(level, a, b, c, d)                        \
++  __asm__ (&quot;cpuid\n\t&quot;                                        \
++           : &quot;=a&quot; (a), &quot;=b&quot; (b), &quot;=c&quot; (c), &quot;=d&quot; (d)        \
++           : &quot;0&quot; (level))
++
++#define __cpuid_count(level, count, a, b, c, d)                \
++  __asm__ (&quot;cpuid\n\t&quot;                                        \
++           : &quot;=a&quot; (a), &quot;=b&quot; (b), &quot;=c&quot; (c), &quot;=d&quot; (d)        \
++           : &quot;0&quot; (level), &quot;2&quot; (count))
++#endif
++
++/* Return highest supported input value for cpuid instruction.  ext can
++   be either 0x0 or 0x8000000 to return highest supported value for
++   basic or extended cpuid information.  Function returns 0 if cpuid
++   is not supported or whatever cpuid returns in eax register.  If sig
++   pointer is non-null, then first four bytes of the signature
++   (as found in ebx register) are returned in location pointed by sig.  */
++
++static __inline unsigned int
++__get_cpuid_max (unsigned int __ext, unsigned int *__sig)
++{
++  unsigned int __eax, __ebx, __ecx, __edx;
++
++#ifndef __x86_64__
++  /* See if we can use cpuid.  On AMD64 we always can.  */
++#if __GNUC__ &gt;= 3
++  __asm__ (&quot;pushf{l|d}\n\t&quot;
++           &quot;pushf{l|d}\n\t&quot;
++           &quot;pop{l}\t%0\n\t&quot;
++           &quot;mov{l}\t{%0, %1|%1, %0}\n\t&quot;
++           &quot;xor{l}\t{%2, %0|%0, %2}\n\t&quot;
++           &quot;push{l}\t%0\n\t&quot;
++           &quot;popf{l|d}\n\t&quot;
++           &quot;pushf{l|d}\n\t&quot;
++           &quot;pop{l}\t%0\n\t&quot;
++           &quot;popf{l|d}\n\t&quot;
++           : &quot;=&amp;r&quot; (__eax), &quot;=&amp;r&quot; (__ebx)
++           : &quot;i&quot; (0x00200000));
++#else
++/* Host GCCs older than 3.0 weren't supporting Intel asm syntax
++   nor alternatives in i386 code.  */
++  __asm__ (&quot;pushfl\n\t&quot;
++           &quot;pushfl\n\t&quot;
++           &quot;popl\t%0\n\t&quot;
++           &quot;movl\t%0, %1\n\t&quot;
++           &quot;xorl\t%2, %0\n\t&quot;
++           &quot;pushl\t%0\n\t&quot;
++           &quot;popfl\n\t&quot;
++           &quot;pushfl\n\t&quot;
++           &quot;popl\t%0\n\t&quot;
++           &quot;popfl\n\t&quot;
++           : &quot;=&amp;r&quot; (__eax), &quot;=&amp;r&quot; (__ebx)
++           : &quot;i&quot; (0x00200000));
++#endif
++
++  if (!((__eax ^ __ebx) &amp; 0x00200000))
++    return 0;
++#endif
++
++  /* Host supports cpuid.  Return highest supported cpuid input value.  */
++  __cpuid (__ext, __eax, __ebx, __ecx, __edx);
++
++  if (__sig)
++    *__sig = __ebx;
++
++  return __eax;
++}
++
++/* Return cpuid data for requested cpuid level, as found in returned
++   eax, ebx, ecx and edx registers.  The function checks if cpuid is
++   supported and returns 1 for valid cpuid information or 0 for
++   unsupported cpuid level.  All pointers are required to be non-null.  */
++
++static __inline int
++__get_cpuid (unsigned int __level,
++             unsigned int *__eax, unsigned int *__ebx,
++             unsigned int *__ecx, unsigned int *__edx)
++{
++  unsigned int __ext = __level &amp; 0x80000000;
++
++  if (__get_cpuid_max (__ext, 0) &lt; __level)
++    return 0;
++
++  __cpuid (__level, *__eax, *__ebx, *__ecx, *__edx);
++  return 1;
++}
+--- tmpl/volk_cpu.tmpl.c.orig
++++ tmpl/volk_cpu.tmpl.c
+@@ -33,7 +33,11 @@ struct VOLK_CPU volk_cpu;

+ //implement get cpuid for gcc compilers using a system or local copy of cpuid.h
+ #if defined(__GNUC__)
+-    #include &lt;cpuid.h&gt;
++    #if defined(HAVE_CPUID_H)
++        #include &lt;cpuid.h&gt;
++    #else
++        #include &quot;gcc_x86_cpuid.h&quot;
++    #endif
+     #define cpuid_x86(op, r) __get_cpuid(op, (unsigned int *)r+0, (unsigned int *)r+1, (unsigned int *)r+2, (unsigned int *)r+3)

+     /* Return Intel AVX extended CPU capabilities register.
</ins></span></pre>
</div>
</div>

</body>
</html>