1# Altivec instruction set, for PSIM, the PowerPC simulator.
2
3# Copyright 2003-2024 Free Software Foundation, Inc.
4
5# Contributed by Red Hat Inc; developed under contract from Motorola.
6# Written by matthew green <mrg@redhat.com>.
7
8# This file is part of GDB.
9
10# This program is free software; you can redistribute it and/or modify
11# it under the terms of the GNU General Public License as published by
12# the Free Software Foundation; either version 3 of the License, or
13# (at your option) any later version.
14
15# This program is distributed in the hope that it will be useful,
16# but WITHOUT ANY WARRANTY; without even the implied warranty of
17# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18# GNU General Public License for more details.
19
20# You should have received a copy of the GNU General Public License
21# along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
22
23
24#
25# Motorola AltiVec instructions.
26#
27
28:cache:av:::VS:VS:
29:cache:av::vreg *:vS:VS:(cpu_registers(processor)->altivec.vr + VS)
30:cache:av::uint32_t:VS_BITMASK:VS:(1 << VS)
31:cache:av:::VA:VA:
32:cache:av::vreg *:vA:VA:(cpu_registers(processor)->altivec.vr + VA)
33:cache:av::uint32_t:VA_BITMASK:VA:(1 << VA)
34:cache:av:::VB:VB:
35:cache:av::vreg *:vB:VB:(cpu_registers(processor)->altivec.vr + VB)
36:cache:av::uint32_t:VB_BITMASK:VB:(1 << VB)
37:cache:av:::VC:VC:
38:cache:av::vreg *:vC:VC:(cpu_registers(processor)->altivec.vr + VC)
39:cache:av::uint32_t:VC_BITMASK:VC:(1 << VC)
40
41# Flags for model.h
42::model-macro:::
43          #define PPC_INSN_INT_VR(OUT_MASK, IN_MASK, OUT_VMASK, IN_VMASK) \
44                    do { \
45                      if (CURRENT_MODEL_ISSUE > 0) \
46                        ppc_insn_int_vr(MY_INDEX, cpu_model(processor), OUT_MASK, IN_MASK, OUT_VMASK, IN_VMASK); \
47                    } while (0)
48
49          #define PPC_INSN_VR(OUT_VMASK, IN_VMASK) \
50                    do { \
51                      if (CURRENT_MODEL_ISSUE > 0) \
52                        ppc_insn_vr(MY_INDEX, cpu_model(processor), OUT_VMASK, IN_VMASK); \
53                    } while (0)
54
55          #define PPC_INSN_VR_CR(OUT_VMASK, IN_VMASK, CR_MASK) \
56                    do { \
57                      if (CURRENT_MODEL_ISSUE > 0) \
58                        ppc_insn_vr_cr(MY_INDEX, cpu_model(processor), OUT_VMASK, IN_VMASK, CR_MASK); \
59                    } while (0)
60
61          #define PPC_INSN_VR_VSCR(OUT_VMASK, IN_VMASK) \
62                    do { \
63                      if (CURRENT_MODEL_ISSUE > 0) \
64                        ppc_insn_vr_vscr(MY_INDEX, cpu_model(processor), OUT_VMASK, IN_VMASK); \
65                    } while (0)
66
67          #define PPC_INSN_FROM_VSCR(VR_MASK) \
68                    do { \
69                      if (CURRENT_MODEL_ISSUE > 0) \
70                        ppc_insn_from_vscr(MY_INDEX, cpu_model(processor), VR_MASK); \
71                    } while (0)
72
73          #define PPC_INSN_TO_VSCR(VR_MASK) \
74                    do { \
75                      if (CURRENT_MODEL_ISSUE > 0) \
76                        ppc_insn_to_vscr(MY_INDEX, cpu_model(processor), VR_MASK); \
77                    } while (0)
78
79# Trace waiting for AltiVec registers to become available
80void::model-static::model_trace_altivec_busy_p:model_data *model_ptr, uint32_t vr_busy
81          int i;
82          if (vr_busy) {
83            vr_busy &= model_ptr->vr_busy;
84            for(i = 0; i < 32; i++) {
85              if (((1 << i) & vr_busy) != 0) {
86                TRACE(trace_model, ("Waiting for register v%d.\n", i));
87              }
88            }
89          }
90          if (model_ptr->vscr_busy)
91            TRACE(trace_model, ("Waiting for VSCR\n"));
92
93# Trace making AltiVec registers busy
94void::model-static::model_trace_altivec_make_busy:model_data *model_ptr, uint32_t vr_mask, uint32_t cr_mask
95          int i;
96          if (vr_mask) {
97            for(i = 0; i < 32; i++) {
98              if (((1 << i) & vr_mask) != 0) {
99                TRACE(trace_model, ("Register v%d is now busy.\n", i));
100              }
101            }
102          }
103          if (cr_mask) {
104            for(i = 0; i < 8; i++) {
105              if (((1 << i) & cr_mask) != 0) {
106                TRACE(trace_model, ("Register cr%d is now busy.\n", i));
107              }
108            }
109          }
110
111# Schedule an AltiVec instruction that takes integer input registers and produces output registers
112void::model-function::ppc_insn_int_vr:itable_index index, model_data *model_ptr, const uint32_t out_mask, const uint32_t in_mask, const uint32_t out_vmask, const uint32_t in_vmask
113          const uint32_t int_mask = out_mask | in_mask;
114          const uint32_t vr_mask = out_vmask | in_vmask;
115          model_busy *busy_ptr;
116
117          if ((model_ptr->int_busy & int_mask) != 0 || (model_ptr->vr_busy & vr_mask)) {
118            model_new_cycle(model_ptr);                     /* don't count first dependency as a stall */
119
120            while ((model_ptr->int_busy & int_mask) != 0 || (model_ptr->vr_busy & vr_mask)) {
121              if (WITH_TRACE && ppc_trace[trace_model]) {
122                model_trace_busy_p(model_ptr, int_mask, 0, 0, PPC_NO_SPR);
123                model_trace_altivec_busy_p(model_ptr, vr_mask);
124              }
125
126              model_ptr->nr_stalls_data++;
127              model_new_cycle(model_ptr);
128            }
129          }
130
131          busy_ptr = model_wait_for_unit(index, model_ptr, &model_ptr->timing[index]);
132          model_ptr->int_busy |= out_mask;
133          busy_ptr->int_busy |= out_mask;
134          model_ptr->vr_busy |= out_vmask;
135          busy_ptr->vr_busy |= out_vmask;
136
137          if (out_mask)
138            busy_ptr->nr_writebacks = (PPC_ONE_BIT_SET_P(out_vmask)) ? 1 : 2;
139
140          if (out_vmask)
141            busy_ptr->nr_writebacks += (PPC_ONE_BIT_SET_P(out_vmask)) ? 1 : 2;
142
143          if (WITH_TRACE && ppc_trace[trace_model]) {
144            model_trace_make_busy(model_ptr, out_mask, 0, 0);
145            model_trace_altivec_make_busy(model_ptr, vr_mask, 0);
146          }
147
148# Schedule an AltiVec instruction that takes vector input registers and produces vector output registers
149void::model-function::ppc_insn_vr:itable_index index, model_data *model_ptr, const uint32_t out_vmask, const uint32_t in_vmask
150          const uint32_t vr_mask = out_vmask | in_vmask;
151          model_busy *busy_ptr;
152
153          if (model_ptr->vr_busy & vr_mask) {
154            model_new_cycle(model_ptr);                     /* don't count first dependency as a stall */
155
156            while (model_ptr->vr_busy & vr_mask) {
157              if (WITH_TRACE && ppc_trace[trace_model]) {
158                model_trace_altivec_busy_p(model_ptr, vr_mask);
159              }
160
161              model_ptr->nr_stalls_data++;
162              model_new_cycle(model_ptr);
163            }
164          }
165
166          busy_ptr = model_wait_for_unit(index, model_ptr, &model_ptr->timing[index]);
167          model_ptr->vr_busy |= out_vmask;
168          busy_ptr->vr_busy |= out_vmask;
169          if (out_vmask)
170            busy_ptr->nr_writebacks = (PPC_ONE_BIT_SET_P(out_vmask)) ? 1 : 2;
171
172          if (WITH_TRACE && ppc_trace[trace_model]) {
173            model_trace_altivec_make_busy(model_ptr, vr_mask, 0);
174          }
175
176# Schedule an AltiVec instruction that takes vector input registers and produces vector output registers, touches CR
177void::model-function::ppc_insn_vr_cr:itable_index index, model_data *model_ptr, const uint32_t out_vmask, const uint32_t in_vmask, const uint32_t cr_mask
178          const uint32_t vr_mask = out_vmask | in_vmask;
179          model_busy *busy_ptr;
180
181          if ((model_ptr->vr_busy & vr_mask) || (model_ptr->cr_fpscr_busy & cr_mask)) {
182            model_new_cycle(model_ptr);                     /* don't count first dependency as a stall */
183
184            while ((model_ptr->vr_busy & vr_mask) || (model_ptr->cr_fpscr_busy & cr_mask)) {
185              if (WITH_TRACE && ppc_trace[trace_model]) {
186                model_trace_busy_p(model_ptr, 0, 0, cr_mask, PPC_NO_SPR);
187                model_trace_altivec_busy_p(model_ptr, vr_mask);
188              }
189
190              model_ptr->nr_stalls_data++;
191              model_new_cycle(model_ptr);
192            }
193          }
194
195          busy_ptr = model_wait_for_unit(index, model_ptr, &model_ptr->timing[index]);
196          model_ptr->cr_fpscr_busy |= cr_mask;
197          busy_ptr->cr_fpscr_busy |= cr_mask;
198          model_ptr->vr_busy |= out_vmask;
199          busy_ptr->vr_busy |= out_vmask;
200
201          if (out_vmask)
202            busy_ptr->nr_writebacks = (PPC_ONE_BIT_SET_P(out_vmask)) ? 1 : 2;
203
204          if (cr_mask)
205            busy_ptr->nr_writebacks++;
206
207          if (WITH_TRACE && ppc_trace[trace_model])
208            model_trace_altivec_make_busy(model_ptr, vr_mask, cr_mask);
209
210# Schedule an AltiVec instruction that takes vector input registers and produces vector output registers, touches VSCR
211void::model-function::ppc_insn_vr_vscr:itable_index index, model_data *model_ptr, const uint32_t out_vmask, const uint32_t in_vmask
212          const uint32_t vr_mask = out_vmask | in_vmask;
213          model_busy *busy_ptr;
214
215          if ((model_ptr->vr_busy & vr_mask) != 0 || model_ptr->vscr_busy != 0) {
216            model_new_cycle(model_ptr);                     /* don't count first dependency as a stall */
217
218            while ((model_ptr->vr_busy & vr_mask) != 0 || model_ptr->vscr_busy != 0) {
219              if (WITH_TRACE && ppc_trace[trace_model])
220                model_trace_altivec_busy_p(model_ptr, vr_mask);
221
222              model_ptr->nr_stalls_data++;
223              model_new_cycle(model_ptr);
224            }
225          }
226
227          busy_ptr = model_wait_for_unit(index, model_ptr, &model_ptr->timing[index]);
228          model_ptr->vr_busy |= out_vmask;
229          busy_ptr->vr_busy |= out_vmask;
230          model_ptr->vscr_busy = 1;
231          busy_ptr->vscr_busy = 1;
232
233          if (out_vmask)
234            busy_ptr->nr_writebacks = 1 + (PPC_ONE_BIT_SET_P (out_vmask) ? 1 : 2);
235
236          if (WITH_TRACE && ppc_trace[trace_model])
237            model_trace_altivec_make_busy(model_ptr, vr_mask, 0);
238
239# Schedule an MFVSCR instruction that VSCR input register and produces an AltiVec output register
240void::model-function::ppc_insn_from_vscr:itable_index index, model_data *model_ptr, const uint32_t vr_mask
241          model_busy *busy_ptr;
242
243          while ((model_ptr->vr_busy & vr_mask) != 0 || model_ptr->vscr_busy != 0) {
244            if (WITH_TRACE && ppc_trace[trace_model])
245              model_trace_altivec_busy_p(model_ptr, vr_mask);
246
247            model_ptr->nr_stalls_data++;
248            model_new_cycle(model_ptr);
249          }
250          busy_ptr = model_wait_for_unit(index, model_ptr, &model_ptr->timing[index]);
251          model_ptr->cr_fpscr_busy |= vr_mask;
252          busy_ptr->cr_fpscr_busy |= vr_mask;
253
254          if (vr_mask)
255            busy_ptr->nr_writebacks = 1;
256
257          model_ptr->vr_busy |= vr_mask;
258          if (WITH_TRACE && ppc_trace[trace_model])
259            model_trace_altivec_make_busy(model_ptr, vr_mask, 0);
260
261# Schedule an MTVSCR instruction that one AltiVec input register and produces a vscr output register
262void::model-function::ppc_insn_to_vscr:itable_index index, model_data *model_ptr, const uint32_t vr_mask
263          model_busy *busy_ptr;
264
265          while ((model_ptr->vr_busy & vr_mask) != 0 || model_ptr->vscr_busy != 0) {
266            if (WITH_TRACE && ppc_trace[trace_model])
267              model_trace_altivec_busy_p(model_ptr, vr_mask);
268
269            model_ptr->nr_stalls_data++;
270            model_new_cycle(model_ptr);
271          }
272          busy_ptr = model_wait_for_unit(index, model_ptr, &model_ptr->timing[index]);
273          busy_ptr ->vscr_busy = 1;
274          model_ptr->vscr_busy = 1;
275          busy_ptr->nr_writebacks = 1;
276
277          TRACE(trace_model,("Making VSCR busy.\n"));
278
279# The follow are AltiVec saturate operations
280
281int8_t::model-function::altivec_signed_saturate_8:int16_t val, int *sat
282            int8_t rv;
283            if (val > 127) {
284              rv = 127;
285              *sat = 1;
286            } else if (val < -128) {
287              rv = -128;
288              *sat = 1;
289            } else {
290              rv = val;
291              *sat = 0;
292            }
293            return rv;
294
295int16_t::model-function::altivec_signed_saturate_16:int32_t val, int *sat
296            int16_t rv;
297            if (val > 32767) {
298              rv = 32767;
299              *sat = 1;
300            } else if (val < -32768) {
301              rv = -32768;
302              *sat = 1;
303            } else {
304              rv = val;
305              *sat = 0;
306            }
307            return rv;
308
309int32_t::model-function::altivec_signed_saturate_32:int64_t val, int *sat
310            int32_t rv;
311            if (val > 2147483647) {
312              rv = 2147483647;
313              *sat = 1;
314            } else if (val < -2147483648LL) {
315              rv = -2147483648LL;
316              *sat = 1;
317            } else {
318              rv = val;
319              *sat = 0;
320            }
321            return rv;
322
323uint8_t::model-function::altivec_unsigned_saturate_8:int16_t val, int *sat
324            uint8_t rv;
325            if (val > 255) {
326              rv = 255;
327              *sat = 1;
328            } else if (val < 0) {
329              rv = 0;
330              *sat = 1;
331            } else {
332              rv = val;
333              *sat = 0;
334            }
335            return rv;
336
337uint16_t::model-function::altivec_unsigned_saturate_16:int32_t val, int *sat
338            uint16_t rv;
339            if (val > 65535) {
340              rv = 65535;
341              *sat = 1;
342            } else if (val < 0) {
343              rv = 0;
344              *sat = 1;
345            } else {
346              rv = val;
347              *sat = 0;
348            }
349            return rv;
350
351uint32_t::model-function::altivec_unsigned_saturate_32:int64_t val, int *sat
352            uint32_t rv;
353            if (val > 4294967295LL) {
354              rv = 4294967295LL;
355              *sat = 1;
356            } else if (val < 0) {
357              rv = 0;
358              *sat = 1;
359            } else {
360              rv = val;
361              *sat = 0;
362            }
363            return rv;
364
365#
366# Load instructions, 6-14 ... 6-22.
367#
368
3690.31,6.VS,11.RA,16.RB,21.7,31.0:X:av:lvebx %VD, %RA, %RB:Load Vector Element Byte Indexed
370          unsigned_word b;
371          unsigned_word EA;
372          unsigned_word eb;
373          if (RA_is_0) b = 0;
374          else         b = *rA;
375          EA = b + *rB;
376          eb = EA & 0xf;
377          (*vS).b[AV_BINDEX(eb)] = MEM(unsigned, EA, 1);
378          PPC_INSN_INT_VR(0, RA_BITMASK | RB_BITMASK, VS_BITMASK, 0);
379
3800.31,6.VS,11.RA,16.RB,21.39,31.0:X:av:lvehx %VD, %RA, %RB:Load Vector Element Half Word Indexed
381          unsigned_word b;
382          unsigned_word EA;
383          unsigned_word eb;
384          if (RA_is_0) b = 0;
385          else         b = *rA;
386          EA = (b + *rB) & ~1;
387          eb = EA & 0xf;
388          (*vS).h[AV_HINDEX(eb/2)] = MEM(unsigned, EA, 2);
389          PPC_INSN_INT_VR(0, RA_BITMASK | RB_BITMASK, VS_BITMASK, 0);
390
3910.31,6.VS,11.RA,16.RB,21.71,31.0:X:av:lvewx %VD, %RA, %RB:Load Vector Element Word Indexed
392          unsigned_word b;
393          unsigned_word EA;
394          unsigned_word eb;
395          if (RA_is_0) b = 0;
396          else         b = *rA;
397          EA = (b + *rB) & ~3;
398          eb = EA & 0xf;
399          (*vS).w[eb/4] = MEM(unsigned, EA, 4);
400          PPC_INSN_INT_VR(0, RA_BITMASK | RB_BITMASK, VS_BITMASK, 0);
401
402
4030.31,6.VS,11.RA,16.RB,21.6,31.0:X:av:lvsl %VD, %RA, %RB:Load Vector for Shift Left
404          unsigned_word b;
405          unsigned_word addr;
406          int i, j;
407          if (RA_is_0) b = 0;
408          else         b = *rA;
409          addr = b + *rB;
410          j = addr & 0xf;
411          for (i = 0; i < 16; i++)
412            if (CURRENT_TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
413              (*vS).b[AV_BINDEX(i)] = j++;
414            else
415              (*vS).b[AV_BINDEX(15 - i)] = j++;
416          PPC_INSN_INT_VR(0, RA_BITMASK | RB_BITMASK, VS_BITMASK, 0);
417
4180.31,6.VS,11.RA,16.RB,21.38,31.0:X:av:lvsr %VD, %RA, %RB:Load Vector for Shift Right
419          unsigned_word b;
420          unsigned_word addr;
421          int i, j;
422          if (RA_is_0) b = 0;
423          else         b = *rA;
424          addr = b + *rB;
425          j = 0x10 - (addr & 0xf);
426          for (i = 0; i < 16; i++)
427            if (CURRENT_TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
428              (*vS).b[AV_BINDEX(i)] = j++;
429            else
430              (*vS).b[AV_BINDEX(15 - i)] = j++;
431          PPC_INSN_INT_VR(0, RA_BITMASK | RB_BITMASK, VS_BITMASK, 0);
432
433
4340.31,6.VS,11.RA,16.RB,21.103,31.0:X:av:lvx %VD, %RA, %RB:Load Vector Indexed
435          unsigned_word b;
436          unsigned_word EA;
437          if (RA_is_0) b = 0;
438          else         b = *rA;
439          EA = (b + *rB) & ~0xf;
440          if (CURRENT_TARGET_BYTE_ORDER == BFD_ENDIAN_BIG) {
441            (*vS).w[0] = MEM(unsigned, EA + 0, 4);
442            (*vS).w[1] = MEM(unsigned, EA + 4, 4);
443            (*vS).w[2] = MEM(unsigned, EA + 8, 4);
444            (*vS).w[3] = MEM(unsigned, EA + 12, 4);
445          } else {
446            (*vS).w[0] = MEM(unsigned, EA + 12, 4);
447            (*vS).w[1] = MEM(unsigned, EA + 8, 4);
448            (*vS).w[2] = MEM(unsigned, EA + 4, 4);
449            (*vS).w[3] = MEM(unsigned, EA + 0, 4);
450          }
451          PPC_INSN_INT_VR(0, RA_BITMASK | RB_BITMASK, VS_BITMASK, 0);
452
4530.31,6.VS,11.RA,16.RB,21.359,31.0:X:av:lvxl %VD, %RA, %RB:Load Vector Indexed LRU
454          unsigned_word b;
455          unsigned_word EA;
456          if (RA_is_0) b = 0;
457          else         b = *rA;
458          EA = (b + *rB) & ~0xf;
459          if (CURRENT_TARGET_BYTE_ORDER == BFD_ENDIAN_BIG) {
460            (*vS).w[0] = MEM(unsigned, EA + 0, 4);
461            (*vS).w[1] = MEM(unsigned, EA + 4, 4);
462            (*vS).w[2] = MEM(unsigned, EA + 8, 4);
463            (*vS).w[3] = MEM(unsigned, EA + 12, 4);
464          } else {
465            (*vS).w[0] = MEM(unsigned, EA + 12, 4);
466            (*vS).w[1] = MEM(unsigned, EA + 8, 4);
467            (*vS).w[2] = MEM(unsigned, EA + 4, 4);
468            (*vS).w[3] = MEM(unsigned, EA + 0, 4);
469          }
470          PPC_INSN_INT_VR(0, RA_BITMASK | RB_BITMASK, VS_BITMASK, 0);
471
472#
473# Move to/from VSCR instructions, 6-23 & 6-24.
474#
475
4760.4,6.VS,11.0,16.0,21.1540:VX:av:mfvscr %VS:Move from Vector Status and Control Register
477          (*vS).w[0] = 0;
478          (*vS).w[1] = 0;
479          (*vS).w[2] = 0;
480          (*vS).w[3] = VSCR;
481          PPC_INSN_FROM_VSCR(VS_BITMASK);
482
4830.4,6.0,11.0,16.VB,21.1604:VX:av:mtvscr %VB:Move to Vector Status and Control Register
484          VSCR = (*vB).w[3];
485          PPC_INSN_TO_VSCR(VB_BITMASK);
486
487#
488# Store instructions, 6-25 ... 6-29.
489#
490
4910.31,6.VS,11.RA,16.RB,21.135,31.0:X:av:stvebx %VD, %RA, %RB:Store Vector Element Byte Indexed
492          unsigned_word b;
493          unsigned_word EA;
494          unsigned_word eb;
495          if (RA_is_0) b = 0;
496          else         b = *rA;
497          EA = b + *rB;
498          eb = EA & 0xf;
499          if (CURRENT_TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
500            STORE(EA, 1, (*vS).b[eb]);
501          else
502            STORE(EA, 1, (*vS).b[15-eb]);
503          PPC_INSN_INT_VR(0, RA_BITMASK | RB_BITMASK, VS_BITMASK, 0);
504
5050.31,6.VS,11.RA,16.RB,21.167,31.0:X:av:stvehx %VD, %RA, %RB:Store Vector Element Half Word Indexed
506          unsigned_word b;
507          unsigned_word EA;
508          unsigned_word eb;
509          if (RA_is_0) b = 0;
510          else         b = *rA;
511          EA = (b + *rB) & ~1;
512          eb = EA & 0xf;
513          if (CURRENT_TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
514            STORE(EA, 2, (*vS).h[eb/2]);
515          else
516            STORE(EA, 2, (*vS).h[7-eb]);
517          PPC_INSN_INT_VR(0, RA_BITMASK | RB_BITMASK, VS_BITMASK, 0);
518
5190.31,6.VS,11.RA,16.RB,21.199,31.0:X:av:stvewx %VD, %RA, %RB:Store Vector Element Word Indexed
520          unsigned_word b;
521          unsigned_word EA;
522          unsigned_word eb;
523          if (RA_is_0) b = 0;
524          else         b = *rA;
525          EA = (b + *rB) & ~3;
526          eb = EA & 0xf;
527          if (CURRENT_TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
528            STORE(EA, 4, (*vS).w[eb/4]);
529          else
530            STORE(EA, 4, (*vS).w[3-(eb/4)]);
531          PPC_INSN_INT_VR(0, RA_BITMASK | RB_BITMASK, VS_BITMASK, 0);
532
5330.31,6.VS,11.RA,16.RB,21.231,31.0:X:av:stvx %VD, %RA, %RB:Store Vector Indexed
534          unsigned_word b;
535          unsigned_word EA;
536          if (RA_is_0) b = 0;
537          else         b = *rA;
538          EA = (b + *rB) & ~0xf;
539          if (CURRENT_TARGET_BYTE_ORDER == BFD_ENDIAN_BIG) {
540            STORE(EA + 0, 4, (*vS).w[0]);
541            STORE(EA + 4, 4, (*vS).w[1]);
542            STORE(EA + 8, 4, (*vS).w[2]);
543            STORE(EA + 12, 4, (*vS).w[3]);
544          } else {
545            STORE(EA + 12, 4, (*vS).w[0]);
546            STORE(EA + 8, 4, (*vS).w[1]);
547            STORE(EA + 4, 4, (*vS).w[2]);
548            STORE(EA + 0, 4, (*vS).w[3]);
549          }
550          PPC_INSN_INT_VR(0, RA_BITMASK | RB_BITMASK, VS_BITMASK, 0);
551
5520.31,6.VS,11.RA,16.RB,21.487,31.0:X:av:stvxl %VD, %RA, %RB:Store Vector Indexed LRU
553          unsigned_word b;
554          unsigned_word EA;
555          if (RA_is_0) b = 0;
556          else         b = *rA;
557          EA = (b + *rB) & ~0xf;
558          if (CURRENT_TARGET_BYTE_ORDER == BFD_ENDIAN_BIG) {
559            STORE(EA + 0, 4, (*vS).w[0]);
560            STORE(EA + 4, 4, (*vS).w[1]);
561            STORE(EA + 8, 4, (*vS).w[2]);
562            STORE(EA + 12, 4, (*vS).w[3]);
563          } else {
564            STORE(EA + 12, 4, (*vS).w[0]);
565            STORE(EA + 8, 4, (*vS).w[1]);
566            STORE(EA + 4, 4, (*vS).w[2]);
567            STORE(EA + 0, 4, (*vS).w[3]);
568          }
569          PPC_INSN_INT_VR(0, RA_BITMASK | RB_BITMASK, VS_BITMASK, 0);
570
571#
572# Vector Add instructions, 6-30 ... 6-40.
573#
574
5750.4,6.VS,11.VA,16.VB,21.384:VX:av:vaddcuw %VD, %VA, %VB:Vector Add Carryout Unsigned Word
576          uint64_t temp;
577          int i;
578          for (i = 0; i < 4; i++) {
579            temp = (uint64_t)(*vA).w[i] + (uint64_t)(*vB).w[i];
580            (*vS).w[i] = temp >> 32;
581          }
582          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
583
5840.4,6.VS,11.VA,16.VB,21.10:VX:av:vaddfp %VD, %VA, %VB:Vector Add Floating Point
585          int i;
586          uint32_t f;
587          sim_fpu a, b, d;
588          for (i = 0; i < 4; i++) {
589            sim_fpu_32to (&a, (*vA).w[i]);
590            sim_fpu_32to (&b, (*vB).w[i]);
591            sim_fpu_add (&d, &a, &b);
592            sim_fpu_to32 (&f, &d);
593            (*vS).w[i] = f;
594          }
595          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
596
5970.4,6.VS,11.VA,16.VB,21.768:VX:av:vaddsbs %VD, %VA, %VB:Vector Add Signed Byte Saturate
598          int i, sat, tempsat;
599          int16_t temp;
600          for (i = 0; i < 16; i++) {
601            temp = (int16_t)(int8_t)(*vA).b[i] + (int16_t)(int8_t)(*vB).b[i];
602            (*vS).b[i] = altivec_signed_saturate_8(temp, &tempsat);
603            sat |= tempsat;
604          }
605          ALTIVEC_SET_SAT(sat);
606          PPC_INSN_VR_VSCR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
607
6080.4,6.VS,11.VA,16.VB,21.832:VX:av:vaddshs %VD, %VA, %VB:Vector Add Signed Half Word Saturate
609          int i, sat, tempsat;
610          int32_t temp, a, b;
611          for (i = 0; i < 8; i++) {
612            a = (int32_t)(int16_t)(*vA).h[i];
613            b = (int32_t)(int16_t)(*vB).h[i];
614            temp = a + b;
615            (*vS).h[i] = altivec_signed_saturate_16(temp, &tempsat);
616            sat |= tempsat;
617          }
618          ALTIVEC_SET_SAT(sat);
619          PPC_INSN_VR_VSCR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
620
6210.4,6.VS,11.VA,16.VB,21.896:VX:av:vaddsws %VD, %VA, %VB:Vector Add Signed Word Saturate
622          int i, sat, tempsat;
623          int64_t temp;
624          for (i = 0; i < 4; i++) {
625            temp = (int64_t)(int32_t)(*vA).w[i] + (int64_t)(int32_t)(*vB).w[i];
626            (*vS).w[i] = altivec_signed_saturate_32(temp, &tempsat);
627            sat |= tempsat;
628          }
629          ALTIVEC_SET_SAT(sat);
630          PPC_INSN_VR_VSCR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
631
6320.4,6.VS,11.VA,16.VB,21.0:VX:av:vaddubm %VD, %VA, %VB:Vector Add Unsigned Byte Modulo
633          int i;
634          for (i = 0; i < 16; i++)
635            (*vS).b[i] = ((*vA).b[i] + (*vB).b[i]) & 0xff;
636          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
637
6380.4,6.VS,11.VA,16.VB,21.512:VX:av:vaddubs %VD, %VA, %VB:Vector Add Unsigned Byte Saturate
639          int i, sat, tempsat;
640          int16_t temp;
641          sat = 0;
642          for (i = 0; i < 16; i++) {
643            temp = (int16_t)(uint8_t)(*vA).b[i] + (int16_t)(uint8_t)(*vB).b[i];
644            (*vS).b[i] = altivec_unsigned_saturate_8(temp, &tempsat);
645            sat |= tempsat;
646          }
647          ALTIVEC_SET_SAT(sat);
648          PPC_INSN_VR_VSCR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
649
6500.4,6.VS,11.VA,16.VB,21.64:VX:av:vadduhm %VD, %VA, %VB:Vector Add Unsigned Half Word Modulo
651          int i;
652          for (i = 0; i < 8; i++)
653            (*vS).h[i] = ((*vA).h[i] + (*vB).h[i]) & 0xffff;
654          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
655
6560.4,6.VS,11.VA,16.VB,21.576:VX:av:vadduhs %VD, %VA, %VB:Vector Add Unsigned Half Word Saturate
657          int i, sat, tempsat;
658          int32_t temp;
659          for (i = 0; i < 8; i++) {
660            temp = (int32_t)(uint16_t)(*vA).h[i] + (int32_t)(uint16_t)(*vB).h[i];
661            (*vS).h[i] = altivec_unsigned_saturate_16(temp, &tempsat);
662            sat |= tempsat;
663          }
664          ALTIVEC_SET_SAT(sat);
665          PPC_INSN_VR_VSCR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
666
6670.4,6.VS,11.VA,16.VB,21.128:VX:av:vadduwm %VD, %VA, %VB:Vector Add Unsigned Word Modulo
668          int i;
669          for (i = 0; i < 4; i++)
670            (*vS).w[i] = (*vA).w[i] + (*vB).w[i];
671          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
672
6730.4,6.VS,11.VA,16.VB,21.640:VX:av:vadduws %VD, %VA, %VB:Vector Add Unsigned Word Saturate
674          int i, sat, tempsat;
675          int64_t temp;
676          for (i = 0; i < 4; i++) {
677            temp = (int64_t)(uint32_t)(*vA).w[i] + (int64_t)(uint32_t)(*vB).w[i];
678            (*vS).w[i] = altivec_unsigned_saturate_32(temp, &tempsat);
679            sat |= tempsat;
680          }
681          ALTIVEC_SET_SAT(sat);
682          PPC_INSN_VR_VSCR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
683
684#
685# Vector AND instructions, 6-41, 6-42
686#
687
6880.4,6.VS,11.VA,16.VB,21.1028:VX:av:vand %VD, %VA, %VB:Vector Logical AND
689          int i;
690          for (i = 0; i < 4; i++)
691            (*vS).w[i] = (*vA).w[i] & (*vB).w[i];
692          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
693
6940.4,6.VS,11.VA,16.VB,21.1092:VX:av:vandc %VD, %VA, %VB:Vector Logical AND with Compliment
695          int i;
696          for (i = 0; i < 4; i++)
697            (*vS).w[i] = (*vA).w[i] & ~((*vB).w[i]);
698          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
699
700
701#
702# Vector Average instructions, 6-43, 6-48
703#
704
7050.4,6.VS,11.VA,16.VB,21.1282:VX:av:vavgsb %VD, %VA, %VB:Vector Average Signed Byte
706          int i;
707          int16_t temp, a, b;
708          for (i = 0; i < 16; i++) {
709            a = (int16_t)(int8_t)(*vA).b[i];
710            b = (int16_t)(int8_t)(*vB).b[i];
711            temp = a + b + 1;
712            (*vS).b[i] = (temp >> 1) & 0xff;
713          }
714          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
715
7160.4,6.VS,11.VA,16.VB,21.1346:VX:av:vavgsh %VD, %VA, %VB:Vector Average Signed Half Word
717          int i;
718          int32_t temp, a, b;
719          for (i = 0; i < 8; i++) {
720            a = (int32_t)(int16_t)(*vA).h[i];
721            b = (int32_t)(int16_t)(*vB).h[i];
722            temp = a + b + 1;
723            (*vS).h[i] = (temp >> 1) & 0xffff;
724          }
725          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
726
7270.4,6.VS,11.VA,16.VB,21.1410:VX:av:vavgsw %VD, %VA, %VB:Vector Average Signed Word
728          int i;
729          int64_t temp, a, b;
730          for (i = 0; i < 4; i++) {
731            a = (int64_t)(int32_t)(*vA).w[i];
732            b = (int64_t)(int32_t)(*vB).w[i];
733            temp = a + b + 1;
734            (*vS).w[i] = (temp >> 1) & 0xffffffff;
735          }
736          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
737
7380.4,6.VS,11.VA,16.VB,21.1026:VX:av:vavgub %VD, %VA, %VB:Vector Average Unsigned Byte
739          int i;
740          uint16_t temp, a, b;
741          for (i = 0; i < 16; i++) {
742            a = (*vA).b[i];
743            b = (*vB).b[i];
744            temp = a + b + 1;
745            (*vS).b[i] = (temp >> 1) & 0xff;
746          }
747          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
748
7490.4,6.VS,11.VA,16.VB,21.1090:VX:av:vavguh %VD, %VA, %VB:Vector Average Unsigned Half Word
750          int i;
751          uint32_t temp, a, b;
752          for (i = 0; i < 8; i++) {
753            a = (*vA).h[i];
754            b = (*vB).h[i];
755            temp = a + b + 1;
756            (*vS).h[i] = (temp >> 1) & 0xffff;
757          }
758          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
759
7600.4,6.VS,11.VA,16.VB,21.1154:VX:av:vavguw %VD, %VA, %VB:Vector Average Unsigned Word
761          int i;
762          uint64_t temp, a, b;
763          for (i = 0; i < 4; i++) {
764            a = (*vA).w[i];
765            b = (*vB).w[i];
766            temp = a + b + 1;
767            (*vS).w[i] = (temp >> 1) & 0xffffffff;
768          }
769          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
770
771#
772# Vector Fixed Point Convert instructions, 6-49, 6-50
773#
774
7750.4,6.VS,11.UIMM,16.VB,21.842:VX:av:vcfsx %VD, %VB, %UIMM:Vector Convert From Signed Fixed-Point Word
776          int i;
777          uint32_t f;
778          sim_fpu b, div, d;
779          for (i = 0; i < 4; i++) {
780            sim_fpu_32to (&b, (*vB).w[i]);
781            sim_fpu_u32to (&div, 2 << UIMM, sim_fpu_round_default);
782            sim_fpu_div (&d, &b, &div);
783            sim_fpu_to32 (&f, &d);
784            (*vS).w[i] = f;
785          }
786          PPC_INSN_VR(VS_BITMASK, VB_BITMASK);
787
7880.4,6.VS,11.UIMM,16.VB,21.778:VX:av:vcfux %VD, %VA, %UIMM:Vector Convert From Unsigned Fixed-Point Word
789          int i;
790          uint32_t f;
791          sim_fpu b, d, div;
792          for (i = 0; i < 4; i++) {
793            sim_fpu_32to (&b, (*vB).w[i]);
794            sim_fpu_u32to (&div, 2 << UIMM, sim_fpu_round_default);
795            sim_fpu_div (&d, &b, &div);
796            sim_fpu_to32u (&f, &d, sim_fpu_round_default);
797            (*vS).w[i] = f;
798          }
799          PPC_INSN_VR(VS_BITMASK, VB_BITMASK);
800
801#
802# Vector Compare instructions, 6-51 ... 6-64
803#
804
8050.4,6.VS,11.VA,16.VB,21.RC,22.966:VXR:av:vcmpbpfpx %VD, %VA, %VB:Vector Compare Bounds Floating Point
806          int i, le, ge;
807          sim_fpu a, b, d;
808          for (i = 0; i < 4; i++) {
809            sim_fpu_32to (&a, (*vA).w[i]);
810            sim_fpu_32to (&b, (*vB).w[i]);
811            le = sim_fpu_is_le(&a, &b);
812            ge = sim_fpu_is_ge(&a, &b);
813            (*vS).w[i] = (le ? 0 : 1 << 31) | (ge ? 0 : 1 << 30);
814          }
815          if (RC)
816            ALTIVEC_SET_CR6(vS, 0);
817          PPC_INSN_VR_CR(VS_BITMASK, VA_BITMASK | VB_BITMASK, RC ? 0x000000f0 : 0);
818
8190.4,6.VS,11.VA,16.VB,21.RC,22.198:VXR:av:vcmpeqfpx %VD, %VA, %VB:Vector Compare Equal-to-Floating Point
820          int i;
821          sim_fpu a, b;
822          for (i = 0; i < 4; i++) {
823            sim_fpu_32to (&a, (*vA).w[i]);
824            sim_fpu_32to (&b, (*vB).w[i]);
825            if (sim_fpu_is_eq(&a, &b))
826              (*vS).w[i] = 0xffffffff;
827            else
828              (*vS).w[i] = 0;
829          }
830          if (RC)
831            ALTIVEC_SET_CR6(vS, 1);
832          PPC_INSN_VR_CR(VS_BITMASK, VA_BITMASK | VB_BITMASK, RC ? 0x000000f0 : 0);
833
8340.4,6.VS,11.VA,16.VB,21.RC,22.6:VXR:av:vcmpequbx %VD, %VA, %VB:Vector Compare Equal-to Unsigned Byte
835          int i;
836          for (i = 0; i < 16; i++)
837            if ((*vA).b[i] == (*vB).b[i])
838              (*vS).b[i] = 0xff;
839            else
840              (*vS).b[i] = 0;
841          if (RC)
842            ALTIVEC_SET_CR6(vS, 1);
843          PPC_INSN_VR_CR(VS_BITMASK, VA_BITMASK | VB_BITMASK, RC ? 0x000000f0 : 0);
844
8450.4,6.VS,11.VA,16.VB,21.RC,22.70:VXR:av:vcmpequhx %VD, %VA, %VB:Vector Compare Equal-to Unsigned Half Word
846          int i;
847          for (i = 0; i < 8; i++)
848            if ((*vA).h[i] == (*vB).h[i])
849              (*vS).h[i] = 0xffff;
850            else
851              (*vS).h[i] = 0;
852          if (RC)
853            ALTIVEC_SET_CR6(vS, 1);
854          PPC_INSN_VR_CR(VS_BITMASK, VA_BITMASK | VB_BITMASK, RC ? 0x000000f0 : 0);
855
8560.4,6.VS,11.VA,16.VB,21.RC,22.134:VXR:av:vcmpequwx %VD, %VA, %VB:Vector Compare Equal-to Unsigned Word
857          int i;
858          for (i = 0; i < 4; i++)
859            if ((*vA).w[i] == (*vB).w[i])
860              (*vS).w[i] = 0xffffffff;
861            else
862              (*vS).w[i] = 0;
863          if (RC)
864            ALTIVEC_SET_CR6(vS, 1);
865          PPC_INSN_VR_CR(VS_BITMASK, VA_BITMASK | VB_BITMASK, RC ? 0x000000f0 : 0);
866
8670.4,6.VS,11.VA,16.VB,21.RC,22.454:VXR:av:vcmpgefpx %VD, %VA, %VB:Vector Compare Greater-Than-or-Equal-to Floating Point
868          int i;
869          sim_fpu a, b;
870          for (i = 0; i < 4; i++) {
871            sim_fpu_32to (&a, (*vA).w[i]);
872            sim_fpu_32to (&b, (*vB).w[i]);
873            if (sim_fpu_is_ge(&a, &b))
874              (*vS).w[i] = 0xffffffff;
875            else
876              (*vS).w[i] = 0;
877          }
878          if (RC)
879            ALTIVEC_SET_CR6(vS, 1);
880          PPC_INSN_VR_CR(VS_BITMASK, VA_BITMASK | VB_BITMASK, RC ? 0x000000f0 : 0);
881
8820.4,6.VS,11.VA,16.VB,21.RC,22.710:VXR:av:vcmpgtfpx %VD, %VA, %VB:Vector Compare Greater-Than Floating Point
883          int i;
884          sim_fpu a, b;
885          for (i = 0; i < 4; i++) {
886            sim_fpu_32to (&a, (*vA).w[i]);
887            sim_fpu_32to (&b, (*vB).w[i]);
888            if (sim_fpu_is_gt(&a, &b))
889              (*vS).w[i] = 0xffffffff;
890            else
891              (*vS).w[i] = 0;
892          }
893          if (RC)
894            ALTIVEC_SET_CR6(vS, 1);
895          PPC_INSN_VR_CR(VS_BITMASK, VA_BITMASK | VB_BITMASK, RC ? 0x000000f0 : 0);
896
8970.4,6.VS,11.VA,16.VB,21.RC,22.774:VXR:av:vcmpgtsbx %VD, %VA, %VB:Vector Compare Greater-Than Signed Byte
898          int i;
899          int8_t a, b;
900          for (i = 0; i < 16; i++) {
901            a = (*vA).b[i];
902            b = (*vB).b[i];
903            if (a > b)
904              (*vS).b[i] = 0xff;
905            else
906              (*vS).b[i] = 0;
907          }
908          if (RC)
909            ALTIVEC_SET_CR6(vS, 1);
910          PPC_INSN_VR_CR(VS_BITMASK, VA_BITMASK | VB_BITMASK, RC ? 0x000000f0 : 0);
911
9120.4,6.VS,11.VA,16.VB,21.RC,22.838:VXR:av:vcmpgtshx %VD, %VA, %VB:Vector Compare Greater-Than Signed Half Word
913          int i;
914          int16_t a, b;
915          for (i = 0; i < 8; i++) {
916            a = (*vA).h[i];
917            b = (*vB).h[i];
918            if (a > b)
919              (*vS).h[i] = 0xffff;
920            else
921              (*vS).h[i] = 0;
922          }
923          if (RC)
924            ALTIVEC_SET_CR6(vS, 1);
925          PPC_INSN_VR_CR(VS_BITMASK, VA_BITMASK | VB_BITMASK, RC ? 0x000000f0 : 0);
926
9270.4,6.VS,11.VA,16.VB,21.RC,22.902:VXR:av:vcmpgtswx %VD, %VA, %VB:Vector Compare Greater-Than Signed Word
928          int i;
929          int32_t a, b;
930          for (i = 0; i < 4; i++) {
931            a = (*vA).w[i];
932            b = (*vB).w[i];
933            if (a > b)
934              (*vS).w[i] = 0xffffffff;
935            else
936              (*vS).w[i] = 0;
937          }
938          if (RC)
939            ALTIVEC_SET_CR6(vS, 1);
940          PPC_INSN_VR_CR(VS_BITMASK, VA_BITMASK | VB_BITMASK, RC ? 0x000000f0 : 0);
941
9420.4,6.VS,11.VA,16.VB,21.RC,22.518:VXR:av:vcmpgtubx %VD, %VA, %VB:Vector Compare Greater-Than Unsigned Byte
943          int i;
944          uint8_t a, b;
945          for (i = 0; i < 16; i++) {
946            a = (*vA).b[i];
947            b = (*vB).b[i];
948            if (a > b)
949              (*vS).b[i] = 0xff;
950            else
951              (*vS).b[i] = 0;
952          }
953          if (RC)
954            ALTIVEC_SET_CR6(vS, 1);
955          PPC_INSN_VR_CR(VS_BITMASK, VA_BITMASK | VB_BITMASK, RC ? 0x000000f0 : 0);
956
9570.4,6.VS,11.VA,16.VB,21.RC,22.582:VXR:av:vcmpgtuhx %VD, %VA, %VB:Vector Compare Greater-Than Unsigned Half Word
958          int i;
959          uint16_t a, b;
960          for (i = 0; i < 8; i++) {
961            a = (*vA).h[i];
962            b = (*vB).h[i];
963            if (a > b)
964              (*vS).h[i] = 0xffff;
965            else
966              (*vS).h[i] = 0;
967          }
968          if (RC)
969            ALTIVEC_SET_CR6(vS, 1);
970          PPC_INSN_VR_CR(VS_BITMASK, VA_BITMASK | VB_BITMASK, RC ? 0x000000f0 : 0);
971
9720.4,6.VS,11.VA,16.VB,21.RC,22.646:VXR:av:vcmpgtuwx %VD, %VA, %VB:Vector Compare Greater-Than Unsigned Word
973          int i;
974          uint32_t a, b;
975          for (i = 0; i < 4; i++) {
976            a = (*vA).w[i];
977            b = (*vB).w[i];
978            if (a > b)
979              (*vS).w[i] = 0xffffffff;
980            else
981              (*vS).w[i] = 0;
982          }
983          if (RC)
984            ALTIVEC_SET_CR6(vS, 1);
985          PPC_INSN_VR_CR(VS_BITMASK, VA_BITMASK | VB_BITMASK, RC ? 0x000000f0 : 0);
986
987#
988# Vector Convert instructions, 6-65, 6-66.
989#
990
9910.4,6.VS,11.UIMM,16.VB,21.970:VX:av:vctsxs %VD, %VB, %UIMM:Vector Convert to Signed Fixed-Point Word Saturate
992          int i, sat, tempsat;
993          int64_t temp;
994          sim_fpu a, b, m;
995          sat = 0;
996          for (i = 0; i < 4; i++) {
997            sim_fpu_32to (&b, (*vB).w[i]);
998            sim_fpu_u32to (&m, 2 << UIMM, sim_fpu_round_default);
999            sim_fpu_mul (&a, &b, &m);
1000            sim_fpu_to64i (&temp, &a, sim_fpu_round_default);
1001            (*vS).w[i] = altivec_signed_saturate_32(temp, &tempsat);
1002            sat |= tempsat;
1003          }
1004          ALTIVEC_SET_SAT(sat);
1005          PPC_INSN_VR_VSCR(VS_BITMASK, VB_BITMASK);
1006
10070.4,6.VS,11.UIMM,16.VB,21.906:VX:av:vctuxs %VD, %VB, %UIMM:Vector Convert to Unsigned Fixed-Point Word Saturate
1008          int i, sat, tempsat;
1009          int64_t temp;
1010          sim_fpu a, b, m;
1011          sat = 0;
1012          for (i = 0; i < 4; i++) {
1013            sim_fpu_32to (&b, (*vB).w[i]);
1014            sim_fpu_u32to (&m, 2 << UIMM, sim_fpu_round_default);
1015            sim_fpu_mul (&a, &b, &m);
1016            sim_fpu_to64u (&temp, &a, sim_fpu_round_default);
1017            (*vS).w[i] = altivec_unsigned_saturate_32(temp, &tempsat);
1018            sat |= tempsat;
1019          }
1020          ALTIVEC_SET_SAT(sat);
1021          PPC_INSN_VR_VSCR(VS_BITMASK, VB_BITMASK);
1022
1023#
1024# Vector Estimate instructions, 6-67 ... 6-70.
1025#
1026
10270.4,6.VS,11.0,16.VB,21.394:VX:av:vexptefp %VD, %VB:Vector 2 Raised to the Exponent Estimate Floating Point
1028          int i;
1029          uint32_t f;
1030          int32_t bi;
1031          sim_fpu b, d;
1032          for (i = 0; i < 4; i++) {
1033            /*HACK!*/
1034            sim_fpu_32to (&b, (*vB).w[i]);
1035            sim_fpu_to32i (&bi, &b, sim_fpu_round_default);
1036            bi = 2 ^ bi;
1037            sim_fpu_32to (&d, bi);
1038            sim_fpu_to32 (&f, &d);
1039            (*vS).w[i] = f;
1040          }
1041          PPC_INSN_VR_VSCR(VS_BITMASK, VB_BITMASK);
1042
10430.4,6.VS,11.0,16.VB,21.458:VX:av:vlogefp %VD, %VB:Vector Log2 Estimate Floating Point
1044          int i;
1045          uint32_t c, u, f;
1046          sim_fpu b, cfpu, d;
1047          for (i = 0; i < 4; i++) {
1048            /*HACK!*/
1049            sim_fpu_32to (&b, (*vB).w[i]);
1050            sim_fpu_to32u (&u, &b, sim_fpu_round_default);
1051            for (c = 0; (u /= 2) > 1; c++)
1052              ;
1053            sim_fpu_32to (&cfpu, c);
1054            sim_fpu_add (&d, &b, &cfpu);
1055            sim_fpu_to32 (&f, &d);
1056            (*vS).w[i] = f;
1057          }
1058          PPC_INSN_VR_VSCR(VS_BITMASK, VB_BITMASK);
1059
1060#
1061# Vector Multiply Add instruction, 6-71
1062#
1063
10640.4,6.VS,11.VA,16.VB,21.VC,26.46:VAX:av:vmaddfp %VD, %VA, %VB, %VC:Vector Multiply Add Floating Point
1065          int i;
1066          uint32_t f;
1067          sim_fpu a, b, c, d, e;
1068          for (i = 0; i < 4; i++) {
1069            sim_fpu_32to (&a, (*vA).w[i]);
1070            sim_fpu_32to (&b, (*vB).w[i]);
1071            sim_fpu_32to (&c, (*vC).w[i]);
1072            sim_fpu_mul (&e, &a, &c);
1073            sim_fpu_add (&d, &e, &b);
1074            sim_fpu_to32 (&f, &d);
1075            (*vS).w[i] = f;
1076          }
1077          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK | VC_BITMASK);
1078
1079
1080#
1081# Vector Maximum instructions, 6-72 ... 6-78.
1082#
1083
10840.4,6.VS,11.VA,16.VB,21.1034:VX:av:vmaxfp %VD, %VA, %VB:Vector Maximum Floating Point
1085          int i;
1086          uint32_t f;
1087          sim_fpu a, b, d;
1088          for (i = 0; i < 4; i++) {
1089            sim_fpu_32to (&a, (*vA).w[i]);
1090            sim_fpu_32to (&b, (*vB).w[i]);
1091            sim_fpu_max (&d, &a, &b);
1092            sim_fpu_to32 (&f, &d);
1093            (*vS).w[i] = f;
1094          }
1095          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1096
10970.4,6.VS,11.VA,16.VB,21.258:VX:av:vmaxsb %VD, %VA, %VB:Vector Maximum Signed Byte
1098          int i;
1099          int8_t a, b;
1100          for (i = 0; i < 16; i++) {
1101            a = (*vA).b[i];
1102            b = (*vB).b[i];
1103            if (a > b)
1104              (*vS).b[i] = a;
1105            else
1106              (*vS).b[i] = b;
1107          }
1108          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1109
11100.4,6.VS,11.VA,16.VB,21.322:VX:av:vmaxsh %VD, %VA, %VB:Vector Maximum Signed Half Word
1111          int i;
1112          int16_t a, b;
1113          for (i = 0; i < 8; i++) {
1114            a = (*vA).h[i];
1115            b = (*vB).h[i];
1116            if (a > b)
1117              (*vS).h[i] = a;
1118            else
1119              (*vS).h[i] = b;
1120          }
1121          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1122
11230.4,6.VS,11.VA,16.VB,21.386:VX:av:vmaxsw %VD, %VA, %VB:Vector Maximum Signed Word
1124          int i;
1125          int32_t a, b;
1126          for (i = 0; i < 4; i++) {
1127            a = (*vA).w[i];
1128            b = (*vB).w[i];
1129            if (a > b)
1130              (*vS).w[i] = a;
1131            else
1132              (*vS).w[i] = b;
1133          }
1134          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1135
11360.4,6.VS,11.VA,16.VB,21.2:VX:av:vmaxub %VD, %VA, %VB:Vector Maximum Unsigned Byte
1137          int i;
1138          uint8_t a, b;
1139          for (i = 0; i < 16; i++) {
1140            a = (*vA).b[i];
1141            b = (*vB).b[i];
1142            if (a > b)
1143              (*vS).b[i] = a;
1144            else
1145              (*vS).b[i] = b;
1146          };
1147          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1148
11490.4,6.VS,11.VA,16.VB,21.66:VX:av:vmaxus %VD, %VA, %VB:Vector Maximum Unsigned Half Word
1150          int i;
1151          uint16_t a, b;
1152          for (i = 0; i < 8; i++) {
1153            a = (*vA).h[i];
1154            b = (*vB).h[i];
1155            if (a > b)
1156              (*vS).h[i] = a;
1157            else
1158              (*vS).h[i] = b;
1159          }
1160          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1161
11620.4,6.VS,11.VA,16.VB,21.130:VX:av:vmaxuw %VD, %VA, %VB:Vector Maximum Unsigned Word
1163          int i;
1164          uint32_t a, b;
1165          for (i = 0; i < 4; i++) {
1166            a = (*vA).w[i];
1167            b = (*vB).w[i];
1168            if (a > b)
1169              (*vS).w[i] = a;
1170            else
1171              (*vS).w[i] = b;
1172          }
1173          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1174
1175
1176#
1177# Vector Multiple High instructions, 6-79, 6-80.
1178#
1179
11800.4,6.VS,11.VA,16.VB,21.VC,26.32:VAX:av:vmhaddshs %VD, %VA, %VB, %VC:Vector Multiple High and Add Signed Half Word Saturate
1181          int i, sat, tempsat;
1182          int16_t a, b;
1183          int32_t prod, temp, c;
1184          for (i = 0; i < 8; i++) {
1185            a = (*vA).h[i];
1186            b = (*vB).h[i];
1187            c = (int32_t)(int16_t)(*vC).h[i];
1188            prod = (int32_t)a * (int32_t)b;
1189            temp = (prod >> 15) + c;
1190            (*vS).h[i] = altivec_signed_saturate_16(temp, &tempsat);
1191            sat |= tempsat;
1192          }
1193          ALTIVEC_SET_SAT(sat);
1194          PPC_INSN_VR_VSCR(VS_BITMASK, VA_BITMASK | VB_BITMASK | VC_BITMASK);
1195
11960.4,6.VS,11.VA,16.VB,21.VC,26.33:VAX:av:vmhraddshs %VD, %VA, %VB, %VC:Vector Multiple High Round and Add Signed Half Word Saturate
1197          int i, sat, tempsat;
1198          int16_t a, b;
1199          int32_t prod, temp, c;
1200          for (i = 0; i < 8; i++) {
1201            a = (*vA).h[i];
1202            b = (*vB).h[i];
1203            c = (int32_t)(int16_t)(*vC).h[i];
1204            prod = (int32_t)a * (int32_t)b;
1205            prod += 0x4000;
1206            temp = (prod >> 15) + c;
1207            (*vS).h[i] = altivec_signed_saturate_16(temp, &tempsat);
1208            sat |= tempsat;
1209          }
1210          ALTIVEC_SET_SAT(sat);
1211          PPC_INSN_VR_VSCR(VS_BITMASK, VA_BITMASK | VB_BITMASK | VC_BITMASK);
1212
1213
1214#
1215# Vector Minimum instructions, 6-81 ... 6-87
1216#
1217
12180.4,6.VS,11.VA,16.VB,21.1098:VX:av:vminfp %VD, %VA, %VB:Vector Minimum Floating Point
1219          int i;
1220          uint32_t f;
1221          sim_fpu a, b, d;
1222          for (i = 0; i < 4; i++) {
1223            sim_fpu_32to (&a, (*vA).w[i]);
1224            sim_fpu_32to (&b, (*vB).w[i]);
1225            sim_fpu_min (&d, &a, &b);
1226            sim_fpu_to32 (&f, &d);
1227            (*vS).w[i] = f;
1228          }
1229          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1230
12310.4,6.VS,11.VA,16.VB,21.770:VX:av:vminsb %VD, %VA, %VB:Vector Minimum Signed Byte
1232          int i;
1233          int8_t a, b;
1234          for (i = 0; i < 16; i++) {
1235            a = (*vA).b[i];
1236            b = (*vB).b[i];
1237            if (a < b)
1238              (*vS).b[i] = a;
1239            else
1240              (*vS).b[i] = b;
1241          }
1242          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1243
12440.4,6.VS,11.VA,16.VB,21.834:VX:av:vminsh %VD, %VA, %VB:Vector Minimum Signed Half Word
1245          int i;
1246          int16_t a, b;
1247          for (i = 0; i < 8; i++) {
1248            a = (*vA).h[i];
1249            b = (*vB).h[i];
1250            if (a < b)
1251              (*vS).h[i] = a;
1252            else
1253              (*vS).h[i] = b;
1254          }
1255          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1256
12570.4,6.VS,11.VA,16.VB,21.898:VX:av:vminsw %VD, %VA, %VB:Vector Minimum Signed Word
1258          int i;
1259          int32_t a, b;
1260          for (i = 0; i < 4; i++) {
1261            a = (*vA).w[i];
1262            b = (*vB).w[i];
1263            if (a < b)
1264              (*vS).w[i] = a;
1265            else
1266              (*vS).w[i] = b;
1267          }
1268          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1269
12700.4,6.VS,11.VA,16.VB,21.514:VX:av:vminub %VD, %VA, %VB:Vector Minimum Unsigned Byte
1271          int i;
1272          uint8_t a, b;
1273          for (i = 0; i < 16; i++) {
1274            a = (*vA).b[i];
1275            b = (*vB).b[i];
1276            if (a < b)
1277              (*vS).b[i] = a;
1278            else
1279              (*vS).b[i] = b;
1280          };
1281          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1282
12830.4,6.VS,11.VA,16.VB,21.578:VX:av:vminuh %VD, %VA, %VB:Vector Minimum Unsigned Half Word
1284          int i;
1285          uint16_t a, b;
1286          for (i = 0; i < 8; i++) {
1287            a = (*vA).h[i];
1288            b = (*vB).h[i];
1289            if (a < b)
1290              (*vS).h[i] = a;
1291            else
1292              (*vS).h[i] = b;
1293          }
1294          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1295
12960.4,6.VS,11.VA,16.VB,21.642:VX:av:vminuw %VD, %VA, %VB:Vector Minimum Unsigned Word
1297          int i;
1298          uint32_t a, b;
1299          for (i = 0; i < 4; i++) {
1300            a = (*vA).w[i];
1301            b = (*vB).w[i];
1302            if (a < b)
1303              (*vS).w[i] = a;
1304            else
1305              (*vS).w[i] = b;
1306          }
1307          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1308
1309
1310#
1311# Vector Multiply Low instruction, 6-88
1312#
1313
13140.4,6.VS,11.VA,16.VB,21.VC,26.34:VAX:av:vmladduhm %VD, %VA, %VB, %VC:Vector Multiply Low and Add Unsigned Half Word Modulo
1315          int i;
1316          uint16_t a, b, c;
1317          uint32_t prod;
1318          for (i = 0; i < 8; i++) {
1319            a = (*vA).h[i];
1320            b = (*vB).h[i];
1321            c = (*vC).h[i];
1322            prod = (uint32_t)a * (uint32_t)b;
1323            (*vS).h[i] = (prod + c) & 0xffff;
1324          }
1325          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK | VC_BITMASK);
1326
1327
1328#
1329# Vector Merge instructions, 6-89 ... 6-94
1330#
1331
13320.4,6.VS,11.VA,16.VB,21.12:VX:av:vmrghb %VD, %VA, %VB:Vector Merge High Byte
1333          int i;
1334          for (i = 0; i < 16; i += 2) {
1335            (*vS).b[AV_BINDEX(i)] = (*vA).b[AV_BINDEX(i/2)];
1336            (*vS).b[AV_BINDEX(i+1)] = (*vB).b[AV_BINDEX(i/2)];
1337          }
1338          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1339
13400.4,6.VS,11.VA,16.VB,21.76:VX:av:vmrghh %VD, %VA, %VB:Vector Merge High Half Word
1341          int i;
1342          for (i = 0; i < 8; i += 2) {
1343            (*vS).h[AV_HINDEX(i)] = (*vA).h[AV_HINDEX(i/2)];
1344            (*vS).h[AV_HINDEX(i+1)] = (*vB).h[AV_HINDEX(i/2)];
1345          }
1346          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1347
13480.4,6.VS,11.VA,16.VB,21.140:VX:av:vmrghw %VD, %VA, %VB:Vector Merge High Word
1349          int i;
1350          for (i = 0; i < 4; i += 2) {
1351            (*vS).w[i] = (*vA).w[i/2];
1352            (*vS).w[i+1] = (*vB).w[i/2];
1353          }
1354          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1355
13560.4,6.VS,11.VA,16.VB,21.268:VX:av:vmrglb %VD, %VA, %VB:Vector Merge Low Byte
1357          int i;
1358          for (i = 0; i < 16; i += 2) {
1359            (*vS).b[AV_BINDEX(i)] = (*vA).b[AV_BINDEX((i/2) + 8)];
1360            (*vS).b[AV_BINDEX(i+1)] = (*vB).b[AV_BINDEX((i/2) + 8)];
1361          }
1362          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1363
13640.4,6.VS,11.VA,16.VB,21.332:VX:av:vmrglh %VD, %VA, %VB:Vector Merge Low Half Word
1365          int i;
1366          for (i = 0; i < 8; i += 2) {
1367            (*vS).h[AV_HINDEX(i)] = (*vA).h[AV_HINDEX((i/2) + 4)];
1368            (*vS).h[AV_HINDEX(i+1)] = (*vB).h[AV_HINDEX((i/2) + 4)];
1369          }
1370          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1371
13720.4,6.VS,11.VA,16.VB,21.396:VX:av:vmrglw %VD, %VA, %VB:Vector Merge Low Word
1373          int i;
1374          for (i = 0; i < 4; i += 2) {
1375            (*vS).w[i] = (*vA).w[(i/2) + 2];
1376            (*vS).w[i+1] = (*vB).w[(i/2) + 2];
1377          }
1378          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1379
1380
1381#
1382# Vector Multiply Sum instructions, 6-95 ... 6-100
1383#
1384
13850.4,6.VS,11.VA,16.VB,21.VC,26.37:VAX:av:vmsummbm %VD, %VA, %VB, %VC:Vector Multiply Sum Mixed-Sign Byte Modulo
1386          int i, j;
1387          int32_t temp;
1388          int16_t prod, a;
1389          uint16_t b;
1390          for (i = 0; i < 4; i++) {
1391            temp = (*vC).w[i];
1392            for (j = 0; j < 4; j++) {
1393              a = (int16_t)(int8_t)(*vA).b[i*4+j];
1394              b = (*vB).b[i*4+j];
1395              prod = a * b;
1396              temp += (int32_t)prod;
1397            }
1398            (*vS).w[i] = temp;
1399          }
1400          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK | VC_BITMASK);
1401
14020.4,6.VS,11.VA,16.VB,21.VC,26.40:VAX:av:vmsumshm %VD, %VA, %VB, %VC:Vector Multiply Sum Signed Half Word Modulo
1403          int i, j;
1404          int32_t temp, prod, a, b;
1405          for (i = 0; i < 4; i++) {
1406            temp = (*vC).w[i];
1407            for (j = 0; j < 2; j++) {
1408              a = (int32_t)(int16_t)(*vA).h[i*2+j];
1409              b = (int32_t)(int16_t)(*vB).h[i*2+j];
1410              prod = a * b;
1411              temp += prod;
1412            }
1413            (*vS).w[i] = temp;
1414          }
1415          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK | VC_BITMASK);
1416
14170.4,6.VS,11.VA,16.VB,21.VC,26.41:VAX:av:vmsumshs %VD, %VA, %VB, %VC:Vector Multiply Sum Signed Half Word Saturate
1418          int i, j, sat, tempsat;
1419          int64_t temp;
1420          int32_t prod, a, b;
1421          sat = 0;
1422          for (i = 0; i < 4; i++) {
1423            temp = (int64_t)(int32_t)(*vC).w[i];
1424            for (j = 0; j < 2; j++) {
1425              a = (int32_t)(int16_t)(*vA).h[i*2+j];
1426              b = (int32_t)(int16_t)(*vB).h[i*2+j];
1427              prod = a * b;
1428              temp += (int64_t)prod;
1429            }
1430            (*vS).w[i] = altivec_signed_saturate_32(temp, &tempsat);
1431            sat |= tempsat;
1432          }
1433          ALTIVEC_SET_SAT(sat);
1434          PPC_INSN_VR_VSCR(VS_BITMASK, VA_BITMASK | VB_BITMASK | VC_BITMASK);
1435
14360.4,6.VS,11.VA,16.VB,21.VC,26.36:VAX:av:vmsumubm %VD, %VA, %VB, %VC:Vector Multiply Sum Unsigned Byte Modulo
1437          int i, j;
1438          uint32_t temp;
1439          uint16_t prod, a, b;
1440          for (i = 0; i < 4; i++) {
1441            temp = (*vC).w[i];
1442            for (j = 0; j < 4; j++) {
1443              a = (*vA).b[i*4+j];
1444              b = (*vB).b[i*4+j];
1445              prod = a * b;
1446              temp += prod;
1447            }
1448            (*vS).w[i] = temp;
1449          }
1450          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK | VC_BITMASK);
1451
14520.4,6.VS,11.VA,16.VB,21.VC,26.38:VAX:av:vmsumuhm %VD, %VA, %VB, %VC:Vector Multiply Sum Unsigned Half Word Modulo
1453          int i, j;
1454          uint32_t temp, prod, a, b;
1455          for (i = 0; i < 4; i++) {
1456            temp = (*vC).w[i];
1457            for (j = 0; j < 2; j++) {
1458              a = (*vA).h[i*2+j];
1459              b = (*vB).h[i*2+j];
1460              prod = a * b;
1461              temp += prod;
1462            }
1463            (*vS).w[i] = temp;
1464          }
1465          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK | VC_BITMASK);
1466
14670.4,6.VS,11.VA,16.VB,21.VC,26.39:VAX:av:vmsumuhs %VD, %VA, %VB, %VC:Vector Multiply Sum Unsigned Half Word Saturate
1468          int i, j, sat, tempsat;
1469          uint32_t temp, prod, a, b;
1470          sat = 0;
1471          for (i = 0; i < 4; i++) {
1472            temp = (*vC).w[i];
1473            for (j = 0; j < 2; j++) {
1474              a = (*vA).h[i*2+j];
1475              b = (*vB).h[i*2+j];
1476              prod = a * b;
1477              temp += prod;
1478            }
1479            (*vS).w[i] = altivec_unsigned_saturate_32(temp, &tempsat);
1480            sat |= tempsat;
1481          }
1482          ALTIVEC_SET_SAT(sat);
1483          PPC_INSN_VR_VSCR(VS_BITMASK, VA_BITMASK | VB_BITMASK | VC_BITMASK);
1484
1485
1486#
1487# Vector Multiply Even/Odd instructions, 6-101 ... 6-108
1488#
1489
14900.4,6.VS,11.VA,16.VB,21.776:VX:av:vmulesb %VD, %VA, %VB:Vector Multiply Even Signed Byte
1491          int i;
1492          int8_t a, b;
1493          int16_t prod;
1494          for (i = 0; i < 8; i++) {
1495            a = (*vA).b[AV_BINDEX(i*2)];
1496            b = (*vB).b[AV_BINDEX(i*2)];
1497            prod = a * b;
1498            (*vS).h[AV_HINDEX(i)] = prod;
1499          }
1500          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1501
15020.4,6.VS,11.VA,16.VB,21.840:VX:av:vmulesh %VD, %VA, %VB:Vector Multiply Even Signed Half Word
1503          int i;
1504          int16_t a, b;
1505          int32_t prod;
1506          for (i = 0; i < 4; i++) {
1507            a = (*vA).h[AV_HINDEX(i*2)];
1508            b = (*vB).h[AV_HINDEX(i*2)];
1509            prod = a * b;
1510            (*vS).w[i] = prod;
1511          }
1512          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1513
15140.4,6.VS,11.VA,16.VB,21.520:VX:av:vmuleub %VD, %VA, %VB:Vector Multiply Even Unsigned Byte
1515          int i;
1516          uint8_t a, b;
1517          uint16_t prod;
1518          for (i = 0; i < 8; i++) {
1519            a = (*vA).b[AV_BINDEX(i*2)];
1520            b = (*vB).b[AV_BINDEX(i*2)];
1521            prod = a * b;
1522            (*vS).h[AV_HINDEX(i)] = prod;
1523          }
1524          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1525
15260.4,6.VS,11.VA,16.VB,21.584:VX:av:vmuleuh %VD, %VA, %VB:Vector Multiply Even Unsigned Half Word
1527          int i;
1528          uint16_t a, b;
1529          uint32_t prod;
1530          for (i = 0; i < 4; i++) {
1531            a = (*vA).h[AV_HINDEX(i*2)];
1532            b = (*vB).h[AV_HINDEX(i*2)];
1533            prod = a * b;
1534            (*vS).w[i] = prod;
1535          }
1536          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1537
15380.4,6.VS,11.VA,16.VB,21.264:VX:av:vmulosb %VD, %VA, %VB:Vector Multiply Odd Signed Byte
1539          int i;
1540          int8_t a, b;
1541          int16_t prod;
1542          for (i = 0; i < 8; i++) {
1543            a = (*vA).b[AV_BINDEX((i*2)+1)];
1544            b = (*vB).b[AV_BINDEX((i*2)+1)];
1545            prod = a * b;
1546            (*vS).h[AV_HINDEX(i)] = prod;
1547          }
1548          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1549
15500.4,6.VS,11.VA,16.VB,21.328:VX:av:vmulosh %VD, %VA, %VB:Vector Multiply Odd Signed Half Word
1551          int i;
1552          int16_t a, b;
1553          int32_t prod;
1554          for (i = 0; i < 4; i++) {
1555            a = (*vA).h[AV_HINDEX((i*2)+1)];
1556            b = (*vB).h[AV_HINDEX((i*2)+1)];
1557            prod = a * b;
1558            (*vS).w[i] = prod;
1559          }
1560          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1561
15620.4,6.VS,11.VA,16.VB,21.8:VX:av:vmuloub %VD, %VA, %VB:Vector Multiply Odd Unsigned Byte
1563          int i;
1564          uint8_t a, b;
1565          uint16_t prod;
1566          for (i = 0; i < 8; i++) {
1567            a = (*vA).b[AV_BINDEX((i*2)+1)];
1568            b = (*vB).b[AV_BINDEX((i*2)+1)];
1569            prod = a * b;
1570            (*vS).h[AV_HINDEX(i)] = prod;
1571          }
1572          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1573
15740.4,6.VS,11.VA,16.VB,21.72:VX:av:vmulouh %VD, %VA, %VB:Vector Multiply Odd Unsigned Half Word
1575          int i;
1576          uint16_t a, b;
1577          uint32_t prod;
1578          for (i = 0; i < 4; i++) {
1579            a = (*vA).h[AV_HINDEX((i*2)+1)];
1580            b = (*vB).h[AV_HINDEX((i*2)+1)];
1581            prod = a * b;
1582            (*vS).w[i] = prod;
1583          }
1584          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1585
1586
1587#
1588# Vector Negative Multiply-Subtract instruction, 6-109
1589#
1590
15910.4,6.VS,11.VA,16.VB,21.VC,26.47:VX:av:vnmsubfp %VD, %VA, %VB, %VC:Vector Negative Multiply-Subtract Floating Point
1592          int i;
1593          uint32_t f;
1594          sim_fpu a, b, c, d, i1, i2;
1595          for (i = 0; i < 4; i++) {
1596            sim_fpu_32to (&a, (*vA).w[i]);
1597            sim_fpu_32to (&b, (*vB).w[i]);
1598            sim_fpu_32to (&c, (*vC).w[i]);
1599            sim_fpu_mul (&i1, &a, &c);
1600            sim_fpu_sub (&i2, &i1, &b);
1601            sim_fpu_neg (&d, &i2);
1602            sim_fpu_to32 (&f, &d);
1603            (*vS).w[i] = f;
1604          }
1605          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK | VC_BITMASK);
1606
1607
1608#
1609# Vector Logical OR instructions, 6-110, 6-111, 6-177
1610#
1611
16120.4,6.VS,11.VA,16.VB,21.1284:VX:av:vnor %VD, %VA, %VB:Vector Logical NOR
1613          int i;
1614          for (i = 0; i < 4; i++)
1615            (*vS).w[i] = ~((*vA).w[i] | (*vB).w[i]);
1616          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1617
16180.4,6.VS,11.VA,16.VB,21.1156:VX:av:vor %VD, %VA, %VB:Vector Logical OR
1619          int i;
1620          for (i = 0; i < 4; i++)
1621            (*vS).w[i] = (*vA).w[i] | (*vB).w[i];
1622          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1623
16240.4,6.VS,11.VA,16.VB,21.1220:VX:av:vxor %VD, %VA, %VB:Vector Logical XOR
1625          int i;
1626          for (i = 0; i < 4; i++)
1627            (*vS).w[i] = (*vA).w[i] ^ (*vB).w[i];
1628          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1629
1630
1631#
1632# Vector Permute instruction, 6-112
1633#
1634
16350.4,6.VS,11.VA,16.VB,21.VC,26.43:VX:av:vperm %VD, %VA, %VB, %VC:Vector Permute
1636          int i, who;
1637          /* The permutation vector might have us read into the source vectors
1638             back at positions before the iteration index, so we must latch the
1639             sources to prevent early-clobbering in case the destination vector
1640             is the same as one of them.  */
1641          vreg myvA = (*vA), myvB = (*vB);
1642          for (i = 0; i < 16; i++) {
1643            who = (*vC).b[AV_BINDEX(i)] & 0x1f;
1644            if (who & 0x10)
1645              (*vS).b[AV_BINDEX(i)] = myvB.b[AV_BINDEX(who & 0xf)];
1646            else
1647              (*vS).b[AV_BINDEX(i)] = myvA.b[AV_BINDEX(who & 0xf)];
1648          }
1649          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK | VC_BITMASK);
1650
1651
1652#
1653# Vector Pack instructions, 6-113 ... 6-121
1654#
1655
16560.4,6.VS,11.VA,16.VB,21.782:VX:av:vpkpx %VD, %VA, %VB:Vector Pack Pixel32
1657          int i;
1658          for (i = 0; i < 4; i++) {
1659            (*vS).h[AV_HINDEX(i+4)] = ((((*vB).w[i]) >> 9) & 0xfc00)
1660                         | ((((*vB).w[i]) >> 6) & 0x03e0)
1661                         | ((((*vB).w[i]) >> 3) & 0x001f);
1662            (*vS).h[AV_HINDEX(i)] = ((((*vA).w[i]) >> 9) & 0xfc00)
1663                       | ((((*vA).w[i]) >> 6) & 0x03e0)
1664                       | ((((*vA).w[i]) >> 3) & 0x001f);
1665          }
1666          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1667
16680.4,6.VS,11.VA,16.VB,21.398:VX:av:vpkshss %VD, %VA, %VB:Vector Pack Signed Half Word Signed Saturate
1669          int i, sat, tempsat;
1670          int16_t temp;
1671          sat = 0;
1672          for (i = 0; i < 16; i++) {
1673            if (i < 8)
1674              temp = (*vA).h[AV_HINDEX(i)];
1675            else
1676              temp = (*vB).h[AV_HINDEX(i-8)];
1677            (*vS).b[AV_BINDEX(i)] = altivec_signed_saturate_8(temp, &tempsat);
1678            sat |= tempsat;
1679          }
1680          ALTIVEC_SET_SAT(sat);
1681          PPC_INSN_VR_VSCR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1682
16830.4,6.VS,11.VA,16.VB,21.270:VX:av:vpkshus %VD, %VA, %VB:Vector Pack Signed Half Word Unsigned Saturate
1684          int i, sat, tempsat;
1685          int16_t temp;
1686          sat = 0;
1687          for (i = 0; i < 16; i++) {
1688            if (i < 8)
1689              temp = (*vA).h[AV_HINDEX(i)];
1690            else
1691              temp = (*vB).h[AV_HINDEX(i-8)];
1692            (*vS).b[AV_BINDEX(i)] = altivec_unsigned_saturate_8(temp, &tempsat);
1693            sat |= tempsat;
1694          }
1695          ALTIVEC_SET_SAT(sat);
1696          PPC_INSN_VR_VSCR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1697
16980.4,6.VS,11.VA,16.VB,21.462:VX:av:vpkswss %VD, %VA, %VB:Vector Pack Signed Word Signed Saturate
1699          int i, sat, tempsat;
1700          int32_t temp;
1701          sat = 0;
1702          for (i = 0; i < 8; i++) {
1703            if (i < 4)
1704              temp = (*vA).w[i];
1705            else
1706              temp = (*vB).w[i-4];
1707            (*vS).h[AV_HINDEX(i)] = altivec_signed_saturate_16(temp, &tempsat);
1708            sat |= tempsat;
1709          }
1710          ALTIVEC_SET_SAT(sat);
1711          PPC_INSN_VR_VSCR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1712
17130.4,6.VS,11.VA,16.VB,21.334:VX:av:vpkswus %VD, %VA, %VB:Vector Pack Signed Word Unsigned Saturate
1714          int i, sat, tempsat;
1715          int32_t temp;
1716          sat = 0;
1717          for (i = 0; i < 8; i++) {
1718            if (i < 4)
1719              temp = (*vA).w[i];
1720            else
1721              temp = (*vB).w[i-4];
1722            (*vS).h[AV_HINDEX(i)] = altivec_unsigned_saturate_16(temp, &tempsat);
1723            sat |= tempsat;
1724          }
1725          ALTIVEC_SET_SAT(sat);
1726          PPC_INSN_VR_VSCR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1727
17280.4,6.VS,11.VA,16.VB,21.14:VX:av:vpkuhum %VD, %VA, %VB:Vector Pack Unsigned Half Word Unsigned Modulo
1729          int i;
1730          for (i = 0; i < 16; i++)
1731            if (i < 8)
1732              (*vS).b[AV_BINDEX(i)] = (*vA).h[AV_HINDEX(i)];
1733            else
1734              (*vS).b[AV_BINDEX(i)] = (*vB).h[AV_HINDEX(i-8)];
1735          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1736
17370.4,6.VS,11.VA,16.VB,21.142:VX:av:vpkuhus %VD, %VA, %VB:Vector Pack Unsigned Half Word Unsigned Saturate
1738          int i, sat, tempsat;
1739          int16_t temp;
1740          sat = 0;
1741          for (i = 0; i < 16; i++) {
1742            if (i < 8)
1743              temp = (*vA).h[AV_HINDEX(i)];
1744            else
1745              temp = (*vB).h[AV_HINDEX(i-8)];
1746            /* force positive in int16_t, ok as we'll toss the bit away anyway */
1747            temp &= ~0x8000;
1748            (*vS).b[AV_BINDEX(i)] = altivec_unsigned_saturate_8(temp, &tempsat);
1749            sat |= tempsat;
1750          }
1751          ALTIVEC_SET_SAT(sat);
1752          PPC_INSN_VR_VSCR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1753
17540.4,6.VS,11.VA,16.VB,21.78:VX:av:vpkuwum %VD, %VA, %VB:Vector Pack Unsigned Word Unsigned Modulo
1755          int i;
1756          for (i = 0; i < 8; i++)
1757            if (i < 8)
1758              (*vS).h[AV_HINDEX(i)] = (*vA).w[i];
1759            else
1760              (*vS).h[AV_HINDEX(i)] = (*vB).w[i-8];
1761          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1762
17630.4,6.VS,11.VA,16.VB,21.206:VX:av:vpkuwus %VD, %VA, %VB:Vector Pack Unsigned Word Unsigned Saturate
1764          int i, sat, tempsat;
1765          int32_t temp;
1766          sat = 0;
1767          for (i = 0; i < 8; i++) {
1768            if (i < 4)
1769              temp = (*vA).w[i];
1770            else
1771              temp = (*vB).w[i-4];
1772            /* force positive in int32_t, ok as we'll toss the bit away anyway */
1773            temp &= ~0x80000000;
1774            (*vS).h[AV_HINDEX(i)] = altivec_unsigned_saturate_16(temp, &tempsat);
1775            sat |= tempsat;
1776          }
1777          ALTIVEC_SET_SAT(sat);
1778          PPC_INSN_VR_VSCR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1779
1780
1781#
1782# Vector Reciprocal instructions, 6-122, 6-123, 6-131
1783#
1784
17850.4,6.VS,11.0,16.VB,21.266:VX:av:vrefp %VD, %VB:Vector Reciprocal Estimate Floating Point
1786          int i;
1787          uint32_t f;
1788          sim_fpu op, d;
1789          for (i = 0; i < 4; i++) {
1790            sim_fpu_32to (&op, (*vB).w[i]);
1791            sim_fpu_div (&d, &sim_fpu_one, &op);
1792            sim_fpu_to32 (&f, &d);
1793            (*vS).w[i] = f;
1794          }
1795          PPC_INSN_VR(VS_BITMASK, VB_BITMASK);
1796
17970.4,6.VS,11.0,16.VB,21.330:VX:av:vrsqrtefp %VD, %VB:Vector Reciprocal Square Root Estimate Floating Point
1798          int i;
1799          uint32_t f;
1800          sim_fpu op, i1, one, d;
1801          for (i = 0; i < 4; i++) {
1802            sim_fpu_32to (&op, (*vB).w[i]);
1803            sim_fpu_sqrt (&i1, &op);
1804            sim_fpu_div (&d, &sim_fpu_one, &i1);
1805            sim_fpu_to32 (&f, &d);
1806            (*vS).w[i] = f;
1807          }
1808          PPC_INSN_VR(VS_BITMASK, VB_BITMASK);
1809
1810
1811#
1812# Vector Round instructions, 6-124 ... 6-127
1813#
1814
18150.4,6.VS,11.0,16.VB,21.714:VX:av:vrfim %VD, %VB:Vector Round to Floating-Point Integer towards Minus Infinity
1816          int i;
1817          uint32_t f;
1818          sim_fpu op;
1819          for (i = 0; i < 4; i++) {
1820            sim_fpu_32to (&op, (*vB).w[i]);
1821            sim_fpu_round_32(&op, sim_fpu_round_down, sim_fpu_denorm_default);
1822            sim_fpu_to32 (&f, &op);
1823            (*vS).w[i] = f;
1824          }
1825          PPC_INSN_VR(VS_BITMASK, VB_BITMASK);
1826
18270.4,6.VS,11.0,16.VB,21.522:VX:av:vrfin %VD, %VB:Vector Round to Floating-Point Integer Nearest
1828          int i;
1829          uint32_t f;
1830          sim_fpu op;
1831          for (i = 0; i < 4; i++) {
1832            sim_fpu_32to (&op, (*vB).w[i]);
1833            sim_fpu_round_32(&op, sim_fpu_round_near, sim_fpu_denorm_default);
1834            sim_fpu_to32 (&f, &op);
1835            (*vS).w[i] = f;
1836          }
1837          PPC_INSN_VR(VS_BITMASK, VB_BITMASK);
1838
18390.4,6.VS,11.0,16.VB,21.650:VX:av:vrfip %VD, %VB:Vector Round to Floating-Point Integer towards Plus Infinity
1840          int i;
1841          uint32_t f;
1842          sim_fpu op;
1843          for (i = 0; i < 4; i++) {
1844            sim_fpu_32to (&op, (*vB).w[i]);
1845            sim_fpu_round_32(&op, sim_fpu_round_up, sim_fpu_denorm_default);
1846            sim_fpu_to32 (&f, &op);
1847            (*vS).w[i] = f;
1848          }
1849          PPC_INSN_VR(VS_BITMASK, VB_BITMASK);
1850
18510.4,6.VS,11.0,16.VB,21.586:VX:av:vrfiz %VD, %VB:Vector Round to Floating-Point Integer towards Zero
1852          int i;
1853          uint32_t f;
1854          sim_fpu op;
1855          for (i = 0; i < 4; i++) {
1856            sim_fpu_32to (&op, (*vB).w[i]);
1857            sim_fpu_round_32(&op, sim_fpu_round_zero, sim_fpu_denorm_default);
1858            sim_fpu_to32 (&f, &op);
1859            (*vS).w[i] = f;
1860          }
1861          PPC_INSN_VR(VS_BITMASK, VB_BITMASK);
1862
1863
1864#
1865# Vector Rotate Left instructions, 6-128 ... 6-130
1866#
1867
18680.4,6.VS,11.VA,16.VB,21.4:VX:av:vrlb %VD, %VA, %VB:Vector Rotate Left Integer Byte
1869          int i;
1870          uint16_t temp;
1871          for (i = 0; i < 16; i++) {
1872            temp = (uint16_t)(*vA).b[i] << (((*vB).b[i]) & 7);
1873            (*vS).b[i] = (temp & 0xff) | ((temp >> 8) & 0xff);
1874          }
1875          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1876
18770.4,6.VS,11.VA,16.VB,21.68:VX:av:vrlh %VD, %VA, %VB:Vector Rotate Left Integer Half Word
1878          int i;
1879          uint32_t temp;
1880          for (i = 0; i < 8; i++) {
1881            temp = (uint32_t)(*vA).h[i] << (((*vB).h[i]) & 0xf);
1882            (*vS).h[i] = (temp & 0xffff) | ((temp >> 16) & 0xffff);
1883          }
1884          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1885
18860.4,6.VS,11.VA,16.VB,21.132:VX:av:vrlw %VD, %VA, %VB:Vector Rotate Left Integer Word
1887          int i;
1888          uint64_t temp;
1889          for (i = 0; i < 4; i++) {
1890            temp = (uint64_t)(*vA).w[i] << (((*vB).w[i]) & 0x1f);
1891            (*vS).w[i] = (temp & 0xffffffff) | ((temp >> 32) & 0xffffffff);
1892          }
1893          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1894
1895
1896#
1897# Vector Conditional Select instruction, 6-133
1898#
1899
19000.4,6.VS,11.VA,16.VB,21.VC,26.42:VAX:av:vsel %VD, %VA, %VB, %VC:Vector Conditional Select
1901          int i;
1902          uint32_t c;
1903          for (i = 0; i < 4; i++) {
1904            c = (*vC).w[i];
1905            (*vS).w[i] = ((*vB).w[i] & c) | ((*vA).w[i] & ~c);
1906          }
1907          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK | VC_BITMASK);
1908
1909#
1910# Vector Shift Left instructions, 6-134 ... 6-139
1911#
1912
19130.4,6.VS,11.VA,16.VB,21.452:VX:av:vsl %VD, %VA, %VB:Vector Shift Left
1914          int sh, i, j, carry, new_carry;
1915          sh = (*vB).b[0] & 7;          /* don't bother checking everything */
1916          carry = 0;
1917          for (j = 3; j >= 0; j--) {
1918            if (CURRENT_TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
1919              i = j;
1920            else
1921              i = (j + 2) % 4;
1922            new_carry = (*vA).w[i] >> (32 - sh);
1923            (*vS).w[i] = ((*vA).w[i] << sh) | carry;
1924            carry = new_carry;
1925          }
1926          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1927
19280.4,6.VS,11.VA,16.VB,21.260:VX:av:vslb %VD, %VA, %VB:Vector Shift Left Integer Byte
1929          int i, sh;
1930          for (i = 0; i < 16; i++) {
1931            sh = ((*vB).b[i]) & 7;
1932            (*vS).b[i] = (*vA).b[i] << sh;
1933          }
1934          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1935
19360.4,6.VS,11.VA,16.VB,21.0,22.SH,26.44:VX:av:vsldol %VD, %VA, %VB:Vector Shift Left Double by Octet Immediate
1937          int i, j;
1938          for (j = 0, i = SH; i < 16; i++)
1939            (*vS).b[j++] = (*vA).b[i];
1940          for (i = 0; i < SH; i++)
1941            (*vS).b[j++] = (*vB).b[i];
1942          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1943
19440.4,6.VS,11.VA,16.VB,21.324:VX:av:vslh %VD, %VA, %VB:Vector Shift Left Half Word
1945          int i, sh;
1946          for (i = 0; i < 8; i++) {
1947            sh = ((*vB).h[i]) & 0xf;
1948            (*vS).h[i] = (*vA).h[i] << sh;
1949          }
1950          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1951
19520.4,6.VS,11.VA,16.VB,21.1036:VX:av:vslo %VD, %VA, %VB:Vector Shift Left by Octet
1953          int i, sh;
1954          if (CURRENT_TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
1955            sh = ((*vB).b[AV_BINDEX(15)] >> 3) & 0xf;
1956          else
1957            sh = ((*vB).b[AV_BINDEX(0)] >> 3) & 0xf;
1958          for (i = 0; i < 16; i++) {
1959            if (15 - i > sh)
1960              (*vS).b[AV_BINDEX(i)] = (*vA).b[AV_BINDEX(i + sh)];
1961            else
1962              (*vS).b[AV_BINDEX(i)] = 0;
1963          }
1964          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1965
19660.4,6.VS,11.VA,16.VB,21.388:VX:av:vslw %VD, %VA, %VB:Vector Shift Left Integer Word
1967          int i, sh;
1968          for (i = 0; i < 4; i++) {
1969            sh = ((*vB).w[i]) & 0x1f;
1970            (*vS).w[i] = (*vA).w[i] << sh;
1971          }
1972          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
1973
1974
1975#
1976# Vector Splat instructions, 6-140 ... 6-145
1977#
1978
19790.4,6.VS,11.UIMM,16.VB,21.524:VX:av:vspltb %VD, %VB, %UIMM:Vector Splat Byte
1980          int i;
1981          uint8_t b;
1982          b = (*vB).b[AV_BINDEX(UIMM & 0xf)];
1983          for (i = 0; i < 16; i++)
1984            (*vS).b[i] = b;
1985          PPC_INSN_VR(VS_BITMASK, VB_BITMASK);
1986
19870.4,6.VS,11.UIMM,16.VB,21.588:VX:av:vsplth %VD, %VB, %UIMM:Vector Splat Half Word
1988          int i;
1989          uint16_t h;
1990          h = (*vB).h[AV_HINDEX(UIMM & 0x7)];
1991          for (i = 0; i < 8; i++)
1992            (*vS).h[i] = h;
1993          PPC_INSN_VR(VS_BITMASK, VB_BITMASK);
1994
19950.4,6.VS,11.SIMM,16.0,21.780:VX:av:vspltisb %VD, %SIMM:Vector Splat Immediate Signed Byte
1996          int i;
1997          int8_t b = SIMM;
1998          /* manual 5-bit signed extension */
1999          if (b & 0x10)
2000            b -= 0x20;
2001          for (i = 0; i < 16; i++)
2002            (*vS).b[i] = b;
2003          PPC_INSN_VR(VS_BITMASK, 0);
2004
20050.4,6.VS,11.SIMM,16.0,21.844:VX:av:vspltish %VD, %SIMM:Vector Splat Immediate Signed Half Word
2006          int i;
2007          int16_t h = SIMM;
2008          /* manual 5-bit signed extension */
2009          if (h & 0x10)
2010            h -= 0x20;
2011          for (i = 0; i < 8; i++)
2012            (*vS).h[i] = h;
2013          PPC_INSN_VR(VS_BITMASK, 0);
2014
20150.4,6.VS,11.SIMM,16.0,21.908:VX:av:vspltisw %VD, %SIMM:Vector Splat Immediate Signed Word
2016          int i;
2017          int32_t w = SIMM;
2018          /* manual 5-bit signed extension */
2019          if (w & 0x10)
2020            w -= 0x20;
2021          for (i = 0; i < 4; i++)
2022            (*vS).w[i] = w;
2023          PPC_INSN_VR(VS_BITMASK, 0);
2024
20250.4,6.VS,11.UIMM,16.VB,21.652:VX:av:vspltw %VD, %VB, %UIMM:Vector Splat Word
2026          int i;
2027          uint32_t w;
2028          w = (*vB).w[UIMM & 0x3];
2029          for (i = 0; i < 4; i++)
2030            (*vS).w[i] = w;
2031          PPC_INSN_VR(VS_BITMASK, VB_BITMASK);
2032
2033
2034#
2035# Vector Shift Right instructions, 6-146 ... 6-154
2036#
2037
20380.4,6.VS,11.VA,16.VB,21.708:VX:av:vsr %VD, %VA, %VB:Vector Shift Right
2039          int sh, i, j, carry, new_carry;
2040          sh = (*vB).b[0] & 7;          /* don't bother checking everything */
2041          carry = 0;
2042          for (j = 0; j < 4; j++) {
2043            if (CURRENT_TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
2044              i = j;
2045            else
2046              i = (j + 2) % 4;
2047            new_carry = (*vA).w[i] << (32 - sh);
2048            (*vS).w[i] = ((*vA).w[i] >> sh) | carry;
2049            carry = new_carry;
2050          }
2051          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
2052
20530.4,6.VS,11.VA,16.VB,21.772:VX:av:vsrab %VD, %VA, %VB:Vector Shift Right Algebraic Byte
2054          int i, sh;
2055          int16_t a;
2056          for (i = 0; i < 16; i++) {
2057            sh = ((*vB).b[i]) & 7;
2058            a = (int16_t)(int8_t)(*vA).b[i];
2059            (*vS).b[i] = (a >> sh) & 0xff;
2060          }
2061          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
2062
20630.4,6.VS,11.VA,16.VB,21.836:VX:av:vsrah %VD, %VA, %VB:Vector Shift Right Algebraic Half Word
2064          int i, sh;
2065          int32_t a;
2066          for (i = 0; i < 8; i++) {
2067            sh = ((*vB).h[i]) & 0xf;
2068            a = (int32_t)(int16_t)(*vA).h[i];
2069            (*vS).h[i] = (a >> sh) & 0xffff;
2070          }
2071          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
2072
20730.4,6.VS,11.VA,16.VB,21.900:VX:av:vsraw %VD, %VA, %VB:Vector Shift Right Algebraic Word
2074          int i, sh;
2075          int64_t a;
2076          for (i = 0; i < 4; i++) {
2077            sh = ((*vB).w[i]) & 0xf;
2078            a = (int64_t)(int32_t)(*vA).w[i];
2079            (*vS).w[i] = (a >> sh) & 0xffffffff;
2080          }
2081          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
2082
20830.4,6.VS,11.VA,16.VB,21.516:VX:av:vsrb %VD, %VA, %VB:Vector Shift Right Byte
2084          int i, sh;
2085          for (i = 0; i < 16; i++) {
2086            sh = ((*vB).b[i]) & 7;
2087            (*vS).b[i] = (*vA).b[i] >> sh;
2088          }
2089          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
2090
20910.4,6.VS,11.VA,16.VB,21.580:VX:av:vsrh %VD, %VA, %VB:Vector Shift Right Half Word
2092          int i, sh;
2093          for (i = 0; i < 8; i++) {
2094            sh = ((*vB).h[i]) & 0xf;
2095            (*vS).h[i] = (*vA).h[i] >> sh;
2096          }
2097          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
2098
20990.4,6.VS,11.VA,16.VB,21.1100:VX:av:vsro %VD, %VA, %VB:Vector Shift Right Octet
2100          int i, sh;
2101          if (CURRENT_TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
2102            sh = ((*vB).b[AV_BINDEX(15)] >> 3) & 0xf;
2103          else
2104            sh = ((*vB).b[AV_BINDEX(0)] >> 3) & 0xf;
2105          for (i = 0; i < 16; i++) {
2106            if (i < sh)
2107              (*vS).b[AV_BINDEX(i)] = 0;
2108            else
2109              (*vS).b[AV_BINDEX(i)] = (*vA).b[AV_BINDEX(i - sh)];
2110          }
2111          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
2112
21130.4,6.VS,11.VA,16.VB,21.644:VX:av:vsrw %VD, %VA, %VB:Vector Shift Right Word
2114          int i, sh;
2115          for (i = 0; i < 4; i++) {
2116            sh = ((*vB).w[i]) & 0x1f;
2117            (*vS).w[i] = (*vA).w[i] >> sh;
2118          }
2119          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
2120
2121
2122#
2123# Vector Subtract instructions, 6-155 ... 6-165
2124#
2125
21260.4,6.VS,11.VA,16.VB,21.1408:VX:av:vsubcuw %VD, %VA, %VB:Vector Subtract Carryout Unsigned Word
2127          int i;
2128          int64_t temp, a, b;
2129          for (i = 0; i < 4; i++) {
2130            a = (int64_t)(uint32_t)(*vA).w[i];
2131            b = (int64_t)(uint32_t)(*vB).w[i];
2132            temp = a - b;
2133            (*vS).w[i] = ~(temp >> 32) & 1;
2134          }
2135          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
2136
21370.4,6.VS,11.VA,16.VB,21.74:VX:av:vsubfp %VD, %VA, %VB:Vector Subtract Floating Point
2138          int i;
2139          uint32_t f;
2140          sim_fpu a, b, d;
2141          for (i = 0; i < 4; i++) {
2142            sim_fpu_32to (&a, (*vA).w[i]);
2143            sim_fpu_32to (&b, (*vB).w[i]);
2144            sim_fpu_sub (&d, &a, &b);
2145            sim_fpu_to32 (&f, &d);
2146            (*vS).w[i] = f;
2147          }
2148          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
2149
21500.4,6.VS,11.VA,16.VB,21.1792:VX:av:vsubsbs %VD, %VA, %VB:Vector Subtract Signed Byte Saturate
2151          int i, sat, tempsat;
2152          int16_t temp;
2153          sat = 0;
2154          for (i = 0; i < 16; i++) {
2155            temp = (int16_t)(int8_t)(*vA).b[i] - (int16_t)(int8_t)(*vB).b[i];
2156            (*vS).b[i] = altivec_signed_saturate_8(temp, &tempsat);
2157            sat |= tempsat;
2158          }
2159          ALTIVEC_SET_SAT(sat);
2160          PPC_INSN_VR_VSCR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
2161
21620.4,6.VS,11.VA,16.VB,21.1856:VX:av:vsubshs %VD, %VA, %VB:Vector Subtract Signed Half Word Saturate
2163          int i, sat, tempsat;
2164          int32_t temp;
2165          sat = 0;
2166          for (i = 0; i < 8; i++) {
2167            temp = (int32_t)(int16_t)(*vA).h[i] - (int32_t)(int16_t)(*vB).h[i];
2168            (*vS).h[i] = altivec_signed_saturate_16(temp, &tempsat);
2169            sat |= tempsat;
2170          }
2171          ALTIVEC_SET_SAT(sat);
2172          PPC_INSN_VR_VSCR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
2173
21740.4,6.VS,11.VA,16.VB,21.1920:VX:av:vsubsws %VD, %VA, %VB:Vector Subtract Signed Word Saturate
2175          int i, sat, tempsat;
2176          int64_t temp;
2177          sat = 0;
2178          for (i = 0; i < 4; i++) {
2179            temp = (int64_t)(int32_t)(*vA).w[i] - (int64_t)(int32_t)(*vB).w[i];
2180            (*vS).w[i] = altivec_signed_saturate_32(temp, &tempsat);
2181            sat |= tempsat;
2182          }
2183          ALTIVEC_SET_SAT(sat);
2184          PPC_INSN_VR_VSCR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
2185
21860.4,6.VS,11.VA,16.VB,21.1024:VX:av:vsububm %VD, %VA, %VB:Vector Subtract Unsigned Byte Modulo
2187          int i;
2188          for (i = 0; i < 16; i++)
2189            (*vS).b[i] = (*vA).b[i] - (*vB).b[i];
2190          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
2191
21920.4,6.VS,11.VA,16.VB,21.1536:VX:av:vsububs %VD, %VA, %VB:Vector Subtract Unsigned Byte Saturate
2193          int i, sat, tempsat;
2194          int16_t temp;
2195          sat = 0;
2196          for (i = 0; i < 16; i++) {
2197            temp = (int16_t)(uint8_t)(*vA).b[i] - (int16_t)(uint8_t)(*vB).b[i];
2198            (*vS).b[i] = altivec_unsigned_saturate_8(temp, &tempsat);
2199            sat |= tempsat;
2200          }
2201          ALTIVEC_SET_SAT(sat);
2202          PPC_INSN_VR_VSCR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
2203
22040.4,6.VS,11.VA,16.VB,21.1088:VX:av:vsubuhm %VD, %VA, %VB:Vector Subtract Unsigned Half Word Modulo
2205          int i;
2206          for (i = 0; i < 8; i++)
2207            (*vS).h[i] = ((*vA).h[i] - (*vB).h[i]) & 0xffff;
2208          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
2209
22100.4,6.VS,11.VA,16.VB,21.1600:VX:av:vsubuhs %VD, %VA, %VB:Vector Subtract Unsigned Half Word Saturate
2211          int i, sat, tempsat;
2212          int32_t temp;
2213          for (i = 0; i < 8; i++) {
2214            temp = (int32_t)(uint16_t)(*vA).h[i] - (int32_t)(uint16_t)(*vB).h[i];
2215            (*vS).h[i] = altivec_unsigned_saturate_16(temp, &tempsat);
2216            sat |= tempsat;
2217          }
2218          ALTIVEC_SET_SAT(sat);
2219          PPC_INSN_VR_VSCR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
2220
22210.4,6.VS,11.VA,16.VB,21.1152:VX:av:vsubuwm %VD, %VA, %VB:Vector Subtract Unsigned Word Modulo
2222          int i;
2223          for (i = 0; i < 4; i++)
2224            (*vS).w[i] = (*vA).w[i] - (*vB).w[i];
2225          PPC_INSN_VR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
2226
22270.4,6.VS,11.VA,16.VB,21.1664:VX:av:vsubuws %VD, %VA, %VB:Vector Subtract Unsigned Word Saturate
2228          int i, sat, tempsat;
2229          int64_t temp;
2230          for (i = 0; i < 4; i++) {
2231            temp = (int64_t)(uint32_t)(*vA).w[i] - (int64_t)(uint32_t)(*vB).w[i];
2232            (*vS).w[i] = altivec_unsigned_saturate_32(temp, &tempsat);
2233            sat |= tempsat;
2234          }
2235          ALTIVEC_SET_SAT(sat);
2236          PPC_INSN_VR_VSCR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
2237
2238
2239#
2240# Vector Sum instructions, 6-166 ... 6-170
2241#
2242
22430.4,6.VS,11.VA,16.VB,21.1928:VX:av:vsumsws %VD, %VA, %VB:Vector Sum Across Signed Word Saturate
2244          int i, sat;
2245          int64_t temp;
2246          temp = (int64_t)(int32_t)(*vB).w[3];
2247          for (i = 0; i < 4; i++)
2248            temp += (int64_t)(int32_t)(*vA).w[i];
2249          (*vS).w[3] = altivec_signed_saturate_32(temp, &sat);
2250          (*vS).w[0] = (*vS).w[1] = (*vS).w[2] = 0;
2251          ALTIVEC_SET_SAT(sat);
2252          PPC_INSN_VR_VSCR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
2253
22540.4,6.VS,11.VA,16.VB,21.1672:VX:av:vsum2sws %VD, %VA, %VB:Vector Sum Across Partial (1/2) Signed Word Saturate
2255          int i, j, sat, tempsat;
2256          int64_t temp;
2257          for (j = 0; j < 4; j += 2) {
2258            temp = (int64_t)(int32_t)(*vB).w[j+1];
2259            temp += (int64_t)(int32_t)(*vA).w[j] + (int64_t)(int32_t)(*vA).w[j+1];
2260            (*vS).w[j+1] = altivec_signed_saturate_32(temp, &tempsat);
2261            sat |= tempsat;
2262          }
2263          (*vS).w[0] = (*vS).w[2] = 0;
2264          ALTIVEC_SET_SAT(sat);
2265          PPC_INSN_VR_VSCR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
2266
22670.4,6.VS,11.VA,16.VB,21.1800:VX:av:vsum4sbs %VD, %VA, %VB:Vector Sum Across Partial (1/4) Signed Byte Saturate
2268          int i, j, sat, tempsat;
2269          int64_t temp;
2270          for (j = 0; j < 4; j++) {
2271            temp = (int64_t)(int32_t)(*vB).w[j];
2272            for (i = 0; i < 4; i++)
2273              temp += (int64_t)(int8_t)(*vA).b[i+(j*4)];
2274            (*vS).w[j] = altivec_signed_saturate_32(temp, &tempsat);
2275            sat |= tempsat;
2276          }
2277          ALTIVEC_SET_SAT(sat);
2278          PPC_INSN_VR_VSCR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
2279
22800.4,6.VS,11.VA,16.VB,21.1608:VX:av:vsum4shs %VD, %VA, %VB:Vector Sum Across Partial (1/4) Signed Half Word Saturate
2281          int i, j, sat, tempsat;
2282          int64_t temp;
2283          for (j = 0; j < 4; j++) {
2284            temp = (int64_t)(int32_t)(*vB).w[j];
2285            for (i = 0; i < 2; i++)
2286              temp += (int64_t)(int16_t)(*vA).h[i+(j*2)];
2287            (*vS).w[j] = altivec_signed_saturate_32(temp, &tempsat);
2288            sat |= tempsat;
2289          }
2290          ALTIVEC_SET_SAT(sat);
2291          PPC_INSN_VR_VSCR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
2292
22930.4,6.VS,11.VA,16.VB,21.1544:VX:av:vsum4ubs %VD, %VA, %VB:Vector Sum Across Partial (1/4) Unsigned Byte Saturate
2294          int i, j, sat, tempsat;
2295          int64_t utemp;
2296          int64_t temp;
2297          for (j = 0; j < 4; j++) {
2298            utemp = (int64_t)(uint32_t)(*vB).w[j];
2299            for (i = 0; i < 4; i++)
2300              utemp += (int64_t)(uint16_t)(*vA).b[i+(j*4)];
2301            temp = utemp;
2302            (*vS).w[j] = altivec_unsigned_saturate_32(temp, &tempsat);
2303            sat |= tempsat;
2304          }
2305          ALTIVEC_SET_SAT(sat);
2306          PPC_INSN_VR_VSCR(VS_BITMASK, VA_BITMASK | VB_BITMASK);
2307
2308
2309#
2310# Vector Unpack instructions, 6-171 ... 6-176
2311#
2312
23130.4,6.VS,11.0,16.VB,21.846:VX:av:vupkhpx %VD, %VB:Vector Unpack High Pixel16
2314          int i;
2315          uint16_t h;
2316          for (i = 0; i < 4; i++) {
2317            h = (*vB).h[AV_HINDEX(i)];
2318            (*vS).w[i] = ((h & 0x8000) ? 0xff000000 : 0)
2319                         | ((h & 0x7c00) << 6)
2320                         | ((h & 0x03e0) << 3)
2321                         | ((h & 0x001f));
2322          }
2323          PPC_INSN_VR(VS_BITMASK, VB_BITMASK);
2324
23250.4,6.VS,11.0,16.VB,21.526:VX:av:vupkhsb %VD, %VB:Vector Unpack High Signed Byte
2326          int i;
2327          for (i = 0; i < 8; i++)
2328            (*vS).h[AV_HINDEX(i)] = (int16_t)(int8_t)(*vB).b[AV_BINDEX(i)];
2329          PPC_INSN_VR(VS_BITMASK, VB_BITMASK);
2330
23310.4,6.VS,11.0,16.VB,21.590:VX:av:vupkhsh %VD, %VB:Vector Unpack High Signed Half Word
2332          int i;
2333          for (i = 0; i < 4; i++)
2334            (*vS).w[i] = (int32_t)(int16_t)(*vB).h[AV_HINDEX(i)];
2335          PPC_INSN_VR(VS_BITMASK, VB_BITMASK);
2336
23370.4,6.VS,11.0,16.VB,21.974:VX:av:vupklpx %VD, %VB:Vector Unpack Low Pixel16
2338          int i;
2339          uint16_t h;
2340          for (i = 0; i < 4; i++) {
2341            h = (*vB).h[AV_HINDEX(i + 4)];
2342            (*vS).w[i] = ((h & 0x8000) ? 0xff000000 : 0)
2343                         | ((h & 0x7c00) << 6)
2344                         | ((h & 0x03e0) << 3)
2345                         | ((h & 0x001f));
2346          }
2347          PPC_INSN_VR(VS_BITMASK, VB_BITMASK);
2348
23490.4,6.VS,11.0,16.VB,21.654:VX:av:vupklsb %VD, %VB:Vector Unpack Low Signed Byte
2350          int i;
2351          for (i = 0; i < 8; i++)
2352            (*vS).h[AV_HINDEX(i)] = (int16_t)(int8_t)(*vB).b[AV_BINDEX(i + 8)];
2353          PPC_INSN_VR(VS_BITMASK, VB_BITMASK);
2354
23550.4,6.VS,11.0,16.VB,21.718:VX:av:vupklsh %VD, %VB:Vector Unpack Low Signed Half Word
2356          int i;
2357          for (i = 0; i < 4; i++)
2358            (*vS).w[i] = (int32_t)(int16_t)(*vB).h[AV_HINDEX(i + 4)];
2359          PPC_INSN_VR(VS_BITMASK, VB_BITMASK);
2360