/docs/MyDocs

To get this branch, use:
bzr branch http://darksoft.org/webbzr/docs/MyDocs

« back to all changes in this revision

Viewing changes to Development/languages/C/Info/SSE/Vector-Extensions.html

  • Committer: Suren A. Chilingaryan
  • Date: 2009-04-09 03:21:08 UTC
  • Revision ID: csa@dside.dyndns.org-20090409032108-w4edamdh4adrgdu3
import

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
<html lang="en"><head><title>Vector Extensions - Using the GNU Compiler Collection (GCC)</title>
 
2
 
 
3
 
 
4
<meta http-equiv="Content-Type" content="text/html">
 
5
<meta name="description" content="Using the GNU Compiler Collection (GCC)">
 
6
<meta name="generator" content="makeinfo 4.8">
 
7
<link title="Top" rel="start" href="http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/index.html#Top">
 
8
<link rel="up" href="http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/C-Extensions.html#C-Extensions" title="C Extensions">
 
9
<link rel="prev" href="http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Return-Address.html#Return-Address" title="Return Address">
 
10
<link rel="next" href="http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Offsetof.html#Offsetof" title="Offsetof">
 
11
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage"><!--
 
12
Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
 
13
1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
 
14
 
 
15
Permission is granted to copy, distribute and/or modify this document
 
16
under the terms of the GNU Free Documentation License, Version 1.2 or
 
17
any later version published by the Free Software Foundation; with the
 
18
Invariant Sections being ``GNU General Public License'' and ``Funding
 
19
Free Software'', the Front-Cover texts being (a) (see below), and with
 
20
the Back-Cover Texts being (b) (see below).  A copy of the license is
 
21
included in the section entitled ``GNU Free Documentation License''.
 
22
 
 
23
(a) The FSF's Front-Cover Text is:
 
24
 
 
25
     A GNU Manual
 
26
 
 
27
(b) The FSF's Back-Cover Text is:
 
28
 
 
29
     You have freedom to copy and modify this GNU Manual, like GNU
 
30
     software.  Copies published by the Free Software Foundation raise
 
31
     funds for GNU development.-->
 
32
 
 
33
<meta http-equiv="Content-Style-Type" content="text/css">
 
34
<style type="text/css"><!--
 
35
  pre.display { font-family:inherit }
 
36
  pre.format  { font-family:inherit }
 
37
  pre.smalldisplay { font-family:inherit; font-size:smaller }
 
38
  pre.smallformat  { font-family:inherit; font-size:smaller }
 
39
  pre.smallexample { font-size:smaller }
 
40
  pre.smalllisp    { font-size:smaller }
 
41
  span.sc    { font-variant:small-caps }
 
42
  span.roman { font-family:serif; font-weight:normal; } 
 
43
  span.sansserif { font-family:sans-serif; font-weight:normal; } 
 
44
--></style></head><body>
 
45
<div class="node">
 
46
<p>
 
47
<a name="Vector-Extensions"></a>
 
48
Next:&nbsp;<a rel="next" accesskey="n" href="http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Offsetof.html#Offsetof">Offsetof</a>,
 
49
Previous:&nbsp;<a rel="previous" accesskey="p" href="http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Return-Address.html#Return-Address">Return Address</a>,
 
50
Up:&nbsp;<a rel="up" accesskey="u" href="http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/C-Extensions.html#C-Extensions">C Extensions</a>
 
51
</p><hr>
 
52
</div>
 
53
 
 
54
<h3 class="section">5.42 Using vector instructions through built-in functions</h3>
 
55
 
 
56
<p>On some targets, the instruction set contains SIMD vector instructions that
 
57
operate on multiple values contained in one large register at the same time. 
 
58
For example, on the i386 the MMX, 3Dnow! and SSE extensions can be used
 
59
this way.
 
60
 
 
61
 </p><p>The first step in using these extensions is to provide the necessary data
 
62
types.  This should be done using an appropriate <code>typedef</code>:
 
63
 
 
64
</p><pre class="smallexample">     typedef int v4si __attribute__ ((vector_size (16)));
 
65
</pre>
 
66
 <p>The <code>int</code> type specifies the base type, while the attribute specifies
 
67
the vector size for the variable, measured in bytes.  For example, the
 
68
declaration above causes the compiler to set the mode for the <code>v4si</code>
 
69
type to be 16 bytes wide and divided into <code>int</code> sized units.  For
 
70
a 32-bit <code>int</code> this means a vector of 4 units of 4 bytes, and the
 
71
corresponding mode of <code>foo</code> will be <acronym>V4SI</acronym>.
 
72
 
 
73
 </p><p>The <code>vector_size</code> attribute is only applicable to integral and
 
74
float scalars, although arrays, pointers, and function return values
 
75
are allowed in conjunction with this construct.
 
76
 
 
77
 </p><p>All the basic integer types can be used as base types, both as signed
 
78
and as unsigned: <code>char</code>, <code>short</code>, <code>int</code>, <code>long</code>,
 
79
<code>long long</code>.  In addition, <code>float</code> and <code>double</code> can be
 
80
used to build floating-point vector types.
 
81
 
 
82
 </p><p>Specifying a combination that is not valid for the current architecture
 
83
will cause GCC to synthesize the instructions using a narrower mode. 
 
84
For example, if you specify a variable of type <code>V4SI</code> and your
 
85
architecture does not allow for this specific SIMD type, GCC will
 
86
produce code that uses 4 <code>SIs</code>.
 
87
 
 
88
 </p><p>The types defined in this manner can be used with a subset of normal C
 
89
operations.  Currently, GCC will allow using the following operators
 
90
on these types: <code>+, -, *, /, unary minus, ^, |, &amp;, ~</code>.
 
91
 
 
92
 </p><p>The operations behave like C++ <code>valarrays</code>.  Addition is defined as
 
93
the addition of the corresponding elements of the operands.  For
 
94
example, in the code below, each of the 4 elements in <var>a</var> will be
 
95
added to the corresponding 4 elements in <var>b</var> and the resulting
 
96
vector will be stored in <var>c</var>.
 
97
 
 
98
</p><pre class="smallexample">     typedef int v4si __attribute__ ((vector_size (16)));
 
99
     
 
100
     v4si a, b, c;
 
101
     
 
102
     c = a + b;
 
103
</pre>
 
104
 <p>Subtraction, multiplication, division, and the logical operations
 
105
operate in a similar manner.  Likewise, the result of using the unary
 
106
minus or complement operators on a vector type is a vector whose
 
107
elements are the negative or complemented values of the corresponding
 
108
elements in the operand.
 
109
 
 
110
 </p><p>You can declare variables and use them in function calls and returns, as
 
111
well as in assignments and some casts.  You can specify a vector type as
 
112
a return type for a function.  Vector types can also be used as function
 
113
arguments.  It is possible to cast from one vector type to another,
 
114
provided they are of the same size (in fact, you can also cast vectors
 
115
to and from other datatypes of the same size).
 
116
 
 
117
 </p><p>You cannot operate between vectors of different lengths or different
 
118
signedness without a cast.
 
119
 
 
120
 </p><p>A port that supports hardware vector operations, usually provides a set
 
121
of built-in functions that can be used to operate on vectors.  For
 
122
example, a function to add two vectors and multiply the result by a
 
123
third could look like this:
 
124
 
 
125
</p><pre class="smallexample">     v4si f (v4si a, v4si b, v4si c)
 
126
     {
 
127
       v4si tmp = __builtin_addv4si (a, b);
 
128
       return __builtin_mulv4si (tmp, c);
 
129
     }
 
130
     
 
131
</pre>
 
132
 
 
133
</body></html>
 
 
b'\\ No newline at end of file'