You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
2.7 KiB
65 lines
2.7 KiB
<?xml version="1.0" encoding="UTF-8"?> |
|
<!-- |
|
Copyright (c) 2017 OpenPOWER Foundation |
|
|
|
Licensed under the Apache License, Version 2.0 (the "License"); |
|
you may not use this file except in compliance with the License. |
|
You may obtain a copy of the License at |
|
|
|
http://www.apache.org/licenses/LICENSE-2.0 |
|
|
|
Unless required by applicable law or agreed to in writing, software |
|
distributed under the License is distributed on an "AS IS" BASIS, |
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
See the License for the specific language governing permissions and |
|
limitations under the License. |
|
|
|
--> |
|
<section xmlns="http://docbook.org/ns/docbook" |
|
xmlns:xi="http://www.w3.org/2001/XInclude" |
|
xmlns:xlink="http://www.w3.org/1999/xlink" |
|
version="5.0" |
|
xml:id="sec_simple_examples"> |
|
<title>Some simple examples</title> |
|
|
|
<para>For example; a vector double splat looks like this: |
|
<programlisting><![CDATA[/* Create a vector with both elements equal to F. */ |
|
extern __inline __m128d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) |
|
_mm_set1_pd (double __F) |
|
{ |
|
return __extension__ (__m128d){ __F, __F }; |
|
}]]></programlisting></para> |
|
|
|
<para>Another example: |
|
<programlisting><![CDATA[extern __inline __m128d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) |
|
_mm_add_pd (__m128d __A, __m128d __B) |
|
{ |
|
return (__m128d) ((__v2df)__A + (__v2df)__B); |
|
}]]></programlisting></para> |
|
|
|
<para>Note in the example above the cast to __v2df for the operation. Both |
|
__m128d and __v2df are vector double, but __v2df does no have the <literal>__may_alias__</literal> |
|
attribute. And one more example: |
|
<programlisting><![CDATA[extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) |
|
_mm_mullo_epi16 (__m128i __A, __m128i __B) |
|
{ |
|
return (__m128i) ((__v8hu)__A * (__v8hu)__B); |
|
}]]></programlisting></para> |
|
|
|
<para>Note this requires a cast for the compiler to generate the correct |
|
code for the intended operation. The parameters and result are the generic |
|
interface |
|
type <literal>__m128i</literal>, which is a vector long long with the |
|
<literal>__may_alias__</literal> attribute. But |
|
operation is a vector multiply low on unsigned short elements. |
|
So not only do we use the cast to drop the <literal>__may_alias__</literal> |
|
attribute but we also need to cast to |
|
the correct type (<literal>__v8hu</literal> or vector unsigned short) |
|
for the specified operation.</para> |
|
|
|
<para>I have successfully copied these (and similar) source snippets over |
|
to the PPC64LE implementation unchanged. This of course assumes the associated |
|
types are defined and with compatible attributes.</para> |
|
|
|
</section> |
|
|
|
|