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