diff --git a/crypto/perlasm/s390x.pm b/crypto/perlasm/s390x.pm new file mode 100644 index 0000000000..5f3a49dd0c --- /dev/null +++ b/crypto/perlasm/s390x.pm @@ -0,0 +1,3060 @@ +#!/usr/bin/env perl +# Copyright 2018 The OpenSSL Project Authors. All Rights Reserved. +# +# Licensed under the OpenSSL license (the "License"). You may not use +# this file except in compliance with the License. You can obtain a copy +# in the file LICENSE in the source distribution or at +# https://www.openssl.org/source/license.html + +# Copyright IBM Corp. 2018 +# Author: Patrick Steuer + +package perlasm::s390x; + +use strict; +use warnings; +use Carp qw(confess); +use Exporter qw(import); + +our @EXPORT=qw(PERLASM_BEGIN PERLASM_END); +our @EXPORT_OK=qw(AUTOLOAD LABEL INCLUDE stfle); +our %EXPORT_TAGS=( + MSA => [qw(kmac km kmc kimd klmd)], + MSA4 => [qw(kmf kmo pcc kmctr)], + MSA5 => [qw(ppno prno)], + MSA8 => [qw(kma)], + VX => [qw(vgef vgeg vgbm vzero vone vgm vgmb vgmh vgmf vgmg + vl vlr vlrep vlrepb vlreph vlrepf vlrepg vleb vleh vlef vleg vleib + vleih vleif vleig vlgv vlgvb vlgvh vlgvf vlgvg vllez vllezb vllezh + vllezf vllezg vlm vlbb vlvg vlvgb vlvgh vlvgf vlvgg vlvgp + vll vmrh vmrhb vmrhh vmrhf vmrhg vmrl vmrlb vmrlh vmrlf vmrlg vpk + vpkh vpkf vpkg vpks vpksh vpksf vpksg vpkshs vpksfs vpksgs vpkls + vpklsh vpklsf vpklsg vpklshs vpklsfs vpklsgs vperm vpdi vrep vrepb + vreph vrepf vrepg vrepi vrepib vrepih vrepif vrepig vscef vsceg + vsel vseg vsegb vsegh vsegf vst vsteb vsteh vstef vsteg vstm vstl + vuph vuphb vuphh vuphf vuplh vuplhb vuplhh vuplhf vupl vuplb vuplhw + vuplf vupll vupllb vupllh vupllf va vab vah vaf vag vaq vacc vaccb + vacch vaccf vaccg vaccq vac vacq vaccc vacccq vn vnc vavg vavgb + vavgh vavgf vavgg vavgl vavglb vavglh vavglf vavglg vcksm vec_ vecb + vech vecf vecg vecl veclb veclh veclf veclg vceq vceqb vceqh vceqf + vceqg vceqbs vceqhs vceqfs vceqgs vch vchb vchh vchf vchg vchbs + vchhs vchfs vchgs vchl vchlb vchlh vchlf vchlg vchlbs vchlhs vchlfs + vchlgs vclz vclzb vclzh vclzf vclzg vctz vctzb vctzh vctzf vctzg + vx vgfm vgfmb vgfmh vgfmf vgfmg vgfma vgfmab vgfmah vgfmaf vgfmag + vlc vlcb vlch vlcf vlcg vlp vlpb vlph vlpf vlpg vmx vmxb vmxh vmxf + vmxg vmxl vmxlb vmxlh vmxlf vmxlg vmn vmnb vmnh vmnf vmng vmnl + vmnlb vmnlh vmnlf vmnlg vmal vmalb vmalhw vmalf vmah vmahb vmahh + vmahf vmalh vmalhb vmalhh vmalhf vmae vmaeb vmaeh vmaef vmale + vmaleb vmaleh vmalef vmao vmaob vmaoh vmaof vmalo vmalob vmaloh + vmalof vmh vmhb vmhh vmhf vmlh vmlhb vmlhh vmlhf vml vmlb vmlhw + vmlf vme vmeb vmeh vmef vmle vmleb vmleh vmlef vmo vmob vmoh vmof + vmlo vmlob vmloh vmlof vno vnot vo vpopct verllv verllvb verllvh + verllvf verllvg verll verllb verllh verllf verllg verim verimb + verimh verimf verimg veslv veslvb veslvh veslvf veslvg vesl veslb + veslh veslf veslg vesrav vesravb vesravh vesravf vesravg vesra + vesrab vesrah vesraf vesrag vesrlv vesrlvb vesrlvh vesrlvf vesrlvg + vesrl vesrlb vesrlh vesrlf vesrlg vsl vslb vsldb vsra vsrab vsrl + vsrlb vs vsb vsh vsf vsg vsq vscbi vscbib vscbih vscbif vscbig + vscbiq vsbi vsbiq vsbcbi vsbcbiq vsumg vsumgh vsumgf vsumq vsumqf + vsumqg vsum vsumb vsumh vtm vfae vfaeb vfaeh vfaef vfaebs vfaehs + vfaefs vfaezb vfaezh vfaezf vfaezbs vfaezhs vfaezfs vfee vfeeb + vfeeh vfeef vfeebs vfeehs vfeefs vfeezb vfeezh vfeezf vfeezbs + vfeezhs vfeezfs vfene vfeneb vfeneh vfenef vfenebs vfenehs vfenefs + vfenezb vfenezh vfenezf vfenezbs vfenezhs vfenezfs vistr vistrb + vistrh vistrf vistrbs vistrhs vistrfs vstrc vstrcb vstrch vstrcf + vstrcbs vstrchs vstrcfs vstrczb vstrczh vstrczf vstrczbs vstrczhs + vstrczfs vfa vfadb wfadb wfc wfcdb wfk wfkdb vfce vfcedb wfcedb + vfcedbs wfcedbs vfch vfchdb wfchdb vfchdbs wfchdbs vfche vfchedb + wfchedb vfchedbs wfchedbs vcdg vcdgb wcdgb vcdlg vcdlgb wcdlgb vcgd + vcgdb wcgdb vclgd vclgdb wclgdb vfd vfddb wfddb vfi vfidb wfidb + vlde vldeb wldeb vled vledb wledb vfm vfmdb wfmdb vfma vfmadb + wfmadb vfms vfmsdb wfmsdb vfpso vfpsodb wfpsodb vflcdb wflcdb + vflndb wflndb vflpdb wflpdb vfsq vfsqdb wfsqdb vfs vfsdb wfsdb + vftci vftcidb wftcidb)], + VXE => [qw(vbperm vllezlf vmsl vmslg vnx vnn voc vpopctb vpopcth + vpopctf vpopctg vfasb wfasb wfaxb wfcsb wfcxb wfksb wfkxb vfcesb + vfcesbs wfcesb wfcesbs wfcexb wfcexbs vfchsb vfchsbs wfchsb wfchsbs + wfchxb wfchxbs vfchesb vfchesbs wfchesb wfchesbs wfchexb wfchexbs + vfdsb wfdsb wfdxb vfisb wfisb wfixb vfll vflls wflls wflld vflr + vflrd wflrd wflrx vfmax vfmaxsb vfmaxdb wfmaxsb wfmaxdb wfmaxxb + vfmin vfminsb vfmindb wfminsb wfmindb wfminxb vfmsb wfmsb wfmxb + vfnma vfnms vfmasb wfmasb wfmaxb vfmssb wfmssb wfmsxb vfnmasb + vfnmadb wfnmasb wfnmadb wfnmaxb vfnmssb vfnmsdb wfnmssb wfnmsdb + wfnmsxb vfpsosb wfpsosb vflcsb wflcsb vflnsb wflnsb vflpsb wflpsb + vfpsoxb wfpsoxb vflcxb wflcxb vflnxb wflnxb vflpxb wflpxb vfsqsb + wfsqsb wfsqxb vfssb wfssb wfsxb vftcisb wftcisb wftcixb)], + VXD => [qw(vlrlr vlrl vstrlr vstrl vap vcp vcvb vcvbg vcvd vcvdg vdp + vlip vmp vmsp vpkz vpsop vrp vsdp vsrp vsp vtp vupkz)], +); +Exporter::export_ok_tags(qw(MSA MSA4 MSA5 MSA8 VX VXE VXD)); + +our $AUTOLOAD; + +my $GR='(?:%r)?([0-9]|1[0-5])'; +my $VR='(?:%v)?([0-9]|1[0-9]|2[0-9]|3[0-1])'; + +my ($file,$out); + +sub PERLASM_BEGIN +{ + ($file,$out)=(shift,""); +} +sub PERLASM_END +{ + if (defined($file)) { + open(my $fd,'>',$file)||die("can't open $file: $!"); + print({$fd}$out); + close($fd); + } else { + print($out); + } +} + +sub AUTOLOAD { + confess(err("PARSE")) if (grep(!defined($_),@_)); + my $token; + for ($AUTOLOAD) { + $token=".$1" if (/^.*::([A-Z_]+)$/); # uppercase: directive + $token="\t$1" if (/^.*::([a-z]+)$/); # lowercase: mnemonic + confess(err("PARSE")) if (!defined($token)); + } + $token.="\t" if ($#_>=0); + $out.=$token.join(',',@_)."\n"; +} + +sub LABEL { # label directive + confess(err("ARGNUM")) if ($#_!=0); + my ($label)=@_; + $out.="$label:\n"; +} + +sub INCLUDE { + confess(err("ARGNUM")) if ($#_!=0); + my ($file)=@_; + $out.="#include \"$file\"\n"; +} + +# +# Mnemonics +# + +sub stfle { + confess(err("ARGNUM")) if ($#_!=0); + S(0xb2b0,@_); +} + +# MSA + +sub kmac { + confess(err("ARGNUM")) if ($#_!=1); + RRE(0xb91e,@_); +} + +sub km { + confess(err("ARGNUM")) if ($#_!=1); + RRE(0xb92e,@_); +} + +sub kmc { + confess(err("ARGNUM")) if ($#_!=1); + RRE(0xb92f,@_); +} + +sub kimd { + confess(err("ARGNUM")) if ($#_!=1); + RRE(0xb93e,@_); +} + +sub klmd { + confess(err("ARGNUM")) if ($#_!=1); + RRE(0xb93f,@_); +} + +# MSA4 + +sub kmf { + confess(err("ARGNUM")) if ($#_!=1); + RRE(0xb92a,@_); +} + +sub kmo { + confess(err("ARGNUM")) if ($#_!=1); + RRE(0xb92b,@_); +} + +sub pcc { + confess(err("ARGNUM")) if ($#_!=-1); + RRE(0xb92c,@_); +} + +sub kmctr { + confess(err("ARGNUM")) if ($#_!=2); + RRFb(0xb92d,@_); +} + +# MSA5 + +sub prno { + ppno(@_); +} + +sub ppno { # deprecated, use prno + confess(err("ARGNUM")) if ($#_!=1); + RRE(0xb93c,@_); +} + +# MSA8 + +sub kma { + confess(err("ARGNUM")) if ($#_!=2); + RRFb(0xb929,@_); +} + +# VX - Support Instructions + +sub vgef { + confess(err("ARGNUM")) if ($#_!=2); + VRV(0xe713,@_); +} +sub vgeg { + confess(err("ARGNUM")) if ($#_!=2); + VRV(0xe712,@_); +} + +sub vgbm { + confess(err("ARGNUM")) if ($#_!=1); + VRIa(0xe744,@_); +} +sub vzero { + vgbm(@_,0); +} +sub vone { + vgbm(@_,0xffff); +} + +sub vgm { + confess(err("ARGNUM")) if ($#_!=3); + VRIb(0xe746,@_); +} +sub vgmb { + vgm(@_,0); +} +sub vgmh { + vgm(@_,1); +} +sub vgmf { + vgm(@_,2); +} +sub vgmg { + vgm(@_,3); +} + +sub vl { + confess(err("ARGNUM")) if ($#_!=1); + VRX(0xe706,@_); +} + +sub vlr { + confess(err("ARGNUM")) if ($#_!=1); + VRRa(0xe756,@_); +} + +sub vlrep { + confess(err("ARGNUM")) if ($#_!=2); + VRX(0xe705,@_); +} +sub vlrepb { + vlrep(@_,0); +} +sub vlreph { + vlrep(@_,1); +} +sub vlrepf { + vlrep(@_,2); +} +sub vlrepg { + vlrep(@_,3); +} + +sub vleb { + confess(err("ARGNUM")) if ($#_!=2); + VRX(0xe700,@_); +} +sub vleh { + confess(err("ARGNUM")) if ($#_!=2); + VRX(0xe701,@_); +} +sub vlef { + confess(err("ARGNUM")) if ($#_!=2); + VRX(0xe703,@_); +} +sub vleg { + confess(err("ARGNUM")) if ($#_!=2); + VRX(0xe702,@_); +} + +sub vleib { + confess(err("ARGNUM")) if ($#_!=2); + VRIa(0xe740,@_); +} +sub vleih { + confess(err("ARGNUM")) if ($#_!=2); + VRIa(0xe741,@_); +} +sub vleif { + confess(err("ARGNUM")) if ($#_!=2); + VRIa(0xe743,@_); +} +sub vleig { + confess(err("ARGNUM")) if ($#_!=2); + VRIa(0xe742,@_); +} + +sub vlgv { + confess(err("ARGNUM")) if ($#_!=3); + VRSc(0xe721,@_); +} +sub vlgvb { + vlgv(@_,0); +} +sub vlgvh { + vlgv(@_,1); +} +sub vlgvf { + vlgv(@_,2); +} +sub vlgvg { + vlgv(@_,3); +} + +sub vllez { + confess(err("ARGNUM")) if ($#_!=2); + VRX(0xe704,@_); +} +sub vllezb { + vllez(@_,0); +} +sub vllezh { + vllez(@_,1); +} +sub vllezf { + vllez(@_,2); +} +sub vllezg { + vllez(@_,3); +} + +sub vlm { + confess(err("ARGNUM")) if ($#_!=2); + VRSa(0xe736,@_); +} + +sub vlbb { + confess(err("ARGNUM")) if ($#_!=2); + VRX(0xe707,@_); +} + +sub vlvg { + confess(err("ARGNUM")) if ($#_!=3); + VRSb(0xe722,@_); +} +sub vlvgb { + vlvg(@_,0); +} +sub vlvgh { + vlvg(@_,1); +} +sub vlvgf { + vlvg(@_,2); +} +sub vlvgg { + vlvg(@_,3); +} + +sub vlvgp { + confess(err("ARGNUM")) if ($#_!=2); + VRRf(0xe762,@_); +} + +sub vll { + confess(err("ARGNUM")) if ($#_!=2); + VRSb(0xe737,@_); +} + +sub vmrh { + confess(err("ARGNUM")) if ($#_!=3); + VRRc(0xe761,@_); +} +sub vmrhb { + vmrh(@_,0); +} +sub vmrhh { + vmrh(@_,1); +} +sub vmrhf { + vmrh(@_,2); +} +sub vmrhg { + vmrh(@_,3); +} + +sub vmrl { + confess(err("ARGNUM")) if ($#_!=3); + VRRc(0xe760,@_); +} +sub vmrlb { + vmrl(@_,0); +} +sub vmrlh { + vmrl(@_,1); +} +sub vmrlf { + vmrl(@_,2); +} +sub vmrlg { + vmrl(@_,3); +} + +sub vpk { + confess(err("ARGNUM")) if ($#_!=3); + VRRc(0xe794,@_); +} +sub vpkh { + vpk(@_,1); +} +sub vpkf { + vpk(@_,2); +} +sub vpkg { + vpk(@_,3); +} + +sub vpks { + confess(err("ARGNUM")) if ($#_!=4); + VRRb(0xe797,@_); +} +sub vpksh { + vpks(@_,1,0); +} +sub vpksf { + vpks(@_,2,0); +} +sub vpksg { + vpks(@_,3,0); +} +sub vpkshs { + vpks(@_,1,1); +} +sub vpksfs { + vpks(@_,2,1); +} +sub vpksgs { + vpks(@_,3,1); +} + +sub vpkls { + confess(err("ARGNUM")) if ($#_!=4); + VRRb(0xe795,@_); +} +sub vpklsh { + vpkls(@_,1,0); +} +sub vpklsf { + vpkls(@_,2,0); +} +sub vpklsg { + vpkls(@_,3,0); +} +sub vpklshs { + vpkls(@_,1,1); +} +sub vpklsfs { + vpkls(@_,2,1); +} +sub vpklsgs { + vpkls(@_,3,1); +} + +sub vperm { + confess(err("ARGNUM")) if ($#_!=3); + VRRe(0xe78c,@_); +} + +sub vpdi { + confess(err("ARGNUM")) if ($#_!=3); + VRRc(0xe784,@_); +} + +sub vrep { + confess(err("ARGNUM")) if ($#_!=3); + VRIc(0xe74d,@_); +} +sub vrepb { + vrep(@_,0); +} +sub vreph { + vrep(@_,1); +} +sub vrepf { + vrep(@_,2); +} +sub vrepg { + vrep(@_,3); +} + +sub vrepi { + confess(err("ARGNUM")) if ($#_!=2); + VRIa(0xe745,@_); +} +sub vrepib { + vrepi(@_,0); +} +sub vrepih { + vrepi(@_,1); +} +sub vrepif { + vrepi(@_,2); +} +sub vrepig { + vrepi(@_,3); +} + +sub vscef { + confess(err("ARGNUM")) if ($#_!=2); + VRV(0xe71b,@_); +} +sub vsceg { + confess(err("ARGNUM")) if ($#_!=2); + VRV(0xe71a,@_); +} + +sub vsel { + confess(err("ARGNUM")) if ($#_!=3); + VRRe(0xe78d,@_); +} + +sub vseg { + confess(err("ARGNUM")) if ($#_!=2); + VRRa(0xe75f,@_); +} +sub vsegb { + vseg(@_,0); +} +sub vsegh { + vseg(@_,1); +} +sub vsegf { + vseg(@_,2); +} + +sub vst { + confess(err("ARGNUM")) if ($#_!=1); + VRX(0xe70e,@_); +} + +sub vsteb { + confess(err("ARGNUM")) if ($#_!=2); + VRX(0xe708,@_); +} +sub vsteh { + confess(err("ARGNUM")) if ($#_!=2); + VRX(0xe709,@_); +} +sub vstef { + confess(err("ARGNUM")) if ($#_!=2); + VRX(0xe70b,@_); +} +sub vsteg { + confess(err("ARGNUM")) if ($#_!=2); + VRX(0xe70a,@_); +} + +sub vstm { + confess(err("ARGNUM")) if ($#_!=2); + VRSa(0xe73e,@_); +} + +sub vstl { + confess(err("ARGNUM")) if ($#_!=2); + VRSb(0xe73f,@_); +} + +sub vuph { + confess(err("ARGNUM")) if ($#_!=2); + VRRa(0xe7d7,@_); +} +sub vuphb { + vuph(@_,0); +} +sub vuphh { + vuph(@_,1); +} +sub vuphf { + vuph(@_,2); +} + +sub vuplh { + confess(err("ARGNUM")) if ($#_!=2); + VRRa(0xe7d5,@_); +} +sub vuplhb { + vuplh(@_,0); +} +sub vuplhh { + vuplh(@_,1); +} +sub vuplhf { + vuplh(@_,2); +} + +sub vupl { + confess(err("ARGNUM")) if ($#_!=2); + VRRa(0xe7d6,@_); +} +sub vuplb { + vupl(@_,0); +} +sub vuplhw { + vupl(@_,1); +} +sub vuplf { + vupl(@_,2); +} + +sub vupll { + confess(err("ARGNUM")) if ($#_!=2); + VRRa(0xe7d4,@_); +} +sub vupllb { + vupll(@_,0); +} +sub vupllh { + vupll(@_,1); +} +sub vupllf { + vupll(@_,2); +} + +# VX - Integer Instructions + +sub va { + confess(err("ARGNUM")) if ($#_!=3); + VRRc(0xe7f3,@_); +} +sub vab { + va(@_,0); +} +sub vah { + va(@_,1); +} +sub vaf { + va(@_,2); +} +sub vag { + va(@_,3); +} +sub vaq { + va(@_,4); +} + +sub vacc { + confess(err("ARGNUM")) if ($#_!=3); + VRRc(0xe7f1,@_); +} +sub vaccb { + vacc(@_,0); +} +sub vacch { + vacc(@_,1); +} +sub vaccf { + vacc(@_,2); +} +sub vaccg { + vacc(@_,3); +} +sub vaccq { + vacc(@_,4); +} + +sub vac { + confess(err("ARGNUM")) if ($#_!=4); + VRRd(0xe7bb,@_); +} +sub vacq { + vac(@_,4); +} + +sub vaccc { + confess(err("ARGNUM")) if ($#_!=4); + VRRd(0xe7b9,@_); +} +sub vacccq { + vaccc(@_,4); +} + +sub vn { + confess(err("ARGNUM")) if ($#_!=2); + VRRc(0xe768,@_); +} + +sub vnc { + confess(err("ARGNUM")) if ($#_!=2); + VRRc(0xe769,@_); +} + +sub vavg { + confess(err("ARGNUM")) if ($#_!=3); + VRRc(0xe7f2,@_); +} +sub vavgb { + vavg(@_,0); +} +sub vavgh { + vavg(@_,1); +} +sub vavgf { + vavg(@_,2); +} +sub vavgg { + vavg(@_,3); +} + +sub vavgl { + confess(err("ARGNUM")) if ($#_!=3); + VRRc(0xe7f0,@_); +} +sub vavglb { + vavgl(@_,0); +} +sub vavglh { + vavgl(@_,1); +} +sub vavglf { + vavgl(@_,2); +} +sub vavglg { + vavgl(@_,3); +} + +sub vcksm { + confess(err("ARGNUM")) if ($#_!=2); + VRRc(0xe766,@_); +} + +sub vec_ { + confess(err("ARGNUM")) if ($#_!=2); + VRRa(0xe7db,@_); +} +sub vecb { + vec_(@_,0); +} +sub vech { + vec_(@_,1); +} +sub vecf { + vec_(@_,2); +} +sub vecg { + vec_(@_,3); +} + +sub vecl { + confess(err("ARGNUM")) if ($#_!=2); + VRRa(0xe7d9,@_); +} +sub veclb { + vecl(@_,0); +} +sub veclh { + vecl(@_,1); +} +sub veclf { + vecl(@_,2); +} +sub veclg { + vecl(@_,3); +} + +sub vceq { + confess(err("ARGNUM")) if ($#_!=4); + VRRb(0xe7f8,@_); +} +sub vceqb { + vceq(@_,0,0); +} +sub vceqh { + vceq(@_,1,0); +} +sub vceqf { + vceq(@_,2,0); +} +sub vceqg { + vceq(@_,3,0); +} +sub vceqbs { + vceq(@_,0,1); +} +sub vceqhs { + vceq(@_,1,1); +} +sub vceqfs { + vceq(@_,2,1); +} +sub vceqgs { + vceq(@_,3,1); +} + +sub vch { + confess(err("ARGNUM")) if ($#_!=4); + VRRb(0xe7fb,@_); +} +sub vchb { + vch(@_,0,0); +} +sub vchh { + vch(@_,1,0); +} +sub vchf { + vch(@_,2,0); +} +sub vchg { + vch(@_,3,0); +} +sub vchbs { + vch(@_,0,1); +} +sub vchhs { + vch(@_,1,1); +} +sub vchfs { + vch(@_,2,1); +} +sub vchgs { + vch(@_,3,1); +} + +sub vchl { + confess(err("ARGNUM")) if ($#_!=4); + VRRb(0xe7f9,@_); +} +sub vchlb { + vchl(@_,0,0); +} +sub vchlh { + vchl(@_,1,0); +} +sub vchlf { + vchl(@_,2,0); +} +sub vchlg { + vchl(@_,3,0); +} +sub vchlbs { + vchl(@_,0,1); +} +sub vchlhs { + vchl(@_,1,1); +} +sub vchlfs { + vchl(@_,2,1); +} +sub vchlgs { + vchl(@_,3,1); +} + +sub vclz { + confess(err("ARGNUM")) if ($#_!=2); + VRRa(0xe753,@_); +} +sub vclzb { + vclz(@_,0); +} +sub vclzh { + vclz(@_,1); +} +sub vclzf { + vclz(@_,2); +} +sub vclzg { + vclz(@_,3); +} + +sub vctz { + confess(err("ARGNUM")) if ($#_!=2); + VRRa(0xe752,@_); +} +sub vctzb { + vctz(@_,0); +} +sub vctzh { + vctz(@_,1); +} +sub vctzf { + vctz(@_,2); +} +sub vctzg { + vctz(@_,3); +} + +sub vx { + confess(err("ARGNUM")) if ($#_!=2); + VRRc(0xe76d,@_); +} + +sub vgfm { + confess(err("ARGNUM")) if ($#_!=3); + VRRc(0xe7b4,@_); +} +sub vgfmb { + vgfm(@_,0); +} +sub vgfmh { + vgfm(@_,1); +} +sub vgfmf { + vgfm(@_,2); +} +sub vgfmg { + vgfm(@_,3); +} + +sub vgfma { + confess(err("ARGNUM")) if ($#_!=4); + VRRd(0xe7bc,@_); +} +sub vgfmab { + vgfma(@_,0); +} +sub vgfmah { + vgfma(@_,1); +} +sub vgfmaf { + vgfma(@_,2); +} +sub vgfmag { + vgfma(@_,3); +} + +sub vlc { + confess(err("ARGNUM")) if ($#_!=2); + VRRa(0xe7de,@_); +} +sub vlcb { + vlc(@_,0); +} +sub vlch { + vlc(@_,1); +} +sub vlcf { + vlc(@_,2); +} +sub vlcg { + vlc(@_,3); +} + +sub vlp { + confess(err("ARGNUM")) if ($#_!=2); + VRRa(0xe7df,@_); +} +sub vlpb { + vlp(@_,0); +} +sub vlph { + vlp(@_,1); +} +sub vlpf { + vlp(@_,2); +} +sub vlpg { + vlp(@_,3); +} + +sub vmx { + confess(err("ARGNUM")) if ($#_!=3); + VRRc(0xe7ff,@_); +} +sub vmxb { + vmx(@_,0); +} +sub vmxh { + vmx(@_,1); +} +sub vmxf { + vmx(@_,2); +} +sub vmxg { + vmx(@_,3); +} + +sub vmxl { + confess(err("ARGNUM")) if ($#_!=3); + VRRc(0xe7fd,@_); +} +sub vmxlb { + vmxl(@_,0); +} +sub vmxlh { + vmxl(@_,1); +} +sub vmxlf { + vmxl(@_,2); +} +sub vmxlg { + vmxl(@_,3); +} + +sub vmn { + confess(err("ARGNUM")) if ($#_!=3); + VRRc(0xe7fe,@_); +} +sub vmnb { + vmn(@_,0); +} +sub vmnh { + vmn(@_,1); +} +sub vmnf { + vmn(@_,2); +} +sub vmng { + vmn(@_,3); +} + +sub vmnl { + confess(err("ARGNUM")) if ($#_!=3); + VRRc(0xe7fc,@_); +} +sub vmnlb { + vmnl(@_,0); +} +sub vmnlh { + vmnl(@_,1); +} +sub vmnlf { + vmnl(@_,2); +} +sub vmnlg { + vmnl(@_,3); +} + +sub vmal { + confess(err("ARGNUM")) if ($#_!=4); + VRRd(0xe7aa,@_); +} +sub vmalb { + vmal(@_,0); +} +sub vmalhw { + vmal(@_,1); +} +sub vmalf { + vmal(@_,2); +} + +sub vmah { + confess(err("ARGNUM")) if ($#_!=4); + VRRd(0xe7ab,@_); +} +sub vmahb { + vmah(@_,0); +} +sub vmahh { + vmah(@_,1); +} +sub vmahf { + vmah(@_,2); +} + +sub vmalh { + confess(err("ARGNUM")) if ($#_!=4); + VRRd(0xe7a9,@_); +} +sub vmalhb { + vmalh(@_,0); +} +sub vmalhh { + vmalh(@_,1); +} +sub vmalhf { + vmalh(@_,2); +} + +sub vmae { + confess(err("ARGNUM")) if ($#_!=4); + VRRd(0xe7ae,@_); +} +sub vmaeb { + vmae(@_,0); +} +sub vmaeh { + vmae(@_,1); +} +sub vmaef { + vmae(@_,2); +} + +sub vmale { + confess(err("ARGNUM")) if ($#_!=4); + VRRd(0xe7ac,@_); +} +sub vmaleb { + vmale(@_,0); +} +sub vmaleh { + vmale(@_,1); +} +sub vmalef { + vmale(@_,2); +} + +sub vmao { + confess(err("ARGNUM")) if ($#_!=4); + VRRd(0xe7af,@_); +} +sub vmaob { + vmao(@_,0); +} +sub vmaoh { + vmao(@_,1); +} +sub vmaof { + vmao(@_,2); +} + +sub vmalo { + confess(err("ARGNUM")) if ($#_!=4); + VRRd(0xe7ad,@_); +} +sub vmalob { + vmalo(@_,0); +} +sub vmaloh { + vmalo(@_,1); +} +sub vmalof { + vmalo(@_,2); +} + +sub vmh { + confess(err("ARGNUM")) if ($#_!=3); + VRRc(0xe7a3,@_); +} +sub vmhb { + vmh(@_,0); +} +sub vmhh { + vmh(@_,1); +} +sub vmhf { + vmh(@_,2); +} + +sub vmlh { + confess(err("ARGNUM")) if ($#_!=3); + VRRc(0xe7a1,@_); +} +sub vmlhb { + vmlh(@_,0); +} +sub vmlhh { + vmlh(@_,1); +} +sub vmlhf { + vmlh(@_,2); +} + +sub vml { + confess(err("ARGNUM")) if ($#_!=3); + VRRc(0xe7a2,@_); +} +sub vmlb { + vml(@_,0); +} +sub vmlhw { + vml(@_,1); +} +sub vmlf { + vml(@_,2); +} + +sub vme { + confess(err("ARGNUM")) if ($#_!=3); + VRRc(0xe7a6,@_); +} +sub vmeb { + vme(@_,0); +} +sub vmeh { + vme(@_,1); +} +sub vmef { + vme(@_,2); +} + +sub vmle { + confess(err("ARGNUM")) if ($#_!=3); + VRRc(0xe7a4,@_); +} +sub vmleb { + vmle(@_,0); +} +sub vmleh { + vmle(@_,1); +} +sub vmlef { + vmle(@_,2); +} + +sub vmo { + confess(err("ARGNUM")) if ($#_!=3); + VRRc(0xe7a7,@_); +} +sub vmob { + vmo(@_,0); +} +sub vmoh { + vmo(@_,1); +} +sub vmof { + vmo(@_,2); +} + +sub vmlo { + confess(err("ARGNUM")) if ($#_!=3); + VRRc(0xe7a5,@_); +} +sub vmlob { + vmlo(@_,0); +} +sub vmloh { + vmlo(@_,1); +} +sub vmlof { + vmlo(@_,2); +} + +sub vno { + confess(err("ARGNUM")) if ($#_!=2); + VRRc(0xe76b,@_); +} +sub vnot { + vno(@_,$_[1]); +} + +sub vo { + confess(err("ARGNUM")) if ($#_!=2); + VRRc(0xe76a,@_); +} + +sub vpopct { + confess(err("ARGNUM")) if ($#_!=2); + VRRa(0xe750,@_); +} + +sub verllv { + confess(err("ARGNUM")) if ($#_!=3); + VRRc(0xe773,@_); +} +sub verllvb { + verllv(@_,0); +} +sub verllvh { + verllv(@_,1); +} +sub verllvf { + verllv(@_,2); +} +sub verllvg { + verllv(@_,3); +} + +sub verll { + confess(err("ARGNUM")) if ($#_!=3); + VRSa(0xe733,@_); +} +sub verllb { + verll(@_,0); +} +sub verllh { + verll(@_,1); +} +sub verllf { + verll(@_,2); +} +sub verllg { + verll(@_,3); +} + +sub verim { + confess(err("ARGNUM")) if ($#_!=4); + VRId(0xe772,@_); +} +sub verimb { + verim(@_,0); +} +sub verimh { + verim(@_,1); +} +sub verimf { + verim(@_,2); +} +sub verimg { + verim(@_,3); +} + +sub veslv { + confess(err("ARGNUM")) if ($#_!=3); + VRRc(0xe770,@_); +} +sub veslvb { + veslv(@_,0); +} +sub veslvh { + veslv(@_,1); +} +sub veslvf { + veslv(@_,2); +} +sub veslvg { + veslv(@_,3); +} + +sub vesl { + confess(err("ARGNUM")) if ($#_!=3); + VRSa(0xe730,@_); +} +sub veslb { + vesl(@_,0); +} +sub veslh { + vesl(@_,1); +} +sub veslf { + vesl(@_,2); +} +sub veslg { + vesl(@_,3); +} + +sub vesrav { + confess(err("ARGNUM")) if ($#_!=3); + VRRc(0xe77a,@_); +} +sub vesravb { + vesrav(@_,0); +} +sub vesravh { + vesrav(@_,1); +} +sub vesravf { + vesrav(@_,2); +} +sub vesravg { + vesrav(@_,3); +} + +sub vesra { + confess(err("ARGNUM")) if ($#_!=3); + VRSa(0xe73a,@_); +} +sub vesrab { + vesra(@_,0); +} +sub vesrah { + vesra(@_,1); +} +sub vesraf { + vesra(@_,2); +} +sub vesrag { + vesra(@_,3); +} + +sub vesrlv { + confess(err("ARGNUM")) if ($#_!=3); + VRRc(0xe778,@_); +} +sub vesrlvb { + vesrlv(@_,0); +} +sub vesrlvh { + vesrlv(@_,1); +} +sub vesrlvf { + vesrlv(@_,2); +} +sub vesrlvg { + vesrlv(@_,3); +} + +sub vesrl { + confess(err("ARGNUM")) if ($#_!=3); + VRSa(0xe738,@_); +} +sub vesrlb { + vesrl(@_,0); +} +sub vesrlh { + vesrl(@_,1); +} +sub vesrlf { + vesrl(@_,2); +} +sub vesrlg { + vesrl(@_,3); +} + +sub vsl { + confess(err("ARGNUM")) if ($#_!=2); + VRRc(0xe774,@_); +} + +sub vslb { + confess(err("ARGNUM")) if ($#_!=2); + VRRc(0xe775,@_); +} + +sub vsldb { + confess(err("ARGNUM")) if ($#_!=3); + VRId(0xe777,@_); +} + +sub vsra { + confess(err("ARGNUM")) if ($#_!=2); + VRRc(0xe77e,@_); +} + +sub vsrab { + confess(err("ARGNUM")) if ($#_!=2); + VRRc(0xe77f,@_); +} + +sub vsrl { + confess(err("ARGNUM")) if ($#_!=2); + VRRc(0xe77c,@_); +} + +sub vsrlb { + confess(err("ARGNUM")) if ($#_!=2); + VRRc(0xe77d,@_); +} + +sub vs { + confess(err("ARGNUM")) if ($#_!=3); + VRRc(0xe7f7,@_); +} +sub vsb { + vs(@_,0); +} +sub vsh { + vs(@_,1); +} +sub vsf { + vs(@_,2); +} +sub vsg { + vs(@_,3); +} +sub vsq { + vs(@_,4); +} + +sub vscbi { + confess(err("ARGNUM")) if ($#_!=3); + VRRc(0xe7f5,@_); +} +sub vscbib { + vscbi(@_,0); +} +sub vscbih { + vscbi(@_,1); +} +sub vscbif { + vscbi(@_,2); +} +sub vscbig { + vscbi(@_,3); +} +sub vscbiq { + vscbi(@_,4); +} + +sub vsbi { + confess(err("ARGNUM")) if ($#_!=4); + VRRd(0xe7bf,@_); +} +sub vsbiq { + vsbi(@_,4); +} + +sub vsbcbi { + confess(err("ARGNUM")) if ($#_!=4); + VRRd(0xe7bd,@_); +} +sub vsbcbiq { + vsbcbi(@_,4); +} + +sub vsumg { + confess(err("ARGNUM")) if ($#_!=3); + VRRc(0xe765,@_); +} +sub vsumgh { + vsumg(@_,1); +} +sub vsumgf { + vsumg(@_,2); +} + +sub vsumq { + confess(err("ARGNUM")) if ($#_!=3); + VRRc(0xe767,@_); +} +sub vsumqf { + vsumq(@_,2); +} +sub vsumqg { + vsumq(@_,3); +} + +sub vsum { + confess(err("ARGNUM")) if ($#_!=3); + VRRc(0xe764,@_); +} +sub vsumb { + vsum(@_,0); +} +sub vsumh { + vsum(@_,1); +} + +sub vtm { + confess(err("ARGNUM")) if ($#_!=1); + VRRa(0xe7d8,@_); +} + +# VX - String Instructions + +sub vfae { + confess(err("ARGNUM")) if ($#_<3||$#_>4); + VRRb(0xe782,@_); +} +sub vfaeb { + vfae(@_[0..2],0,$_[3]); +} +sub vfaeh { + vfae(@_[0..2],1,$_[3]); +} +sub vfaef { + vfae(@_[0..2],2,$_[3]); +} +sub vfaebs { + $_[3]=0 if (!defined($_[3])); + vfae(@_[0..2],0,0x1|$_[3]); +} +sub vfaehs { + $_[3]=0 if (!defined($_[3])); + vfae(@_[0..2],1,0x1|$_[3]); +} +sub vfaefs { + $_[3]=0 if (!defined($_[3])); + vfae(@_[0..2],2,0x1|$_[3]); +} +sub vfaezb { + $_[3]=0 if (!defined($_[3])); + vfae(@_[0..2],0,0x2|$_[3]); +} +sub vfaezh { + $_[3]=0 if (!defined($_[3])); + vfae(@_[0..2],1,0x2|$_[3]); +} +sub vfaezf { + $_[3]=0 if (!defined($_[3])); + vfae(@_[0..2],2,0x2|$_[3]); +} +sub vfaezbs { + $_[3]=0 if (!defined($_[3])); + vfae(@_[0..2],0,0x3|$_[3]); +} +sub vfaezhs { + $_[3]=0 if (!defined($_[3])); + vfae(@_[0..2],1,0x3|$_[3]); +} +sub vfaezfs { + $_[3]=0 if (!defined($_[3])); + vfae(@_[0..2],2,0x3|$_[3]); +} + +sub vfee { + confess(err("ARGNUM")) if ($#_<3||$#_>4); + VRRb(0xe780,@_); +} +sub vfeeb { + vfee(@_[0..2],0,$_[3]); +} +sub vfeeh { + vfee(@_[0..2],1,$_[3]); +} +sub vfeef { + vfee(@_[0..2],2,$_[3]); +} +sub vfeebs { + vfee(@_,0,1); +} +sub vfeehs { + vfee(@_,1,1); +} +sub vfeefs { + vfee(@_,2,1); +} +sub vfeezb { + vfee(@_,0,2); +} +sub vfeezh { + vfee(@_,1,2); +} +sub vfeezf { + vfee(@_,2,2); +} +sub vfeezbs { + vfee(@_,0,3); +} +sub vfeezhs { + vfee(@_,1,3); +} +sub vfeezfs { + vfee(@_,2,3); +} + +sub vfene { + confess(err("ARGNUM")) if ($#_<3||$#_>4); + VRRb(0xe781,@_); +} +sub vfeneb { + vfene(@_[0..2],0,$_[3]); +} +sub vfeneh { + vfene(@_[0..2],1,$_[3]); +} +sub vfenef { + vfene(@_[0..2],2,$_[3]); +} +sub vfenebs { + vfene(@_,0,1); +} +sub vfenehs { + vfene(@_,1,1); +} +sub vfenefs { + vfene(@_,2,1); +} +sub vfenezb { + vfene(@_,0,2); +} +sub vfenezh { + vfene(@_,1,2); +} +sub vfenezf { + vfene(@_,2,2); +} +sub vfenezbs { + vfene(@_,0,3); +} +sub vfenezhs { + vfene(@_,1,3); +} +sub vfenezfs { + vfene(@_,2,3); +} + +sub vistr { + confess(err("ARGNUM")) if ($#_<2||$#_>3); + VRRa(0xe75c,@_[0..2],0,$_[3]); +} +sub vistrb { + vistr(@_[0..1],0,$_[2]); +} +sub vistrh { + vistr(@_[0..1],1,$_[2]); +} +sub vistrf { + vistr(@_[0..1],2,$_[2]); +} +sub vistrbs { + vistr(@_,0,1); +} +sub vistrhs { + vistr(@_,1,1); +} +sub vistrfs { + vistr(@_,2,1); +} + +sub vstrc { + confess(err("ARGNUM")) if ($#_<4||$#_>5); + VRRd(0xe78a,@_); +} +sub vstrcb { + vstrc(@_[0..3],0,$_[4]); +} +sub vstrch { + vstrc(@_[0..3],1,$_[4]); +} +sub vstrcf { + vstrc(@_[0..3],2,$_[4]); +} +sub vstrcbs { + $_[4]=0 if (!defined($_[4])); + vstrc(@_[0..3],0,0x1|$_[4]); +} +sub vstrchs { + $_[4]=0 if (!defined($_[4])); + vstrc(@_[0..3],1,0x1|$_[4]); +} +sub vstrcfs { + $_[4]=0 if (!defined($_[4])); + vstrc(@_[0..3],2,0x1|$_[4]); +} +sub vstrczb { + $_[4]=0 if (!defined($_[4])); + vstrc(@_[0..3],0,0x2|$_[4]); +} +sub vstrczh { + $_[4]=0 if (!defined($_[4])); + vstrc(@_[0..3],1,0x2|$_[4]); +} +sub vstrczf { + $_[4]=0 if (!defined($_[4])); + vstrc(@_[0..3],2,0x2|$_[4]); +} +sub vstrczbs { + $_[4]=0 if (!defined($_[4])); + vstrc(@_[0..3],0,0x3|$_[4]); +} +sub vstrczhs { + $_[4]=0 if (!defined($_[4])); + vstrc(@_[0..3],1,0x3|$_[4]); +} +sub vstrczfs { + $_[4]=0 if (!defined($_[4])); + vstrc(@_[0..3],2,0x3|$_[4]); +} + +# VX - Floating-point Instructions + +sub vfa { + confess(err("ARGNUM")) if ($#_!=4); + VRRc(0xe7e3,@_); +} +sub vfadb { + vfa(@_,3,0); +} +sub wfadb { + vfa(@_,3,8); +} + +sub wfc { + confess(err("ARGNUM")) if ($#_!=3); + VRRa(0xe7cb,@_); +} +sub wfcdb { + wfc(@_,3,0); +} + +sub wfk { + confess(err("ARGNUM")) if ($#_!=3); + VRRa(0xe7ca,@_); +} +sub wfksb { + wfk(@_,2,0); +} +sub wfkdb { + wfk(@_,3,0); +} +sub wfkxb { + wfk(@_,4,0); +} + +sub vfce { + confess(err("ARGNUM")) if ($#_!=5); + VRRc(0xe7e8,@_); +} +sub vfcedb { + vfce(@_,3,0,0); +} +sub vfcedbs { + vfce(@_,3,0,1); +} +sub wfcedb { + vfce(@_,3,8,0); +} +sub wfcedbs { + vfce(@_,3,8,1); +} + +sub vfch { + confess(err("ARGNUM")) if ($#_!=5); + VRRc(0xe7eb,@_); +} +sub vfchdb { + vfch(@_,3,0,0); +} +sub vfchdbs { + vfch(@_,3,0,1); +} +sub wfchdb { + vfch(@_,3,8,0); +} +sub wfchdbs { + vfch(@_,3,8,1); +} + +sub vfche { + confess(err("ARGNUM")) if ($#_!=5); + VRRc(0xe7ea,@_); +} +sub vfchedb { + vfche(@_,3,0,0); +} +sub vfchedbs { + vfche(@_,3,0,1); +} +sub wfchedb { + vfche(@_,3,8,0); +} +sub wfchedbs { + vfche(@_,3,8,1); +} + +sub vcdg { + confess(err("ARGNUM")) if ($#_!=4); + VRRa(0xe7c3,@_); +} +sub vcdgb { + vcdg(@_[0..1],3,@_[2..3]); +} +sub wcdgb { + vcdg(@_[0..1],3,0x8|$_[2],$_[3]); +} + +sub vcdlg { + confess(err("ARGNUM")) if ($#_!=4); + VRRa(0xe7c1,@_); +} +sub vcdlgb { + vcdlg(@_[0..1],3,@_[2..3]); +} +sub wcdlgb { + vcdlg(@_[0..1],3,0x8|$_[2],$_[3]); +} + +sub vcgd { + confess(err("ARGNUM")) if ($#_!=4); + VRRa(0xe7c2,@_); +} +sub vcgdb { + vcgd(@_[0..1],3,@_[2..3]); +} +sub wcgdb { + vcgd(@_[0..1],3,0x8|$_[2],$_[3]); +} + +sub vclgd { + confess(err("ARGNUM")) if ($#_!=4); + VRRa(0xe7c0,@_); +} +sub vclgdb { + vclgd(@_[0..1],3,@_[2..3]); +} +sub wclgdb { + vclgd(@_[0..1],3,0x8|$_[2],$_[3]); +} + +sub vfd { + confess(err("ARGNUM")) if ($#_!=4); + VRRc(0xe7e5,@_); +} +sub vfddb { + vfd(@_,3,0); +} +sub wfddb { + vfd(@_,3,8); +} + +sub vfi { + confess(err("ARGNUM")) if ($#_!=4); + VRRa(0xe7c7,@_); +} +sub vfidb { + vfi(@_[0..1],3,@_[2..3]); +} +sub wfidb { + vfi(@_[0..1],3,0x8|$_[2],$_[3]); +} + +sub vlde { # deprecated, use vfll + confess(err("ARGNUM")) if ($#_!=3); + VRRa(0xe7c4,@_); +} +sub vldeb { # deprecated, use vflls + vlde(@_,2,0); +} +sub wldeb { # deprecated, use wflls + vlde(@_,2,8); +} + +sub vled { # deprecated, use vflr + confess(err("ARGNUM")) if ($#_!=4); + VRRa(0xe7c5,@_); +} +sub vledb { # deprecated, use vflrd + vled(@_[0..1],3,@_[2..3]); +} +sub wledb { # deprecated, use wflrd + vled(@_[0..1],3,0x8|$_[2],$_[3]); +} + +sub vfm { + confess(err("ARGNUM")) if ($#_!=4); + VRRc(0xe7e7,@_); +} +sub vfmdb { + vfm(@_,3,0); +} +sub wfmdb { + vfm(@_,3,8); +} + +sub vfma { + confess(err("ARGNUM")) if ($#_!=5); + VRRe(0xe78f,@_); +} +sub vfmadb { + vfma(@_,0,3); +} +sub wfmadb { + vfma(@_,8,3); +} + +sub vfms { + confess(err("ARGNUM")) if ($#_!=5); + VRRe(0xe78e,@_); +} +sub vfmsdb { + vfms(@_,0,3); +} +sub wfmsdb { + vfms(@_,8,3); +} + +sub vfpso { + confess(err("ARGNUM")) if ($#_!=4); + VRRa(0xe7cc,@_); +} +sub vfpsodb { + vfpso(@_[0..1],3,0,$_[2]); +} +sub wfpsodb { + vfpso(@_[0..1],3,8,$_[2]); +} +sub vflcdb { + vfpso(@_,3,0,0); +} +sub wflcdb { + vfpso(@_,3,8,0); +} +sub vflndb { + vfpso(@_,3,0,1); +} +sub wflndb { + vfpso(@_,3,8,1); +} +sub vflpdb { + vfpso(@_,3,0,2); +} +sub wflpdb { + vfpso(@_,3,8,2); +} + +sub vfsq { + confess(err("ARGNUM")) if ($#_!=3); + VRRa(0xe7ce,@_); +} +sub vfsqdb { + vfsq(@_,3,0); +} +sub wfsqdb { + vfsq(@_,3,8); +} + +sub vfs { + confess(err("ARGNUM")) if ($#_!=4); + VRRc(0xe7e2,@_); +} +sub vfsdb { + vfs(@_,3,0); +} +sub wfsdb { + vfs(@_,3,8); +} + +sub vftci { + confess(err("ARGNUM")) if ($#_!=4); + VRIe(0xe74a,@_); +} +sub vftcidb { + vftci(@_,3,0); +} +sub wftcidb { + vftci(@_,3,8); +} + +# VXE - Support Instructions + +sub vbperm { + confess(err("ARGNUM")) if ($#_!=2); + VRRc(0xe785,@_); +} + +sub vllezlf { + vllez(@_,6); +} + +# VXE - Integer Instructions + +sub vmsl { + confess(err("ARGNUM")) if ($#_!=5); + VRRd(0xe7b8,@_); +} +sub vmslg { + vmsl(@_[0..3],3,$_[4]); +} + +sub vnx { + confess(err("ARGNUM")) if ($#_!=2); + VRRc(0xe76c,@_); +} + +sub vnn { + confess(err("ARGNUM")) if ($#_!=2); + VRRc(0xe76e,@_); +} + +sub voc { + confess(err("ARGNUM")) if ($#_!=2); + VRRc(0xe76f,@_); +} + +sub vpopctb { + vpopct(@_,0); +} +sub vpopcth { + vpopct(@_,1); +} +sub vpopctf { + vpopct(@_,2); +} +sub vpopctg { + vpopct(@_,3); +} + +# VXE - Floating-Point Instructions + +sub vfasb { + vfa(@_,2,0); +} +sub wfasb { + vfa(@_,2,8); +} +sub wfaxb { + vfa(@_,4,8); +} + +sub wfcsb { + wfc(@_,2,0); +} +sub wfcxb { + wfc(@_,4,0); +} + +sub vfcesb { + vfce(@_,2,0,0); +} +sub vfcesbs { + vfce(@_,2,0,1); +} +sub wfcesb { + vfce(@_,2,8,0); +} +sub wfcesbs { + vfce(@_,2,8,1); +} +sub wfcexb { + vfce(@_,4,8,0); +} +sub wfcexbs { + vfce(@_,4,8,1); +} + +sub vfchsb { + vfch(@_,2,0,0); +} +sub vfchsbs { + vfch(@_,2,0,1); +} +sub wfchsb { + vfch(@_,2,8,0); +} +sub wfchsbs { + vfch(@_,2,8,1); +} +sub wfchxb { + vfch(@_,4,8,0); +} +sub wfchxbs { + vfch(@_,4,8,1); +} + +sub vfchesb { + vfche(@_,2,0,0); +} +sub vfchesbs { + vfche(@_,2,0,1); +} +sub wfchesb { + vfche(@_,2,8,0); +} +sub wfchesbs { + vfche(@_,2,8,1); +} +sub wfchexb { + vfche(@_,4,8,0); +} +sub wfchexbs { + vfche(@_,4,8,1); +} + +sub vfdsb { + vfd(@_,2,0); +} +sub wfdsb { + vfd(@_,2,8); +} +sub wfdxb { + vfd(@_,4,8); +} + +sub vfisb { + vfi(@_[0..1],2,@_[2..3]); +} +sub wfisb { + vfi(@_[0..1],2,0x8|$_[2],$_[3]); +} +sub wfixb { + vfi(@_[0..1],4,0x8|$_[2],$_[3]); +} + +sub vfll { + vlde(@_); +} +sub vflls { + vfll(@_,2,0); +} +sub wflls { + vfll(@_,2,8); +} +sub wflld { + vfll(@_,3,8); +} + +sub vflr { + vled(@_); +} +sub vflrd { + vflr(@_[0..1],3,@_[2..3]); +} +sub wflrd { + vflr(@_[0..1],3,0x8|$_[2],$_[3]); +} +sub wflrx { + vflr(@_[0..1],4,0x8|$_[2],$_[3]); +} + +sub vfmax { + confess(err("ARGNUM")) if ($#_!=5); + VRRc(0xe7ef,@_); +} +sub vfmaxsb { + vfmax(@_[0..2],2,0,$_[3]); +} +sub vfmaxdb { + vfmax(@_[0..2],3,0,$_[3]); +} +sub wfmaxsb { + vfmax(@_[0..2],2,8,$_[3]); +} +sub wfmaxdb { + vfmax(@_[0..2],3,8,$_[3]); +} +sub wfmaxxb { + vfmax(@_[0..2],4,8,$_[3]); +} + +sub vfmin { + confess(err("ARGNUM")) if ($#_!=5); + VRRc(0xe7ee,@_); +} +sub vfminsb { + vfmin(@_[0..2],2,0,$_[5]); +} +sub vfmindb { + vfmin(@_[0..2],3,0,$_[5]); +} +sub wfminsb { + vfmin(@_[0..2],2,8,$_[5]); +} +sub wfmindb { + vfmin(@_[0..2],3,8,$_[5]); +} +sub wfminxb { + vfmin(@_[0..2],4,8,$_[5]); +} + +sub vfmsb { + vfm(@_,2,0); +} +sub wfmsb { + vfm(@_,2,8); +} +sub wfmxb { + vfm(@_,4,8); +} + +sub vfmasb { + vfma(@_,0,2); +} +sub wfmasb { + vfma(@_,8,2); +} +sub wfmaxb { + vfma(@_,8,4); +} + +sub vfmssb { + vfms(@_,0,2); +} +sub wfmssb { + vfms(@_,8,2); +} +sub wfmsxb { + vfms(@_,8,4); +} + +sub vfnma { + confess(err("ARGNUM")) if ($#_!=5); + VRRe(0xe79f,@_); +} +sub vfnmasb { + vfnma(@_,0,2); +} +sub vfnmadb { + vfnma(@_,0,3); +} +sub wfnmasb { + vfnma(@_,8,2); +} +sub wfnmadb { + vfnma(@_,8,3); +} +sub wfnmaxb { + vfnma(@_,8,4); +} + +sub vfnms { + confess(err("ARGNUM")) if ($#_!=5); + VRRe(0xe79e,@_); +} +sub vfnmssb { + vfnms(@_,0,2); +} +sub vfnmsdb { + vfnms(@_,0,3); +} +sub wfnmssb { + vfnms(@_,8,2); +} +sub wfnmsdb { + vfnms(@_,8,3); +} +sub wfnmsxb { + vfnms(@_,8,4); +} + +sub vfpsosb { + vfpso(@_[0..1],2,0,$_[2]); +} +sub wfpsosb { + vfpso(@_[0..1],2,8,$_[2]); +} +sub vflcsb { + vfpso(@_,2,0,0); +} +sub wflcsb { + vfpso(@_,2,8,0); +} +sub vflnsb { + vfpso(@_,2,0,1); +} +sub wflnsb { + vfpso(@_,2,8,1); +} +sub vflpsb { + vfpso(@_,2,0,2); +} +sub wflpsb { + vfpso(@_,2,8,2); +} +sub vfpsoxb { + vfpso(@_[0..1],4,0,$_[2]); +} +sub wfpsoxb { + vfpso(@_[0..1],4,8,$_[2]); +} +sub vflcxb { + vfpso(@_,4,0,0); +} +sub wflcxb { + vfpso(@_,4,8,0); +} +sub vflnxb { + vfpso(@_,4,0,1); +} +sub wflnxb { + vfpso(@_,4,8,1); +} +sub vflpxb { + vfpso(@_,4,0,2); +} +sub wflpxb { + vfpso(@_,4,8,2); +} + +sub vfsqsb { + vfsq(@_,2,0); +} +sub wfsqsb { + vfsq(@_,2,8); +} +sub wfsqxb { + vfsq(@_,4,8); +} + +sub vfssb { + vfs(@_,2,0); +} +sub wfssb { + vfs(@_,2,8); +} +sub wfsxb { + vfs(@_,4,8); +} + +sub vftcisb { + vftci(@_,2,0); +} +sub wftcisb { + vftci(@_,2,8); +} +sub wftcixb { + vftci(@_,4,8); +} + +# VXD - Support Instructions + +sub vlrlr { + confess(err("ARGNUM")) if ($#_!=2); + VRSd(0xe637,@_); +} + +sub vlrl { + confess(err("ARGNUM")) if ($#_!=2); + VSI(0xe635,@_); +} + +sub vstrlr { + confess(err("ARGNUM")) if ($#_!=2); + VRSd(0xe63f,@_); +} + +sub vstrl { + confess(err("ARGNUM")) if ($#_!=2); + VSI(0xe63d,@_); +} + +sub vap { + confess(err("ARGNUM")) if ($#_!=4); + VRIf(0xe671,@_); +} + +sub vcp { + confess(err("ARGNUM")) if ($#_!=2); + VRRh(0xe677,@_); +} + +sub vcvb { + confess(err("ARGNUM")) if ($#_!=2); + VRRi(0xe650,@_); +} + +sub vcvbg { + confess(err("ARGNUM")) if ($#_!=2); + VRRi(0xe652,@_); +} + +sub vcvd { + confess(err("ARGNUM")) if ($#_!=3); + VRIi(0xe658,@_); +} + +sub vcvdg { + confess(err("ARGNUM")) if ($#_!=3); + VRIi(0xe65a,@_); +} + +sub vdp { + confess(err("ARGNUM")) if ($#_!=4); + VRIf(0xe67a,@_); +} + +sub vlip { + confess(err("ARGNUM")) if ($#_!=2); + VRIh(0xe649,@_); +} + +sub vmp { + confess(err("ARGNUM")) if ($#_!=4); + VRIf(0xe678,@_); +} + +sub vmsp { + confess(err("ARGNUM")) if ($#_!=4); + VRIf(0xe679,@_); +} + +sub vpkz { + confess(err("ARGNUM")) if ($#_!=2); + VSI(0xe634,@_); +} + +sub vpsop { + confess(err("ARGNUM")) if ($#_!=4); + VRIg(0xe65b,@_); +} + +sub vrp { + confess(err("ARGNUM")) if ($#_!=4); + VRIf(0xe67b,@_); +} + +sub vsdp { + confess(err("ARGNUM")) if ($#_!=4); + VRIf(0xe67e,@_); +} + +sub vsrp { + confess(err("ARGNUM")) if ($#_!=4); + VRIg(0xe659,@_); +} + +sub vsp { + confess(err("ARGNUM")) if ($#_!=4); + VRIf(0xe673,@_); +} + +sub vtp { + confess(err("ARGNUM")) if ($#_!=0); + VRRg(0xe65f,@_); +} + +sub vupkz { + confess(err("ARGNUM")) if ($#_!=2); + VSI(0xe63c,@_); +} + +# +# Instruction Formats +# + +sub RRE { + confess(err("ARGNUM")) if ($#_<0||2<$#_); + my $ops=join(',',@_[1..$#_]); + my $memn=(caller(1))[3]; + $memn=~s/^.*:://; + my ($opcode,$r1,$r2)=(shift,get_R(shift),get_R(shift)); + + $out.="\t.long\t".sprintf("%#010x",($opcode<<16|$r1<<4|$r2)); + $out.="\t# $memn\t$ops\n" +} + +sub RRFb { + confess(err("ARGNUM")) if ($#_<3||4<$#_); + my $ops=join(',',@_[1..$#_]); + my $memn=(caller(1))[3]; + $memn=~s/^.*:://; + my ($opcode,$r1,$r3,$r2,$m4)=(shift,get_R(shift),get_R(shift) + ,get_R(shift),get_M(shift)); + + $out.="\t.long\t" + .sprintf("%#010x",($opcode<<16|$r3<<12|$m4<<8|$r1<<4|$r2)); + $out.="\t# $memn\t$ops\n" +} + +sub S { + confess(err("ARGNUM")) if ($#_<0||1<$#_); + my $ops=join(',',@_[1..$#_]); + my $memn=(caller(1))[3]; + $memn=~s/^.*:://; + my ($opcode,$d2,$b2)=(shift,get_DB(shift)); + + $out.="\t.long\t".sprintf("%#010x",($opcode<<16|$b2<<12|$d2)); + $out.="\t# $memn\t$ops\n" +} + +sub VRIa { + confess(err("ARGNUM")) if ($#_<2||3<$#_); + my $ops=join(',',@_[1..$#_]); + my $memn=(caller(1))[3]; + $memn=~s/^.*:://; + my ($opcode,$v1,$i2,$m3)=(shift,get_V(shift),get_I(shift,16), + get_M(shift)); + + $out.="\t.word\t"; + $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4)).","; + $out.=sprintf("%#06x",$i2).","; + $out.=sprintf("%#06x",($m3<<12|RXB($v1)<<8|$opcode&0xff)); + $out.="\t# $memn\t$ops\n" +} + +sub VRIb { + confess(err("ARGNUM")) if ($#_!=4); + my $ops=join(',',@_[1..$#_]); + my $memn=(caller(1))[3]; + $memn=~s/^.*:://; + my ($opcode,$v1,$i2,$i3,$m4)=(shift,get_V(shift),get_I(shift,8), + ,get_I(shift,8),get_M(shift)); + + $out.="\t.word\t"; + $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4)).","; + $out.=sprintf("%#06x",($i2<<8|$i3)).","; + $out.=sprintf("%#06x",($m4<<12|RXB($v1)<<8|$opcode&0xff)); + $out.="\t# $memn\t$ops\n" +} + +sub VRIc { + confess(err("ARGNUM")) if ($#_!=4); + my $ops=join(',',@_[1..$#_]); + my $memn=(caller(1))[3]; + $memn=~s/^.*:://; + my ($opcode,$v1,$v3,$i2,$m4)=(shift,get_V(shift),get_V(shift), + ,get_I(shift,16),get_M(shift)); + + $out.="\t.word\t"; + $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4)|($v3&0xf)).","; + $out.=sprintf("%#06x",$i2).","; + $out.=sprintf("%#06x",($m4<<12|RXB($v1,$v3)<<8|$opcode&0xff)); + $out.="\t# $memn\t$ops\n" +} + +sub VRId { + confess(err("ARGNUM")) if ($#_<4||$#_>5); + my $ops=join(',',@_[1..$#_]); + my $memn=(caller(1))[3]; + $memn=~s/^.*:://; + my ($opcode,$v1,$v2,$v3,$i4,$m5)=(shift,get_V(shift),get_V(shift), + ,get_V(shift),get_I(shift,8),get_M(shift)); + + $out.="\t.word\t"; + $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4)|($v2&0xf)).","; + $out.=sprintf("%#06x",(($v3&0xf)<<12|$i4)).","; + $out.=sprintf("%#06x",($m5<<12|RXB($v1,$v2,$v3)<<8|$opcode&0xff)); + $out.="\t# $memn\t$ops\n" +} + +sub VRIe { + confess(err("ARGNUM")) if ($#_!=5); + my $ops=join(',',@_[1..$#_]); + my $memn=(caller(1))[3]; + $memn=~s/^.*:://; + my ($opcode,$v1,$v2,$i3,$m4,$m5)=(shift,get_V(shift),get_V(shift), + ,get_I(shift,12),get_M(shift),get_M(shift)); + + $out.="\t.word\t"; + $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4)|($v2&0xf)).","; + $out.=sprintf("%#06x",($i3<<4|$m5)).","; + $out.=sprintf("%#06x",($m4<<12|RXB($v1,$v2)<<8|$opcode&0xff)); + $out.="\t# $memn\t$ops\n" +} + +sub VRIf { + confess(err("ARGNUM")) if ($#_!=5); + my $ops=join(',',@_[1..$#_]); + my $memn=(caller(1))[3]; + $memn=~s/^.*:://; + my ($opcode,$v1,$v2,$v3,$i4,$m5)=(shift,get_V(shift),get_V(shift), + ,get_V(shift),get_I(shift,8),get_M(shift)); + + $out.="\t.word\t"; + $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4)|($v2&0xf)).","; + $out.=sprintf("%#06x",(($v3&0xf)<<12|$m5<<4)|$i4>>4).","; + $out.=sprintf("%#06x",(($i4&0xf)<<12|RXB($v1,$v2,$v3)<<8|$opcode&0xff)); + $out.="\t# $memn\t$ops\n" +} + +sub VRIg { + confess(err("ARGNUM")) if ($#_!=5); + my $ops=join(',',@_[1..$#_]); + my $memn=(caller(1))[3]; + $memn=~s/^.*:://; + my ($opcode,$v1,$v2,$i3,$i4,$m5)=(shift,get_V(shift),get_V(shift), + ,get_I(shift,8),get_I(shift,8),get_M(shift)); + + $out.="\t.word\t"; + $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4)|($v2&0xf)).","; + $out.=sprintf("%#06x",($i4<<8|$m5<<4|$i3>>4)).","; + $out.=sprintf("%#06x",(($i3&0xf)<<12|RXB($v1,$v2)<<8|$opcode&0xff)); + $out.="\t# $memn\t$ops\n" +} + +sub VRIh { + confess(err("ARGNUM")) if ($#_!=3); + my $ops=join(',',@_[1..$#_]); + my $memn=(caller(1))[3]; + $memn=~s/^.*:://; + my ($opcode,$v1,$i2,$i3)=(shift,get_V(shift),get_I(shift,16), + get_I(shift,4)); + + $out.="\t.word\t"; + $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4)).","; + $out.=sprintf("%#06x",$i2).","; + $out.=sprintf("%#06x",($i3<<12|RXB($v1)<<8|$opcode&0xff)); + $out.="\t# $memn\t$ops\n" +} + +sub VRIi { + confess(err("ARGNUM")) if ($#_!=4); + my $ops=join(',',@_[1..$#_]); + my $memn=(caller(1))[3]; + $memn=~s/^.*:://; + my ($opcode,$v1,$r2,$i3,$m4)=(shift,get_V(shift),get_R(shift), + ,get_I(shift,8),get_M(shift)); + + $out.="\t.word\t"; + $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4)|$r2).","; + $out.=sprintf("%#06x",($m4<<4|$i3>>4)).","; + $out.=sprintf("%#06x",(($i3&0xf)<<12|RXB($v1)<<8|$opcode&0xff)); + $out.="\t# $memn\t$ops\n" +} + +sub VRRa { + confess(err("ARGNUM")) if ($#_<2||5<$#_); + my $ops=join(',',@_[1..$#_]); + my $memn=(caller(1))[3]; + $memn=~s/^.*:://; + my ($opcode,$v1,$v2,$m3,$m4,$m5)=(shift,get_V(shift),get_V(shift), + get_M(shift),get_M(shift),get_M(shift)); + + $out.="\t.word\t"; + $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|($v2&0xf))).","; + $out.=sprintf("%#06x",($m5<<4|$m4)).","; + $out.=sprintf("%#06x",($m3<<12|RXB($v1,$v2)<<8|$opcode&0xff)); + $out.="\t# $memn\t$ops\n" +} + +sub VRRb { + confess(err("ARGNUM")) if ($#_<3||5<$#_); + my $ops=join(',',@_[1..$#_]); + my $memn=(caller(1))[3]; + $memn=~s/^.*:://; + my ($opcode,$v1,$v2,$v3,$m4,$m5)=(shift,get_V(shift),get_V(shift), + get_V(shift),get_M(shift),get_M(shift)); + + $out.="\t.word\t"; + $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|($v2&0xf))).","; + $out.=sprintf("%#06x",(($v3&0xf)<<12|$m5<<4)).","; + $out.=sprintf("%#06x",($m4<<12|RXB($v1,$v2,$v3)<<8|$opcode&0xff)); + $out.="\t# $memn\t$ops\n" +} + +sub VRRc { + confess(err("ARGNUM")) if ($#_<3||6<$#_); + my $ops=join(',',@_[1..$#_]); + my $memn=(caller(1))[3]; + $memn=~s/^.*:://; + my ($opcode,$v1,$v2,$v3,$m4,$m5,$m6)=(shift,get_V(shift),get_V(shift), + get_V(shift),get_M(shift),get_M(shift),get_M(shift)); + + $out.="\t.word\t"; + $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|($v2&0xf))).","; + $out.=sprintf("%#06x",(($v3&0xf)<<12|$m6<<4|$m5)).","; + $out.=sprintf("%#06x",($m4<<12|RXB($v1,$v2,$v3)<<8|$opcode&0xff)); + $out.="\t# $memn\t$ops\n" +} + +sub VRRd { + confess(err("ARGNUM")) if ($#_<4||6<$#_); + my $ops=join(',',@_[1..$#_]); + my $memn=(caller(1))[3]; + $memn=~s/^.*:://; + my ($opcode,$v1,$v2,$v3,$v4,$m5,$m6)=(shift,get_V(shift),get_V(shift), + get_V(shift),get_V(shift),get_M(shift),get_M(shift)); + + $out.="\t.word\t"; + $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|($v2&0xf))).","; + $out.=sprintf("%#06x",(($v3&0xf)<<12|$m5<<8|$m6<<4)).","; + $out.=sprintf("%#06x",(($v4&0xf)<<12|RXB($v1,$v2,$v3,$v4)<<8|$opcode&0xff)); + $out.="\t# $memn\t$ops\n" +} + +sub VRRe { + confess(err("ARGNUM")) if ($#_<4||6<$#_); + my $ops=join(',',@_[1..$#_]); + my $memn=(caller(1))[3]; + $memn=~s/^.*:://; + my ($opcode,$v1,$v2,$v3,$v4,$m5,$m6)=(shift,get_V(shift),get_V(shift), + get_V(shift),get_V(shift),get_M(shift),get_M(shift)); + + $out.="\t.word\t"; + $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|($v2&0xf))).","; + $out.=sprintf("%#06x",(($v3&0xf)<<12|$m6<<8|$m5)).","; + $out.=sprintf("%#06x",(($v4&0xf)<<12|RXB($v1,$v2,$v3,$v4)<<8|$opcode&0xff)); + $out.="\t# $memn\t$ops\n" +} + +sub VRRf { + confess(err("ARGNUM")) if ($#_!=3); + my $ops=join(',',@_[1..$#_]); + my $memn=(caller(1))[3]; + $memn=~s/^.*:://; + my ($opcode,$v1,$r2,$r3)=(shift,get_V(shift),get_R(shift), + get_R(shift)); + + $out.="\t.word\t"; + $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|$r2)).","; + $out.=sprintf("%#06x",($r3<<12)).","; + $out.=sprintf("%#06x",(RXB($v1)<<8|$opcode&0xff)); + $out.="\t# $memn\t$ops\n" +} + +sub VRRg { + confess(err("ARGNUM")) if ($#_!=1); + my $ops=join(',',@_[1..$#_]); + my $memn=(caller(1))[3]; + $memn=~s/^.*:://; + my ($opcode,$v1)=(shift,get_V(shift)); + + $out.="\t.word\t"; + $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf))).","; + $out.=sprintf("%#06x",0x0000).","; + $out.=sprintf("%#06x",(RXB(0,$v1)<<8|$opcode&0xff)); + $out.="\t# $memn\t$ops\n" +} + +sub VRRh { + confess(err("ARGNUM")) if ($#_<2||$#_>3); + my $ops=join(',',@_[1..$#_]); + my $memn=(caller(1))[3]; + $memn=~s/^.*:://; + my ($opcode,$v1,$v2,$m3)=(shift,get_V(shift),get_V(shift), + get_M(shift)); + + $out.="\t.word\t"; + $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf))).","; + $out.=sprintf("%#06x",(($v2&0xf)<<12|$m3<<4)).","; + $out.=sprintf("%#06x",(RXB(0,$v1,$v2)<<8|$opcode&0xff)); + $out.="\t# $memn\t$ops\n" +} + +sub VRRi { + confess(err("ARGNUM")) if ($#_!=3); + my $ops=join(',',@_[1..$#_]); + my $memn=(caller(1))[3]; + $memn=~s/^.*:://; + my ($opcode,$r1,$v2,$m3)=(shift,get_R(shift),get_V(shift), + get_M(shift)); + + $out.="\t.word\t"; + $out.=sprintf("%#06x",($opcode&0xff00|$r1<<4|($v2&0xf))).","; + $out.=sprintf("%#06x",($m3<<4))."\,"; + $out.=sprintf("%#06x",(RXB(0,$v2)<<8|$opcode&0xff)); + $out.="\t# $memn\t$ops\n" +} + +sub VRSa { + confess(err("ARGNUM")) if ($#_<3||$#_>4); + my $ops=join(',',@_[1..$#_]); + my $memn=(caller(1))[3]; + $memn=~s/^.*:://; + my ($opcode,$v1,$v3,$d2,$b2,$m4)=(shift,get_V(shift),get_V(shift), + get_DB(shift),get_M(shift)); + + $out.="\t.word\t"; + $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|($v3&0xf))).","; + $out.=sprintf("%#06x",($b2<<12|$d2)).","; + $out.=sprintf("%#06x",($m4<<12|RXB($v1,$v3)<<8|$opcode&0xff)); + $out.="\t# $memn\t$ops\n" +} + +sub VRSb { + confess(err("ARGNUM")) if ($#_<3||$#_>4); + my $ops=join(',',@_[1..$#_]); + my $memn=(caller(1))[3]; + $memn=~s/^.*:://; + my ($opcode,$v1,$r3,$d2,$b2,$m4)=(shift,get_V(shift),get_R(shift), + get_DB(shift),get_M(shift)); + + $out.="\t.word\t"; + $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|$r3)).","; + $out.=sprintf("%#06x",($b2<<12|$d2)).","; + $out.=sprintf("%#06x",($m4<<12|RXB($v1)<<8|$opcode&0xff)); + $out.="\t# $memn\t$ops\n" +} + +sub VRSc { + confess(err("ARGNUM")) if ($#_!=4); + my $ops=join(',',@_[1..$#_]); + my $memn=(caller(1))[3]; + $memn=~s/^.*:://; + my ($opcode,$r1,$v3,$d2,$b2,$m4)=(shift,get_R(shift),get_V(shift), + get_DB(shift),get_M(shift)); + + $out.="\t.word\t"; + $out.=sprintf("%#06x",($opcode&0xff00|$r1<<4|($v3&0xf))).","; + $out.=sprintf("%#06x",($b2<<12|$d2)).","; + $out.=sprintf("%#06x",($m4<<12|RXB(0,$v3)<<8|$opcode&0xff)); + $out.="\t# $memn\t$ops\n" +} + +sub VRSd { + confess(err("ARGNUM")) if ($#_!=3); + my $ops=join(',',@_[1..$#_]); + my $memn=(caller(1))[3]; + $memn=~s/^.*:://; + my ($opcode,$v1,$r3,$d2,$b2)=(shift,get_V(shift),get_R(shift), + get_DB(shift)); + + $out.="\t.word\t"; + $out.=sprintf("%#06x",($opcode&0xff00|$r3)).","; + $out.=sprintf("%#06x",($b2<<12|$d2)).","; + $out.=sprintf("%#06x",(($v1&0xf)<<12|RXB(0,0,0,$v1)<<8|$opcode&0xff)); + $out.="\t# $memn\t$ops\n" +} + +sub VRV { + confess(err("ARGNUM")) if ($#_<2||$#_>3); + my $ops=join(',',@_[1..$#_]); + my $memn=(caller(1))[3]; + $memn=~s/^.*:://; + my ($opcode,$v1,$d2,$v2,$b2,$m3)=(shift,get_V(shift),get_DVB(shift), + get_M(shift)); + + $out.="\t.word\t"; + $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|($v2&0xf))).","; + $out.=sprintf("%#06x",($b2<<12|$d2)).","; + $out.=sprintf("%#06x",($m3<<12|RXB($v1,$v2)<<8|$opcode&0xff)); + $out.="\t# $memn\t$ops\n" +} + +sub VRX { + confess(err("ARGNUM")) if ($#_<2||$#_>3); + my $ops=join(',',@_[1..$#_]); + my $memn=(caller(1))[3]; + $memn=~s/^.*:://; + my ($opcode,$v1,$d2,$x2,$b2,$m3)=(shift,get_V(shift),get_DXB(shift), + get_M(shift)); + + $out.="\t.word\t"; + $out.=sprintf("%#06x",($opcode&0xff00|($v1&0xf)<<4|($x2))).","; + $out.=sprintf("%#06x",($b2<<12|$d2)).","; + $out.=sprintf("%#06x",($m3<<12|RXB($v1)<<8|$opcode&0xff)); + $out.="\t# $memn\t$ops\n" +} + +sub VSI { + confess(err("ARGNUM")) if ($#_!=3); + my $ops=join(',',@_[1..$#_]); + my $memn=(caller(1))[3]; + $memn=~s/^.*:://; + my ($opcode,$v1,$d2,$b2,$i3)=(shift,get_V(shift),get_DB(shift), + get_I(shift,8)); + + $out.="\t.word\t"; + $out.=sprintf("%#06x",($opcode&0xff00|$i3)).","; + $out.=sprintf("%#06x",($b2<<12|$d2)).","; + $out.=sprintf("%#06x",(($v1&0xf)<<12|RXB(0,0,0,$v1)<<8|$opcode&0xff)); + $out.="\t# $memn\t$ops\n" +} + +# +# Internal +# + +sub get_R { + confess(err("ARGNUM")) if ($#_!=0); + my $r; + + for (shift) { + if (!defined) { + $r=0; + } elsif (/^$GR$/) { + $r=$1; + } else { + confess(err("PARSE")); + } + } + confess(err("ARGRANGE")) if ($r&~0xf); + + return $r; +} + +sub get_V { + confess(err("ARGNUM")) if ($#_!=0); + my $v; + + for (shift) { + if (!defined) { + $v=0; + } elsif (/^$VR$/) { + $v=$1; + } else { + confess(err("PARSE")); + } + } + confess(err("ARGRANGE")) if ($v&~0x1f); + + return $v; +} + +sub get_I { + confess(err("ARGNUM")) if ($#_!=1); + my ($i,$bits)=(shift,shift); + + $i=defined($i)?(eval($i)):(0); + confess(err("PARSE")) if (!defined($i)); + confess(err("ARGRANGE")) if (abs($i)&~(2**$bits-1)); + + return $i&(2**$bits-1); +} + +sub get_M { + confess(err("ARGNUM")) if ($#_!=0); + my $m=shift; + + $m=defined($m)?(eval($m)):(0); + confess(err("PARSE")) if (!defined($m)); + confess(err("ARGRANGE")) if ($m&~0xf); + + return $m; +} + +sub get_DB +{ + confess(err("ARGNUM")) if ($#_!=0); + my ($d,$b); + + for (shift) { + if (!defined) { + ($d,$b)=(0,0); + } elsif (/^(.+)\($GR\)$/) { + ($d,$b)=(eval($1),$2); + confess(err("PARSE")) if (!defined($d)); + } elsif (/^(.+)$/) { + ($d,$b)=(eval($1),0); + confess(err("PARSE")) if (!defined($d)); + } else { + confess(err("PARSE")); + } + } + confess(err("ARGRANGE")) if ($d&~0xfff||$b&~0xf); + + return ($d,$b); +} + +sub get_DVB +{ + confess(err("ARGNUM")) if ($#_!=0); + my ($d,$v,$b); + + for (shift) { + if (!defined) { + ($d,$v,$b)=(0,0,0); + } elsif (/^(.+)\($VR,$GR\)$/) { + ($d,$v,$b)=(eval($1),$2,$3); + confess(err("PARSE")) if (!defined($d)); + } elsif (/^(.+)\($GR\)$/) { + ($d,$v,$b)=(eval($1),0,$2); + confess(err("PARSE")) if (!defined($d)); + } elsif (/^(.+)$/) { + ($d,$v,$b)=(eval($1),0,0); + confess(err("PARSE")) if (!defined($d)); + } else { + confess(err("PARSE")); + } + } + confess(err("ARGRANGE")) if ($d&~0xfff||$v&~0x1f||$b&~0xf); + + return ($d,$v,$b); +} + +sub get_DXB +{ + confess(err("ARGNUM")) if ($#_!=0); + my ($d,$x,$b); + + for (shift) { + if (!defined) { + ($d,$x,$b)=(0,0,0); + } elsif (/^(.+)\($GR,$GR\)$/) { + ($d,$x,$b)=(eval($1),$2,$3); + confess(err("PARSE")) if (!defined($d)); + } elsif (/^(.+)\($GR\)$/) { + ($d,$x,$b)=(eval($1),0,$2); + confess(err("PARSE")) if (!defined($d)); + } elsif (/^(.+)$/) { + ($d,$x,$b)=(eval($1),0,0); + confess(err("PARSE")) if (!defined($d)); + } else { + confess(err("PARSE")); + } + } + confess(err("ARGRANGE")) if ($d&~0xfff||$x&~0xf||$b&~0xf); + + return ($d,$x,$b); +} + +sub RXB +{ + confess(err("ARGNUM")) if ($#_<0||3<$#_); + my $rxb=0; + + $rxb|=0x08 if (defined($_[0])&&($_[0]&0x10)); + $rxb|=0x04 if (defined($_[1])&&($_[1]&0x10)); + $rxb|=0x02 if (defined($_[2])&&($_[2]&0x10)); + $rxb|=0x01 if (defined($_[3])&&($_[3]&0x10)); + + return $rxb; +} + +sub err { + my %ERR = + ( + ARGNUM => 'Wrong number of arguments', + ARGRANGE=> 'Argument out of range', + PARSE => 'Parse error', + ); + confess($ERR{ARGNUM}) if ($#_!=0); + + return $ERR{$_[0]}; +} + +1;