c00218a0cc498c3cffd1bc934d95435a41be5c4f
[openssl.git] / crypto / perlasm / s390x.pm
1 #!/usr/bin/env perl
2 # Copyright 2018 The OpenSSL Project Authors. All Rights Reserved.
3 #
4 # Licensed under the OpenSSL license (the "License").  You may not use
5 # this file except in compliance with the License.  You can obtain a copy
6 # in the file LICENSE in the source distribution or at
7 # https://www.openssl.org/source/license.html
8
9 # Copyright IBM Corp. 2018
10 # Author: Patrick Steuer <patrick.steuer@de.ibm.com>
11
12 package perlasm::s390x;
13
14 use strict;
15 use warnings;
16 use Carp qw(confess);
17 use Exporter qw(import);
18
19 our @EXPORT=qw(PERLASM_BEGIN PERLASM_END);
20 our @EXPORT_OK=qw(AUTOLOAD LABEL INCLUDE stfle);
21 our %EXPORT_TAGS=(
22         MSA => [qw(kmac km kmc kimd klmd)],
23         MSA4 => [qw(kmf kmo pcc kmctr)],
24         MSA5 => [qw(ppno prno)],
25         MSA8 => [qw(kma)],
26         VX => [qw(vgef vgeg vgbm vzero vone vgm vgmb vgmh vgmf vgmg
27             vl vlr vlrep vlrepb vlreph vlrepf vlrepg vleb vleh vlef vleg vleib
28             vleih vleif vleig vlgv vlgvb vlgvh vlgvf vlgvg vllez vllezb vllezh
29             vllezf vllezg vlm vlbb vlvg vlvgb vlvgh vlvgf vlvgg vlvgp
30             vll vmrh vmrhb vmrhh vmrhf vmrhg vmrl vmrlb vmrlh vmrlf vmrlg vpk
31             vpkh vpkf vpkg vpks vpksh vpksf vpksg vpkshs vpksfs vpksgs vpkls
32             vpklsh vpklsf vpklsg vpklshs vpklsfs vpklsgs vperm vpdi vrep vrepb
33             vreph vrepf vrepg vrepi vrepib vrepih vrepif vrepig vscef vsceg
34             vsel vseg vsegb vsegh vsegf vst vsteb vsteh vstef vsteg vstm vstl
35             vuph vuphb vuphh vuphf vuplh vuplhb vuplhh vuplhf vupl vuplb vuplhw
36             vuplf vupll vupllb vupllh vupllf va vab vah vaf vag vaq vacc vaccb
37             vacch vaccf vaccg vaccq vac vacq vaccc vacccq vn vnc vavg vavgb
38             vavgh vavgf vavgg vavgl vavglb vavglh vavglf vavglg vcksm vec_ vecb
39             vech vecf vecg vecl veclb veclh veclf veclg vceq vceqb vceqh vceqf
40             vceqg vceqbs vceqhs vceqfs vceqgs vch vchb vchh vchf vchg vchbs
41             vchhs vchfs vchgs vchl vchlb vchlh vchlf vchlg vchlbs vchlhs vchlfs
42             vchlgs vclz vclzb vclzh vclzf vclzg vctz vctzb vctzh vctzf vctzg
43             vx vgfm vgfmb vgfmh vgfmf vgfmg vgfma vgfmab vgfmah vgfmaf vgfmag
44             vlc vlcb vlch vlcf vlcg vlp vlpb vlph vlpf vlpg vmx vmxb vmxh vmxf
45             vmxg vmxl vmxlb vmxlh vmxlf vmxlg vmn vmnb vmnh vmnf vmng vmnl
46             vmnlb vmnlh vmnlf vmnlg vmal vmalb vmalhw vmalf vmah vmahb vmahh
47             vmahf vmalh vmalhb vmalhh vmalhf vmae vmaeb vmaeh vmaef vmale
48             vmaleb vmaleh vmalef vmao vmaob vmaoh vmaof vmalo vmalob vmaloh
49             vmalof vmh vmhb vmhh vmhf vmlh vmlhb vmlhh vmlhf vml vmlb vmlhw
50             vmlf vme vmeb vmeh vmef vmle vmleb vmleh vmlef vmo vmob vmoh vmof
51             vmlo vmlob vmloh vmlof vno vnot vo vpopct verllv verllvb verllvh
52             verllvf verllvg verll verllb verllh verllf verllg verim verimb
53             verimh verimf verimg veslv veslvb veslvh veslvf veslvg vesl veslb
54             veslh veslf veslg vesrav vesravb vesravh vesravf vesravg vesra
55             vesrab vesrah vesraf vesrag vesrlv vesrlvb vesrlvh vesrlvf vesrlvg
56             vesrl vesrlb vesrlh vesrlf vesrlg vsl vslb vsldb vsra vsrab vsrl
57             vsrlb vs vsb vsh vsf vsg vsq vscbi vscbib vscbih vscbif vscbig
58             vscbiq vsbi vsbiq vsbcbi vsbcbiq vsumg vsumgh vsumgf vsumq vsumqf
59             vsumqg vsum vsumb vsumh vtm vfae vfaeb vfaeh vfaef vfaebs vfaehs
60             vfaefs vfaezb vfaezh vfaezf vfaezbs vfaezhs vfaezfs vfee vfeeb
61             vfeeh vfeef vfeebs vfeehs vfeefs vfeezb vfeezh vfeezf vfeezbs
62             vfeezhs vfeezfs vfene vfeneb vfeneh vfenef vfenebs vfenehs vfenefs
63             vfenezb vfenezh vfenezf vfenezbs vfenezhs vfenezfs vistr vistrb
64             vistrh vistrf vistrbs vistrhs vistrfs vstrc vstrcb vstrch vstrcf
65             vstrcbs vstrchs vstrcfs vstrczb vstrczh vstrczf vstrczbs vstrczhs
66             vstrczfs vfa vfadb wfadb wfc wfcdb wfk wfkdb vfce vfcedb wfcedb
67             vfcedbs wfcedbs vfch vfchdb wfchdb vfchdbs wfchdbs vfche vfchedb
68             wfchedb vfchedbs wfchedbs vcdg vcdgb wcdgb vcdlg vcdlgb wcdlgb vcgd
69             vcgdb wcgdb vclgd vclgdb wclgdb vfd vfddb wfddb vfi vfidb wfidb
70             vlde vldeb wldeb vled vledb wledb vfm vfmdb wfmdb vfma vfmadb
71             wfmadb vfms vfmsdb wfmsdb vfpso vfpsodb wfpsodb vflcdb wflcdb
72             vflndb wflndb vflpdb wflpdb vfsq vfsqdb wfsqdb vfs vfsdb wfsdb
73             vftci vftcidb wftcidb)],
74         VXE => [qw(vbperm vllezlf vmsl vmslg vnx vnn voc vpopctb vpopcth
75             vpopctf vpopctg vfasb wfasb wfaxb wfcsb wfcxb wfksb wfkxb vfcesb
76             vfcesbs wfcesb wfcesbs wfcexb wfcexbs vfchsb vfchsbs wfchsb wfchsbs
77             wfchxb wfchxbs vfchesb vfchesbs wfchesb wfchesbs wfchexb wfchexbs
78             vfdsb wfdsb wfdxb vfisb wfisb wfixb vfll vflls wflls wflld vflr
79             vflrd wflrd wflrx vfmax vfmaxsb vfmaxdb wfmaxsb wfmaxdb wfmaxxb
80             vfmin vfminsb vfmindb wfminsb wfmindb wfminxb vfmsb wfmsb wfmxb
81             vfnma vfnms vfmasb wfmasb wfmaxb vfmssb wfmssb wfmsxb vfnmasb
82             vfnmadb wfnmasb wfnmadb wfnmaxb vfnmssb vfnmsdb wfnmssb wfnmsdb
83             wfnmsxb vfpsosb wfpsosb vflcsb wflcsb vflnsb wflnsb vflpsb wflpsb
84             vfpsoxb wfpsoxb vflcxb wflcxb vflnxb wflnxb vflpxb wflpxb vfsqsb
85             wfsqsb wfsqxb vfssb wfssb wfsxb vftcisb wftcisb wftcixb)],
86         VXD => [qw(vlrlr vlrl vstrlr vstrl vap vcp vcvb vcvbg vcvd vcvdg vdp
87             vlip vmp vmsp vpkz vpsop vrp vsdp vsrp vsp vtp vupkz)],
88 );
89 Exporter::export_ok_tags(qw(MSA MSA4 MSA5 MSA8 VX VXE VXD));
90
91 our $AUTOLOAD;
92
93 my $GR='(?:%r)?([0-9]|1[0-5])';
94 my $VR='(?:%v)?([0-9]|1[0-9]|2[0-9]|3[0-1])';
95
96 my ($file,$out);
97
98 sub PERLASM_BEGIN
99 {
100         ($file,$out)=(shift,"");
101 }
102 sub PERLASM_END
103 {
104         if (defined($file)) {
105                 open(my $fd,'>',$file)||die("can't open $file: $!");
106                 print({$fd}$out);
107                 close($fd);
108         } else {
109                 print($out);
110         }
111 }
112
113 sub AUTOLOAD {
114         confess(err("PARSE")) if (grep(!defined($_),@_));
115         my $token;
116         for ($AUTOLOAD) {
117                 $token=".$1" if (/^.*::([A-Z_]+)$/);    # uppercase: directive
118                 $token="\t$1" if (/^.*::([a-z]+)$/);    # lowercase: mnemonic
119                 confess(err("PARSE")) if (!defined($token));
120         }
121         $token.="\t" if ($#_>=0);
122         $out.=$token.join(',',@_)."\n";
123 }
124
125 sub LABEL {                                             # label directive
126         confess(err("ARGNUM")) if ($#_!=0);
127         my ($label)=@_;
128         $out.="$label:\n";
129 }
130
131 sub INCLUDE {
132         confess(err("ARGNUM")) if ($#_!=0);
133         my ($file)=@_;
134         $out.="#include \"$file\"\n";
135 }
136
137 #
138 # Mnemonics
139 #
140
141 sub stfle {
142         confess(err("ARGNUM")) if ($#_!=0);
143         S(0xb2b0,@_);
144 }
145
146 # MSA
147
148 sub kmac {
149         confess(err("ARGNUM")) if ($#_!=1);
150         RRE(0xb91e,@_);
151 }
152
153 sub km {
154         confess(err("ARGNUM")) if ($#_!=1);
155         RRE(0xb92e,@_);
156 }
157
158 sub kmc {
159         confess(err("ARGNUM")) if ($#_!=1);
160         RRE(0xb92f,@_);
161 }
162
163 sub kimd {
164         confess(err("ARGNUM")) if ($#_!=1);
165         RRE(0xb93e,@_);
166 }
167
168 sub klmd {
169         confess(err("ARGNUM")) if ($#_!=1);
170         RRE(0xb93f,@_);
171 }
172
173 # MSA4
174
175 sub kmf {
176         confess(err("ARGNUM")) if ($#_!=1);
177         RRE(0xb92a,@_);
178 }
179
180 sub kmo {
181         confess(err("ARGNUM")) if ($#_!=1);
182         RRE(0xb92b,@_);
183 }
184
185 sub pcc {
186         confess(err("ARGNUM")) if ($#_!=-1);
187         RRE(0xb92c,@_);
188 }
189
190 sub kmctr {
191         confess(err("ARGNUM")) if ($#_!=2);
192         RRFb(0xb92d,@_);
193 }
194
195 # MSA5
196
197 sub prno {
198         ppno(@_);
199 }
200
201 sub ppno {                                              # deprecated, use prno
202         confess(err("ARGNUM")) if ($#_!=1);
203         RRE(0xb93c,@_);
204 }
205
206 # MSA8
207
208 sub kma {
209         confess(err("ARGNUM")) if ($#_!=2);
210         RRFb(0xb929,@_);
211 }
212
213 # VX - Support Instructions
214
215 sub vgef {
216         confess(err("ARGNUM")) if ($#_!=2);
217         VRV(0xe713,@_);
218 }
219 sub vgeg {
220         confess(err("ARGNUM")) if ($#_!=2);
221         VRV(0xe712,@_);
222 }
223
224 sub vgbm {
225         confess(err("ARGNUM")) if ($#_!=1);
226         VRIa(0xe744,@_);
227 }
228 sub vzero {
229         vgbm(@_,0);
230 }
231 sub vone {
232         vgbm(@_,0xffff);
233 }
234
235 sub vgm {
236         confess(err("ARGNUM")) if ($#_!=3);
237         VRIb(0xe746,@_);
238 }
239 sub vgmb {
240         vgm(@_,0);
241 }
242 sub vgmh {
243         vgm(@_,1);
244 }
245 sub vgmf {
246         vgm(@_,2);
247 }
248 sub vgmg {
249         vgm(@_,3);
250 }
251
252 sub vl {
253         confess(err("ARGNUM")) if ($#_<1||$#_>2);
254         VRX(0xe706,@_);
255 }
256
257 sub vlr {
258         confess(err("ARGNUM")) if ($#_!=1);
259         VRRa(0xe756,@_);
260 }
261
262 sub vlrep {
263         confess(err("ARGNUM")) if ($#_!=2);
264         VRX(0xe705,@_);
265 }
266 sub vlrepb {
267         vlrep(@_,0);
268 }
269 sub vlreph {
270         vlrep(@_,1);
271 }
272 sub vlrepf {
273         vlrep(@_,2);
274 }
275 sub vlrepg {
276         vlrep(@_,3);
277 }
278
279 sub vleb {
280         confess(err("ARGNUM")) if ($#_!=2);
281         VRX(0xe700,@_);
282 }
283 sub vleh {
284         confess(err("ARGNUM")) if ($#_!=2);
285         VRX(0xe701,@_);
286 }
287 sub vlef {
288         confess(err("ARGNUM")) if ($#_!=2);
289         VRX(0xe703,@_);
290 }
291 sub vleg {
292         confess(err("ARGNUM")) if ($#_!=2);
293         VRX(0xe702,@_);
294 }
295
296 sub vleib {
297         confess(err("ARGNUM")) if ($#_!=2);
298         VRIa(0xe740,@_);
299 }
300 sub vleih {
301         confess(err("ARGNUM")) if ($#_!=2);
302         VRIa(0xe741,@_);
303 }
304 sub vleif {
305         confess(err("ARGNUM")) if ($#_!=2);
306         VRIa(0xe743,@_);
307 }
308 sub vleig {
309         confess(err("ARGNUM")) if ($#_!=2);
310         VRIa(0xe742,@_);
311 }
312
313 sub vlgv {
314         confess(err("ARGNUM")) if ($#_!=3);
315         VRSc(0xe721,@_);
316 }
317 sub vlgvb {
318         vlgv(@_,0);
319 }
320 sub vlgvh {
321         vlgv(@_,1);
322 }
323 sub vlgvf {
324         vlgv(@_,2);
325 }
326 sub vlgvg {
327         vlgv(@_,3);
328 }
329
330 sub vllez {
331         confess(err("ARGNUM")) if ($#_!=2);
332         VRX(0xe704,@_);
333 }
334 sub vllezb {
335         vllez(@_,0);
336 }
337 sub vllezh {
338         vllez(@_,1);
339 }
340 sub vllezf {
341         vllez(@_,2);
342 }
343 sub vllezg {
344         vllez(@_,3);
345 }
346
347 sub vlm {
348         confess(err("ARGNUM")) if ($#_<2||$#_>3);
349         VRSa(0xe736,@_);
350 }
351
352 sub vlbb {
353         confess(err("ARGNUM")) if ($#_!=2);
354         VRX(0xe707,@_);
355 }
356
357 sub vlvg {
358         confess(err("ARGNUM")) if ($#_!=3);
359         VRSb(0xe722,@_);
360 }
361 sub vlvgb {
362         vlvg(@_,0);
363 }
364 sub vlvgh {
365         vlvg(@_,1);
366 }
367 sub vlvgf {
368         vlvg(@_,2);
369 }
370 sub vlvgg {
371         vlvg(@_,3);
372 }
373
374 sub vlvgp {
375         confess(err("ARGNUM")) if ($#_!=2);
376         VRRf(0xe762,@_);
377 }
378
379 sub vll {
380         confess(err("ARGNUM")) if ($#_!=2);
381         VRSb(0xe737,@_);
382 }
383
384 sub vmrh {
385         confess(err("ARGNUM")) if ($#_!=3);
386         VRRc(0xe761,@_);
387 }
388 sub vmrhb {
389         vmrh(@_,0);
390 }
391 sub vmrhh {
392         vmrh(@_,1);
393 }
394 sub vmrhf {
395         vmrh(@_,2);
396 }
397 sub vmrhg {
398         vmrh(@_,3);
399 }
400
401 sub vmrl {
402         confess(err("ARGNUM")) if ($#_!=3);
403         VRRc(0xe760,@_);
404 }
405 sub vmrlb {
406         vmrl(@_,0);
407 }
408 sub vmrlh {
409         vmrl(@_,1);
410 }
411 sub vmrlf {
412         vmrl(@_,2);
413 }
414 sub vmrlg {
415         vmrl(@_,3);
416 }
417
418 sub vpk {
419         confess(err("ARGNUM")) if ($#_!=3);
420         VRRc(0xe794,@_);
421 }
422 sub vpkh {
423         vpk(@_,1);
424 }
425 sub vpkf {
426         vpk(@_,2);
427 }
428 sub vpkg {
429         vpk(@_,3);
430 }
431
432 sub vpks {
433         confess(err("ARGNUM")) if ($#_!=4);
434         VRRb(0xe797,@_);
435 }
436 sub vpksh {
437         vpks(@_,1,0);
438 }
439 sub vpksf {
440         vpks(@_,2,0);
441 }
442 sub vpksg {
443         vpks(@_,3,0);
444 }
445 sub vpkshs {
446         vpks(@_,1,1);
447 }
448 sub vpksfs {
449         vpks(@_,2,1);
450 }
451 sub vpksgs {
452         vpks(@_,3,1);
453 }
454
455 sub vpkls {
456         confess(err("ARGNUM")) if ($#_!=4);
457         VRRb(0xe795,@_);
458 }
459 sub vpklsh {
460         vpkls(@_,1,0);
461 }
462 sub vpklsf {
463         vpkls(@_,2,0);
464 }
465 sub vpklsg {
466         vpkls(@_,3,0);
467 }
468 sub vpklshs {
469         vpkls(@_,1,1);
470 }
471 sub vpklsfs {
472         vpkls(@_,2,1);
473 }
474 sub vpklsgs {
475         vpkls(@_,3,1);
476 }
477
478 sub vperm {
479         confess(err("ARGNUM")) if ($#_!=3);
480         VRRe(0xe78c,@_);
481 }
482
483 sub vpdi {
484         confess(err("ARGNUM")) if ($#_!=3);
485         VRRc(0xe784,@_);
486 }
487
488 sub vrep {
489         confess(err("ARGNUM")) if ($#_!=3);
490         VRIc(0xe74d,@_);
491 }
492 sub vrepb {
493         vrep(@_,0);
494 }
495 sub vreph {
496         vrep(@_,1);
497 }
498 sub vrepf {
499         vrep(@_,2);
500 }
501 sub vrepg {
502         vrep(@_,3);
503 }
504
505 sub vrepi {
506         confess(err("ARGNUM")) if ($#_!=2);
507         VRIa(0xe745,@_);
508 }
509 sub vrepib {
510         vrepi(@_,0);
511 }
512 sub vrepih {
513         vrepi(@_,1);
514 }
515 sub vrepif {
516         vrepi(@_,2);
517 }
518 sub vrepig {
519         vrepi(@_,3);
520 }
521
522 sub vscef {
523         confess(err("ARGNUM")) if ($#_!=2);
524         VRV(0xe71b,@_);
525 }
526 sub vsceg {
527         confess(err("ARGNUM")) if ($#_!=2);
528         VRV(0xe71a,@_);
529 }
530
531 sub vsel {
532         confess(err("ARGNUM")) if ($#_!=3);
533         VRRe(0xe78d,@_);
534 }
535
536 sub vseg {
537         confess(err("ARGNUM")) if ($#_!=2);
538         VRRa(0xe75f,@_);
539 }
540 sub vsegb {
541         vseg(@_,0);
542 }
543 sub vsegh {
544         vseg(@_,1);
545 }
546 sub vsegf {
547         vseg(@_,2);
548 }
549
550 sub vst {
551         confess(err("ARGNUM")) if ($#_<1||$#_>2);
552         VRX(0xe70e,@_);
553 }
554
555 sub vsteb {
556         confess(err("ARGNUM")) if ($#_!=2);
557         VRX(0xe708,@_);
558 }
559 sub vsteh {
560         confess(err("ARGNUM")) if ($#_!=2);
561         VRX(0xe709,@_);
562 }
563 sub vstef {
564         confess(err("ARGNUM")) if ($#_!=2);
565         VRX(0xe70b,@_);
566 }
567 sub vsteg {
568         confess(err("ARGNUM")) if ($#_!=2);
569         VRX(0xe70a,@_);
570 }
571
572 sub vstm {
573         confess(err("ARGNUM")) if ($#_<2||$#_>3);
574         VRSa(0xe73e,@_);
575 }
576
577 sub vstl {
578         confess(err("ARGNUM")) if ($#_!=2);
579         VRSb(0xe73f,@_);
580 }
581
582 sub vuph {
583         confess(err("ARGNUM")) if ($#_!=2);
584         VRRa(0xe7d7,@_);
585 }
586 sub vuphb {
587         vuph(@_,0);
588 }
589 sub vuphh {
590         vuph(@_,1);
591 }
592 sub vuphf {
593         vuph(@_,2);
594 }
595
596 sub vuplh {
597         confess(err("ARGNUM")) if ($#_!=2);
598         VRRa(0xe7d5,@_);
599 }
600 sub vuplhb {
601         vuplh(@_,0);
602 }
603 sub vuplhh {
604         vuplh(@_,1);
605 }
606 sub vuplhf {
607         vuplh(@_,2);
608 }
609
610 sub vupl {
611         confess(err("ARGNUM")) if ($#_!=2);
612         VRRa(0xe7d6,@_);
613 }
614 sub vuplb {
615         vupl(@_,0);
616 }
617 sub vuplhw {
618         vupl(@_,1);
619 }
620 sub vuplf {
621         vupl(@_,2);
622 }
623
624 sub vupll {
625         confess(err("ARGNUM")) if ($#_!=2);
626         VRRa(0xe7d4,@_);
627 }
628 sub vupllb {
629         vupll(@_,0);
630 }
631 sub vupllh {
632         vupll(@_,1);
633 }
634 sub vupllf {
635         vupll(@_,2);
636 }
637
638 # VX - Integer Instructions
639
640 sub va {
641         confess(err("ARGNUM")) if ($#_!=3);
642         VRRc(0xe7f3,@_);
643 }
644 sub vab {
645         va(@_,0);
646 }
647 sub vah {
648         va(@_,1);
649 }
650 sub vaf {
651         va(@_,2);
652 }
653 sub vag {
654         va(@_,3);
655 }
656 sub vaq {
657         va(@_,4);
658 }
659
660 sub vacc {
661         confess(err("ARGNUM")) if ($#_!=3);
662         VRRc(0xe7f1,@_);
663 }
664 sub vaccb {
665         vacc(@_,0);
666 }
667 sub vacch {
668         vacc(@_,1);
669 }
670 sub vaccf {
671         vacc(@_,2);
672 }
673 sub vaccg {
674         vacc(@_,3);
675 }
676 sub vaccq {
677         vacc(@_,4);
678 }
679
680 sub vac {
681         confess(err("ARGNUM")) if ($#_!=4);
682         VRRd(0xe7bb,@_);
683 }
684 sub vacq {
685         vac(@_,4);
686 }
687
688 sub vaccc {
689         confess(err("ARGNUM")) if ($#_!=4);
690         VRRd(0xe7b9,@_);
691 }
692 sub vacccq {
693         vaccc(@_,4);
694 }
695
696 sub vn {
697         confess(err("ARGNUM")) if ($#_!=2);
698         VRRc(0xe768,@_);
699 }
700
701 sub vnc {
702         confess(err("ARGNUM")) if ($#_!=2);
703         VRRc(0xe769,@_);
704 }
705
706 sub vavg {
707         confess(err("ARGNUM")) if ($#_!=3);
708         VRRc(0xe7f2,@_);
709 }
710 sub vavgb {
711         vavg(@_,0);
712 }
713 sub vavgh {
714         vavg(@_,1);
715 }
716 sub vavgf {
717         vavg(@_,2);
718 }
719 sub vavgg {
720         vavg(@_,3);
721 }
722
723 sub vavgl {
724         confess(err("ARGNUM")) if ($#_!=3);
725         VRRc(0xe7f0,@_);
726 }
727 sub vavglb {
728         vavgl(@_,0);
729 }
730 sub vavglh {
731         vavgl(@_,1);
732 }
733 sub vavglf {
734         vavgl(@_,2);
735 }
736 sub vavglg {
737         vavgl(@_,3);
738 }
739
740 sub vcksm {
741         confess(err("ARGNUM")) if ($#_!=2);
742         VRRc(0xe766,@_);
743 }
744
745 sub vec_ {
746         confess(err("ARGNUM")) if ($#_!=2);
747         VRRa(0xe7db,@_);
748 }
749 sub vecb {
750         vec_(@_,0);
751 }
752 sub vech {
753         vec_(@_,1);
754 }
755 sub vecf {
756         vec_(@_,2);
757 }
758 sub vecg {
759         vec_(@_,3);
760 }
761
762 sub vecl {
763         confess(err("ARGNUM")) if ($#_!=2);
764         VRRa(0xe7d9,@_);
765 }
766 sub veclb {
767         vecl(@_,0);
768 }
769 sub veclh {
770         vecl(@_,1);
771 }
772 sub veclf {
773         vecl(@_,2);
774 }
775 sub veclg {
776         vecl(@_,3);
777 }
778
779 sub vceq {
780         confess(err("ARGNUM")) if ($#_!=4);
781         VRRb(0xe7f8,@_);
782 }
783 sub vceqb {
784         vceq(@_,0,0);
785 }
786 sub vceqh {
787         vceq(@_,1,0);
788 }
789 sub vceqf {
790         vceq(@_,2,0);
791 }
792 sub vceqg {
793         vceq(@_,3,0);
794 }
795 sub vceqbs {
796         vceq(@_,0,1);
797 }
798 sub vceqhs {
799         vceq(@_,1,1);
800 }
801 sub vceqfs {
802         vceq(@_,2,1);
803 }
804 sub vceqgs {
805         vceq(@_,3,1);
806 }
807
808 sub vch {
809         confess(err("ARGNUM")) if ($#_!=4);
810         VRRb(0xe7fb,@_);
811 }
812 sub vchb {
813         vch(@_,0,0);
814 }
815 sub vchh {
816         vch(@_,1,0);
817 }
818 sub vchf {
819         vch(@_,2,0);
820 }
821 sub vchg {
822         vch(@_,3,0);
823 }
824 sub vchbs {
825         vch(@_,0,1);
826 }
827 sub vchhs {
828         vch(@_,1,1);
829 }
830 sub vchfs {
831         vch(@_,2,1);
832 }
833 sub vchgs {
834         vch(@_,3,1);
835 }
836
837 sub vchl {
838         confess(err("ARGNUM")) if ($#_!=4);
839         VRRb(0xe7f9,@_);
840 }
841 sub vchlb {
842         vchl(@_,0,0);
843 }
844 sub vchlh {
845         vchl(@_,1,0);
846 }
847 sub vchlf {
848         vchl(@_,2,0);
849 }
850 sub vchlg {
851         vchl(@_,3,0);
852 }
853 sub vchlbs {
854         vchl(@_,0,1);
855 }
856 sub vchlhs {
857         vchl(@_,1,1);
858 }
859 sub vchlfs {
860         vchl(@_,2,1);
861 }
862 sub vchlgs {
863         vchl(@_,3,1);
864 }
865
866 sub vclz {
867         confess(err("ARGNUM")) if ($#_!=2);
868         VRRa(0xe753,@_);
869 }
870 sub vclzb {
871         vclz(@_,0);
872 }
873 sub vclzh {
874         vclz(@_,1);
875 }
876 sub vclzf {
877         vclz(@_,2);
878 }
879 sub vclzg {
880         vclz(@_,3);
881 }
882
883 sub vctz {
884         confess(err("ARGNUM")) if ($#_!=2);
885         VRRa(0xe752,@_);
886 }
887 sub vctzb {
888         vctz(@_,0);
889 }
890 sub vctzh {
891         vctz(@_,1);
892 }
893 sub vctzf {
894         vctz(@_,2);
895 }
896 sub vctzg {
897         vctz(@_,3);
898 }
899
900 sub vx {
901         confess(err("ARGNUM")) if ($#_!=2);
902         VRRc(0xe76d,@_);
903 }
904
905 sub vgfm {
906         confess(err("ARGNUM")) if ($#_!=3);
907         VRRc(0xe7b4,@_);
908 }
909 sub vgfmb {
910         vgfm(@_,0);
911 }
912 sub vgfmh {
913         vgfm(@_,1);
914 }
915 sub vgfmf {
916         vgfm(@_,2);
917 }
918 sub vgfmg {
919         vgfm(@_,3);
920 }
921
922 sub vgfma {
923         confess(err("ARGNUM")) if ($#_!=4);
924         VRRd(0xe7bc,@_);
925 }
926 sub vgfmab {
927         vgfma(@_,0);
928 }
929 sub vgfmah {
930         vgfma(@_,1);
931 }
932 sub vgfmaf {
933         vgfma(@_,2);
934 }
935 sub vgfmag {
936         vgfma(@_,3);
937 }
938
939 sub vlc {
940         confess(err("ARGNUM")) if ($#_!=2);
941         VRRa(0xe7de,@_);
942 }
943 sub vlcb {
944         vlc(@_,0);
945 }
946 sub vlch {
947         vlc(@_,1);
948 }
949 sub vlcf {
950         vlc(@_,2);
951 }
952 sub vlcg {
953         vlc(@_,3);
954 }
955
956 sub vlp {
957         confess(err("ARGNUM")) if ($#_!=2);
958         VRRa(0xe7df,@_);
959 }
960 sub vlpb {
961         vlp(@_,0);
962 }
963 sub vlph {
964         vlp(@_,1);
965 }
966 sub vlpf {
967         vlp(@_,2);
968 }
969 sub vlpg {
970         vlp(@_,3);
971 }
972
973 sub vmx {
974         confess(err("ARGNUM")) if ($#_!=3);
975         VRRc(0xe7ff,@_);
976 }
977 sub vmxb {
978         vmx(@_,0);
979 }
980 sub vmxh {
981         vmx(@_,1);
982 }
983 sub vmxf {
984         vmx(@_,2);
985 }
986 sub vmxg {
987         vmx(@_,3);
988 }
989
990 sub vmxl {
991         confess(err("ARGNUM")) if ($#_!=3);
992         VRRc(0xe7fd,@_);
993 }
994 sub vmxlb {
995         vmxl(@_,0);
996 }
997 sub vmxlh {
998         vmxl(@_,1);
999 }
1000 sub vmxlf {
1001         vmxl(@_,2);
1002 }
1003 sub vmxlg {
1004         vmxl(@_,3);
1005 }
1006
1007 sub vmn {
1008         confess(err("ARGNUM")) if ($#_!=3);
1009         VRRc(0xe7fe,@_);
1010 }
1011 sub vmnb {
1012         vmn(@_,0);
1013 }
1014 sub vmnh {
1015         vmn(@_,1);
1016 }
1017 sub vmnf {
1018         vmn(@_,2);
1019 }
1020 sub vmng {
1021         vmn(@_,3);
1022 }
1023
1024 sub vmnl {
1025         confess(err("ARGNUM")) if ($#_!=3);
1026         VRRc(0xe7fc,@_);
1027 }
1028 sub vmnlb {
1029         vmnl(@_,0);
1030 }
1031 sub vmnlh {
1032         vmnl(@_,1);
1033 }
1034 sub vmnlf {
1035         vmnl(@_,2);
1036 }
1037 sub vmnlg {
1038         vmnl(@_,3);
1039 }
1040
1041 sub vmal {
1042         confess(err("ARGNUM")) if ($#_!=4);
1043         VRRd(0xe7aa,@_);
1044 }
1045 sub vmalb {
1046         vmal(@_,0);
1047 }
1048 sub vmalhw {
1049         vmal(@_,1);
1050 }
1051 sub vmalf {
1052         vmal(@_,2);
1053 }
1054
1055 sub vmah {
1056         confess(err("ARGNUM")) if ($#_!=4);
1057         VRRd(0xe7ab,@_);
1058 }
1059 sub vmahb {
1060         vmah(@_,0);
1061 }
1062 sub vmahh {
1063         vmah(@_,1);
1064 }
1065 sub vmahf {
1066         vmah(@_,2);
1067 }
1068
1069 sub vmalh {
1070         confess(err("ARGNUM")) if ($#_!=4);
1071         VRRd(0xe7a9,@_);
1072 }
1073 sub vmalhb {
1074         vmalh(@_,0);
1075 }
1076 sub vmalhh {
1077         vmalh(@_,1);
1078 }
1079 sub vmalhf {
1080         vmalh(@_,2);
1081 }
1082
1083 sub vmae {
1084         confess(err("ARGNUM")) if ($#_!=4);
1085         VRRd(0xe7ae,@_);
1086 }
1087 sub vmaeb {
1088         vmae(@_,0);
1089 }
1090 sub vmaeh {
1091         vmae(@_,1);
1092 }
1093 sub vmaef {
1094         vmae(@_,2);
1095 }
1096
1097 sub vmale {
1098         confess(err("ARGNUM")) if ($#_!=4);
1099         VRRd(0xe7ac,@_);
1100 }
1101 sub vmaleb {
1102         vmale(@_,0);
1103 }
1104 sub vmaleh {
1105         vmale(@_,1);
1106 }
1107 sub vmalef {
1108         vmale(@_,2);
1109 }
1110
1111 sub vmao {
1112         confess(err("ARGNUM")) if ($#_!=4);
1113         VRRd(0xe7af,@_);
1114 }
1115 sub vmaob {
1116         vmao(@_,0);
1117 }
1118 sub vmaoh {
1119         vmao(@_,1);
1120 }
1121 sub vmaof {
1122         vmao(@_,2);
1123 }
1124
1125 sub vmalo {
1126         confess(err("ARGNUM")) if ($#_!=4);
1127         VRRd(0xe7ad,@_);
1128 }
1129 sub vmalob {
1130         vmalo(@_,0);
1131 }
1132 sub vmaloh {
1133         vmalo(@_,1);
1134 }
1135 sub vmalof {
1136         vmalo(@_,2);
1137 }
1138
1139 sub vmh {
1140         confess(err("ARGNUM")) if ($#_!=3);
1141         VRRc(0xe7a3,@_);
1142 }
1143 sub vmhb {
1144         vmh(@_,0);
1145 }
1146 sub vmhh {
1147         vmh(@_,1);
1148 }
1149 sub vmhf {
1150         vmh(@_,2);
1151 }
1152
1153 sub vmlh {
1154         confess(err("ARGNUM")) if ($#_!=3);
1155         VRRc(0xe7a1,@_);
1156 }
1157 sub vmlhb {
1158         vmlh(@_,0);
1159 }
1160 sub vmlhh {
1161         vmlh(@_,1);
1162 }
1163 sub vmlhf {
1164         vmlh(@_,2);
1165 }
1166
1167 sub vml {
1168         confess(err("ARGNUM")) if ($#_!=3);
1169         VRRc(0xe7a2,@_);
1170 }
1171 sub vmlb {
1172         vml(@_,0);
1173 }
1174 sub vmlhw {
1175         vml(@_,1);
1176 }
1177 sub vmlf {
1178         vml(@_,2);
1179 }
1180
1181 sub vme {
1182         confess(err("ARGNUM")) if ($#_!=3);
1183         VRRc(0xe7a6,@_);
1184 }
1185 sub vmeb {
1186         vme(@_,0);
1187 }
1188 sub vmeh {
1189         vme(@_,1);
1190 }
1191 sub vmef {
1192         vme(@_,2);
1193 }
1194
1195 sub vmle {
1196         confess(err("ARGNUM")) if ($#_!=3);
1197         VRRc(0xe7a4,@_);
1198 }
1199 sub vmleb {
1200         vmle(@_,0);
1201 }
1202 sub vmleh {
1203         vmle(@_,1);
1204 }
1205 sub vmlef {
1206         vmle(@_,2);
1207 }
1208
1209 sub vmo {
1210         confess(err("ARGNUM")) if ($#_!=3);
1211         VRRc(0xe7a7,@_);
1212 }
1213 sub vmob {
1214         vmo(@_,0);
1215 }
1216 sub vmoh {
1217         vmo(@_,1);
1218 }
1219 sub vmof {
1220         vmo(@_,2);
1221 }
1222
1223 sub vmlo {
1224         confess(err("ARGNUM")) if ($#_!=3);
1225         VRRc(0xe7a5,@_);
1226 }
1227 sub vmlob {
1228         vmlo(@_,0);
1229 }
1230 sub vmloh {
1231         vmlo(@_,1);
1232 }
1233 sub vmlof {
1234         vmlo(@_,2);
1235 }
1236
1237 sub vno {
1238         confess(err("ARGNUM")) if ($#_!=2);
1239         VRRc(0xe76b,@_);
1240 }
1241 sub vnot {
1242         vno(@_,$_[1]);
1243 }
1244
1245 sub vo {
1246         confess(err("ARGNUM")) if ($#_!=2);
1247         VRRc(0xe76a,@_);
1248 }
1249
1250 sub vpopct {
1251         confess(err("ARGNUM")) if ($#_!=2);
1252         VRRa(0xe750,@_);
1253 }
1254
1255 sub verllv {
1256         confess(err("ARGNUM")) if ($#_!=3);
1257         VRRc(0xe773,@_);
1258 }
1259 sub verllvb {
1260         verllv(@_,0);
1261 }
1262 sub verllvh {
1263         verllv(@_,1);
1264 }
1265 sub verllvf {
1266         verllv(@_,2);
1267 }
1268 sub verllvg {
1269         verllv(@_,3);
1270 }
1271
1272 sub verll {
1273         confess(err("ARGNUM")) if ($#_!=3);
1274         VRSa(0xe733,@_);
1275 }
1276 sub verllb {
1277         verll(@_,0);
1278 }
1279 sub verllh {
1280         verll(@_,1);
1281 }
1282 sub verllf {
1283         verll(@_,2);
1284 }
1285 sub verllg {
1286         verll(@_,3);
1287 }
1288
1289 sub verim {
1290         confess(err("ARGNUM")) if ($#_!=4);
1291         VRId(0xe772,@_);
1292 }
1293 sub verimb {
1294         verim(@_,0);
1295 }
1296 sub verimh {
1297         verim(@_,1);
1298 }
1299 sub verimf {
1300         verim(@_,2);
1301 }
1302 sub verimg {
1303         verim(@_,3);
1304 }
1305
1306 sub veslv {
1307         confess(err("ARGNUM")) if ($#_!=3);
1308         VRRc(0xe770,@_);
1309 }
1310 sub veslvb {
1311         veslv(@_,0);
1312 }
1313 sub veslvh {
1314         veslv(@_,1);
1315 }
1316 sub veslvf {
1317         veslv(@_,2);
1318 }
1319 sub veslvg {
1320         veslv(@_,3);
1321 }
1322
1323 sub vesl {
1324         confess(err("ARGNUM")) if ($#_!=3);
1325         VRSa(0xe730,@_);
1326 }
1327 sub veslb {
1328         vesl(@_,0);
1329 }
1330 sub veslh {
1331         vesl(@_,1);
1332 }
1333 sub veslf {
1334         vesl(@_,2);
1335 }
1336 sub veslg {
1337         vesl(@_,3);
1338 }
1339
1340 sub vesrav {
1341         confess(err("ARGNUM")) if ($#_!=3);
1342         VRRc(0xe77a,@_);
1343 }
1344 sub vesravb {
1345         vesrav(@_,0);
1346 }
1347 sub vesravh {
1348         vesrav(@_,1);
1349 }
1350 sub vesravf {
1351         vesrav(@_,2);
1352 }
1353 sub vesravg {
1354         vesrav(@_,3);
1355 }
1356
1357 sub vesra {
1358         confess(err("ARGNUM")) if ($#_!=3);
1359         VRSa(0xe73a,@_);
1360 }
1361 sub vesrab {
1362         vesra(@_,0);
1363 }
1364 sub vesrah {
1365         vesra(@_,1);
1366 }
1367 sub vesraf {
1368         vesra(@_,2);
1369 }
1370 sub vesrag {
1371         vesra(@_,3);
1372 }
1373
1374 sub vesrlv {
1375         confess(err("ARGNUM")) if ($#_!=3);
1376         VRRc(0xe778,@_);
1377 }
1378 sub vesrlvb {
1379         vesrlv(@_,0);
1380 }
1381 sub vesrlvh {
1382         vesrlv(@_,1);
1383 }
1384 sub vesrlvf {
1385         vesrlv(@_,2);
1386 }
1387 sub vesrlvg {
1388         vesrlv(@_,3);
1389 }
1390
1391 sub vesrl {
1392         confess(err("ARGNUM")) if ($#_!=3);
1393         VRSa(0xe738,@_);
1394 }
1395 sub vesrlb {
1396         vesrl(@_,0);
1397 }
1398 sub vesrlh {
1399         vesrl(@_,1);
1400 }
1401 sub vesrlf {
1402         vesrl(@_,2);
1403 }
1404 sub vesrlg {
1405         vesrl(@_,3);
1406 }
1407
1408 sub vsl {
1409         confess(err("ARGNUM")) if ($#_!=2);
1410         VRRc(0xe774,@_);
1411 }
1412
1413 sub vslb {
1414         confess(err("ARGNUM")) if ($#_!=2);
1415         VRRc(0xe775,@_);
1416 }
1417
1418 sub vsldb {
1419         confess(err("ARGNUM")) if ($#_!=3);
1420         VRId(0xe777,@_);
1421 }
1422
1423 sub vsra {
1424         confess(err("ARGNUM")) if ($#_!=2);
1425         VRRc(0xe77e,@_);
1426 }
1427
1428 sub vsrab {
1429         confess(err("ARGNUM")) if ($#_!=2);
1430         VRRc(0xe77f,@_);
1431 }
1432
1433 sub vsrl {
1434         confess(err("ARGNUM")) if ($#_!=2);
1435         VRRc(0xe77c,@_);
1436 }
1437
1438 sub vsrlb {
1439         confess(err("ARGNUM")) if ($#_!=2);
1440         VRRc(0xe77d,@_);
1441 }
1442
1443 sub vs {
1444         confess(err("ARGNUM")) if ($#_!=3);
1445         VRRc(0xe7f7,@_);
1446 }
1447 sub vsb {
1448         vs(@_,0);
1449 }
1450 sub vsh {
1451         vs(@_,1);
1452 }
1453 sub vsf {
1454         vs(@_,2);
1455 }
1456 sub vsg {
1457         vs(@_,3);
1458 }
1459 sub vsq {
1460         vs(@_,4);
1461 }
1462
1463 sub vscbi {
1464         confess(err("ARGNUM")) if ($#_!=3);
1465         VRRc(0xe7f5,@_);
1466 }
1467 sub vscbib {
1468         vscbi(@_,0);
1469 }
1470 sub vscbih {
1471         vscbi(@_,1);
1472 }
1473 sub vscbif {
1474         vscbi(@_,2);
1475 }
1476 sub vscbig {
1477         vscbi(@_,3);
1478 }
1479 sub vscbiq {
1480         vscbi(@_,4);
1481 }
1482
1483 sub vsbi {
1484         confess(err("ARGNUM")) if ($#_!=4);
1485         VRRd(0xe7bf,@_);
1486 }
1487 sub vsbiq {
1488         vsbi(@_,4);
1489 }
1490
1491 sub vsbcbi {
1492         confess(err("ARGNUM")) if ($#_!=4);
1493         VRRd(0xe7bd,@_);
1494 }
1495 sub vsbcbiq {
1496         vsbcbi(@_,4);
1497 }
1498
1499 sub vsumg {
1500         confess(err("ARGNUM")) if ($#_!=3);
1501         VRRc(0xe765,@_);
1502 }
1503 sub vsumgh {
1504         vsumg(@_,1);
1505 }
1506 sub vsumgf {
1507         vsumg(@_,2);
1508 }
1509
1510 sub vsumq {
1511         confess(err("ARGNUM")) if ($#_!=3);
1512         VRRc(0xe767,@_);
1513 }
1514 sub vsumqf {
1515         vsumq(@_,2);
1516 }
1517 sub vsumqg {
1518         vsumq(@_,3);
1519 }
1520
1521 sub vsum {
1522         confess(err("ARGNUM")) if ($#_!=3);
1523         VRRc(0xe764,@_);
1524 }
1525 sub vsumb {
1526         vsum(@_,0);
1527 }
1528 sub vsumh {
1529         vsum(@_,1);
1530 }
1531
1532 sub vtm {
1533         confess(err("ARGNUM")) if ($#_!=1);
1534         VRRa(0xe7d8,@_);
1535 }
1536
1537 # VX - String Instructions
1538
1539 sub vfae {
1540         confess(err("ARGNUM")) if ($#_<3||$#_>4);
1541         VRRb(0xe782,@_);
1542 }
1543 sub vfaeb {
1544         vfae(@_[0..2],0,$_[3]);
1545 }
1546 sub vfaeh {
1547         vfae(@_[0..2],1,$_[3]);
1548 }
1549 sub vfaef {
1550         vfae(@_[0..2],2,$_[3]);
1551 }
1552 sub vfaebs {
1553         $_[3]=0 if (!defined($_[3]));
1554         vfae(@_[0..2],0,0x1|$_[3]);
1555 }
1556 sub vfaehs {
1557         $_[3]=0 if (!defined($_[3]));
1558         vfae(@_[0..2],1,0x1|$_[3]);
1559 }
1560 sub vfaefs {
1561         $_[3]=0 if (!defined($_[3]));
1562         vfae(@_[0..2],2,0x1|$_[3]);
1563 }
1564 sub vfaezb {
1565         $_[3]=0 if (!defined($_[3]));
1566         vfae(@_[0..2],0,0x2|$_[3]);
1567 }
1568 sub vfaezh {
1569         $_[3]=0 if (!defined($_[3]));
1570         vfae(@_[0..2],1,0x2|$_[3]);
1571 }
1572 sub vfaezf {
1573         $_[3]=0 if (!defined($_[3]));
1574         vfae(@_[0..2],2,0x2|$_[3]);
1575 }
1576 sub vfaezbs {
1577         $_[3]=0 if (!defined($_[3]));
1578         vfae(@_[0..2],0,0x3|$_[3]);
1579 }
1580 sub vfaezhs {
1581         $_[3]=0 if (!defined($_[3]));
1582         vfae(@_[0..2],1,0x3|$_[3]);
1583 }
1584 sub vfaezfs {
1585         $_[3]=0 if (!defined($_[3]));
1586         vfae(@_[0..2],2,0x3|$_[3]);
1587 }
1588
1589 sub vfee {
1590         confess(err("ARGNUM")) if ($#_<3||$#_>4);
1591         VRRb(0xe780,@_);
1592 }
1593 sub vfeeb {
1594         vfee(@_[0..2],0,$_[3]);
1595 }
1596 sub vfeeh {
1597         vfee(@_[0..2],1,$_[3]);
1598 }
1599 sub vfeef {
1600         vfee(@_[0..2],2,$_[3]);
1601 }
1602 sub vfeebs {
1603         vfee(@_,0,1);
1604 }
1605 sub vfeehs {
1606         vfee(@_,1,1);
1607 }
1608 sub vfeefs {
1609         vfee(@_,2,1);
1610 }
1611 sub vfeezb {
1612         vfee(@_,0,2);
1613 }
1614 sub vfeezh {
1615         vfee(@_,1,2);
1616 }
1617 sub vfeezf {
1618         vfee(@_,2,2);
1619 }
1620 sub vfeezbs {
1621         vfee(@_,0,3);
1622 }
1623 sub vfeezhs {
1624         vfee(@_,1,3);
1625 }
1626 sub vfeezfs {
1627         vfee(@_,2,3);
1628 }
1629
1630 sub vfene {
1631         confess(err("ARGNUM")) if ($#_<3||$#_>4);
1632         VRRb(0xe781,@_);
1633 }
1634 sub vfeneb {
1635         vfene(@_[0..2],0,$_[3]);
1636 }
1637 sub vfeneh {
1638         vfene(@_[0..2],1,$_[3]);
1639 }
1640 sub vfenef {
1641         vfene(@_[0..2],2,$_[3]);
1642 }
1643 sub vfenebs {
1644         vfene(@_,0,1);
1645 }
1646 sub vfenehs {
1647         vfene(@_,1,1);
1648 }
1649 sub vfenefs {
1650         vfene(@_,2,1);
1651 }
1652 sub vfenezb {
1653         vfene(@_,0,2);
1654 }
1655 sub vfenezh {
1656         vfene(@_,1,2);
1657 }
1658 sub vfenezf {
1659         vfene(@_,2,2);
1660 }
1661 sub vfenezbs {
1662         vfene(@_,0,3);
1663 }
1664 sub vfenezhs {
1665         vfene(@_,1,3);
1666 }
1667 sub vfenezfs {
1668         vfene(@_,2,3);
1669 }
1670
1671 sub vistr {
1672         confess(err("ARGNUM")) if ($#_<2||$#_>3);
1673         VRRa(0xe75c,@_[0..2],0,$_[3]);
1674 }
1675 sub vistrb {
1676         vistr(@_[0..1],0,$_[2]);
1677 }
1678 sub vistrh {
1679         vistr(@_[0..1],1,$_[2]);
1680 }
1681 sub vistrf {
1682         vistr(@_[0..1],2,$_[2]);
1683 }
1684 sub vistrbs {
1685         vistr(@_,0,1);
1686 }
1687 sub vistrhs {
1688         vistr(@_,1,1);
1689 }
1690 sub vistrfs {
1691         vistr(@_,2,1);
1692 }
1693
1694 sub vstrc {
1695         confess(err("ARGNUM")) if ($#_<4||$#_>5);
1696         VRRd(0xe78a,@_);
1697 }
1698 sub vstrcb {
1699         vstrc(@_[0..3],0,$_[4]);
1700 }
1701 sub vstrch {
1702         vstrc(@_[0..3],1,$_[4]);
1703 }
1704 sub vstrcf {
1705         vstrc(@_[0..3],2,$_[4]);
1706 }
1707 sub vstrcbs {
1708         $_[4]=0 if (!defined($_[4]));
1709         vstrc(@_[0..3],0,0x1|$_[4]);
1710 }
1711 sub vstrchs {
1712         $_[4]=0 if (!defined($_[4]));
1713         vstrc(@_[0..3],1,0x1|$_[4]);
1714 }
1715 sub vstrcfs {
1716         $_[4]=0 if (!defined($_[4]));
1717         vstrc(@_[0..3],2,0x1|$_[4]);
1718 }
1719 sub vstrczb {
1720         $_[4]=0 if (!defined($_[4]));
1721         vstrc(@_[0..3],0,0x2|$_[4]);
1722 }
1723 sub vstrczh {
1724         $_[4]=0 if (!defined($_[4]));
1725         vstrc(@_[0..3],1,0x2|$_[4]);
1726 }
1727 sub vstrczf {
1728         $_[4]=0 if (!defined($_[4]));
1729         vstrc(@_[0..3],2,0x2|$_[4]);
1730 }
1731 sub vstrczbs {
1732         $_[4]=0 if (!defined($_[4]));
1733         vstrc(@_[0..3],0,0x3|$_[4]);
1734 }
1735 sub vstrczhs {
1736         $_[4]=0 if (!defined($_[4]));
1737         vstrc(@_[0..3],1,0x3|$_[4]);
1738 }
1739 sub vstrczfs {
1740         $_[4]=0 if (!defined($_[4]));
1741         vstrc(@_[0..3],2,0x3|$_[4]);
1742 }
1743
1744 # VX - Floating-point Instructions
1745
1746 sub vfa {
1747         confess(err("ARGNUM")) if ($#_!=4);
1748         VRRc(0xe7e3,@_);
1749 }
1750 sub vfadb {
1751         vfa(@_,3,0);
1752 }
1753 sub wfadb {
1754         vfa(@_,3,8);
1755 }
1756
1757 sub wfc {
1758         confess(err("ARGNUM")) if ($#_!=3);
1759         VRRa(0xe7cb,@_);
1760 }
1761 sub wfcdb {
1762         wfc(@_,3,0);
1763 }
1764
1765 sub wfk {
1766         confess(err("ARGNUM")) if ($#_!=3);
1767         VRRa(0xe7ca,@_);
1768 }
1769 sub wfksb {
1770         wfk(@_,2,0);
1771 }
1772 sub wfkdb {
1773         wfk(@_,3,0);
1774 }
1775 sub wfkxb {
1776         wfk(@_,4,0);
1777 }
1778
1779 sub vfce {
1780         confess(err("ARGNUM")) if ($#_!=5);
1781         VRRc(0xe7e8,@_);
1782 }
1783 sub vfcedb {
1784         vfce(@_,3,0,0);
1785 }
1786 sub vfcedbs {
1787         vfce(@_,3,0,1);
1788 }
1789 sub wfcedb {
1790         vfce(@_,3,8,0);
1791 }
1792 sub wfcedbs {
1793         vfce(@_,3,8,1);
1794 }
1795
1796 sub vfch {
1797         confess(err("ARGNUM")) if ($#_!=5);
1798         VRRc(0xe7eb,@_);
1799 }
1800 sub vfchdb {
1801         vfch(@_,3,0,0);
1802 }
1803 sub vfchdbs {
1804         vfch(@_,3,0,1);
1805 }
1806 sub wfchdb {
1807         vfch(@_,3,8,0);
1808 }
1809 sub wfchdbs {
1810         vfch(@_,3,8,1);
1811 }
1812
1813 sub vfche {
1814         confess(err("ARGNUM")) if ($#_!=5);
1815         VRRc(0xe7ea,@_);
1816 }
1817 sub vfchedb {
1818         vfche(@_,3,0,0);
1819 }
1820 sub vfchedbs {
1821         vfche(@_,3,0,1);
1822 }
1823 sub wfchedb {
1824         vfche(@_,3,8,0);
1825 }
1826 sub wfchedbs {
1827         vfche(@_,3,8,1);
1828 }
1829
1830 sub vcdg {
1831         confess(err("ARGNUM")) if ($#_!=4);
1832         VRRa(0xe7c3,@_);
1833 }
1834 sub vcdgb {
1835         vcdg(@_[0..1],3,@_[2..3]);
1836 }
1837 sub wcdgb {
1838         vcdg(@_[0..1],3,0x8|$_[2],$_[3]);
1839 }
1840
1841 sub vcdlg {
1842         confess(err("ARGNUM")) if ($#_!=4);
1843         VRRa(0xe7c1,@_);
1844 }
1845 sub vcdlgb {
1846         vcdlg(@_[0..1],3,@_[2..3]);
1847 }
1848 sub wcdlgb {
1849         vcdlg(@_[0..1],3,0x8|$_[2],$_[3]);
1850 }
1851
1852 sub vcgd {
1853         confess(err("ARGNUM")) if ($#_!=4);
1854         VRRa(0xe7c2,@_);
1855 }
1856 sub vcgdb {
1857         vcgd(@_[0..1],3,@_[2..3]);
1858 }
1859 sub wcgdb {
1860         vcgd(@_[0..1],3,0x8|$_[2],$_[3]);
1861 }
1862
1863 sub vclgd {
1864         confess(err("ARGNUM")) if ($#_!=4);
1865         VRRa(0xe7c0,@_);
1866 }
1867 sub vclgdb {
1868         vclgd(@_[0..1],3,@_[2..3]);
1869 }
1870 sub wclgdb {
1871         vclgd(@_[0..1],3,0x8|$_[2],$_[3]);
1872 }
1873
1874 sub vfd {
1875         confess(err("ARGNUM")) if ($#_!=4);
1876         VRRc(0xe7e5,@_);
1877 }
1878 sub vfddb {
1879         vfd(@_,3,0);
1880 }
1881 sub wfddb {
1882         vfd(@_,3,8);
1883 }
1884
1885 sub vfi {
1886         confess(err("ARGNUM")) if ($#_!=4);
1887         VRRa(0xe7c7,@_);
1888 }
1889 sub vfidb {
1890         vfi(@_[0..1],3,@_[2..3]);
1891 }
1892 sub wfidb {
1893         vfi(@_[0..1],3,0x8|$_[2],$_[3]);
1894 }
1895
1896 sub vlde {      # deprecated, use vfll
1897         confess(err("ARGNUM")) if ($#_!=3);
1898         VRRa(0xe7c4,@_);
1899 }
1900 sub vldeb {     # deprecated, use vflls
1901         vlde(@_,2,0);
1902 }
1903 sub wldeb {     # deprecated, use wflls
1904         vlde(@_,2,8);
1905 }
1906
1907 sub vled {      # deprecated, use vflr
1908         confess(err("ARGNUM")) if ($#_!=4);
1909         VRRa(0xe7c5,@_);
1910 }
1911 sub vledb {     # deprecated, use vflrd
1912         vled(@_[0..1],3,@_[2..3]);
1913 }
1914 sub wledb {     # deprecated, use wflrd
1915         vled(@_[0..1],3,0x8|$_[2],$_[3]);
1916 }
1917
1918 sub vfm {
1919         confess(err("ARGNUM")) if ($#_!=4);
1920         VRRc(0xe7e7,@_);
1921 }
1922 sub vfmdb {
1923         vfm(@_,3,0);
1924 }
1925 sub wfmdb {
1926         vfm(@_,3,8);
1927 }
1928
1929 sub vfma {
1930         confess(err("ARGNUM")) if ($#_!=5);
1931         VRRe(0xe78f,@_);
1932 }
1933 sub vfmadb {
1934         vfma(@_,0,3);
1935 }
1936 sub wfmadb {
1937         vfma(@_,8,3);
1938 }
1939
1940 sub vfms {
1941         confess(err("ARGNUM")) if ($#_!=5);
1942         VRRe(0xe78e,@_);
1943 }
1944 sub vfmsdb {
1945         vfms(@_,0,3);
1946 }
1947 sub wfmsdb {
1948         vfms(@_,8,3);
1949 }
1950
1951 sub vfpso {
1952         confess(err("ARGNUM")) if ($#_!=4);
1953         VRRa(0xe7cc,@_);
1954 }
1955 sub vfpsodb {
1956         vfpso(@_[0..1],3,0,$_[2]);
1957 }
1958 sub wfpsodb {
1959         vfpso(@_[0..1],3,8,$_[2]);
1960 }
1961 sub vflcdb {
1962         vfpso(@_,3,0,0);
1963 }
1964 sub wflcdb {
1965         vfpso(@_,3,8,0);
1966 }
1967 sub vflndb {
1968         vfpso(@_,3,0,1);
1969 }
1970 sub wflndb {
1971         vfpso(@_,3,8,1);
1972 }
1973 sub vflpdb {
1974         vfpso(@_,3,0,2);
1975 }
1976 sub wflpdb {
1977         vfpso(@_,3,8,2);
1978 }
1979
1980 sub vfsq {
1981         confess(err("ARGNUM")) if ($#_!=3);
1982         VRRa(0xe7ce,@_);
1983 }
1984 sub vfsqdb {
1985         vfsq(@_,3,0);
1986 }
1987 sub wfsqdb {
1988         vfsq(@_,3,8);
1989 }
1990
1991 sub vfs {
1992         confess(err("ARGNUM")) if ($#_!=4);
1993         VRRc(0xe7e2,@_);
1994 }
1995 sub vfsdb {
1996         vfs(@_,3,0);
1997 }
1998 sub wfsdb {
1999         vfs(@_,3,8);
2000 }
2001
2002 sub vftci {
2003         confess(err("ARGNUM")) if ($#_!=4);
2004         VRIe(0xe74a,@_);
2005 }
2006 sub vftcidb {
2007         vftci(@_,3,0);
2008 }
2009 sub wftcidb {
2010         vftci(@_,3,8);
2011 }
2012
2013 # VXE - Support Instructions
2014
2015 sub vbperm {
2016         confess(err("ARGNUM")) if ($#_!=2);
2017         VRRc(0xe785,@_);
2018 }
2019
2020 sub vllezlf {
2021         vllez(@_,6);
2022 }
2023
2024 # VXE - Integer Instructions
2025
2026 sub vmsl {
2027         confess(err("ARGNUM")) if ($#_!=5);
2028         VRRd(0xe7b8,@_);
2029 }
2030 sub vmslg {
2031         vmsl(@_[0..3],3,$_[4]);
2032 }
2033
2034 sub vnx {
2035         confess(err("ARGNUM")) if ($#_!=2);
2036         VRRc(0xe76c,@_);
2037 }
2038
2039 sub vnn {
2040         confess(err("ARGNUM")) if ($#_!=2);
2041         VRRc(0xe76e,@_);
2042 }
2043
2044 sub voc {
2045         confess(err("ARGNUM")) if ($#_!=2);
2046         VRRc(0xe76f,@_);
2047 }
2048
2049 sub vpopctb {
2050         vpopct(@_,0);
2051 }
2052 sub vpopcth {
2053         vpopct(@_,1);
2054 }
2055 sub vpopctf {
2056         vpopct(@_,2);
2057 }
2058 sub vpopctg {
2059         vpopct(@_,3);
2060 }
2061
2062 # VXE - Floating-Point Instructions
2063
2064 sub vfasb {
2065         vfa(@_,2,0);
2066 }
2067 sub wfasb {
2068         vfa(@_,2,8);
2069 }
2070 sub wfaxb {
2071         vfa(@_,4,8);
2072 }
2073
2074 sub wfcsb {
2075         wfc(@_,2,0);
2076 }
2077 sub wfcxb {
2078         wfc(@_,4,0);
2079 }
2080
2081 sub vfcesb {
2082         vfce(@_,2,0,0);
2083 }
2084 sub vfcesbs {
2085         vfce(@_,2,0,1);
2086 }
2087 sub wfcesb {
2088         vfce(@_,2,8,0);
2089 }
2090 sub wfcesbs {
2091         vfce(@_,2,8,1);
2092 }
2093 sub wfcexb {
2094         vfce(@_,4,8,0);
2095 }
2096 sub wfcexbs {
2097         vfce(@_,4,8,1);
2098 }
2099
2100 sub vfchsb {
2101         vfch(@_,2,0,0);
2102 }
2103 sub vfchsbs {
2104         vfch(@_,2,0,1);
2105 }
2106 sub wfchsb {
2107         vfch(@_,2,8,0);
2108 }
2109 sub wfchsbs {
2110         vfch(@_,2,8,1);
2111 }
2112 sub wfchxb {
2113         vfch(@_,4,8,0);
2114 }
2115 sub wfchxbs {
2116         vfch(@_,4,8,1);
2117 }
2118
2119 sub vfchesb {
2120         vfche(@_,2,0,0);
2121 }
2122 sub vfchesbs {
2123         vfche(@_,2,0,1);
2124 }
2125 sub wfchesb {
2126         vfche(@_,2,8,0);
2127 }
2128 sub wfchesbs {
2129         vfche(@_,2,8,1);
2130 }
2131 sub wfchexb {
2132         vfche(@_,4,8,0);
2133 }
2134 sub wfchexbs {
2135         vfche(@_,4,8,1);
2136 }
2137
2138 sub vfdsb {
2139         vfd(@_,2,0);
2140 }
2141 sub wfdsb {
2142         vfd(@_,2,8);
2143 }
2144 sub wfdxb {
2145         vfd(@_,4,8);
2146 }
2147
2148 sub vfisb {
2149         vfi(@_[0..1],2,@_[2..3]);
2150 }
2151 sub wfisb {
2152         vfi(@_[0..1],2,0x8|$_[2],$_[3]);
2153 }
2154 sub wfixb {
2155         vfi(@_[0..1],4,0x8|$_[2],$_[3]);
2156 }
2157
2158 sub vfll {
2159         vlde(@_);
2160 }
2161 sub vflls {
2162         vfll(@_,2,0);
2163 }
2164 sub wflls {
2165         vfll(@_,2,8);
2166 }
2167 sub wflld {
2168         vfll(@_,3,8);
2169 }
2170
2171 sub vflr {
2172         vled(@_);
2173 }
2174 sub vflrd {
2175         vflr(@_[0..1],3,@_[2..3]);
2176 }
2177 sub wflrd {
2178         vflr(@_[0..1],3,0x8|$_[2],$_[3]);
2179 }
2180 sub wflrx {
2181         vflr(@_[0..1],4,0x8|$_[2],$_[3]);
2182 }
2183
2184 sub vfmax {
2185         confess(err("ARGNUM")) if ($#_!=5);
2186         VRRc(0xe7ef,@_);
2187 }
2188 sub vfmaxsb {
2189         vfmax(@_[0..2],2,0,$_[3]);
2190 }
2191 sub vfmaxdb {
2192         vfmax(@_[0..2],3,0,$_[3]);
2193 }
2194 sub wfmaxsb {
2195         vfmax(@_[0..2],2,8,$_[3]);
2196 }
2197 sub wfmaxdb {
2198         vfmax(@_[0..2],3,8,$_[3]);
2199 }
2200 sub wfmaxxb {
2201         vfmax(@_[0..2],4,8,$_[3]);
2202 }
2203
2204 sub vfmin {
2205         confess(err("ARGNUM")) if ($#_!=5);
2206         VRRc(0xe7ee,@_);
2207 }
2208 sub vfminsb {
2209         vfmin(@_[0..2],2,0,$_[5]);
2210 }
2211 sub vfmindb {
2212         vfmin(@_[0..2],3,0,$_[5]);
2213 }
2214 sub wfminsb {
2215         vfmin(@_[0..2],2,8,$_[5]);
2216 }
2217 sub wfmindb {
2218         vfmin(@_[0..2],3,8,$_[5]);
2219 }
2220 sub wfminxb {
2221         vfmin(@_[0..2],4,8,$_[5]);
2222 }
2223
2224 sub vfmsb {
2225         vfm(@_,2,0);
2226 }
2227 sub wfmsb {
2228         vfm(@_,2,8);
2229 }
2230 sub wfmxb {
2231         vfm(@_,4,8);
2232 }
2233
2234 sub vfmasb {
2235         vfma(@_,0,2);
2236 }
2237 sub wfmasb {
2238         vfma(@_,8,2);
2239 }
2240 sub wfmaxb {
2241         vfma(@_,8,4);
2242 }
2243
2244 sub vfmssb {
2245         vfms(@_,0,2);
2246 }
2247 sub wfmssb {
2248         vfms(@_,8,2);
2249 }
2250 sub wfmsxb {
2251         vfms(@_,8,4);
2252 }
2253
2254 sub vfnma {
2255         confess(err("ARGNUM")) if ($#_!=5);
2256         VRRe(0xe79f,@_);
2257 }
2258 sub vfnmasb {
2259         vfnma(@_,0,2);
2260 }
2261 sub vfnmadb {
2262         vfnma(@_,0,3);
2263 }
2264 sub wfnmasb {
2265         vfnma(@_,8,2);
2266 }
2267 sub wfnmadb {
2268         vfnma(@_,8,3);
2269 }
2270 sub wfnmaxb {
2271         vfnma(@_,8,4);
2272 }
2273
2274 sub vfnms {
2275         confess(err("ARGNUM")) if ($#_!=5);
2276         VRRe(0xe79e,@_);
2277 }
2278 sub vfnmssb {
2279         vfnms(@_,0,2);
2280 }
2281 sub vfnmsdb {
2282         vfnms(@_,0,3);
2283 }
2284 sub wfnmssb {
2285         vfnms(@_,8,2);
2286 }
2287 sub wfnmsdb {
2288         vfnms(@_,8,3);
2289 }
2290 sub wfnmsxb {
2291         vfnms(@_,8,4);
2292 }
2293
2294 sub vfpsosb {
2295         vfpso(@_[0..1],2,0,$_[2]);
2296 }
2297 sub wfpsosb {
2298         vfpso(@_[0..1],2,8,$_[2]);
2299 }
2300 sub vflcsb {
2301         vfpso(@_,2,0,0);
2302 }
2303 sub wflcsb {
2304         vfpso(@_,2,8,0);
2305 }
2306 sub vflnsb {
2307         vfpso(@_,2,0,1);
2308 }
2309 sub wflnsb {
2310         vfpso(@_,2,8,1);
2311 }
2312 sub vflpsb {
2313         vfpso(@_,2,0,2);
2314 }
2315 sub wflpsb {
2316         vfpso(@_,2,8,2);
2317 }
2318 sub vfpsoxb {
2319         vfpso(@_[0..1],4,0,$_[2]);
2320 }
2321 sub wfpsoxb {
2322         vfpso(@_[0..1],4,8,$_[2]);
2323 }
2324 sub vflcxb {
2325         vfpso(@_,4,0,0);
2326 }
2327 sub wflcxb {
2328         vfpso(@_,4,8,0);
2329 }
2330 sub vflnxb {
2331         vfpso(@_,4,0,1);
2332 }
2333 sub wflnxb {
2334         vfpso(@_,4,8,1);
2335 }
2336 sub vflpxb {
2337         vfpso(@_,4,0,2);
2338 }
2339 sub wflpxb {
2340         vfpso(@_,4,8,2);
2341 }
2342
2343 sub vfsqsb {
2344         vfsq(@_,2,0);
2345 }
2346 sub wfsqsb {
2347         vfsq(@_,2,8);
2348 }
2349 sub wfsqxb {
2350         vfsq(@_,4,8);
2351 }
2352
2353 sub vfssb {
2354         vfs(@_,2,0);
2355 }
2356 sub wfssb {
2357         vfs(@_,2,8);
2358 }
2359 sub wfsxb {
2360         vfs(@_,4,8);
2361 }
2362
2363 sub vftcisb {
2364         vftci(@_,2,0);
2365 }
2366 sub wftcisb {
2367         vftci(@_,2,8);
2368 }
2369 sub wftcixb {
2370         vftci(@_,4,8);
2371 }
2372
2373 # VXD - Support Instructions
2374
2375 sub vlrlr {
2376         confess(err("ARGNUM")) if ($#_!=2);
2377         VRSd(0xe637,@_);
2378 }
2379
2380 sub vlrl {
2381         confess(err("ARGNUM")) if ($#_!=2);
2382         VSI(0xe635,@_);
2383 }
2384
2385 sub vstrlr {
2386         confess(err("ARGNUM")) if ($#_!=2);
2387         VRSd(0xe63f,@_);
2388 }
2389
2390 sub vstrl {
2391         confess(err("ARGNUM")) if ($#_!=2);
2392         VSI(0xe63d,@_);
2393 }
2394
2395 sub vap {
2396         confess(err("ARGNUM")) if ($#_!=4);
2397         VRIf(0xe671,@_);
2398 }
2399
2400 sub vcp {
2401         confess(err("ARGNUM")) if ($#_!=2);
2402         VRRh(0xe677,@_);
2403 }
2404
2405 sub vcvb {
2406         confess(err("ARGNUM")) if ($#_!=2);
2407         VRRi(0xe650,@_);
2408 }
2409
2410 sub vcvbg {
2411         confess(err("ARGNUM")) if ($#_!=2);
2412         VRRi(0xe652,@_);
2413 }
2414
2415 sub vcvd {
2416         confess(err("ARGNUM")) if ($#_!=3);
2417         VRIi(0xe658,@_);
2418 }
2419
2420 sub vcvdg {
2421         confess(err("ARGNUM")) if ($#_!=3);
2422         VRIi(0xe65a,@_);
2423 }
2424
2425 sub vdp {
2426         confess(err("ARGNUM")) if ($#_!=4);
2427         VRIf(0xe67a,@_);
2428 }
2429
2430 sub vlip {
2431         confess(err("ARGNUM")) if ($#_!=2);
2432         VRIh(0xe649,@_);
2433 }
2434
2435 sub vmp {
2436         confess(err("ARGNUM")) if ($#_!=4);
2437         VRIf(0xe678,@_);
2438 }
2439
2440 sub vmsp {
2441         confess(err("ARGNUM")) if ($#_!=4);
2442         VRIf(0xe679,@_);
2443 }
2444
2445 sub vpkz {
2446         confess(err("ARGNUM")) if ($#_!=2);
2447         VSI(0xe634,@_);
2448 }
2449
2450 sub vpsop {
2451         confess(err("ARGNUM")) if ($#_!=4);
2452         VRIg(0xe65b,@_);
2453 }
2454
2455 sub vrp {
2456         confess(err("ARGNUM")) if ($#_!=4);
2457         VRIf(0xe67b,@_);
2458 }
2459
2460 sub vsdp {
2461         confess(err("ARGNUM")) if ($#_!=4);
2462         VRIf(0xe67e,@_);
2463 }
2464
2465 sub vsrp {
2466         confess(err("ARGNUM")) if ($#_!=4);
2467         VRIg(0xe659,@_);
2468 }
2469
2470 sub vsp {
2471         confess(err("ARGNUM")) if ($#_!=4);
2472         VRIf(0xe673,@_);
2473 }
2474
2475 sub vtp {
2476         confess(err("ARGNUM")) if ($#_!=0);
2477         VRRg(0xe65f,@_);
2478 }
2479
2480 sub vupkz {
2481         confess(err("ARGNUM")) if ($#_!=2);
2482         VSI(0xe63c,@_);
2483 }
2484
2485 #
2486 # Instruction Formats
2487 #
2488
2489 sub RRE {
2490         confess(err("ARGNUM")) if ($#_<0||2<$#_);
2491         my $ops=join(',',@_[1..$#_]);
2492         my $memn=(caller(1))[3];
2493         $memn=~s/^.*:://;
2494         my ($opcode,$r1,$r2)=(shift,get_R(shift),get_R(shift));
2495
2496         $out.="\t.long\t".sprintf("%#010x",($opcode<<16|$r1<<4|$r2));
2497         $out.="\t# $memn\t$ops\n"
2498 }
2499
2500 sub RRFb {
2501         confess(err("ARGNUM")) if ($#_<3||4<$#_);
2502         my $ops=join(',',@_[1..$#_]);
2503         my $memn=(caller(1))[3];
2504         $memn=~s/^.*:://;
2505         my ($opcode,$r1,$r3,$r2,$m4)=(shift,get_R(shift),get_R(shift)
2506             ,get_R(shift),get_M(shift));
2507
2508         $out.="\t.long\t"
2509             .sprintf("%#010x",($opcode<<16|$r3<<12|$m4<<8|$r1<<4|$r2));
2510         $out.="\t# $memn\t$ops\n"
2511 }
2512
2513 sub S {
2514         confess(err("ARGNUM")) if ($#_<0||1<$#_);
2515         my $ops=join(',',@_[1..$#_]);
2516         my $memn=(caller(1))[3];
2517         $memn=~s/^.*:://;
2518         my ($opcode,$d2,$b2)=(shift,get_DB(shift));
2519
2520         $out.="\t.long\t".sprintf("%#010x",($opcode<<16|$b2<<12|$d2));
2521         $out.="\t# $memn\t$ops\n"
2522 }
2523
2524 sub VRIa {
2525         confess(err("ARGNUM")) if ($#_<2||3<$#_);
2526         my $ops=join(',',@_[1..$#_]);
2527         my $memn=(caller(1))[3];
2528         $memn=~s/^.*:://;
2529         my ($opcode,$v1,$i2,$m3)=(shift,get_V(shift),get_I(shift,16),
2530             get_M(shift));
2531
2532         $out.="\t.word\t";
2533         $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4)).",";
2534         $out.=sprintf("%#06x",$i2).",";
2535         $out.=sprintf("%#06x",($m3<<12|RXB($v1)<<8|$opcode&0xff));
2536         $out.="\t# $memn\t$ops\n"
2537 }
2538
2539 sub VRIb {
2540         confess(err("ARGNUM")) if ($#_!=4);
2541         my $ops=join(',',@_[1..$#_]);
2542         my $memn=(caller(1))[3];
2543         $memn=~s/^.*:://;
2544         my ($opcode,$v1,$i2,$i3,$m4)=(shift,get_V(shift),get_I(shift,8),
2545             ,get_I(shift,8),get_M(shift));
2546
2547         $out.="\t.word\t";
2548         $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4)).",";
2549         $out.=sprintf("%#06x",($i2<<8|$i3)).",";
2550         $out.=sprintf("%#06x",($m4<<12|RXB($v1)<<8|$opcode&0xff));
2551         $out.="\t# $memn\t$ops\n"
2552 }
2553
2554 sub VRIc {
2555         confess(err("ARGNUM")) if ($#_!=4);
2556         my $ops=join(',',@_[1..$#_]);
2557         my $memn=(caller(1))[3];
2558         $memn=~s/^.*:://;
2559         my ($opcode,$v1,$v3,$i2,$m4)=(shift,get_V(shift),get_V(shift),
2560             ,get_I(shift,16),get_M(shift));
2561
2562         $out.="\t.word\t";
2563         $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4)|($v3&0xf)).",";
2564         $out.=sprintf("%#06x",$i2).",";
2565         $out.=sprintf("%#06x",($m4<<12|RXB($v1,$v3)<<8|$opcode&0xff));
2566         $out.="\t# $memn\t$ops\n"
2567 }
2568
2569 sub VRId {
2570         confess(err("ARGNUM")) if ($#_<4||$#_>5);
2571         my $ops=join(',',@_[1..$#_]);
2572         my $memn=(caller(1))[3];
2573         $memn=~s/^.*:://;
2574         my ($opcode,$v1,$v2,$v3,$i4,$m5)=(shift,get_V(shift),get_V(shift),
2575             ,get_V(shift),get_I(shift,8),get_M(shift));
2576
2577         $out.="\t.word\t";
2578         $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4)|($v2&0xf)).",";
2579         $out.=sprintf("%#06x",(($v3&0xf)<<12|$i4)).",";
2580         $out.=sprintf("%#06x",($m5<<12|RXB($v1,$v2,$v3)<<8|$opcode&0xff));
2581         $out.="\t# $memn\t$ops\n"
2582 }
2583
2584 sub VRIe {
2585         confess(err("ARGNUM")) if ($#_!=5);
2586         my $ops=join(',',@_[1..$#_]);
2587         my $memn=(caller(1))[3];
2588         $memn=~s/^.*:://;
2589         my ($opcode,$v1,$v2,$i3,$m4,$m5)=(shift,get_V(shift),get_V(shift),
2590             ,get_I(shift,12),get_M(shift),get_M(shift));
2591
2592         $out.="\t.word\t";
2593         $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4)|($v2&0xf)).",";
2594         $out.=sprintf("%#06x",($i3<<4|$m5)).",";
2595         $out.=sprintf("%#06x",($m4<<12|RXB($v1,$v2)<<8|$opcode&0xff));
2596         $out.="\t# $memn\t$ops\n"
2597 }
2598
2599 sub VRIf {
2600         confess(err("ARGNUM")) if ($#_!=5);
2601         my $ops=join(',',@_[1..$#_]);
2602         my $memn=(caller(1))[3];
2603         $memn=~s/^.*:://;
2604         my ($opcode,$v1,$v2,$v3,$i4,$m5)=(shift,get_V(shift),get_V(shift),
2605             ,get_V(shift),get_I(shift,8),get_M(shift));
2606
2607         $out.="\t.word\t";
2608         $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4)|($v2&0xf)).",";
2609         $out.=sprintf("%#06x",(($v3&0xf)<<12|$m5<<4)|$i4>>4).",";
2610         $out.=sprintf("%#06x",(($i4&0xf)<<12|RXB($v1,$v2,$v3)<<8|$opcode&0xff));
2611         $out.="\t# $memn\t$ops\n"
2612 }
2613
2614 sub VRIg {
2615         confess(err("ARGNUM")) if ($#_!=5);
2616         my $ops=join(',',@_[1..$#_]);
2617         my $memn=(caller(1))[3];
2618         $memn=~s/^.*:://;
2619         my ($opcode,$v1,$v2,$i3,$i4,$m5)=(shift,get_V(shift),get_V(shift),
2620             ,get_I(shift,8),get_I(shift,8),get_M(shift));
2621
2622         $out.="\t.word\t";
2623         $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4)|($v2&0xf)).",";
2624         $out.=sprintf("%#06x",($i4<<8|$m5<<4|$i3>>4)).",";
2625         $out.=sprintf("%#06x",(($i3&0xf)<<12|RXB($v1,$v2)<<8|$opcode&0xff));
2626         $out.="\t# $memn\t$ops\n"
2627 }
2628
2629 sub VRIh {
2630         confess(err("ARGNUM")) if ($#_!=3);
2631         my $ops=join(',',@_[1..$#_]);
2632         my $memn=(caller(1))[3];
2633         $memn=~s/^.*:://;
2634         my ($opcode,$v1,$i2,$i3)=(shift,get_V(shift),get_I(shift,16),
2635             get_I(shift,4));
2636
2637         $out.="\t.word\t";
2638         $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4)).",";
2639         $out.=sprintf("%#06x",$i2).",";
2640         $out.=sprintf("%#06x",($i3<<12|RXB($v1)<<8|$opcode&0xff));
2641         $out.="\t# $memn\t$ops\n"
2642 }
2643
2644 sub VRIi {
2645         confess(err("ARGNUM")) if ($#_!=4);
2646         my $ops=join(',',@_[1..$#_]);
2647         my $memn=(caller(1))[3];
2648         $memn=~s/^.*:://;
2649         my ($opcode,$v1,$r2,$i3,$m4)=(shift,get_V(shift),get_R(shift),
2650             ,get_I(shift,8),get_M(shift));
2651
2652         $out.="\t.word\t";
2653         $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4)|$r2).",";
2654         $out.=sprintf("%#06x",($m4<<4|$i3>>4)).",";
2655         $out.=sprintf("%#06x",(($i3&0xf)<<12|RXB($v1)<<8|$opcode&0xff));
2656         $out.="\t# $memn\t$ops\n"
2657 }
2658
2659 sub VRRa {
2660         confess(err("ARGNUM")) if ($#_<2||5<$#_);
2661         my $ops=join(',',@_[1..$#_]);
2662         my $memn=(caller(1))[3];
2663         $memn=~s/^.*:://;
2664         my ($opcode,$v1,$v2,$m3,$m4,$m5)=(shift,get_V(shift),get_V(shift),
2665             get_M(shift),get_M(shift),get_M(shift));
2666
2667         $out.="\t.word\t";
2668         $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|($v2&0xf))).",";
2669         $out.=sprintf("%#06x",($m5<<4|$m4)).",";
2670         $out.=sprintf("%#06x",($m3<<12|RXB($v1,$v2)<<8|$opcode&0xff));
2671         $out.="\t# $memn\t$ops\n"
2672 }
2673
2674 sub VRRb {
2675         confess(err("ARGNUM")) if ($#_<3||5<$#_);
2676         my $ops=join(',',@_[1..$#_]);
2677         my $memn=(caller(1))[3];
2678         $memn=~s/^.*:://;
2679         my ($opcode,$v1,$v2,$v3,$m4,$m5)=(shift,get_V(shift),get_V(shift),
2680             get_V(shift),get_M(shift),get_M(shift));
2681
2682         $out.="\t.word\t";
2683         $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|($v2&0xf))).",";
2684         $out.=sprintf("%#06x",(($v3&0xf)<<12|$m5<<4)).",";
2685         $out.=sprintf("%#06x",($m4<<12|RXB($v1,$v2,$v3)<<8|$opcode&0xff));
2686         $out.="\t# $memn\t$ops\n"
2687 }
2688
2689 sub VRRc {
2690         confess(err("ARGNUM")) if ($#_<3||6<$#_);
2691         my $ops=join(',',@_[1..$#_]);
2692         my $memn=(caller(1))[3];
2693         $memn=~s/^.*:://;
2694         my ($opcode,$v1,$v2,$v3,$m4,$m5,$m6)=(shift,get_V(shift),get_V(shift),
2695             get_V(shift),get_M(shift),get_M(shift),get_M(shift));
2696
2697         $out.="\t.word\t";
2698         $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|($v2&0xf))).",";
2699         $out.=sprintf("%#06x",(($v3&0xf)<<12|$m6<<4|$m5)).",";
2700         $out.=sprintf("%#06x",($m4<<12|RXB($v1,$v2,$v3)<<8|$opcode&0xff));
2701         $out.="\t# $memn\t$ops\n"
2702 }
2703
2704 sub VRRd {
2705         confess(err("ARGNUM")) if ($#_<4||6<$#_);
2706         my $ops=join(',',@_[1..$#_]);
2707         my $memn=(caller(1))[3];
2708         $memn=~s/^.*:://;
2709         my ($opcode,$v1,$v2,$v3,$v4,$m5,$m6)=(shift,get_V(shift),get_V(shift),
2710             get_V(shift),get_V(shift),get_M(shift),get_M(shift));
2711
2712         $out.="\t.word\t";
2713         $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|($v2&0xf))).",";
2714         $out.=sprintf("%#06x",(($v3&0xf)<<12|$m5<<8|$m6<<4)).",";
2715         $out.=sprintf("%#06x",(($v4&0xf)<<12|RXB($v1,$v2,$v3,$v4)<<8|$opcode&0xff));
2716         $out.="\t# $memn\t$ops\n"
2717 }
2718
2719 sub VRRe {
2720         confess(err("ARGNUM")) if ($#_<4||6<$#_);
2721         my $ops=join(',',@_[1..$#_]);
2722         my $memn=(caller(1))[3];
2723         $memn=~s/^.*:://;
2724         my ($opcode,$v1,$v2,$v3,$v4,$m5,$m6)=(shift,get_V(shift),get_V(shift),
2725             get_V(shift),get_V(shift),get_M(shift),get_M(shift));
2726
2727         $out.="\t.word\t";
2728         $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|($v2&0xf))).",";
2729         $out.=sprintf("%#06x",(($v3&0xf)<<12|$m6<<8|$m5)).",";
2730         $out.=sprintf("%#06x",(($v4&0xf)<<12|RXB($v1,$v2,$v3,$v4)<<8|$opcode&0xff));
2731         $out.="\t# $memn\t$ops\n"
2732 }
2733
2734 sub VRRf {
2735         confess(err("ARGNUM")) if ($#_!=3);
2736         my $ops=join(',',@_[1..$#_]);
2737         my $memn=(caller(1))[3];
2738         $memn=~s/^.*:://;
2739         my ($opcode,$v1,$r2,$r3)=(shift,get_V(shift),get_R(shift),
2740             get_R(shift));
2741
2742         $out.="\t.word\t";
2743         $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|$r2)).",";
2744         $out.=sprintf("%#06x",($r3<<12)).",";
2745         $out.=sprintf("%#06x",(RXB($v1)<<8|$opcode&0xff));
2746         $out.="\t# $memn\t$ops\n"
2747 }
2748
2749 sub VRRg {
2750         confess(err("ARGNUM")) if ($#_!=1);
2751         my $ops=join(',',@_[1..$#_]);
2752         my $memn=(caller(1))[3];
2753         $memn=~s/^.*:://;
2754         my ($opcode,$v1)=(shift,get_V(shift));
2755
2756         $out.="\t.word\t";
2757         $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf))).",";
2758         $out.=sprintf("%#06x",0x0000).",";
2759         $out.=sprintf("%#06x",(RXB(0,$v1)<<8|$opcode&0xff));
2760         $out.="\t# $memn\t$ops\n"
2761 }
2762
2763 sub VRRh {
2764         confess(err("ARGNUM")) if ($#_<2||$#_>3);
2765         my $ops=join(',',@_[1..$#_]);
2766         my $memn=(caller(1))[3];
2767         $memn=~s/^.*:://;
2768         my ($opcode,$v1,$v2,$m3)=(shift,get_V(shift),get_V(shift),
2769             get_M(shift));
2770
2771         $out.="\t.word\t";
2772         $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf))).",";
2773         $out.=sprintf("%#06x",(($v2&0xf)<<12|$m3<<4)).",";
2774         $out.=sprintf("%#06x",(RXB(0,$v1,$v2)<<8|$opcode&0xff));
2775         $out.="\t# $memn\t$ops\n"
2776 }
2777
2778 sub VRRi {
2779         confess(err("ARGNUM")) if ($#_!=3);
2780         my $ops=join(',',@_[1..$#_]);
2781         my $memn=(caller(1))[3];
2782         $memn=~s/^.*:://;
2783         my ($opcode,$r1,$v2,$m3)=(shift,get_R(shift),get_V(shift),
2784             get_M(shift));
2785
2786         $out.="\t.word\t";
2787         $out.=sprintf("%#06x",($opcode&0xff00|$r1<<4|($v2&0xf))).",";
2788         $out.=sprintf("%#06x",($m3<<4))."\,";
2789         $out.=sprintf("%#06x",(RXB(0,$v2)<<8|$opcode&0xff));
2790         $out.="\t# $memn\t$ops\n"
2791 }
2792
2793 sub VRSa {
2794         confess(err("ARGNUM")) if ($#_<3||$#_>4);
2795         my $ops=join(',',@_[1..$#_]);
2796         my $memn=(caller(1))[3];
2797         $memn=~s/^.*:://;
2798         my ($opcode,$v1,$v3,$d2,$b2,$m4)=(shift,get_V(shift),get_V(shift),
2799             get_DB(shift),get_M(shift));
2800
2801         $out.="\t.word\t";
2802         $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|($v3&0xf))).",";
2803         $out.=sprintf("%#06x",($b2<<12|$d2)).",";
2804         $out.=sprintf("%#06x",($m4<<12|RXB($v1,$v3)<<8|$opcode&0xff));
2805         $out.="\t# $memn\t$ops\n"
2806 }
2807
2808 sub VRSb {
2809         confess(err("ARGNUM")) if ($#_<3||$#_>4);
2810         my $ops=join(',',@_[1..$#_]);
2811         my $memn=(caller(1))[3];
2812         $memn=~s/^.*:://;
2813         my ($opcode,$v1,$r3,$d2,$b2,$m4)=(shift,get_V(shift),get_R(shift),
2814             get_DB(shift),get_M(shift));
2815
2816         $out.="\t.word\t";
2817         $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|$r3)).",";
2818         $out.=sprintf("%#06x",($b2<<12|$d2)).",";
2819         $out.=sprintf("%#06x",($m4<<12|RXB($v1)<<8|$opcode&0xff));
2820         $out.="\t# $memn\t$ops\n"
2821 }
2822
2823 sub VRSc {
2824         confess(err("ARGNUM")) if ($#_!=4);
2825         my $ops=join(',',@_[1..$#_]);
2826         my $memn=(caller(1))[3];
2827         $memn=~s/^.*:://;
2828         my ($opcode,$r1,$v3,$d2,$b2,$m4)=(shift,get_R(shift),get_V(shift),
2829             get_DB(shift),get_M(shift));
2830
2831         $out.="\t.word\t";
2832         $out.=sprintf("%#06x",($opcode&0xff00|$r1<<4|($v3&0xf))).",";
2833         $out.=sprintf("%#06x",($b2<<12|$d2)).",";
2834         $out.=sprintf("%#06x",($m4<<12|RXB(0,$v3)<<8|$opcode&0xff));
2835         $out.="\t# $memn\t$ops\n"
2836 }
2837
2838 sub VRSd {
2839         confess(err("ARGNUM")) if ($#_!=3);
2840         my $ops=join(',',@_[1..$#_]);
2841         my $memn=(caller(1))[3];
2842         $memn=~s/^.*:://;
2843         my ($opcode,$v1,$r3,$d2,$b2)=(shift,get_V(shift),get_R(shift),
2844             get_DB(shift));
2845
2846         $out.="\t.word\t";
2847         $out.=sprintf("%#06x",($opcode&0xff00|$r3)).",";
2848         $out.=sprintf("%#06x",($b2<<12|$d2)).",";
2849         $out.=sprintf("%#06x",(($v1&0xf)<<12|RXB(0,0,0,$v1)<<8|$opcode&0xff));
2850         $out.="\t# $memn\t$ops\n"
2851 }
2852
2853 sub VRV {
2854         confess(err("ARGNUM")) if ($#_<2||$#_>3);
2855         my $ops=join(',',@_[1..$#_]);
2856         my $memn=(caller(1))[3];
2857         $memn=~s/^.*:://;
2858         my ($opcode,$v1,$d2,$v2,$b2,$m3)=(shift,get_V(shift),get_DVB(shift),
2859             get_M(shift));
2860
2861         $out.="\t.word\t";
2862         $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|($v2&0xf))).",";
2863         $out.=sprintf("%#06x",($b2<<12|$d2)).",";
2864         $out.=sprintf("%#06x",($m3<<12|RXB($v1,$v2)<<8|$opcode&0xff));
2865         $out.="\t# $memn\t$ops\n"
2866 }
2867
2868 sub VRX {
2869         confess(err("ARGNUM")) if ($#_<2||$#_>3);
2870         my $ops=join(',',@_[1..$#_]);
2871         my $memn=(caller(1))[3];
2872         $memn=~s/^.*:://;
2873         my ($opcode,$v1,$d2,$x2,$b2,$m3)=(shift,get_V(shift),get_DXB(shift),
2874             get_M(shift));
2875
2876         $out.="\t.word\t";
2877         $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|($x2))).",";
2878         $out.=sprintf("%#06x",($b2<<12|$d2)).",";
2879         $out.=sprintf("%#06x",($m3<<12|RXB($v1)<<8|$opcode&0xff));
2880         $out.="\t# $memn\t$ops\n"
2881 }
2882
2883 sub VSI {
2884         confess(err("ARGNUM")) if ($#_!=3);
2885         my $ops=join(',',@_[1..$#_]);
2886         my $memn=(caller(1))[3];
2887         $memn=~s/^.*:://;
2888         my ($opcode,$v1,$d2,$b2,$i3)=(shift,get_V(shift),get_DB(shift),
2889             get_I(shift,8));
2890
2891         $out.="\t.word\t";
2892         $out.=sprintf("%#06x",($opcode&0xff00|$i3)).",";
2893         $out.=sprintf("%#06x",($b2<<12|$d2)).",";
2894         $out.=sprintf("%#06x",(($v1&0xf)<<12|RXB(0,0,0,$v1)<<8|$opcode&0xff));
2895         $out.="\t# $memn\t$ops\n"
2896 }
2897
2898 #
2899 # Internal
2900 #
2901
2902 sub get_R {
2903         confess(err("ARGNUM")) if ($#_!=0);
2904         my $r;
2905
2906         for (shift) {
2907                 if (!defined) {
2908                         $r=0;
2909                 } elsif (/^$GR$/) {
2910                         $r=$1;
2911                 } else {
2912                         confess(err("PARSE"));
2913                 }
2914         }
2915         confess(err("ARGRANGE")) if ($r&~0xf);
2916
2917         return $r;
2918 }
2919
2920 sub get_V {
2921         confess(err("ARGNUM")) if ($#_!=0);
2922         my $v;
2923
2924         for (shift) {
2925                 if (!defined) {
2926                         $v=0;
2927                 } elsif (/^$VR$/) {
2928                         $v=$1;
2929                 } else {
2930                         confess(err("PARSE"));
2931                 }
2932         }
2933         confess(err("ARGRANGE")) if ($v&~0x1f);
2934
2935         return $v;
2936 }
2937
2938 sub get_I {
2939         confess(err("ARGNUM")) if ($#_!=1);
2940         my ($i,$bits)=(shift,shift);
2941
2942         $i=defined($i)?(eval($i)):(0);
2943         confess(err("PARSE")) if (!defined($i));
2944         confess(err("ARGRANGE")) if (abs($i)&~(2**$bits-1));
2945
2946         return $i&(2**$bits-1);
2947 }
2948
2949 sub get_M {
2950         confess(err("ARGNUM")) if ($#_!=0);
2951         my $m=shift;
2952
2953         $m=defined($m)?(eval($m)):(0);
2954         confess(err("PARSE")) if (!defined($m));
2955         confess(err("ARGRANGE")) if ($m&~0xf);
2956
2957         return $m;
2958 }
2959
2960 sub get_DB
2961 {
2962         confess(err("ARGNUM")) if ($#_!=0);
2963         my ($d,$b);
2964
2965         for (shift) {
2966                 if (!defined) {
2967                         ($d,$b)=(0,0);
2968                 } elsif (/^(.+)\($GR\)$/) {
2969                         ($d,$b)=(eval($1),$2);
2970                         confess(err("PARSE")) if (!defined($d));
2971                 } elsif (/^(.+)$/) {
2972                         ($d,$b)=(eval($1),0);
2973                         confess(err("PARSE")) if (!defined($d));
2974                 } else {
2975                         confess(err("PARSE"));
2976                 }
2977         }
2978         confess(err("ARGRANGE")) if ($d&~0xfff||$b&~0xf);
2979
2980         return ($d,$b);
2981 }
2982
2983 sub get_DVB
2984 {
2985         confess(err("ARGNUM")) if ($#_!=0);
2986         my ($d,$v,$b);
2987
2988         for (shift) {
2989                 if (!defined) {
2990                         ($d,$v,$b)=(0,0,0);
2991                 } elsif (/^(.+)\($VR,$GR\)$/) {
2992                         ($d,$v,$b)=(eval($1),$2,$3);
2993                         confess(err("PARSE")) if (!defined($d));
2994                 } elsif (/^(.+)\($GR\)$/) {
2995                         ($d,$v,$b)=(eval($1),0,$2);
2996                         confess(err("PARSE")) if (!defined($d));
2997                 } elsif (/^(.+)$/) {
2998                         ($d,$v,$b)=(eval($1),0,0);
2999                         confess(err("PARSE")) if (!defined($d));
3000                 } else {
3001                         confess(err("PARSE"));
3002                 }
3003         }
3004         confess(err("ARGRANGE")) if ($d&~0xfff||$v&~0x1f||$b&~0xf);
3005
3006         return ($d,$v,$b);
3007 }
3008
3009 sub get_DXB
3010 {
3011         confess(err("ARGNUM")) if ($#_!=0);
3012         my ($d,$x,$b);
3013
3014         for (shift) {
3015                 if (!defined) {
3016                         ($d,$x,$b)=(0,0,0);
3017                 } elsif (/^(.+)\($GR,$GR\)$/) {
3018                         ($d,$x,$b)=(eval($1),$2,$3);
3019                         confess(err("PARSE")) if (!defined($d));
3020                 } elsif (/^(.+)\($GR\)$/) {
3021                         ($d,$x,$b)=(eval($1),0,$2);
3022                         confess(err("PARSE")) if (!defined($d));
3023                 } elsif (/^(.+)$/) {
3024                         ($d,$x,$b)=(eval($1),0,0);
3025                         confess(err("PARSE")) if (!defined($d));
3026                 } else {
3027                         confess(err("PARSE"));
3028                 }
3029         }
3030         confess(err("ARGRANGE")) if ($d&~0xfff||$x&~0xf||$b&~0xf);
3031
3032         return ($d,$x,$b);
3033 }
3034
3035 sub RXB
3036 {
3037         confess(err("ARGNUM")) if ($#_<0||3<$#_);
3038         my $rxb=0;
3039
3040         $rxb|=0x08 if (defined($_[0])&&($_[0]&0x10));
3041         $rxb|=0x04 if (defined($_[1])&&($_[1]&0x10));
3042         $rxb|=0x02 if (defined($_[2])&&($_[2]&0x10));
3043         $rxb|=0x01 if (defined($_[3])&&($_[3]&0x10));
3044
3045         return $rxb;
3046 }
3047
3048 sub err {
3049         my %ERR         =
3050         (
3051                 ARGNUM  =>      'Wrong number of arguments',
3052                 ARGRANGE=>      'Argument out of range',
3053                 PARSE   =>      'Parse error',
3054         );
3055         confess($ERR{ARGNUM}) if ($#_!=0);
3056
3057         return $ERR{$_[0]};
3058 }
3059
3060 1;