1 /*---------------------------------------------------------------*/
2 /*--- begin                            guest_tilegx_helpers.c ---*/
3 /*---------------------------------------------------------------*/
4 
5 /*
6   This file is part of Valgrind, a dynamic binary instrumentation
7   framework.
8 
9   Copyright (C) 2010-2013 Tilera Corp.
10 
11   This program is free software; you can redistribute it and/or
12   modify it under the terms of the GNU General Public License as
13   published by the Free Software Foundation; either version 2 of the
14   License, or (at your option) any later version.
15 
16   This program is distributed in the hope that it will be useful, but
17   WITHOUT ANY WARRANTY; without even the implied warranty of
18   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19   General Public License for more details.
20 
21   You should have received a copy of the GNU General Public License
22   along with this program; if not, write to the Free Software
23   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
24   02111-1307, USA.
25 
26   The GNU General Public License is contained in the file COPYING.
27 */
28 
29 /* Contributed by Zhi-Gang Liu <zliu at tilera dot com> */
30 
31 #include "libvex_basictypes.h"
32 #include "libvex_emnote.h"
33 #include "libvex_guest_tilegx.h"
34 #include "libvex_ir.h"
35 #include "libvex.h"
36 
37 #include "main_util.h"
38 #include "guest_generic_bb_to_IR.h"
39 #include "guest_tilegx_defs.h"
40 
41 /* This file contains helper functions for tilegx guest code.  Calls to
42    these functions are generated by the back end.
43 */
44 
45 #define ALWAYSDEFD(field)                               \
46   { offsetof(VexGuestTILEGXState, field),               \
47       (sizeof ((VexGuestTILEGXState*)0)->field) }
48 
guest_tilegx_spechelper(const HChar * function_name,IRExpr ** args,IRStmt ** precedingStmts,Int n_precedingStmts)49 IRExpr *guest_tilegx_spechelper ( const HChar * function_name, IRExpr ** args,
50                                   IRStmt ** precedingStmts, Int n_precedingStmts)
51 {
52   return NULL;
53 }
54 
55 /* VISIBLE TO LIBVEX CLIENT */
LibVEX_GuestTILEGX_initialise(VexGuestTILEGXState * vex_state)56 void LibVEX_GuestTILEGX_initialise ( VexGuestTILEGXState * vex_state )
57 {
58   vex_state->guest_r0 = 0;
59   vex_state->guest_r1 = 0;
60   vex_state->guest_r2 = 0;
61   vex_state->guest_r3 = 0;
62   vex_state->guest_r4 = 0;
63   vex_state->guest_r5 = 0;
64   vex_state->guest_r6 = 0;
65   vex_state->guest_r7 = 0;
66   vex_state->guest_r8 = 0;
67   vex_state->guest_r9 = 0;
68   vex_state->guest_r10 = 0;
69   vex_state->guest_r11 = 0;
70   vex_state->guest_r12 = 0;
71   vex_state->guest_r13 = 0;
72   vex_state->guest_r14 = 0;
73   vex_state->guest_r15 = 0;
74   vex_state->guest_r16 = 0;
75   vex_state->guest_r17 = 0;
76   vex_state->guest_r18 = 0;
77   vex_state->guest_r19 = 0;
78   vex_state->guest_r20 = 0;
79   vex_state->guest_r21 = 0;
80   vex_state->guest_r22 = 0;
81   vex_state->guest_r23 = 0;
82   vex_state->guest_r24 = 0;
83   vex_state->guest_r25 = 0;
84   vex_state->guest_r26 = 0;
85   vex_state->guest_r27 = 0;
86   vex_state->guest_r28 = 0;
87   vex_state->guest_r29 = 0;
88   vex_state->guest_r30 = 0;
89   vex_state->guest_r31 = 0;
90   vex_state->guest_r32 = 0;
91   vex_state->guest_r33 = 0;
92   vex_state->guest_r34 = 0;
93   vex_state->guest_r35 = 0;
94   vex_state->guest_r36 = 0;
95   vex_state->guest_r37 = 0;
96   vex_state->guest_r38 = 0;
97   vex_state->guest_r39 = 0;
98   vex_state->guest_r40 = 0;
99   vex_state->guest_r41 = 0;
100   vex_state->guest_r42 = 0;
101   vex_state->guest_r43 = 0;
102   vex_state->guest_r44 = 0;
103   vex_state->guest_r45 = 0;
104   vex_state->guest_r46 = 0;
105   vex_state->guest_r47 = 0;
106   vex_state->guest_r48 = 0;
107   vex_state->guest_r49 = 0;
108   vex_state->guest_r50 = 0;
109   vex_state->guest_r51 = 0;
110   vex_state->guest_r52 = 0;
111   vex_state->guest_r53 = 0;
112   vex_state->guest_r54 = 0;
113   vex_state->guest_r55 = 0;
114 
115   vex_state->guest_pc = 0;   /* Program counter */
116 
117   vex_state->guest_EMNOTE = 0;
118   vex_state->guest_CMSTART = 0;
119 
120   /* For clflush: record start and length of area to invalidate */
121   vex_state->guest_CMSTART = 0;
122   vex_state->guest_CMLEN = 0;
123 
124   /* Used to record the unredirected guest address at the start of
125      a translation whose start has been redirected.  By reading
126      this pseudo-register shortly afterwards, the translation can
127      find out what the corresponding no-redirection address was.
128      Note, this is only set for wrap-style redirects, not for
129      replace-style ones. */
130   vex_state->guest_NRADDR = 0;
131 }
132 
133 /*-----------------------------------------------------------*/
134 /*--- Describing the tilegx guest state, for the benefit    ---*/
135 /*--- of iropt and instrumenters.                         ---*/
136 /*-----------------------------------------------------------*/
137 
138 /* Figure out if any part of the guest state contained in minoff
139    .. maxoff requires precise memory exceptions.  If in doubt return
140    True (but this is generates significantly slower code).
141 
142    We enforce precise exns for guest SP, PC.
143 */
guest_tilegx_state_requires_precise_mem_exns(Int minoff,Int maxoff,VexRegisterUpdates pxControl)144 Bool guest_tilegx_state_requires_precise_mem_exns (
145   Int minoff, Int maxoff,
146   VexRegisterUpdates pxControl)
147 {
148   Int sp_min = offsetof(VexGuestTILEGXState, guest_r54);
149   Int sp_max = sp_min + 8 - 1;
150   Int pc_min = offsetof(VexGuestTILEGXState, guest_pc);
151   Int pc_max = pc_min + 8 - 1;
152 
153   if (maxoff < sp_min || minoff > sp_max) {
154     /* no overlap with sp */
155     if (pxControl == VexRegUpdSpAtMemAccess)
156       return False;  /* We only need to check stack pointer. */
157   } else {
158     return True;
159   }
160 
161   if (maxoff < pc_min || minoff > pc_max) {
162     /* no overlap with pc */
163   } else {
164     return True;
165   }
166 
167   /* We appear to need precise updates of R52 in order to get proper
168      stacktraces from non-optimised code. */
169   Int fp_min = offsetof(VexGuestTILEGXState, guest_r52);
170   Int fp_max = fp_min + 8 - 1;
171 
172   if (maxoff < fp_min || minoff > fp_max) {
173     /* no overlap with fp */
174   } else {
175     return True;
176   }
177 
178   return False;
179 }
180 
181 VexGuestLayout tilegxGuest_layout = {
182   /* Total size of the guest state, in bytes. */
183   .total_sizeB = sizeof(VexGuestTILEGXState),
184   /* Describe the stack pointer. */
185   .offset_SP = offsetof(VexGuestTILEGXState, guest_r54),
186   .sizeof_SP = 8,
187   /* Describe the frame pointer. */
188   .offset_FP = offsetof(VexGuestTILEGXState, guest_r52),
189   .sizeof_FP = 8,
190   /* Describe the instruction pointer. */
191   .offset_IP = offsetof(VexGuestTILEGXState, guest_pc),
192   .sizeof_IP = 8,
193   /* Describe any sections to be regarded by Memcheck as
194      'always-defined'. */
195   .n_alwaysDefd = 8,
196   /* ? :(  */
197   .alwaysDefd = {
198     /* 0 */ ALWAYSDEFD(guest_r0),
199     /* 1 */ ALWAYSDEFD(guest_r1),
200     /* 2 */ ALWAYSDEFD(guest_EMNOTE),
201     /* 3 */ ALWAYSDEFD(guest_CMSTART),
202     /* 4 */ ALWAYSDEFD(guest_CMLEN),
203     /* 5 */ ALWAYSDEFD(guest_r52),
204     /* 6 */ ALWAYSDEFD(guest_r55),
205     /* 7 */ ALWAYSDEFD(guest_pc),
206   }
207 };
208 
209 #ifdef __tilegx__
tilegx_dirtyhelper_gen(ULong opc,ULong rd0,ULong rd1,ULong rd2,ULong rd3)210 ULong tilegx_dirtyhelper_gen ( ULong opc,
211                                ULong rd0, ULong rd1,
212                                ULong rd2, ULong rd3)
213 {
214   switch (opc)
215   {
216   case 0:
217     {
218       /* break point */
219       switch (rd0) {
220       case 0x286a44ae90048fffULL:
221         asm (" bpt ");
222         break;
223       default:
224         vex_printf("unhandled \"bpt\": cins=%016llx\n", rd0);
225 
226         vassert(0);
227         return 0;
228       }
229     }
230     break;
231   case 28:
232     {
233       return __insn_addxsc(rd1, rd2);
234     }
235     break;
236 
237   case 150:
238     {
239       __insn_mf();
240       return 0;
241     }
242     break;
243 
244   case 152: /* mm rd, ra, imm0, imm1 */
245     {
246       ULong mask;
247 
248       if( rd2 <= rd3)
249         mask = (-1ULL << rd2) ^ ((-1ULL << rd3) << 1);
250       else
251         mask = (-1ULL << rd2) | (-1ULL >> (63 - rd3));
252 
253       return (rd0 & mask) | (rd1 & (-1ULL ^ mask));
254     }
255     break;
256   case 154: /* mtspr imm, ra */
257     {
258       switch(rd0)
259       {
260       case 0x2785:
261         __insn_mtspr(0x2785, rd1);
262         break;
263       case 0x2780:
264         __insn_mtspr(0x2780, rd1);
265         break;
266       case 0x2708:
267         __insn_mtspr(0x2708, rd1);
268         break;
269       case 0x2580:
270         __insn_mtspr(0x2580, rd1);
271         break;
272       case 0x2581:
273         __insn_mtspr(0x2581, rd1);
274         break;
275       case 0x2709:  // PASS
276         __insn_mtspr(0x2709, rd1);
277         break;
278       case 0x2707:  // FAIL
279         __insn_mtspr(0x2707, rd1);
280         break;
281       case 0x2705:  // DONE
282         __insn_mtspr(0x2705, rd1);
283         break;
284 
285       case 0x2870: //
286 
287       default:
288         vex_printf("opc=%d rd0=%llx rd1=%llx\n",
289                    (int)opc, rd0, rd1);
290         vassert(0);
291       }
292     }
293     break;
294 
295   case 151: /* mfspr rd, imm */
296     {
297       switch(rd1)
298       {
299       case 0x2785:   // SIM_CTRL
300         return __insn_mfspr(0x2785);
301         break;
302 
303       case 0x2708:   // ICS
304         return __insn_mfspr(0x2708);
305         break;
306 
307       case 0x2780:  // CMPEXCH_VALUE
308         return __insn_mfspr(0x2780);
309         break;
310 
311       case 0x2781:  // CYCLE
312         return __insn_mfspr(0x2781);
313         break;
314 
315       case 0x2709:  // PASS
316         return __insn_mfspr(0x2709);
317         break;
318 
319       case 0x2707:  // FAIL
320         return __insn_mfspr(0x2707);
321         break;
322 
323       case 0x2705:  // DONE
324         return __insn_mfspr(0x2705);
325         break;
326 
327       case 0x2580:  // EX_CONTEXT_0
328         return __insn_mfspr(0x2580);
329         break;
330 
331       case 0x2581:  // EX_CONTEXT_1
332         return __insn_mfspr(0x2581);
333         break;
334 
335       default:
336         vex_printf("opc=%d rd0=%llx rd1=%llx\n",
337                    (int)opc, rd0, rd1);
338         vassert(0);
339       }
340     }
341     break;
342   case 183:
343     {
344       return __insn_pcnt(rd1);
345     }
346     break;
347   case 184:
348     {
349       return __insn_revbits(rd1);
350     }
351     break;
352   case 185: /* revbytes rd, ra */
353     {
354       return __insn_revbytes(rd1);
355     }
356     break;
357 
358   case 102:
359     return __insn_fsingle_add1(rd1, rd2);
360     break;
361 
362   case 103:
363     return __insn_fsingle_addsub2(rd0, rd1, rd2);
364     break;
365 
366   case 104:
367     return __insn_fsingle_mul1(rd1, rd2);
368     break;
369 
370   case 105:
371     return __insn_fsingle_mul2(rd1, rd2);
372     break;
373 
374   case 106:
375     return __insn_fsingle_pack1(rd1);
376     break;
377 
378   case 107:
379     return __insn_fsingle_pack2(rd1, rd2);
380     break;
381 
382   case 108:
383     return __insn_fsingle_sub1(rd1, rd2);
384     break;
385 
386   case 21:
387     switch (rd0) {
388     case 0x286a44ae90048fffULL:
389       asm ("{ moveli zero, 72 ; raise }");
390       break;
391     default:
392       vex_printf("unhandled \"raise\": cins=%016llx\n", rd0);
393       __insn_ill();
394       return 0;
395     }
396     break;
397 
398   case 64:
399     {
400       return __insn_cmul(rd1, rd2);
401     }
402     break;
403   case 65:
404     {
405       return __insn_cmula(rd0, rd1, rd2);
406     }
407     break;
408   case 66:
409     {
410       return __insn_cmulaf(rd0, rd1, rd2);
411     }
412     break;
413   case 67:
414     {
415       return __insn_cmulf(rd1, rd2);
416     }
417     break;
418   case 68:
419     {
420       return __insn_cmulfr(rd1, rd2);
421     }
422     break;
423   case 69:
424     {
425       return __insn_cmulh(rd1, rd2);
426     }
427     break;
428   case 70:
429     {
430       return __insn_cmulhr(rd1, rd2);
431     }
432     break;
433   case 71:
434     {
435       return __insn_crc32_32(rd1, rd2);
436     }
437     break;
438   case 72:
439     {
440       return __insn_crc32_8(rd1, rd2);
441     }
442     break;
443   case 75:
444     {
445       return __insn_dblalign2(rd1, rd2);
446     }
447     break;
448   case 76:
449     {
450       return __insn_dblalign4(rd1, rd2);
451     }
452     break;
453   case 77:
454     {
455       return __insn_dblalign6(rd1, rd2);
456     }
457     break;
458   case 78:
459     {
460       __insn_drain();
461       return 0;
462     }
463     break;
464   case 79:
465     {
466       __insn_dtlbpr(rd0);
467       return 0;
468     }
469     break;
470   case 82:
471     {
472       return __insn_fdouble_add_flags(rd1, rd2);
473     }
474     break;
475   case 83:
476     {
477       return __insn_fdouble_addsub(rd0, rd1, rd2);
478     }
479     break;
480   case 84:
481     {
482       return __insn_fdouble_mul_flags(rd1, rd2);
483     }
484     break;
485   case 85:
486     {
487       return __insn_fdouble_pack1(rd1, rd2);
488     }
489     break;
490   case 86:
491     {
492       return __insn_fdouble_pack2(rd0, rd1, rd2);
493     }
494     break;
495   case 87:
496     {
497       return __insn_fdouble_sub_flags(rd1, rd2);
498     }
499     break;
500   case 88:
501     {
502       return __insn_fdouble_unpack_max(rd1, rd2);
503     }
504     break;
505   case 89:
506     {
507       return __insn_fdouble_unpack_min(rd1, rd2);
508     }
509     break;
510 
511   case 98:
512     {
513       __insn_finv(rd0);
514       return 0;
515     }
516     break;
517   case 99:
518     {
519       __insn_flush(rd0);
520       return 0;
521     }
522     break;
523   case 100:
524     {
525       __insn_flushwb();
526       return 0;
527     }
528     break;
529 
530   case 109:
531     {
532       __insn_icoh((ULong *)rd0);
533       return 0;
534     }
535     break;
536   case 110:
537     {
538       __insn_ill();
539     }
540     break;
541   case 111:
542     {
543       __insn_inv((ULong *)rd0);
544       return 0;
545     }
546     break;
547 
548   case 169:
549     {
550       return __insn_mula_hu_hu(rd0, rd1, rd2);
551     }
552     break;
553   case 170:
554     {
555       return __insn_mula_hu_ls(rd0, rd1, rd2);
556     }
557     break;
558   case 205:
559     {
560       return __insn_shufflebytes(rd0, rd1, rd2);
561     }
562     break;
563   case 224:
564     {
565       return __insn_subxsc(rd1, rd2);
566     }
567     break;
568   case 229:
569     {
570       return __insn_tblidxb0(rd0, rd1);
571     }
572     break;
573   case 230:
574     {
575       return __insn_tblidxb1(rd0, rd1);
576     }
577     break;
578   case 231:
579     {
580       return __insn_tblidxb2(rd0, rd1);
581     }
582     break;
583   case 232:
584     {
585       return __insn_tblidxb3(rd0, rd1);
586     }
587     break;
588   case 233:
589     {
590       return __insn_v1add(rd1, rd2);
591     }
592     break;
593   case 234:
594     {
595       return __insn_v1add(rd1, rd2);
596     }
597     break;
598   case 235:
599     {
600       return __insn_v1adduc(rd1, rd2);
601     }
602     break;
603   case 236:
604     {
605       return __insn_v1adiffu(rd1, rd2);
606     }
607     break;
608   case 237:
609     {
610       return __insn_v1avgu(rd1, rd2);
611     }
612     break;
613 
614   case 238:
615     {
616       return __insn_v1cmpeq(rd1, rd2);
617     }
618     break;
619   case 239:
620     {
621       return __insn_v1cmpeq(rd1, rd2);
622     }
623     break;
624   case 240:
625     {
626       return __insn_v1cmples(rd1, rd2);
627     }
628     break;
629   case 241:
630     {
631       return __insn_v1cmpleu(rd1, rd2);
632     }
633     break;
634   case 242:
635     {
636       return __insn_v1cmplts(rd1, rd2);
637     }
638     break;
639   case 243:
640     {
641       return __insn_v1cmplts(rd1, rd2);
642     }
643     break;
644   case 244:
645     {
646       return __insn_v1cmpltu(rd1, rd2);
647     }
648     break;
649   case 245:
650     {
651       return __insn_v1cmpltu(rd1, rd2);
652     }
653     break;
654   case 246:
655     {
656       return __insn_v1cmpne(rd1, rd2);
657     }
658     break;
659   case 247:
660     {
661       return __insn_v1ddotpu(rd1, rd2);
662     }
663     break;
664   case 248:
665     {
666       return __insn_v1ddotpua(rd0, rd1, rd2);
667     }
668     break;
669   case 249:
670     {
671       return __insn_v1ddotpus(rd1, rd2);
672     }
673     break;
674   case 250:
675     {
676       return __insn_v1ddotpusa(rd0, rd1, rd2);
677     }
678     break;
679   case 251:
680     {
681       return __insn_v1dotp(rd1, rd2);
682     }
683     break;
684   case 252:
685     {
686       return __insn_v1dotpa(rd0, rd1, rd2);
687     }
688     break;
689   case 253:
690     {
691       return __insn_v1dotpu(rd1, rd2);
692     }
693     break;
694   case 254:
695     {
696       return __insn_v1dotpua(rd0, rd1, rd2);
697     }
698     break;
699   case 255:
700     {
701       return __insn_v1dotpus(rd1, rd2);
702     }
703     break;
704   case 256:
705     {
706       return __insn_v1dotpusa(rd0, rd1, rd2);
707     }
708     break;
709   case 257:
710     {
711       return __insn_v1int_h(rd1, rd2);
712     }
713     break;
714   case 258:
715     {
716       return __insn_v1int_l(rd1, rd2);
717     }
718     break;
719   case 259:
720     {
721       return __insn_v1maxu(rd1, rd2);
722     }
723     break;
724   case 260:
725     {
726       return __insn_v1maxu(rd1, rd2);
727     }
728     break;
729   case 261:
730     {
731       return __insn_v1minu(rd1, rd2);
732     }
733     break;
734   case 262:
735     {
736       return __insn_v1minu(rd1, rd2);
737     }
738     break;
739   case 263:
740     {
741       return __insn_v1mnz(rd1, rd2);
742     }
743     break;
744   case 264:
745     {
746       return __insn_v1multu(rd1, rd2);
747     }
748     break;
749   case 265:
750     {
751       return __insn_v1mulu(rd1, rd2);
752     }
753     break;
754   case 266:
755     {
756       return __insn_v1mulus(rd1, rd2);
757     }
758     break;
759   case 267:
760     {
761       return __insn_v1mz(rd1, rd2);
762     }
763     break;
764   case 268:
765     {
766       return __insn_v1sadau(rd0, rd1, rd2);
767     }
768     break;
769   case 269:
770     {
771       return __insn_v1sadu(rd1, rd2);
772     }
773     break;
774   case 270:
775     {
776       return __insn_v1shl(rd1, rd2);
777     }
778     break;
779   case 271:
780     {
781       return __insn_v1shli(rd1, rd2);
782     }
783     break;
784   case 272:
785     {
786       return __insn_v1shrs(rd1, rd2);
787     }
788     break;
789   case 273:
790     {
791       return __insn_v1shrsi(rd1, rd2);
792     }
793     break;
794   case 274:
795     {
796       return __insn_v1shru(rd1, rd2);
797     }
798     break;
799   case 275:
800     {
801       return __insn_v1shrui(rd1, rd2);
802     }
803     break;
804   case 276:
805     {
806       return __insn_v1sub(rd1, rd2);
807     }
808     break;
809   case 277:
810     {
811       return __insn_v1subuc(rd1, rd2);
812     }
813     break;
814   case 278:
815     {
816       return __insn_v2add(rd1, rd2);
817     }
818     break;
819   case 279:
820     {
821       return __insn_v2add(rd1, rd2);
822     }
823     break;
824   case 280:
825     {
826       return __insn_v2addsc(rd1, rd2);
827     }
828     break;
829   case 281:
830     {
831       return __insn_v2adiffs(rd1, rd2);
832     }
833     break;
834   case 282:
835     {
836       return __insn_v2avgs(rd1, rd2);
837     }
838     break;
839   case 283:
840     {
841       return __insn_v2cmpeq(rd1, rd2);
842     }
843     break;
844   case 284:
845     {
846       return __insn_v2cmpeq(rd1, rd2);
847     }
848     break;
849   case 285:
850     {
851       return __insn_v2cmples(rd1, rd2);
852     }
853     break;
854   case 286:
855     {
856       return __insn_v2cmpleu(rd1, rd2);
857     }
858     break;
859   case 287:
860     {
861       return __insn_v2cmplts(rd1, rd2);
862     }
863     break;
864   case 288:
865     {
866       return __insn_v2cmplts(rd1, rd2);
867     }
868     break;
869   case 289:
870     {
871       return __insn_v2cmpltu(rd1, rd2);
872     }
873     break;
874   case 290:
875     {
876       return __insn_v2cmpltu(rd1, rd2);
877     }
878     break;
879   case 291:
880     {
881       return __insn_v2cmpne(rd1, rd2);
882     }
883     break;
884   case 292:
885     {
886       return __insn_v2dotp(rd1, rd2);
887     }
888     break;
889   case 293:
890     {
891       return __insn_v2dotpa(rd0, rd1, rd2);
892     }
893     break;
894   case 294:
895     {
896       return __insn_v2int_h(rd1, rd2);
897     }
898     break;
899   case 295:
900     {
901       return __insn_v2int_l(rd1, rd2);
902     }
903     break;
904   case 296:
905     {
906       return __insn_v2maxs(rd1, rd2);
907     }
908     break;
909   case 297:
910     {
911       return __insn_v2maxs(rd1, rd2);
912     }
913     break;
914   case 298:
915     {
916       return __insn_v2mins(rd1, rd2);
917     }
918     break;
919   case 299:
920     {
921       return __insn_v2mins(rd1, rd2);
922     }
923     break;
924   case 300:
925     {
926       return __insn_v2mnz(rd1, rd2);
927     }
928     break;
929   case 301:
930     {
931       return __insn_v2mulfsc(rd1, rd2);
932     }
933     break;
934   case 302:
935     {
936       return __insn_v2muls(rd1, rd2);
937     }
938     break;
939   case 303:
940     {
941       return __insn_v2mults(rd1, rd2);
942     }
943     break;
944   case 304:
945     {
946       return __insn_v2mz(rd1, rd2);
947     }
948     break;
949   case 305:
950     {
951       return __insn_v2packh(rd1, rd2);
952     }
953     break;
954   case 306:
955     {
956       return __insn_v2packl(rd1, rd2);
957     }
958     break;
959   case 307:
960     {
961       return __insn_v2packuc(rd1, rd2);
962     }
963     break;
964   case 308:
965     {
966       return __insn_v2sadas(rd0, rd1, rd2);
967     }
968     break;
969   case 309:
970     {
971       return __insn_v2sadau(rd0, rd1, rd2);
972     }
973     break;
974   case 310:
975     {
976       return __insn_v2sads(rd1, rd2);
977     }
978     break;
979   case 311:
980     {
981       return __insn_v2sadu(rd1, rd2);
982     }
983     break;
984   case 312:
985     {
986       return __insn_v2shl(rd1, rd2);
987     }
988     break;
989   case 313:
990     {
991       return __insn_v2shli(rd1, rd2);
992     }
993     break;
994   case 314:
995     {
996       return __insn_v2shlsc(rd1, rd2);
997     }
998     break;
999   case 315:
1000     {
1001       return __insn_v2shrs(rd1, rd2);
1002     }
1003     break;
1004   case 316:
1005     {
1006       return __insn_v2shrsi(rd1, rd2);
1007     }
1008     break;
1009   case 317:
1010     {
1011       return __insn_v2shru(rd1, rd2);
1012     }
1013     break;
1014   case 318:
1015     {
1016       return __insn_v2shrui(rd1, rd2);
1017     }
1018     break;
1019   case 319:
1020     {
1021       return __insn_v2sub(rd1, rd2);
1022     }
1023     break;
1024   case 320:
1025     {
1026       return __insn_v2subsc(rd1, rd2);
1027     }
1028     break;
1029   case 321:
1030     {
1031       return __insn_v4add(rd1, rd2);
1032     }
1033     break;
1034   case 322:
1035     {
1036       return __insn_v4addsc(rd1, rd2);
1037     }
1038     break;
1039   case 323:
1040     {
1041       return __insn_v4int_h(rd1, rd2);
1042     }
1043     break;
1044   case 324:
1045     {
1046       return __insn_v4int_l(rd1, rd2);
1047     }
1048     break;
1049   case 325:
1050     {
1051       return __insn_v4packsc(rd1, rd2);
1052     }
1053     break;
1054   case 326:
1055     {
1056       return __insn_v4shl(rd1, rd2);
1057     }
1058     break;
1059   case 327:
1060     {
1061       return __insn_v4shlsc(rd1, rd2);
1062     }
1063     break;
1064   case 328:
1065     {
1066       return __insn_v4shrs(rd1, rd2);
1067     }
1068     break;
1069   case 329:
1070     {
1071       return __insn_v4shru(rd1, rd2);
1072     }
1073     break;
1074   case 330:
1075     {
1076       return __insn_v4sub(rd1, rd2);
1077     }
1078     break;
1079   case 331:
1080     {
1081       return __insn_v4subsc(rd1, rd2);
1082     }
1083     break;
1084 
1085   default:
1086     vex_printf("opc=%d rd0=%llx rd1=%llx\n",
1087                (int)opc, rd0, rd1);
1088     vassert(0);
1089   }
1090 }
1091 #else
tilegx_dirtyhelper_gen(ULong opc,ULong rd0,ULong rd1,ULong rd2,ULong rd3)1092 ULong tilegx_dirtyhelper_gen ( ULong opc,
1093                                ULong rd0, ULong rd1,
1094                                ULong rd2, ULong rd3 )
1095 {
1096   vex_printf("NOT a TILEGX platform");
1097   return 0;
1098 }
1099 #endif /* __tilegx__ */
1100 
1101 /*---------------------------------------------------------------*/
1102 /*--- end                              guest_tilegx_helpers.c ---*/
1103 /*---------------------------------------------------------------*/
1104