12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261 |
- MODULE FoxArrayBase; (* stubs for array base runtime - can only be compiled by oc compiler *)
- (* (c) fof, fn, ETH Zürich, 2008 *)
- (*! do do: MAX(array,scalar) and MAX(array,array) for all datatypes*)
- IMPORT SYSTEM, KernelLog, Heaps, Math, MathL;
- TYPE
-
- GenericUnaryAALoopS = PROCEDURE ( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: SHORTINT): SHORTINT );
- GenericUnaryAALoopI = PROCEDURE ( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: INTEGER): INTEGER );
- GenericUnaryAALoopL = PROCEDURE ( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: LONGINT): LONGINT );
- GenericUnaryAALoopH = PROCEDURE ( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: HUGEINT): HUGEINT );
- GenericUnaryAALoopR = PROCEDURE ( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: REAL): REAL );
- GenericUnaryAALoopX = PROCEDURE ( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: LONGREAL): LONGREAL );
- GenericUnaryAALoopZ = PROCEDURE ( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: COMPLEX): COMPLEX );
- GenericUnaryAALoopLZ = PROCEDURE ( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: LONGCOMPLEX): LONGCOMPLEX );
- UnaryAALoop = PROCEDURE ( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- UnaryASLoop = PROCEDURE ( ladr, dadr: ADDRESS; linc, len: SIZE );
- UnarySALoop = PROCEDURE ( ladr, dadr: ADDRESS; dinc, len: SIZE );
- BinaryAAALoop = PROCEDURE ( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- BinaryASALoop = PROCEDURE ( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- BinaryAASLoop = PROCEDURE ( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- BinaryAABLoop = PROCEDURE ( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- BinaryASBLoop = PROCEDURE ( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- CONST
- debug = FALSE; (* warning: debug=true -> a lot of output is generated -> traps are not displayed in Oberon (Kernel overflow) *)
- statistics= FALSE;
- conservative=TRUE;
- ArrDataArrayOffset=ADDRESS(16); (* offset of data in array with pointers *)
- AddressSize=SIZEOF(ADDRESS);
- MathPtrOffset=0*AddressSize;
- MathAdrOffset=1*AddressSize;
- MathFlagsOffset=2*AddressSize;
- MathDimOffset=3*AddressSize;
- MathElementSizeOffset=4*AddressSize;
- MathLenOffset=5*AddressSize;
- MathIncrOffset=6*AddressSize;
- GeometryMismatch = 400;
- DimensionMismatch=401;
- AllocationForbidden=402;
-
- ArrayAlignment=8;
- TensorFlag = 0; RangeFlag = 1; TemporaryFlag = 2;
- down = 0; up = 1; (* memory copy modes *)
- (* flags for optimizations with small matricies and vectors (Alexey Morozov) *)
- SmallMatrixFlag = 3; (* flag for identification of a small matrix *)
- SmallVectorFlag = 3; (* flag for identification of a small vector *)
- Size2Flag = 4; (* size = 2 *)
- Size3Flag = 5; (* size = 3 *)
- Size4Flag = 6; (* size = 4 *)
- Size5Flag = 7; (* size = 5 *)
- Size6Flag = 8; (* size = 6 *)
- Size7Flag = 9; (* size = 7 *)
- Size8Flag = 10; (* size = 8 *)
- Mat2x2 = SYSTEM.VAL(LONGINT,{SmallMatrixFlag,Size2Flag});
- Mat3x3 = SYSTEM.VAL(LONGINT,{SmallMatrixFlag,Size3Flag});
- Mat4x4 = SYSTEM.VAL(LONGINT,{SmallMatrixFlag,Size4Flag});
- Mat5x5 = SYSTEM.VAL(LONGINT,{SmallMatrixFlag,Size5Flag});
- Mat6x6 = SYSTEM.VAL(LONGINT,{SmallMatrixFlag,Size6Flag});
- Mat7x7 = SYSTEM.VAL(LONGINT,{SmallMatrixFlag,Size7Flag});
- Mat8x8 = SYSTEM.VAL(LONGINT,{SmallMatrixFlag,Size8Flag});
- Vec2 = SYSTEM.VAL(LONGINT,{SmallVectorFlag,Size2Flag});
- Vec3 = SYSTEM.VAL(LONGINT,{SmallVectorFlag,Size3Flag});
- Vec4 = SYSTEM.VAL(LONGINT,{SmallVectorFlag,Size4Flag});
- Vec5 = SYSTEM.VAL(LONGINT,{SmallVectorFlag,Size5Flag});
- Vec6 = SYSTEM.VAL(LONGINT,{SmallVectorFlag,Size6Flag});
- Vec7 = SYSTEM.VAL(LONGINT,{SmallVectorFlag,Size7Flag});
- Vec8 = SYSTEM.VAL(LONGINT,{SmallVectorFlag,Size8Flag});
- MatVec2x2 = SYSTEM.VAL(LONGINT,{SmallMatrixFlag,SmallVectorFlag,Size2Flag});
- MatVec3x3 = SYSTEM.VAL(LONGINT,{SmallMatrixFlag,SmallVectorFlag,Size3Flag});
- MatVec4x4 = SYSTEM.VAL(LONGINT,{SmallMatrixFlag,SmallVectorFlag,Size4Flag});
- MatVec5x5 = SYSTEM.VAL(LONGINT,{SmallMatrixFlag,SmallVectorFlag,Size5Flag});
- MatVec6x6 = SYSTEM.VAL(LONGINT,{SmallMatrixFlag,SmallVectorFlag,Size6Flag});
- MatVec7x7 = SYSTEM.VAL(LONGINT,{SmallMatrixFlag,SmallVectorFlag,Size7Flag});
- MatVec8x8 = SYSTEM.VAL(LONGINT,{SmallMatrixFlag,SmallVectorFlag,Size8Flag});
- SmallArrayMask = {SmallMatrixFlag,SmallVectorFlag,Size2Flag,Size3Flag,Size4Flag,Size5Flag,Size6Flag,Size7Flag,Size8Flag};
- TYPE
- FastMatMul* = PROCEDURE ( matrixA, matrixB, matrixC: ADDRESS; IncA, StrideA, IncB, StrideB, IncC, StrideC, RowsA, ColsA, RowsB, ColsB: SIZE ): BOOLEAN;
- TransposeP* = PROCEDURE ( ladr, dadr: ADDRESS; lstride, linc, dstride, dinc, rows, cols:SIZE );
- LenInc* = RECORD
- len*: SIZE;
- inc*: SIZE
- END;
- ArrayDescriptor*= RECORD
- ptr*: ANY;
- adr*: ADDRESS;
- flags*: SET;
- dim*: SIZE;
- elementSize*: SIZE;
- END;
-
- Tensor = POINTER TO ArrayDescriptor;
-
- UnsafeArray*= POINTER {UNSAFE,UNTRACED} TO RECORD(ArrayDescriptor)
- lens*: ARRAY 8 OF LenInc;
- END;
-
- A0 = RECORD(ArrayDescriptor) END;
- A1 = RECORD(ArrayDescriptor) lens : ARRAY 1 OF LenInc; END;
- A2 = RECORD(ArrayDescriptor) lens : ARRAY 2 OF LenInc; END;
- A3 = RECORD(ArrayDescriptor) lens : ARRAY 3 OF LenInc; END;
- A4 = RECORD(ArrayDescriptor) lens : ARRAY 4 OF LenInc; END;
- A5 = RECORD(ArrayDescriptor) lens : ARRAY 5 OF LenInc; END;
- A6 = RECORD(ArrayDescriptor) lens : ARRAY 6 OF LenInc; END;
- A7 = RECORD(ArrayDescriptor) lens : ARRAY 7 OF LenInc; END;
- A8 = RECORD(ArrayDescriptor) lens : ARRAY 8 OF LenInc; END;
-
- T0 = POINTER TO A0;
- T1 = POINTER TO A1;
- T2 = POINTER TO A2;
- T3 = POINTER TO A3;
- T4 = POINTER TO A4;
- T5 = POINTER TO A5;
- T6 = POINTER TO A6;
- T7 = POINTER TO A7;
- T8 = POINTER TO A8;
-
- (* used for optimizations of MatMul with small sizes (Alexey Morozov) *)
- SmallMatMul* = PROCEDURE(dadr, ladr, radr: ADDRESS);
-
-
- VAR
- temporary*: T0;
- alloc*: LONGINT; (* statistics *)
- allocTemp*: LONGINT; (* statistics *)
- (* procedures that might be replaced by ASM methods *)
- loopSPAXAX*, loopSPARAR*: BinaryAASLoop;
- loopSPAZAZ, loopSPALZALZ: BinaryAASLoop;
- loopAddAXAX*, loopAddARAR*, loopAddAZAZ*, loopAddALZALZ*: BinaryAAALoop;
- loopMatMulAXAX*, loopMatMulARAR*: BinaryAASLoop;
- loopMatMulIncAXAX*, loopMatMulIncARAR*: BinaryAASLoop;
- loopMulAXSX*, loopMulARSR*, loopMulAZSZ*, loopMulALZSLZ*: BinaryASALoop;
- loopIncMulAXSX*, loopIncMulARSR*: BinaryASALoop;
- matMulX*, matMulR*: FastMatMul; matMulIncX*, matMulIncR*: FastMatMul;
- transpose4*: TransposeP; transpose8*: TransposeP;
- (* optimizations for small arrays (Alexey Morozov) *)
- matMulR2x2*: SmallMatMul;
- matMulR3x3*: SmallMatMul;
- matMulR4x4*: SmallMatMul;
- matVecMulR2x2*: SmallMatMul;
- matVecMulR3x3*: SmallMatMul;
- matVecMulR4x4*: SmallMatMul;
- matMulLR2x2*: SmallMatMul;
- matMulLR3x3*: SmallMatMul;
- matMulLR4x4*: SmallMatMul;
- matVecMulLR2x2*: SmallMatMul;
- matVecMulLR3x3*: SmallMatMul;
- matVecMulLR4x4*: SmallMatMul;
- (*
- TensorTypePool: ARRAY 32 OF TensorType;
- *)
- PROCEDURE SetDefaults*; (* set standard procedures *)
- BEGIN
- KernelLog.String( "ArrayBase XXXXXXX: setting runtime library (semi-optimized) default methods." ); KernelLog.Ln; loopSPAXAX := SPAXAXLoop;
- loopSPARAR := SPARARLoop; loopAddAXAX := AddAXAXLoop;
- loopSPAZAZ := SPAZAZLoop; loopSPALZALZ := SPALZALZLoop;
- loopAddARAR := AddARARLoop; loopMatMulAXAX := MatMulAXAXLoop;
- loopAddAZAZ := AddAZAZLoop; loopAddALZALZ := AddALZALZLoop;
- loopMatMulIncAXAX := MatMulIncAXAXLoop;
- loopMatMulARAR := MatMulARARLoop; loopMulAXSX := MulAXSXLoop;
- loopIncMulAXSX := IncMulAXSXLoop;
- loopMatMulIncARAR := MatMulIncARARLoop;
- loopMulARSR := MulARSRLoop; loopIncMulARSR := IncMulARSRLoop;
- matMulX := NIL; matMulR := NIL; matMulIncX := NIL; matMulIncR := NIL;
- loopMulAZSZ := MulAZSZLoop;
- loopMulALZSLZ := MulALZSLZLoop;
- END SetDefaults;
- PROCEDURE Err(CONST s: ARRAY OF CHAR );
- BEGIN
- KernelLog.String( "Runtime Error: " ); KernelLog.String( s ); KernelLog.Ln; HALT( 100 );
- END Err;
- (* get increment of dimension dim *)
- PROCEDURE GetIncr(base: UnsafeArray; dim: SIZE): SIZE;
- BEGIN{UNCHECKED}
- RETURN base.lens[dim].inc
- END GetIncr;
- (* set increment of dimension dim *)
- PROCEDURE PutInc(base: UnsafeArray; dim,val: SIZE);
- BEGIN{UNCHECKED}
- base.lens[dim].inc := val
- END PutInc;
- (* get length of dimension dim *)
- PROCEDURE GetLen(base: UnsafeArray; dim: SIZE): SIZE;
- BEGIN{UNCHECKED}
- RETURN base.lens[dim].len
- END GetLen;
- (* set length of dimension dim *)
- PROCEDURE PutLen(base: UnsafeArray; dim,val: SIZE);
- BEGIN{UNCHECKED}
- base.lens[dim].len := val
- END PutLen;
- (* get data address *)
- PROCEDURE GetAdr(base: UnsafeArray): ADDRESS;
- BEGIN
- RETURN base.adr;
- END GetAdr;
- (* set data address *)
- PROCEDURE PutAdr(base: UnsafeArray; value: ADDRESS);
- BEGIN
- base.adr := value
- END PutAdr;
-
- PROCEDURE Align(value: ADDRESS): ADDRESS;
- BEGIN RETURN value + (-value) MOD ArrayAlignment;
- END Align;
-
- (* get data base pointer (GC protection) *)
- PROCEDURE GetPtr(base: UnsafeArray): ANY;
- BEGIN
- RETURN base.ptr;
- END GetPtr;
- PROCEDURE SafePut(VAR dest: ANY; src: ANY);
- BEGIN
- dest := src;
- END SafePut;
-
- (* set data base pointer (GC protection) *)
- PROCEDURE PutPtr(base: UnsafeArray; value: ANY);
- BEGIN
- SafePut(base.ptr,value);
- END PutPtr;
- PROCEDURE GetSize( base: UnsafeArray ): SIZE;
- BEGIN
- IF base = NIL THEN RETURN 0 ELSE RETURN base.elementSize END
- END GetSize;
- PROCEDURE PutSize( base: UnsafeArray; val: SIZE );
- BEGIN
- base.elementSize := val
- END PutSize;
- PROCEDURE GetDim( base: UnsafeArray ): SIZE;
- VAR dim: SIZE;
- BEGIN
- IF base = 0 THEN RETURN 0 ELSE RETURN base.dim END;
- END GetDim;
- PROCEDURE GetFlags( base: UnsafeArray ): SET;
- BEGIN
- IF base = 0 THEN RETURN {} ELSE RETURN base.flags END;
- END GetFlags;
- PROCEDURE PutDim( base: UnsafeArray; dim: SIZE );
- BEGIN
- base.dim := dim
- END PutDim;
- PROCEDURE PutFlags( base: UnsafeArray; flags: SET );
- BEGIN
- base.flags := flags
- END PutFlags;
- (* report geometry of array passed via address s *)
- PROCEDURE Report(CONST name: ARRAY OF CHAR; s: ADDRESS );
- VAR i: SIZE; dim: SIZE;
- PROCEDURE Set( s: SET );
- VAR i: SIZE; first: BOOLEAN;
- BEGIN
- KernelLog.String( "{" ); first := TRUE;
- FOR i := 31 TO 0 BY -1 DO
- IF i IN s THEN
- IF ~first THEN KernelLog.String( "," ); ELSE first := FALSE END;
- KernelLog.Int( i, 1 );
- END;
- END;
- KernelLog.String( "}" );
- END Set;
- BEGIN
- KernelLog.String( name );
- IF s = 0 THEN KernelLog.String( " : NIL " ); KernelLog.Ln;
- ELSE
- KernelLog.String( " at adr " ); KernelLog.Int( s, 1 ); KernelLog.String( "; ptr= " );
- KernelLog.Address( GetPtr( s )); KernelLog.String( "; adr= " );
- KernelLog.Address( GetAdr( s )); KernelLog.String( "; dim=" );
- KernelLog.Int( GetDim( s ), 1 ); KernelLog.String( "; flags=" ); Set( GetFlags( s ) );
- KernelLog.Ln; dim := GetDim( s );
- IF dim > 32 THEN dim := 0 END;
- FOR i := 0 TO dim - 1 DO
- KernelLog.String( "dim (rev)=" ); KernelLog.Int( i, 1 ); KernelLog.String( ", len=" );
- KernelLog.Int( GetLen( s, i ), 1 ); KernelLog.String( ", inc=" );
- KernelLog.Int( GetIncr( s, i ), 1 ); KernelLog.Ln;
- END;
- (*
- FindPattern1( s, dim, ldim, len, inc ); KernelLog.String( "increment: " );
- KernelLog.Int( inc, 10 ); KernelLog.Ln; KernelLog.String( "longest dim:" ); KernelLog.Int( ldim, 10 );
- KernelLog.Ln; KernelLog.String( "len:" ); KernelLog.Int( len, 10 ); KernelLog.Ln;
- *)
- END;
- END Report;
- PROCEDURE GetArrayDesc( dim: SIZE ): Tensor;
- VAR (* t: TensorType; *) ptr: Tensor;
- p0: T0;
- p1: T1; p2: T2; p3: T3; p4: T4; p5: T5; p6: T6; p7: T7; p8: T8;
- BEGIN
- CASE dim OF
- |0: NEW(p0); ptr := p0;
- |1:NEW(p1); ptr := p1;
- |2:NEW(p2); ptr := p2;
- |3:NEW(p3); ptr := p3;
- |4:NEW(p4); ptr := p4;
- |5:NEW(p5); ptr := p5;
- |6:NEW(p6); ptr := p6;
- |7:NEW(p7); ptr := p7;
- |8:NEW(p8); ptr := p8;
- ELSE
- HALT(200)
- END;
-
- ptr.dim := dim;
- ptr.flags := {TensorFlag};
- RETURN ptr;
- END GetArrayDesc;
-
- PROCEDURE EnsureArrayDesc*(dim: SIZE; VAR d: Tensor);
- BEGIN
- IF d = NIL THEN
- d := GetArrayDesc(dim);
- ELSIF d.dim # dim THEN
- IF ~(TensorFlag IN d.flags) &
- ~(TemporaryFlag IN d.flags) THEN (* no, not allowed*)
- HALT( 100 );
- END;
- d := GetArrayDesc(dim)
- (* ELSE keep as is *)
- END;
- END EnsureArrayDesc;
-
- PROCEDURE Halt( code: SIZE; left, right, dest: ADDRESS );
- VAR reason: ARRAY 64 OF CHAR;
- BEGIN
- IF left # 0 THEN Report( "Source operand ", left ) END;
- IF right # 0 THEN Report( "Source operand 2 ", right ) END;
- IF dest # 0 THEN Report( "Dest operand ", dest ) END;
- IF code = GeometryMismatch THEN reason := "Geometry mismatch";
- ELSIF code = DimensionMismatch THEN reason := "Dimension mismatch";
- ELSIF code = AllocationForbidden THEN reason := "Allocation forbidden for dest";
- ELSE reason := "unknown";
- END;
- KernelLog.String( "ArrayBase Halt. Reason= " ); KernelLog.String( reason ); KernelLog.Ln;
- HALT( 400 );
- END Halt;
- (** patterns ********************************************************************)
- (* find the largest block with a regular pattern of the form offset+{i*li: 0<=i<len}. d is dimension applying to the resulting loop *)
- PROCEDURE FindPattern1( left, dim: ADDRESS; VAR d, len, linc: SIZE );
- BEGIN
- d := dim - 1; len := GetLen( left, d );
- WHILE (len = 1) & (d > 0) DO DEC( d ); len := GetLen( left, d );
- END; (* skip lower dimensions with len=1, in most cases d=0 *)
- linc := GetIncr( left, d ); DEC( d );
- WHILE (d >= 0) & (GetIncr( left, d ) = len * linc) DO
- len := len * GetLen( left, d ); DEC( d );
- END; (* find dimension where pattern does not work any more *)
- INC( d );
- IF debug THEN
- KernelLog.String( "FindPattern1: " ); KernelLog.Int( len, 10 ); KernelLog.Int( linc, 10 );
- KernelLog.Ln;
- END;
- END FindPattern1;
- (* find the largest block with a regular pattern of the form offset+{i*linc: 0<=i<len} for two arrays simultaneously. d is dimension applying to the resulting loop *)
- PROCEDURE FindPattern2( left, right: ADDRESS; dim: SIZE;
- VAR d, len, linc, ri: SIZE );
- (* geometric precondition: lengths must coincide *)
- BEGIN
- d := dim - 1; len := GetLen( left, d ); ASSERT( len = GetLen( right, d ) );
- WHILE (len = 1) & (d > 0) DO DEC( d ); len := GetLen( left, d ); END;
- linc := GetIncr( left, d ); ri := GetIncr( right, d ); DEC( d );
- WHILE (d >= 0) & (GetIncr( left, d ) = len * linc) & (GetIncr( right, d ) = len * ri) DO
- len := len * GetLen( left, d ); DEC( d );
- END;
- INC( d );
- IF debug THEN
- KernelLog.String( "FindPattern2: " ); KernelLog.Int( d, 10 ); KernelLog.Int( len, 10 );
- KernelLog.Int( linc, 10 ); KernelLog.Int( ri, 10 ); KernelLog.Ln;
- END;
- END FindPattern2;
- (* find the largest block with a regular pattern of the form offset+{i*linc: 0<=i<len} for three arrays simultaneously. d is dimension applying to the resulting loop *)
- PROCEDURE FindPattern3( left, right, dest: ADDRESS; dim: SIZE;
- VAR d, len, linc, ri, di: SIZE );
- (* geometric precondition: lengths must coincide *)
- BEGIN
- d := dim - 1; len := GetLen( left, d );
- WHILE (len = 1) & (d > 0) DO DEC( d ); len := GetLen( left, d );
- END;
- linc := GetIncr( left, d ); ri := GetIncr( right, d ); di := GetIncr( dest, d );
- DEC( d );
- WHILE (d >= 0) & (GetIncr( left, d ) = len * linc) &
- (GetIncr( right, d ) = len * ri) & (GetIncr( dest, d ) = len * di) DO
- len := len * GetLen( left, d ); DEC( d );
- END;
- INC( d );
- IF debug THEN
- KernelLog.String( "FindPattern3: " ); KernelLog.Int( len, 10 ); KernelLog.Int( linc, 10 );
- KernelLog.Int( ri, 10 ); KernelLog.Int( di, 10 ); KernelLog.Ln;
- END;
- END FindPattern3;
- PROCEDURE Reverse( src: ADDRESS; dim: SIZE );
- VAR d, sl, sr: SIZE;
- BEGIN
- d := 0; sl := GetAdr( src );
- WHILE (d < dim) DO
- INC( sr, GetIncr( src, d ) * (GetLen( src, d ) - 1) );
- PutInc( src, d, -GetIncr( src, d ) ); INC( d );
- END;
- PutAdr( src, sl + sr );
- END Reverse;
- (* check if forward copy may be performed *)
- PROCEDURE CopyUpCompatible( dest, src: ADDRESS; VAR modes: SET );
- VAR d, sl, sr, dl, dr: SIZE; dim: SIZE;
- (* precondition: len(src,i)=len(dest,i) *)
- (* for forward src -> dest copy compatibility src must not be overwritten before src is copied.
- Sufficient (but not necessary) conditions:
- 1.) no overlap: src right < dest left or src left > dest right or
- 2.) same geometry and src left >= dest left
- same geometry if ginc(s)=ginc(d) with
- ginc(s)=inc(s,0)*len(s,0)+inc(s,1)*len(s,1)+...
- ginc(d)=inc(d,0)*len(d,0)+inc(d,1)*len(d,1)+...
- *)
- BEGIN
- d := 0; sl := GetAdr( src ); sr := sl; dl := GetAdr( dest ); dr := dl;
- dim := GetDim( src );
- WHILE (d < dim) DO
- INC( sr, GetIncr( src, d ) * (GetLen( src, d ) - 1) );
- INC( dr, GetIncr( dest, d ) * (GetLen( dest, d ) - 1) ); INC( d );
- END;
- IF (sr < dl) OR (sl > dr) THEN (* no overlap, both directions possible *)
- ELSIF ((sr - sl) = (dr - dl)) THEN
- IF (sl = dl) THEN (* same memory region, both directions possible *)
- ELSIF (sl > dl) THEN
- EXCL( modes, down ) (* only copy up possible *)
- ELSE (*sl < dl*)
- EXCL( modes, up ) (* only copy down possible *)
- END;
- ELSE
- modes := modes - {down, up}; (* neither nor *)
- END;
- END CopyUpCompatible;
- PROCEDURE AllocateTemp( VAR dest: ADDRESS; src: ADDRESS;
- Size: SIZE ): ANY;
- (* allocate a temporary block containing both descriptor and data *)
- VAR d, len, i: SIZE; p: ANY; dim: SIZE;
- BEGIN
- HALT(100);
- (*
- IF statistics THEN INC( allocTemp ) END;
- d := 0; len := Size; dim := GetDim( src );
- WHILE (d < dim) DO len := len * GetLen( src, d ); INC( d ); END;
- INC( len, 2 * dim * SIZEOF( SIZE ) + MathLenOffset ); SYSTEM.NEW( p, len );
- dest := SYSTEM.VAL( SIZE, p );
- PutAdr( dest, dest + dim * 2 * SIZEOF( SIZE ) + MathLenOffset );
- PutPtr( dest, dest ); PutDim( dest, dim ); len := Size;
- FOR i := 0 TO dim - 1 DO
- PutInc( dest, i, len ); PutLen( dest, i, GetLen( src, i ) );
- len := len * GetLen( src, i );
- END;
- (* Report("allocdest",dest,dim); *)
- RETURN p;
- *)
- END AllocateTemp;
-
- (*** procedures to traverse arrays and apply operators *)
-
- (** apply unary operator to array: array SHORTINT -> array SHORTINT *)
- PROCEDURE ApplyGenericUnaryAAOpS( d, l: ADDRESS; elementSize: SIZE; Loop: GenericUnaryAALoopS; op: PROCEDURE(x: SHORTINT): SHORTINT );
- VAR loopd, looplen, loopli, loopdi: SIZE; p: ANY; glen: SIZE;
- origdest: ADDRESS; modes: SET;
- dest, left: ADDRESS; dim: SIZE;
-
- PROCEDURE Traverse( dim: SIZE; ladr, dadr: ADDRESS );
- VAR len: SIZE; linc, dinc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( ladr, dadr, loopli, loopdi, looplen, op );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim );
- dinc := GetIncr( dest, dim ); INC( dim );
- WHILE (len > 0) DO
- Traverse( dim, ladr, dadr ); INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END;
- END Traverse;
-
- BEGIN
- SYSTEM.GET( d, dest ); SYSTEM.GET( l, left ); dim := GetDim( left );
- origdest := 0; modes := {up, down};
- (* allocate destination, if necessary *)
- p := AllocateSame( dest, left, elementSize );
- IF p = NIL THEN
- CopyUpCompatible( dest, left, modes );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE origdest := dest; p := AllocateTemp( dest, origdest, elementSize );
- END;
- END;
- (* allocate destination, if necessary *)
- (*IF GetAdr( dest ) = -1 THEN p := Allocate( left, dest, dim, elementSize )
- ELSIF CheckGeometry( left, dest, dim )
- END; *)
- IF debug THEN Report( "AA: left", left ); Report( "AA: dest", dest ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern2( left, dest, dim, loopd, looplen, loopli, loopdi );
- Traverse( 0, GetAdr( left ), GetAdr( dest ) );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE CopyContent( origdest, dest, elementSize );
- END;
- SYSTEM.PUT( d, dest );
- IF d = p THEN (* new block *)
- Heaps.CheckAssignment(d,dest);
- END;
- END ApplyGenericUnaryAAOpS;
- (** apply unary operator to array: array INTEGER -> array INTEGER *)
- PROCEDURE ApplyGenericUnaryAAOpI( d, l: ADDRESS; elementSize: SIZE; Loop: GenericUnaryAALoopI; op: PROCEDURE(x: INTEGER): INTEGER );
- VAR loopd, looplen, loopli, loopdi: SIZE; p: ANY; glen: SIZE;
- origdest: SIZE; modes: SET;
- dest, left: ADDRESS; dim: SIZE;
-
- PROCEDURE Traverse( dim: SIZE; ladr, dadr: ADDRESS );
- VAR len: SIZE; linc, dinc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( ladr, dadr, loopli, loopdi, looplen, op );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim );
- dinc := GetIncr( dest, dim ); INC( dim );
- WHILE (len > 0) DO
- Traverse( dim, ladr, dadr ); INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END;
- END Traverse;
-
- BEGIN
- SYSTEM.GET( d, dest ); SYSTEM.GET( l, left ); dim := GetDim( left );
- origdest := 0; modes := {up, down};
- (* allocate destination, if necessary *)
- p := AllocateSame( dest, left, elementSize );
- IF p = NIL THEN
- CopyUpCompatible( dest, left, modes );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE origdest := dest; p := AllocateTemp( dest, origdest, elementSize );
- END;
- END;
- (* allocate destination, if necessary *)
- (*IF GetAdr( dest ) = -1 THEN p := Allocate( left, dest, dim, elementSize )
- ELSIF CheckGeometry( left, dest, dim )
- END; *)
- IF debug THEN Report( "AA: left", left ); Report( "AA: dest", dest ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern2( left, dest, dim, loopd, looplen, loopli, loopdi );
- Traverse( 0, GetAdr( left ), GetAdr( dest ) );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE CopyContent( origdest, dest, elementSize );
- END;
- SYSTEM.PUT( d, dest );
- IF d = p THEN (* new block *)
- Heaps.CheckAssignment(d,dest);
- END;
- END ApplyGenericUnaryAAOpI;
- (** apply unary operator to array: array SIZE -> array SIZE *)
- PROCEDURE ApplyGenericUnaryAAOpL( d, l: ADDRESS; elementSize: SIZE; Loop: GenericUnaryAALoopL; op: PROCEDURE(x: LONGINT): LONGINT );
- VAR loopd, looplen, loopli, loopdi: SIZE; p: ANY; glen: SIZE;
- origdest: SIZE; modes: SET;
- dest, left: ADDRESS; dim: SIZE;
-
- PROCEDURE Traverse( dim: SIZE; ladr, dadr: ADDRESS );
- VAR len: SIZE; linc, dinc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( ladr, dadr, loopli, loopdi, looplen, op );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim );
- dinc := GetIncr( dest, dim ); INC( dim );
- WHILE (len > 0) DO
- Traverse( dim, ladr, dadr ); INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END;
- END Traverse;
-
- BEGIN
- SYSTEM.GET( d, dest ); SYSTEM.GET( l, left ); dim := GetDim( left );
- origdest := 0; modes := {up, down};
- (* allocate destination, if necessary *)
- p := AllocateSame( dest, left, elementSize );
- IF p = NIL THEN
- CopyUpCompatible( dest, left, modes );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE origdest := dest; p := AllocateTemp( dest, origdest, elementSize );
- END;
- END;
- (* allocate destination, if necessary *)
- (*IF GetAdr( dest ) = -1 THEN p := Allocate( left, dest, dim, elementSize )
- ELSIF CheckGeometry( left, dest, dim )
- END; *)
- IF debug THEN Report( "AA: left", left ); Report( "AA: dest", dest ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern2( left, dest, dim, loopd, looplen, loopli, loopdi );
- Traverse( 0, GetAdr( left ), GetAdr( dest ) );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE CopyContent( origdest, dest, elementSize );
- END;
- SYSTEM.PUT( d, dest );
- IF d = p THEN (* new block *)
- Heaps.CheckAssignment(d,dest);
- END;
- END ApplyGenericUnaryAAOpL;
-
- (** apply unary operator to array: array HUGEINT -> array HUGEINT *)
- PROCEDURE ApplyGenericUnaryAAOpH( d, l: ADDRESS; elementSize: SIZE; Loop: GenericUnaryAALoopH; op: PROCEDURE(x: HUGEINT): HUGEINT );
- VAR loopd, looplen, loopli, loopdi: SIZE; p: ANY; glen: SIZE;
- origdest: SIZE; modes: SET;
- VAR dest, left: ADDRESS; dim: SIZE;
- PROCEDURE Traverse( dim: SIZE; ladr, dadr: ADDRESS );
- VAR len: SIZE; linc, dinc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( ladr, dadr, loopli, loopdi, looplen, op );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim );
- dinc := GetIncr( dest, dim ); INC( dim );
- WHILE (len > 0) DO
- Traverse( dim, ladr, dadr ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END;
- END Traverse;
- BEGIN
- SYSTEM.GET( d, dest ); SYSTEM.GET( l, left ); dim := GetDim( left );
- origdest := 0; modes := {up, down};
- (* allocate destination, if necessary *)
- p := AllocateSame( dest, left, elementSize );
- IF p = NIL THEN
- CopyUpCompatible( dest, left, modes );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE origdest := dest; p := AllocateTemp( dest, origdest, elementSize );
- END;
- END;
- (*
- (* allocate destination, if necessary *)
- IF GetAdr( dest ) = -1 THEN p := Allocate( left, dest, dim, elementSize )
- ELSIF CheckGeometry( left, dest, dim )
- END;
- *)
- IF debug THEN Report( "AA: left", left ); Report( "AA: dest", dest ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern2( left, dest, dim, loopd, looplen, loopli, loopdi );
- Traverse( 0, GetAdr( left ), GetAdr( dest ) );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE CopyContent( origdest, dest, elementSize );
- END;
- SYSTEM.PUT( d, dest );
- IF d = p THEN (* new block *)
- Heaps.CheckAssignment(d,dest);
- END;
- END ApplyGenericUnaryAAOpH;
- (** apply unary operator to array: array REAL -> array REAL *)
- PROCEDURE ApplyGenericUnaryAAOpR( d, l: ADDRESS; elementSize: SIZE; Loop: GenericUnaryAALoopR; op: PROCEDURE(x: REAL): REAL );
- VAR loopd, looplen, loopli, loopdi: SIZE; p: ANY; glen: SIZE;
- origdest: SIZE; modes: SET;
- dest, left: ADDRESS; dim: SIZE;
-
- PROCEDURE Traverse( dim: SIZE; ladr, dadr: ADDRESS );
- VAR len: SIZE; linc, dinc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( ladr, dadr, loopli, loopdi, looplen, op );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim );
- dinc := GetIncr( dest, dim ); INC( dim );
- WHILE (len > 0) DO
- Traverse( dim, ladr, dadr ); INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END;
- END Traverse;
-
- BEGIN
- SYSTEM.GET( d, dest ); SYSTEM.GET( l, left ); dim := GetDim( left );
- origdest := 0; modes := {up, down};
- (* allocate destination, if necessary *)
- p := AllocateSame( dest, left, elementSize );
- IF p = NIL THEN
- CopyUpCompatible( dest, left, modes );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE origdest := dest; p := AllocateTemp( dest, origdest, elementSize );
- END;
- END;
- (* allocate destination, if necessary *)
- (*IF GetAdr( dest ) = -1 THEN p := Allocate( left, dest, dim, elementSize )
- ELSIF CheckGeometry( left, dest, dim )
- END; *)
- IF debug THEN Report( "AA: left", left ); Report( "AA: dest", dest ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern2( left, dest, dim, loopd, looplen, loopli, loopdi );
- Traverse( 0, GetAdr( left ), GetAdr( dest ) );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE CopyContent( origdest, dest, elementSize );
- END;
- SYSTEM.PUT( d, dest );
- IF d = p THEN (* new block *)
- Heaps.CheckAssignment(d,dest);
- END;
- END ApplyGenericUnaryAAOpR;
-
- (** apply unary operator to array: array LONGREAL -> array LONGREAL *)
- PROCEDURE ApplyGenericUnaryAAOpX( d, l: ADDRESS; elementSize: SIZE; Loop: GenericUnaryAALoopX; op: PROCEDURE(x: LONGREAL): LONGREAL );
- VAR loopd, looplen, loopli, loopdi: SIZE; p: ANY; glen: SIZE;
- origdest: SIZE; modes: SET;
- dest, left: ADDRESS; dim: SIZE;
- PROCEDURE Traverse( dim: SIZE; ladr, dadr: ADDRESS );
- VAR len: SIZE; linc, dinc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( ladr, dadr, loopli, loopdi, looplen, op );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim );
- dinc := GetIncr( dest, dim ); INC( dim );
- WHILE (len > 0) DO
- Traverse( dim, ladr, dadr ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END;
- END Traverse;
- BEGIN
- SYSTEM.GET( d, dest ); SYSTEM.GET( l, left ); dim := GetDim( left );
- origdest := 0; modes := {up, down};
- (* allocate destination, if necessary *)
- p := AllocateSame( dest, left, elementSize );
- IF p = NIL THEN
- CopyUpCompatible( dest, left, modes );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE origdest := dest; p := AllocateTemp( dest, origdest, elementSize );
- END;
- END;
- (*
- (* allocate destination, if necessary *)
- IF GetAdr( dest ) = -1 THEN p := Allocate( left, dest, dim, elementSize )
- ELSIF CheckGeometry( left, dest, dim )
- END;
- *)
- IF debug THEN Report( "AA: left", left ); Report( "AA: dest", dest ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern2( left, dest, dim, loopd, looplen, loopli, loopdi );
- Traverse( 0, GetAdr( left ), GetAdr( dest ) );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE CopyContent( origdest, dest, elementSize );
- END;
- SYSTEM.PUT( d, dest );
- IF d = p THEN (* new block *)
- Heaps.CheckAssignment(d,dest);
- END;
- END ApplyGenericUnaryAAOpX;
-
- (** apply unary operator to array: array COMPLEX -> array COMPLEX *)
- PROCEDURE ApplyGenericUnaryAAOpZ( d, l: ADDRESS; elementSize: SIZE; Loop: GenericUnaryAALoopZ; op: PROCEDURE(x: COMPLEX): COMPLEX );
- VAR loopd, looplen, loopli, loopdi: SIZE; p: ANY; glen: SIZE;
- origdest: SIZE; modes: SET;
- dest, left: ADDRESS; dim: SIZE;
- PROCEDURE Traverse( dim: SIZE; ladr, dadr: ADDRESS );
- VAR len: SIZE; linc, dinc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( ladr, dadr, loopli, loopdi, looplen, op );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim );
- dinc := GetIncr( dest, dim ); INC( dim );
- WHILE (len > 0) DO
- Traverse( dim, ladr, dadr ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END;
- END Traverse;
- BEGIN
- SYSTEM.GET( d, dest ); SYSTEM.GET( l, left ); dim := GetDim( left );
- origdest := 0; modes := {up, down};
- (* allocate destination, if necessary *)
- p := AllocateSame( dest, left, elementSize );
- IF p = NIL THEN
- CopyUpCompatible( dest, left, modes );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE origdest := dest; p := AllocateTemp( dest, origdest, elementSize );
- END;
- END;
- (*
- (* allocate destination, if necessary *)
- IF GetAdr( dest ) = -1 THEN p := Allocate( left, dest, dim, elementSize )
- ELSIF CheckGeometry( left, dest, dim )
- END;
- *)
- IF debug THEN Report( "AA: left", left ); Report( "AA: dest", dest ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern2( left, dest, dim, loopd, looplen, loopli, loopdi );
- Traverse( 0, GetAdr( left ), GetAdr( dest ) );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE CopyContent( origdest, dest, elementSize );
- END;
- SYSTEM.PUT( d, dest );
- IF d = p THEN (* new block *)
- Heaps.CheckAssignment(d,dest);
- END;
- END ApplyGenericUnaryAAOpZ;
-
- (** apply unary operator to array: array LONGCOMPLEX -> array LONGCOMPLEX *)
- PROCEDURE ApplyGenericUnaryAAOpLZ( d, l: ADDRESS; elementSize: SIZE; Loop: GenericUnaryAALoopLZ; op: PROCEDURE(x: LONGCOMPLEX): LONGCOMPLEX );
- VAR loopd, looplen, loopli, loopdi: SIZE; p: ANY; glen: SIZE;
- origdest: SIZE; modes: SET;
- dest, left: ADDRESS; dim: SIZE;
- PROCEDURE Traverse( dim: SIZE; ladr, dadr: ADDRESS );
- VAR len: SIZE; linc, dinc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( ladr, dadr, loopli, loopdi, looplen, op );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim );
- dinc := GetIncr( dest, dim ); INC( dim );
- WHILE (len > 0) DO
- Traverse( dim, ladr, dadr ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END;
- END Traverse;
- BEGIN
- SYSTEM.GET( d, dest ); SYSTEM.GET( l, left ); dim := GetDim( left );
- origdest := 0; modes := {up, down};
- (* allocate destination, if necessary *)
- p := AllocateSame( dest, left, elementSize );
- IF p = NIL THEN
- CopyUpCompatible( dest, left, modes );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE origdest := dest; p := AllocateTemp( dest, origdest, elementSize );
- END;
- END;
- (*
- (* allocate destination, if necessary *)
- IF GetAdr( dest ) = -1 THEN p := Allocate( left, dest, dim, elementSize )
- ELSIF CheckGeometry( left, dest, dim )
- END;
- *)
- IF debug THEN Report( "AA: left", left ); Report( "AA: dest", dest ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern2( left, dest, dim, loopd, looplen, loopli, loopdi );
- Traverse( 0, GetAdr( left ), GetAdr( dest ) );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE CopyContent( origdest, dest, elementSize );
- END;
- SYSTEM.PUT( d, dest );
- IF d = p THEN (* new block *)
- Heaps.CheckAssignment(d,dest);
- END;
- END ApplyGenericUnaryAAOpLZ;
- (** apply unary operator to array: array -> array *)
- PROCEDURE ApplyUnaryAAOp( d, l: ADDRESS; elementSize: SIZE;
- Loop: UnaryAALoop );
- VAR loopd, looplen, loopli, loopdi: SIZE; p: ANY; glen: SIZE;
- origdest: SIZE; modes: SET;
- dest, left: ADDRESS; dim: SIZE;
- PROCEDURE Traverse( dim: SIZE; ladr, dadr: ADDRESS );
- VAR len: SIZE; linc, dinc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( ladr, dadr, loopli, loopdi, looplen );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim );
- dinc := GetIncr( dest, dim ); INC( dim );
- WHILE (len > 0) DO
- Traverse( dim, ladr, dadr ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END;
- END Traverse;
- BEGIN
- SYSTEM.GET( d, dest ); SYSTEM.GET( l, left ); dim := GetDim( left );
- origdest := 0; modes := {up, down};
- (* allocate destination, if necessary *)
- p := AllocateSame( dest, left, elementSize );
- IF p = NIL THEN
- CopyUpCompatible( dest, left, modes );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE origdest := dest; p := AllocateTemp( dest, origdest, elementSize );
- END;
- END;
- (*
- (* allocate destination, if necessary *)
- IF GetAdr( dest ) = -1 THEN p := Allocate( left, dest, dim, elementSize )
- ELSIF CheckGeometry( left, dest, dim )
- END;
- *)
- IF debug THEN Report( "AA: left", left ); Report( "AA: dest", dest ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern2( left, dest, dim, loopd, looplen, loopli, loopdi );
- Traverse( 0, GetAdr( left ), GetAdr( dest ) );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE CopyContent( origdest, dest, elementSize );
- END;
- SYSTEM.PUT( d, dest );
- IF d = p THEN (* new block *)
- Heaps.CheckAssignment(d,dest);
- END;
- END ApplyUnaryAAOp;
- (** apply unary operator to array: array -> scalar *)
- PROCEDURE ApplyUnaryASOp( dest, l: ADDRESS; Loop: UnaryASLoop );
- VAR loopd, looplen, loopli: SIZE; glen: SIZE;
- VAR left: ADDRESS; dim: SIZE;
- PROCEDURE Traverse( dim: SIZE; ladr: ADDRESS );
- VAR len: SIZE; linc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( ladr, dest, loopli, looplen );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim ); INC( dim );
- WHILE (len > 0) DO Traverse( dim, ladr ); INC( ladr, linc ); DEC( len ); END;
- END;
- END Traverse;
- BEGIN
- SYSTEM.GET( l, left ); dim := GetDim( left );
- IF debug THEN Report( "AS: left", left ); END;
- (* check pattern: longest piece that can be done with a loop *)
- IF conservative THEN glen := 0 END;
- FindPattern1( left, dim, loopd, looplen, loopli ); Traverse( 0, GetAdr( left ) );
- IF conservative THEN
- looplen := 1;
- WHILE (dim > 0) DO
- looplen := looplen * GetLen( left, dim - 1 ); DEC( dim );
- END;
- ASSERT( looplen = glen );
- END;
- END ApplyUnaryASOp;
- (** apply unary operator to array: scalar -> array *)
- PROCEDURE ApplyUnarySAOp( d, right: ADDRESS; Loop: UnarySALoop );
- VAR loopd, looplen, loopdi: SIZE; glen: SIZE;
- VAR dest: ADDRESS; dim: SIZE;
- PROCEDURE Traverse( dim: SIZE; dadr: ADDRESS );
- VAR len: SIZE; dinc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( right, dadr, loopdi, looplen );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( dest, dim ); dinc := GetIncr( dest, dim ); INC( dim );
- WHILE (len > 0) DO Traverse( dim, dadr ); INC( dadr, dinc ); DEC( len ); END;
- END;
- END Traverse;
- BEGIN
- SYSTEM.GET( d, dest ); dim := GetDim( dest );
- IF debug THEN Report( "AS: dest", dest ); END;
- (* check pattern: longest piece that can be done with a loop *)
- IF conservative THEN glen := 0 END;
- FindPattern1( dest, dim, loopd, looplen, loopdi ); Traverse( 0, GetAdr( dest ) );
- IF conservative THEN
- looplen := 1;
- WHILE (dim > 0) DO
- looplen := looplen * GetLen( dest, dim - 1 ); DEC( dim );
- END;
- ASSERT( looplen = glen );
- END;
- END ApplyUnarySAOp;
- (** apply binary operator : array x array -> array *)
- PROCEDURE ApplyBinaryAAAOp( d, l, r: ADDRESS; elementSize: SIZE;
- Loop: BinaryAAALoop );
- VAR loopd, looplen, loopli, loopri, loopdi: SIZE; p: ANY; glen: SIZE;
- origdest: SIZE; modes: SET; left, right, dest: ADDRESS; dim: SIZE;
- PROCEDURE Traverse( dim: SIZE; ladr, radr, dadr: ADDRESS );
- VAR len: SIZE; linc, rinc, dinc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( ladr, radr, dadr, loopli, loopri, loopdi, looplen );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim );
- rinc := GetIncr( right, dim ); dinc := GetIncr( dest, dim ); INC( dim );
- WHILE (len > 0) DO
- Traverse( dim, ladr, radr, dadr ); INC( ladr, linc ); INC( radr, rinc );
- INC( dadr, dinc ); DEC( len );
- END;
- END;
- END Traverse;
- BEGIN
- SYSTEM.GET( d, dest ); SYSTEM.GET( l, left ); SYSTEM.GET( r, right ); dim := GetDim( left );
- (* allocate destination, if necessary *)
- IF ~SameShape( left, right ) THEN
- Halt( GeometryMismatch, left, right, 0 )
- END;
- origdest := 0; modes := {up, down};
- p := AllocateSame( dest, left, elementSize );
- IF p = NIL THEN
- CopyUpCompatible( dest, left, modes );
- CopyUpCompatible( dest, right, modes );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN
- Reverse( left, dim ); Reverse( dest, dim ); Reverse( right, dim );
- ELSE
- origdest := dest; p := AllocateTemp( dest, origdest, elementSize ); (* 1d field ? *)
- END;
- END;
- (* debugging *)
- IF debug THEN Report( "AAA:left", left ); Report( "AAA:right", right ); Report( "AAA:dest", dest ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern3( left, right, dest, dim, loopd, looplen, loopli, loopri, loopdi );
- (* run through dimensions *)
- Traverse( 0, GetAdr( left ), GetAdr( right ), GetAdr( dest ) );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN
- Reverse( left, dim ); Reverse( dest, dim ); Reverse( right, dim );
- ELSE CopyContent( origdest, dest, elementSize );
- END;
- SYSTEM.PUT( d, dest );
- IF d = p THEN (* new block *)
- Heaps.CheckAssignment(d,dest);
- END;
- END ApplyBinaryAAAOp;
- (** apply binary operator: array x scalar -> array *)
- PROCEDURE ApplyBinaryASAOp( d, l, right: ADDRESS;
- elementSize: SIZE;
- Loop: BinaryASALoop );
- VAR loopd, looplen, loopli, loopdi: SIZE; p: ANY; glen: SIZE;
- origdest: SIZE; modes: SET; dest, left: ADDRESS; dim: SIZE;
- PROCEDURE Traverse( dim: SIZE; ladr, dadr: ADDRESS );
- VAR len: SIZE; linc, dinc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( ladr, right, dadr, loopli, loopdi, looplen );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim );
- dinc := GetIncr( dest, dim ); INC( dim );
- WHILE (len > 0) DO
- Traverse( dim, ladr, dadr ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END;
- END Traverse;
- BEGIN
- SYSTEM.GET( d, dest ); SYSTEM.GET( l, left ); dim := GetDim( left );
- (* allocate destination, if necessary *)
- origdest := 0; modes := {up, down};
- p := AllocateSame( dest, left, elementSize );
- IF p = NIL THEN
- CopyUpCompatible( dest, left, modes );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE origdest := dest; p := AllocateTemp( dest, origdest, elementSize );
- END;
- END;
- (* debugging *)
- IF debug THEN Report( "ASA:left", left ); Report( "ASA:dest", dest ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern2( left, dest, dim, loopd, looplen, loopli, loopdi );
- (* run through dimensions *)
- IF conservative THEN glen := 0 END;
- Traverse( 0, GetAdr( left ), GetAdr( dest ) );
- IF conservative THEN
- looplen := 1;
- WHILE (dim > 0) DO
- looplen := looplen * GetLen( left, dim - 1 ); DEC( dim );
- END;
- ASSERT( looplen = glen );
- END;
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( left, dim ); Reverse( dest, dim )
- ELSE CopyContent( origdest, dest, elementSize );
- END;
- SYSTEM.PUT( d, dest );
- IF d = p THEN (* new block *)
- Heaps.CheckAssignment(d,dest);
- END;
- END ApplyBinaryASAOp;
- (** apply binary operator: array x array -> scalar *)
- PROCEDURE ApplyBinaryAASOp( dest, l, r: ADDRESS; Loop: BinaryAASLoop );
- VAR loopd, looplen, loopli, loopri: SIZE; glen: SIZE;
- left, right: ADDRESS; dim: SIZE;
- PROCEDURE Traverse( dim: SIZE; ladr, radr: ADDRESS );
- VAR len: SIZE; linc, rinc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( ladr, radr, dest, loopli, loopri, looplen );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim );
- rinc := GetIncr( right, dim ); INC( dim );
- WHILE (len > 0) DO
- Traverse( dim, ladr, radr ); INC( ladr, linc ); INC( radr, rinc );
- DEC( len );
- END;
- END;
- END Traverse;
- BEGIN
- SYSTEM.GET( l, left ); SYSTEM.GET( r, right ); dim := GetDim( left );
- (* check array lengths *)
- IF ~SameShape( left, right ) THEN
- Halt( GeometryMismatch, left, right, 0 )
- END;
- IF debug THEN Report( "AAS:left", left ); Report( "AAS:right", right ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern2( left, right, dim, loopd, looplen, loopli, loopri );
- (* run through dimensions *)
- IF conservative THEN glen := 0 END;
- Traverse( 0, GetAdr( left ), GetAdr( right ) );
- IF conservative THEN
- looplen := 1;
- WHILE (dim > 0) DO
- looplen := looplen * GetLen( left, dim - 1 ); DEC( dim );
- END;
- ASSERT( looplen = glen );
- END;
- END ApplyBinaryAASOp;
- (** special binary operator: array x array -> boolean *)
- PROCEDURE ApplyBinaryAABOp( l, r: ADDRESS;
- Loop: BinaryAABLoop; geometryMismatchDefault: BOOLEAN ): BOOLEAN;
- VAR loopd, looplen, loopli, loopri: SIZE; left, right: ADDRESS; dim: SIZE;
- PROCEDURE Traverse( dim: SIZE; ladr, radr: ADDRESS ): BOOLEAN;
- VAR len: SIZE; linc, rinc: SIZE;
- BEGIN
- IF dim = loopd THEN RETURN Loop( ladr, radr, loopli, loopri, looplen );
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim );
- rinc := GetIncr( right, dim ); INC( dim );
- WHILE (len > 0) DO
- IF ~Traverse( dim, ladr, radr ) THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END;
- END Traverse;
- BEGIN
- SYSTEM.GET( l, left ); SYSTEM.GET( r, right ); dim := GetDim( left );
- (* check array lengths *)
- IF ~SameShape( left, right ) THEN
- RETURN geometryMismatchDefault
- END;
- (* is destination already allocated? (might be a temporary result) *)
- IF debug THEN Report( "AAB:left", left ); Report( "AAB:right", right ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern2( left, right, dim, loopd, looplen, loopli, loopri );
- (* run through dimensions *)
- RETURN Traverse( 0, GetAdr( left ), GetAdr( right ) );
- END ApplyBinaryAABOp;
- (** special binary operator: array x scalar -> boolean *)
- PROCEDURE ApplyBinaryASBOp( l, right: ADDRESS;
- Loop: BinaryASBLoop ): BOOLEAN;
- VAR loopd, looplen, loopli: SIZE; left: ADDRESS; dim: SIZE;
- PROCEDURE Traverse( dim: SIZE; ladr: ADDRESS ): BOOLEAN;
- VAR len: SIZE; linc: SIZE;
- BEGIN
- IF dim = loopd THEN RETURN Loop( ladr, right, loopli, looplen );
- ELSE
- len := GetLen( left, dim ); linc := GetIncr( left, dim ); INC( dim );
- WHILE (len > 0) DO
- IF ~Traverse( dim, ladr ) THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END;
- END Traverse;
- BEGIN
- SYSTEM.GET( l, left ); dim := GetDim( left );
- IF debug THEN Report( "AAB:left", left ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern1( left, dim, loopd, looplen, loopli );
- (* run through dimensions *)
- RETURN Traverse( 0, GetAdr( left ) );
- END ApplyBinaryASBOp;
- (**** operators *)
- (*** copy *)
- PROCEDURE Copy4( ladr, dadr, linc, dinc, len: LONGINT );
- CODE
- LDR R0, [FP, #len] ; R0 := len
- LDR R1, [FP, #ladr] ; R1 := ladr
- LDR R2, [FP, #dadr] ; R2 := dadr
- LDR R3, [FP, #linc] ; R3 := linc
- LDR R4, [FP, #dinc] ; R4 := dinc
- loop:
- CMP R0, #0
- BEQ end ; while R0 > 0 do
- LDR R5, [R1, #0] ; R5 := get(R1)
- STR R5, [R2, #0] ; put(R2, R5)
- ADD R1, R1, R3 ; INC(R1, R3)
- ADD R2, R2, R4 ; INC(R2, R4)
- B loop ; end
- end:
- END Copy4;
- PROCEDURE Copy2( ladr, dadr, linc, dinc, len: LONGINT );
- CODE
- LDR R0, [FP, #len] ; R0 := len
- LDR R1, [FP, #ladr] ; R1 := ladr
- LDR R2, [FP, #dadr] ; R2 := dadr
- LDR R3, [FP, #linc] ; R3 := linc
- LDR R4, [FP, #dinc] ; R4 := dinc
- loop:
- CMP R0, #0
- BEQ end ; while R0 > 0 do
- LDRH R5, [R1, #0] ; R5 := get(R1)
- STRH R5, [R2, #0] ; put(R2, R5)
- ADD R1, R1, R3 ; INC(R1, R3)
- ADD R2, R2, R4 ; INC(R2, R4)
- B loop ; end
- end:
- END Copy2;
- PROCEDURE Copy1( ladr, dadr, linc, dinc, len: LONGINT );
- CODE
- LDR R0, [FP, #len] ; R0 := len
- LDR R1, [FP, #ladr] ; R1 := ladr
- LDR R2, [FP, #dadr] ; R2 := dadr
- LDR R3, [FP, #linc] ; R3 := linc
- LDR R4, [FP, #dinc] ; R4 := dinc
- loop:
- CMP R0, #0
- BEQ end ; while R0 > 0 do
- LDRB R5, [R1, #0] ; R5 := get(R1)
- STRB R5, [R2, #0] ; put(R2, R5)
- ADD R1, R1, R3 ; INC(R1, R3)
- ADD R2, R2, R4 ; INC(R2, R4)
- B loop ; end
- end:
- END Copy1;
- PROCEDURE Copy8( ladr, dadr, linc, dinc, len: LONGINT );
- CODE
- LDR R0, [FP, #len] ; R0 := len
- LDR R1, [FP, #ladr] ; R1 := ladr
- LDR R2, [FP, #dadr] ; R2 := dadr
- LDR R3, [FP, #linc] ; R3 := linc
- LDR R4, [FP, #dinc] ; R4 := dinc
- loop:
- CMP R0, #0
- BEQ end ; while R0 > 0 do
- LDR R5, [R1, #0] ; R5 := get(R1)
- LDR R6, [R1, #4] ; R6 := get(R1 + 4)
- STR R5, [R2, #0] ; put(R2, R5)
- STR R6, [R2, #4] ; put(R2 + 4, R6)
- ADD R1, R1, R3 ; INC(R1, R3)
- ADD R2, R2, R4 ; INC(R2, R4)
- B loop ; end
- end:
- END Copy8;
- (** Correct move if overlap, might be important for some array operations,
- do not use SYSTEM.MOVE. *)
- PROCEDURE -MoveB*( srcadr, destadr, len: LONGINT );
- CODE
- LDR R0, [SP, #len]
- LDR R1, [SP, #srcadr]
- LDR R2, [SP, #destadr]
- ADD SP, SP, #12
- CMP R1, R2
- BHI moveup ; srcadr > destadr -> moving up
- ADD R3, R1, R0
- CMP R3, R2
- BLO moveup ; srcadr + len < destadr -> moving up
- ; Moving down
- ADD R2, R2, R0
- movedown:
- CMP R0, #0
- BEQ end
- LDRB R4, [R2, #0]
- STRB R4, [R3, #0]
- SUB R2, R2, #1
- SUB R3, R3, #1
- SUB R0, R0, #1
- B movedown
- moveup:
- CMP R0, #0
- BEQ end
- LDRB R4, [R1, #0]
- STRB R4, [R2, #0]
- ADD R1, R1, #1
- ADD R2, R2, #1
- SUB R0, R0, #1
- B moveup
- end:
- END MoveB;
- PROCEDURE CopyContent( dest, src: ADDRESS; elementSize: SIZE ); (**! optimize *)
- VAR loopd, looplen, loopli, loopdi: SIZE; p: ANY; glen: SIZE;
- origdest: ADDRESS; modes: SET; dim: SIZE;
- PROCEDURE Loop( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- BEGIN
- IF (dinc = elementSize) & (linc = elementSize) THEN
- MoveB( ladr, dadr, len * elementSize );
- (*
- SYSTEM.MOVE( ladr, dadr, elementSize * len );
- *)
- ELSIF (dinc = -elementSize) & (linc = -elementSize) THEN
- len := len * elementSize;
- MoveB( ladr - len + elementSize, dadr - len + elementSize, len );
- ELSIF elementSize = 1 THEN
- Copy1( ladr, dadr, linc, dinc, len );
- (*
- WHILE (len > 0) DO
- SYSTEM.PUT8( dadr, SYSTEM.GET8( ladr ) ); DEC( len ); INC( ladr, linc ); INC( dadr, dinc );
- END;
- *)
- ELSIF elementSize = 2 THEN
- Copy2( ladr, dadr, linc, dinc, len );
- (*
- WHILE (len > 0) DO
- SYSTEM.PUT16( dadr, SYSTEM.GET16( ladr ) ); DEC( len ); INC( ladr, linc ); INC( dadr, dinc );
- END;
- *)
- ELSIF elementSize = 4 THEN
- Copy4( ladr, dadr, linc, dinc, len );
- (*
- WHILE (len > 0) DO
- SYSTEM.PUT32( dadr, SYSTEM.GET32( ladr ) ); DEC( len ); INC( ladr, linc ); INC( dadr, dinc );
- END;
- *)
- ELSIF elementSize = 8 THEN
- Copy8( ladr, dadr, linc, dinc, len );
- (*
- WHILE (len > 0) DO
- SYSTEM.PUT32( dadr, SYSTEM.GET32( ladr ) );
- SYSTEM.PUT32( dadr + 4, SYSTEM.GET32( ladr + 4 ) ); DEC( len ); INC( ladr, linc );
- INC( dadr, dinc );
- END;
- *)
- ELSE (* SYSTEM.MOVE is expensive ! *)
- WHILE (len > 0) DO
- SYSTEM.MOVE( ladr, dadr, elementSize ); DEC( len ); INC( ladr, linc );
- INC( dadr, dinc );
- END;
- END;
- END Loop;
- PROCEDURE Traverse( dim: SIZE; ladr, dadr: ADDRESS );
- VAR len: SIZE; linc, dinc: SIZE;
- BEGIN
- IF dim = loopd THEN
- Loop( ladr, dadr, loopli, loopdi, looplen );
- IF conservative THEN INC( glen, looplen ) END;
- ELSE
- len := GetLen( src, dim ); linc := GetIncr( src, dim );
- dinc := GetIncr( dest, dim ); INC( dim );
- WHILE (len > 0) DO
- Traverse( dim, ladr, dadr ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END;
- END Traverse;
- BEGIN
- dim := GetDim( src );
- origdest := 0; modes := {up, down}; (* copy modes *)
- ASSERT( SameShape( src, dest ) ); (* must be ensured by caller *)
- CopyUpCompatible( dest, src, modes );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN (* can only copy from top to bottom *)
- Reverse( src, dim ); Reverse( dest, dim )
- ELSE (* can only copy via double buffer *)
- origdest := dest; p := AllocateTemp( dest, origdest, elementSize );
- END;
- IF debug THEN Report( "AA: src", src ); Report( "AA: dest", dest );
- END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPattern2( src, dest, dim, loopd, looplen, loopli, loopdi );
- Traverse( 0, GetAdr( src ), GetAdr( dest ) );
- IF up IN modes THEN (* nothing to be done *)
- ELSIF down IN modes THEN Reverse( src, dim ); Reverse( dest, dim )
- ELSE CopyContent( origdest, dest, elementSize );
- END;
- END CopyContent;
- PROCEDURE AllocateSame( VAR dest: ADDRESS; src: ADDRESS; elementsize: SIZE ): ANY;
- VAR ptr, data: ANY; Size: SIZE;
- (* allocate a structure in dest compatible with src, if necessary. returns if allocation has taken place *)
- PROCEDURE NewData;
- VAR dim, len, size: SIZE;
- BEGIN
- dim := GetDim( src ); size := elementsize;
- PutDim( dest, dim );
- PutSize( dest, elementsize );
- WHILE (dim > 0) DO
- DEC( dim ); len := GetLen( src, dim ); PutLen( dest, dim, len );
- PutInc( dest, dim, size ); size := size * len;
- END;
- SYSTEM.NEW( data, size + ArrayAlignment);
- PutAdr( dest, Align(data));
- PutPtr( dest, data );
- END NewData;
- BEGIN
- IF dest # NIL THEN Size := GetSize( dest ); ASSERT ((Size=0) OR (Size = elementsize )); END;
- IF debug THEN KernelLog.String( "Allocate same " ); Report( "allocation source", src ); Report( "allocation des", dest ); END;
- IF dest = NIL THEN (* NIL pointer, guaranteed to be tensor *)
- ptr := GetArrayDesc( GetDim( src ) ); dest :=ptr;
- Heaps.CheckAssignment(ADDRESS OF dest, ptr);
- PutFlags(dest, {TensorFlag});
- NewData(); RETURN ptr;
- ELSIF GetDim( dest ) # GetDim( src ) THEN (* different dimension *)
- (* check if re-allocation of descriptor is allowed *)
- IF ~(TensorFlag IN GetFlags( dest )) &
- ~(TemporaryFlag IN GetFlags( dest )) THEN (* no, not allowed*)
- HALT( 100 );
- END;
- ptr := GetArrayDesc( GetDim( src ) ); dest :=ptr;
- Heaps.CheckAssignment(ADDRESS OF dest, ptr);
- PutFlags(dest, {TensorFlag});
- NewData();
- RETURN ptr;
- ELSIF (GetAdr( dest ) = 0) OR ~SameShape( dest, src ) THEN
- (* check if re-allocation of array data is allowed *)
- IF RangeFlag IN GetFlags( dest ) THEN (* no! not allowed *)
- HALT( 100 );
- END;
- NewData();
- RETURN data;
- ELSE (* nothing to do *)
- RETURN NIL;
- END;
- END AllocateSame;
- PROCEDURE TempDescCopy( src: ADDRESS ): ANY;
- VAR p: ANY; adr: ADDRESS;dim: SIZE;
- BEGIN
- dim := GetDim(src);
- p := GetArrayDesc(dim);
- adr := p;
- SYSTEM.MOVE( src, adr, dim * SIZEOF(LenInc) + MathLenOffset );
- PutAdr( src, 0 );
- PutPtr( src, NIL );
- PutFlags( src, {} );
- RETURN p;
- END TempDescCopy;
- (* used when arrays are passed by value *)
- PROCEDURE CopyArraySelf*( dest, src: ADDRESS; elementsize: SIZE );
- VAR p: ANY;
- BEGIN
- ASSERT( src = dest );
- p := TempDescCopy( dest ); (* copy and prepare dest to be copied over *)
- CopyArray( dest, p, elementsize );
- END CopyArraySelf;
- PROCEDURE CopyArray*( dest: ADDRESS; src: ADDRESS; elementsize: SIZE );
- VAR p: ANY; srcdim, destdim: SIZE;
- BEGIN
- ASSERT( dest # 0 ); (* impossible unless compiler error *)
- IF GetDim( src ) # GetDim( dest ) THEN (* not allowed but possible (tensor) *)
- srcdim := GetDim(src);
- destdim := GetDim(dest);
- (*
- Debugging.Stack("copy array");
- *)
- Report( "copy array source", src ); Report( "copy array des", dest );
- HALT(100);
- ELSIF src = dest THEN (* self copy *)
- CopyArraySelf( dest, src, elementsize );
- ELSE
- p := AllocateSame( dest, src, elementsize );
- CopyContent( dest, src, elementsize )
- END;
- END CopyArray;
- PROCEDURE CopyTensorSelf*( VAR dest: ADDRESS; src: ADDRESS; elementsize: SIZE );
- BEGIN
- dest := 0; CopyTensor( dest, src, elementsize );
- END CopyTensorSelf;
- PROCEDURE CopyTensor*( VAR dest: ADDRESS; src: ADDRESS;
- elementsize: SIZE );
- VAR p: ANY;
- BEGIN
- (* Report("dest",dest); Report("src",src); *)
- IF (src = NIL) THEN dest := NIL
- ELSIF (dest = 0) OR ~(SameShape( dest, src )) OR (GetAdr( dest ) = 0) THEN
- p := AllocateSame( dest, src, elementsize ); (* includes check if allocation is allowed *)
- CopyContent( dest, src, elementsize );
- ELSIF dest = src THEN CopyTensorSelf( dest, src, elementsize );
- ELSE CopyContent( dest, src, elementsize )
- END;
- END CopyTensor;
- (* copy descriptor of src to that of dest. If not existent then create.*)
- PROCEDURE ShallowCopy*(VAR dest: ADDRESS; src: ADDRESS): ANY;
- VAR ptr: ANY; flags: SET;
- PROCEDURE CopyDescriptor;
- BEGIN
- SYSTEM.MOVE( src , dest, MathLenOffset + SIZEOF(LenInc) * GetDim( src ));
- PutPtr(dest, GetPtr(src)); (* GC! *)
- END CopyDescriptor;
- BEGIN
- (*
- ShallowCopy is either called with a reference to a pointer in which case the dest pointer is safe
- or it is called with an array descriptor in which case a reallocation is forbidden. The pointer cannot escape.
- *)
- IF dest = 0 THEN (* NIL pointer, guaranteed to be tensor *)
- ptr := GetArrayDesc( GetDim( src ) ); dest := ptr;
- Heaps.CheckAssignment(ADDRESS OF dest, ptr);
- CopyDescriptor();
- PutFlags(dest, {TensorFlag});
- ELSIF GetDim( dest ) # GetDim( src ) THEN (* different dimension *)
- flags := GetFlags(dest);
- (* check if re-allocation of descriptor is allowed *)
- IF ~(TensorFlag IN GetFlags( dest )) & ~(TemporaryFlag IN GetFlags( dest )) THEN (* no, not allowed*)
- Halt(DimensionMismatch,src,0,dest);
- END;
- (* create a new descriptor!!! (added by Alexey) *)
- ptr := GetArrayDesc( GetDim( src ) ); dest := ptr;
- Heaps.CheckAssignment(ADDRESS OF dest, ptr);
- CopyDescriptor();
- PutFlags(dest, flags);
- ELSE
- flags := GetFlags(dest);
- (* check if re-allocation of array data is allowed *)
- IF RangeFlag IN GetFlags( dest ) THEN (* no! not allowed *)
- Halt(AllocationForbidden,src,0,dest);
- END;
- CopyDescriptor();
- PutFlags(dest, flags);
- END;
- RETURN ptr;
- END ShallowCopy;
- (*
- PROCEDURE DescriptorCopy( src, dest: LONGINT );
- BEGIN
- IF debug THEN
- KernelLog.String( "DescriptorCopy from " ); KernelLog.Int( src, 1 ); KernelLog.String( " to " );
- KernelLog.Int( dest, 1 ); KernelLog.Ln;
- END;
- SYSTEM.MOVE( src, dest, 2*SIZEOF(ADDRESS) ); (* adr and ptr *)
- SYSTEM.MOVE( src + MathLenOffset, dest + MathLenOffset, SIZEOF(LenInc) * GetDim( src )); (* lens and increments *)
- END DescriptorCopy;
- *)
- PROCEDURE ZeroCopy*(CONST src: ARRAY [?]; VAR dest: ARRAY [?]);
- VAR p: ANY; s,d: ADDRESS;
- BEGIN
- s := SYSTEM.VAL(ADDRESS,src);
- d := SYSTEM.VAL(ADDRESS,dest);
- p := ShallowCopy(d,s);
- SYSTEM.PUT(ADDRESSOF(dest),d);
- IF p = d THEN
- Heaps.CheckAssignment(ADDRESS OF dest, p);
- END;
- END ZeroCopy;
- OPERATOR "ALIAS"*(CONST src: ARRAY [?]): ARRAY[?];
- BEGIN
- ZeroCopy(src, RESULT);
- RETURN RESULT
- END "ALIAS";
- PROCEDURE SameShape( l, r: ADDRESS ): BOOLEAN;
- VAR dim: SIZE;
- BEGIN
- dim := GetDim( l );
- IF dim # GetDim( r ) THEN RETURN FALSE END;
- WHILE (dim > 0) DO
- DEC( dim );
- IF GetLen( l, dim ) # GetLen( r, dim ) THEN RETURN FALSE END;
- END;
- RETURN TRUE;
- END SameShape;
- (*
- PROCEDURE ZeroCopyArray*( dest: ADDRESS; src: ADDRESS; elementsize: LONGINT );
- (*
- called as ZeroCopy(A,B,Size) with enhanced arrays A,B
- check if deep copy can be avoided and if so then do a shallow copy
- *)
- BEGIN
- ASSERT( dest # 0 ); (* impossible *)
- IF GetDim( src ) # GetDim( dest ) THEN (* not allowed but possible (tensor) *)
- HALT( 100 );
- ELSIF (RangeFlag IN GetFlags( src )) THEN
- (* must copy (and allocate) *)
- CopyArray( dest, src, elementsize );
- ELSIF (RangeFlag IN GetFlags( dest )) THEN (* copy only allowed if shape matches *)
- IF ~SameShape( dest, src ) THEN HALT( 100 );
- ELSE CopyContent( dest, src, elementsize )
- END;
- ELSE DescriptorCopy( src, dest )
- END;
- END ZeroCopyArray;
- PROCEDURE ZeroCopyTensor*( VAR dest: ADDRESS; src: ADDRESS; elementsize: LONGINT );
- (*
- called as ZeroCopy(A,B,Size) with A,B: ARRAY [?] OF ...
- check if deep copy can be avoided and if so then do a shallow copy
- *)
- BEGIN
- IF debug THEN
- KernelLog.String( "ZeroCopy2: " ); KernelLog.String( "ADDRESSOF(dest) " ); KernelLog.Int( ADDRESSOF( dest ), 10 );
- KernelLog.Ln; KernelLog.String( "ADDRESSOF(src) " ); KernelLog.Int( ADDRESSOF( src ), 10 ); KernelLog.Ln;
- KernelLog.String( "dest " ); KernelLog.Int( dest, 10 ); KernelLog.Ln; KernelLog.String( "src " );
- KernelLog.Int( src, 10 ); KernelLog.Ln; KernelLog.String( "elementsize" );
- KernelLog.Int( elementsize, 10 ); KernelLog.Ln;
- END;
- IF (dest = 0) OR (TensorFlag IN GetFlags( dest )) THEN (* descriptor allocation allowed *)
- IF (TensorFlag IN GetFlags( src )) THEN dest := src;
- ELSE
- CopyTensor( dest, src, elementsize ); (* allocate freshly *)
- END;
- ELSIF (RangeFlag IN GetFlags( src )) THEN
- (* must copy (and allocate) *)
- CopyTensor( dest, src, elementsize );
- ELSIF (RangeFlag IN GetFlags( dest )) THEN (* descriptor copy forbidden *)
- IF SameShape( src, dest ) THEN CopyContent( dest, src, elementsize )
- ELSE
- HALT( 100 ); (* copy forbidden *)
- END;
- ELSIF GetDim( src ) = GetDim( dest ) THEN (* descriptor copy allowed *)
- DescriptorCopy( src, dest );
- ELSE
- HALT( 100 ); (* different shapes: not allowed *)
- END;
- END ZeroCopyTensor;
- PROCEDURE ZeroCopy*( left, elementSize, dest, dim: LONGINT ); (**! optimize *)
- VAR i: LONGINT;
- BEGIN
- IF GetPtr( dest ) = -1 THEN (* zero copy forbidden, try data copy *)
- CopyContent( dest, left, elementSize )
- ELSE
- IF debug THEN
- KernelLog.String( "Zero Copy" ); KernelLog.Int( left, 10 ); KernelLog.Int( dest, 10 );
- KernelLog.Ln;
- END;
- PutPtr( dest, GetPtr( left ) ); PutAdr( dest, GetAdr( left ) );
- FOR i := 0 TO dim - 1 DO
- PutInc( dest, i, GetIncr( left, i ) ); PutLen( dest, i, GetLen( left, i ) );
- END;
- END;
- END ZeroCopy;
- *)
- (*** conversions ****)
- (** SHORTINT -> INTEGER *)
- PROCEDURE ConvertASAILoop( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- BEGIN
- WHILE (len > 0) DO (* SYSTEM.GET( ladr, lval ); dval := lval; SYSTEM.PUT( dadr, dval ); *)
- SYSTEM.PUT16( dadr, SYSTEM.GET8( ladr ) ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END ConvertASAILoop;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF SHORTINT ): ARRAY [?] OF INTEGER;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( INTEGER ),ConvertASAILoop );
- RETURN RESULT
- END "@Convert";
- OPERATOR "LONG"*(CONST src: ARRAY [ ? ] OF SHORTINT ): ARRAY [?] OF INTEGER;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( INTEGER ),ConvertASAILoop );
- RETURN RESULT
- END "LONG";
- (** SHORTINT -> LONGINT *)
- PROCEDURE ConvertLoopSL( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- BEGIN
- WHILE (len > 0) DO (* SYSTEM.GET( ladr, lval ); dval := lval; SYSTEM.PUT( dadr, dval ); *)
- SYSTEM.PUT32( dadr, SYSTEM.GET8( ladr ) ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END ConvertLoopSL;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF SHORTINT ): ARRAY [?] OF LONGINT;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( LONGINT ),ConvertLoopSL );
- RETURN RESULT
- END "@Convert";
- (** SHORTINT -> REAL *)
- PROCEDURE ConvertLoopSR( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: SHORTINT; dval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ConvertLoopSR;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF SHORTINT ): ARRAY [?] OF REAL;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( REAL ), ConvertLoopSR );
- RETURN RESULT
- END "@Convert";
- (** SHORTINT -> LONGREAL *)
- PROCEDURE ConvertLoopSX( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: SHORTINT; dval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ConvertLoopSX;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF SHORTINT ): ARRAY [ ? ] OF LONGREAL;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( LONGREAL ), ConvertLoopSX );
- RETURN RESULT
- END "@Convert";
- (** INTEGER -> SHORTINT (SHORT) *)
- PROCEDURE ConvertLoopIS( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: INTEGER; dval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := SHORT( lval ); SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END ConvertLoopIS;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF INTEGER ): ARRAY [ ? ] OF SHORTINT;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( SHORTINT ), ConvertLoopIS );
- RETURN RESULT
- END "@Convert";
- OPERATOR "SHORT"*(CONST src: ARRAY [ ? ] OF INTEGER ): ARRAY [ ? ] OF SHORTINT;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( SHORTINT ), ConvertLoopIS );
- RETURN RESULT
- END "SHORT";
- (** INTEGER -> LONGINT *)
- PROCEDURE ConvertLoopIL( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- BEGIN
- WHILE (len > 0) DO (* SYSTEM.GET( ladr, lval ); dval := lval; SYSTEM.PUT( dadr, dval ); *)
- SYSTEM.PUT32( dadr, SYSTEM.GET16( ladr ) ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END ConvertLoopIL;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF INTEGER ): ARRAY [ ? ] OF LONGINT;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( LONGINT ), ConvertLoopIL );
- RETURN RESULT
- END "@Convert";
- OPERATOR "LONG"*(CONST src: ARRAY [ ? ] OF INTEGER ): ARRAY [ ? ] OF LONGINT;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( LONGINT ), ConvertLoopIL );
- RETURN RESULT
- END "LONG";
- (** INTEGER -> REAL *)
- PROCEDURE ConvertLoopIR( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: INTEGER; dval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ConvertLoopIR;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF INTEGER ): ARRAY [ ? ] OF REAL;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( REAL ), ConvertLoopIR );
- RETURN RESULT
- END "@Convert";
- (** INTEGER -> LONGREAL *)
- PROCEDURE ConvertLoopIX( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: INTEGER; dval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ConvertLoopIX;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF INTEGER ): ARRAY [ ? ] OF LONGREAL;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( LONGREAL ), ConvertLoopIX );
- RETURN RESULT
- END "@Convert";
- (** LONGINT -> INTEGER (SHORT) *)
- PROCEDURE ConvertLoopLI( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: LONGINT; dval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := SHORT( lval ); SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END ConvertLoopLI;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF LONGINT ): ARRAY [ ? ] OF INTEGER;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( INTEGER ),ConvertLoopLI );
- RETURN RESULT
- END "@Convert";
- OPERATOR "SHORT"*(CONST src: ARRAY [ ? ] OF LONGINT ): ARRAY [ ? ] OF INTEGER;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( INTEGER ),ConvertLoopLI );
- RETURN RESULT
- END "SHORT";
- (** LONGINT -> REAL *)
- PROCEDURE ConvertLoopLR( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: LONGINT; dval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ConvertLoopLR;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF LONGINT ): ARRAY [ ? ] OF REAL;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( REAL ), ConvertLoopLR );
- RETURN RESULT
- END "@Convert";
- (** LONGINT -> LONGREAL *)
- PROCEDURE ConvertLoopLX( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: LONGINT; dval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ConvertLoopLX;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF LONGINT ): ARRAY [ ? ] OF LONGREAL;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( LONGREAL ), ConvertLoopLX );
- RETURN RESULT
- END "@Convert";
- (** REAL -> LONGINT (ENTIER) *)
- PROCEDURE ConvertLoopRL( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: REAL; dval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := ENTIER( lval ); SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END ConvertLoopRL;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF REAL ): ARRAY [ ? ] OF LONGINT;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( LONGINT ), ConvertLoopRL );
- RETURN RESULT
- END "@Convert";
- OPERATOR "ENTIER"*(CONST src: ARRAY [ ? ] OF REAL ): ARRAY [ ? ] OF LONGINT;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( LONGINT ), ConvertLoopRL );
- RETURN RESULT
- END "ENTIER";
- (** REAL -> LONGREAL *)
- PROCEDURE ConvertLoopRX( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: REAL; dval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ConvertLoopRX;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF REAL ): ARRAY [ ? ] OF LONGREAL;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( LONGREAL ), ConvertLoopRX );
- RETURN RESULT
- END "@Convert";
- OPERATOR "LONG"*(CONST src: ARRAY [ ? ] OF REAL ): ARRAY [ ? ] OF LONGREAL;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( LONGREAL ), ConvertLoopRX );
- RETURN RESULT
- END "LONG";
- (** LONGREAL -> REAL (SHORT) *)
- PROCEDURE ConvertLoopXR( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: LONGREAL; dval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := SHORT( lval ); SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END ConvertLoopXR;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF LONGREAL ): ARRAY [ ? ] OF REAL;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( REAL ), ConvertLoopXR );
- RETURN RESULT
- END "@Convert";
- OPERATOR "SHORT"*(CONST src: ARRAY [ ? ] OF LONGREAL ): ARRAY [ ? ] OF REAL;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( REAL ), ConvertLoopXR );
- RETURN RESULT
- END "SHORT";
- (** LONGREAL -> LONGINT (ENTIER) *)
- PROCEDURE ConvertLoopXL( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: LONGREAL; dval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := ENTIER( lval ); SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END ConvertLoopXL;
- OPERATOR "@Convert"*(CONST src: ARRAY [ ? ] OF LONGREAL ): ARRAY [ ? ] OF LONGINT;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( LONGINT ),ConvertLoopXL );
- RETURN RESULT
- END "@Convert";
- OPERATOR "ENTIER"*(CONST src: ARRAY [ ? ] OF LONGREAL ): ARRAY [ ? ] OF LONGINT;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( LONGINT ),ConvertLoopXL );
- RETURN RESULT
- END "ENTIER";
- (*** monadic not A -> ~A ********************************************************************)
- (** BOOLEAN *)
- PROCEDURE NotLoopAB( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: BOOLEAN;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, ~lval ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END NotLoopAB;
- OPERATOR "~"*(CONST src: ARRAY [ ? ] OF BOOLEAN): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( BOOLEAN ), NotLoopAB );
- RETURN RESULT
- END "~";
-
- (*** monadic generic (A) -> -A ********************************************************************)
- (** SHORTINT *)
- PROCEDURE GenericLoopS( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: SHORTINT): SHORTINT );
- VAR lval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, op(lval) ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END GenericLoopS;
-
- (** INTEGER *)
- PROCEDURE GenericLoopI( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: INTEGER): INTEGER );
- VAR lval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, op(lval) ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END GenericLoopI;
- (** LONGINT *)
- PROCEDURE GenericLoopL( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: LONGINT): LONGINT );
- VAR lval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, op(lval) ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END GenericLoopL;
- (** HUGEINT *)
- PROCEDURE GenericLoopH( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: HUGEINT): HUGEINT );
- VAR lval: HUGEINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, op(lval) ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END GenericLoopH;
- (** REAL *)
- PROCEDURE GenericLoopR( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: REAL): REAL );
- VAR lval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, op(lval) ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END GenericLoopR;
- (** LONGREAL *)
- PROCEDURE GenericLoopX( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: LONGREAL): LONGREAL );
- VAR lval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, op(lval) ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END GenericLoopX;
-
- (** COMPLEX *)
- PROCEDURE GenericLoopZ( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: COMPLEX): COMPLEX );
- VAR lval,dval: POINTER{UNSAFE,UNTRACED} TO RECORD val: COMPLEX END;
- BEGIN
- WHILE (len > 0) DO
- lval := ladr;
- dval := dadr;
- dval.val := op(lval.val);
- INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END GenericLoopZ;
- (** LONGCOMPLEX *)
- PROCEDURE GenericLoopLZ( ladr, dadr: ADDRESS; linc, dinc, len: SIZE; op: PROCEDURE(x: LONGCOMPLEX): LONGCOMPLEX );
- VAR lval,dval: POINTER{UNSAFE,UNTRACED} TO RECORD val: LONGCOMPLEX END;
- BEGIN
- WHILE (len > 0) DO
- lval := ladr;
- dval := dadr;
- dval.val := op (lval.val);
- INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END GenericLoopLZ;
- (*** monadic minus A -> -A ********************************************************************)
- (** SHORTINT *)
- PROCEDURE MinusLoopS( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, -lval ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END MinusLoopS;
- OPERATOR "-"*(CONST src: ARRAY [ ? ] OF SHORTINT): ARRAY [ ? ] OF SHORTINT;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( SHORTINT ), MinusLoopS );
- RETURN RESULT
- END "-";
- (** INTEGER *)
- PROCEDURE MinusLoopI( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, -lval ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END MinusLoopI;
- OPERATOR "-"*(CONST src: ARRAY [ ? ] OF INTEGER): ARRAY [ ? ] OF INTEGER;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( INTEGER ), MinusLoopI );
- RETURN RESULT
- END "-";
- (** LONGINT *)
- PROCEDURE MinusLoopL( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, -lval ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END MinusLoopL;
- OPERATOR "-"*(CONST src: ARRAY [ ? ] OF LONGINT): ARRAY [ ? ] OF LONGINT;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( LONGINT ), MinusLoopL );
- RETURN RESULT
- END "-";
- (** REAL *)
- PROCEDURE MinusLoopR( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, -lval ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END MinusLoopR;
- OPERATOR "-"*(CONST src: ARRAY [ ? ] OF REAL): ARRAY [ ? ] OF REAL;
- BEGIN
- IF debug THEN KernelLog.String( "MinusAR" ); KernelLog.Ln; END;
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( REAL ), MinusLoopR );
- RETURN RESULT
- END "-";
- (** LONGREAL *)
- PROCEDURE MinusLoopX( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, -lval ); INC( ladr, linc ); INC( dadr, dinc );
- DEC( len );
- END;
- END MinusLoopX;
- OPERATOR "-"*(CONST src: ARRAY [ ? ] OF LONGREAL): ARRAY [ ? ] OF LONGREAL;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( LONGREAL ),
- MinusLoopX );
- RETURN RESULT
- END "-";
- (*** add array + array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE AddASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval + rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END AddASASLoop;
- OPERATOR "+"*(CONST left,right: ARRAY [?] OF SHORTINT): ARRAY [?] OF SHORTINT;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( SHORTINT ), AddASASLoop );
- RETURN RESULT
- END "+";
- (** INTEGER *)
- PROCEDURE AddAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval + rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END AddAIAILoop;
- OPERATOR "+"*(CONST left,right: ARRAY [?] OF INTEGER): ARRAY [?] OF INTEGER;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( INTEGER ), AddAIAILoop );
- RETURN RESULT
- END "+";
- (** LONGINT *)
- PROCEDURE AddALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval + rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END AddALALLoop;
- OPERATOR "+"*(CONST left,right: ARRAY [?] OF LONGINT): ARRAY [?] OF LONGINT;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGINT ), AddALALLoop );
- RETURN RESULT
- END "+";
- (** REAL *)
- PROCEDURE AddARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval + rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END AddARARLoop;
- OPERATOR "+"*(CONST left,right: ARRAY [?] OF REAL): ARRAY [?] OF REAL;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( REAL ),
- loopAddARAR );
- RETURN RESULT
- END "+";
- (** LONGREAL *)
- PROCEDURE AddAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval + rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END AddAXAXLoop;
- OPERATOR "+"*(CONST left,right: ARRAY [?] OF LONGREAL): ARRAY [?] OF LONGREAL;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGREAL ), loopAddAXAX );
- RETURN RESULT
- END "+";
- (** COMPLEX *)
- PROCEDURE AddAZAZLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: COMPLEX;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval + rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END AddAZAZLoop;
- OPERATOR "+"*(CONST left,right: ARRAY [?] OF COMPLEX): ARRAY [?] OF COMPLEX;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( COMPLEX ), loopAddAZAZ );
- RETURN RESULT
- END "+";
- (** LONGCOMPLEX *)
- PROCEDURE AddALZALZLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lvalRe, lvalIm, rvalRe, rvalIm: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- SYSTEM.GET( radr, rvalRe ); SYSTEM.GET( radr+SIZEOF(LONGREAL), rvalIm );
- SYSTEM.PUT( dadr, lvalRe+rvalRe ); SYSTEM.PUT( dadr+SIZEOF(LONGREAL), lvalIm+rvalIm );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END AddALZALZLoop;
- OPERATOR "+"*(CONST left,right: ARRAY [?] OF LONGCOMPLEX): ARRAY [?] OF LONGCOMPLEX;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGCOMPLEX ), loopAddALZALZ );
- RETURN RESULT
- END "+";
- (*** add array + scalar -> array and scalar + array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE AddASSSLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval + rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AddASSSLoop;
- OPERATOR "+"*(CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): ARRAY [ ? ] OF SHORTINT;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( SHORTINT ), AddASSSLoop );
- RETURN RESULT
- END "+";
- OPERATOR "+"*(left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT): ARRAY [ ? ] OF SHORTINT;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( SHORTINT ), AddASSSLoop );
- RETURN RESULT
- END "+";
- (** INTEGER *)
- PROCEDURE AddAISILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval + rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AddAISILoop;
- OPERATOR "+"*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): ARRAY [ ? ] OF INTEGER;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( INTEGER ), AddAISILoop );
- RETURN RESULT
- END "+";
- OPERATOR "+"*(left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER): ARRAY [ ? ] OF INTEGER;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( INTEGER ), AddAISILoop );
- RETURN RESULT
- END "+";
- (** LONGINT *)
- PROCEDURE AddALSLLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval + rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AddALSLLoop;
- OPERATOR "+"*(CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): ARRAY [ ? ] OF LONGINT;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGINT ), AddALSLLoop );
- RETURN RESULT
- END "+";
- OPERATOR "+"*(left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT): ARRAY [ ? ] OF LONGINT;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( LONGINT ), AddALSLLoop );
- RETURN RESULT
- END "+";
- (** REAL *)
- PROCEDURE AddARSRLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval + rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AddARSRLoop;
- OPERATOR "+"*(CONST left: ARRAY [ ? ] OF REAL; right: REAL ): ARRAY [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( REAL ),
- AddARSRLoop );
- RETURN RESULT
- END "+";
- OPERATOR "+"*(left: REAL; CONST right: ARRAY [ ? ] OF REAL): ARRAY [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ), SIZEOF( REAL ),
- AddARSRLoop );
- RETURN RESULT
- END "+";
- (** LONGREAL *)
- PROCEDURE AddAXSXLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval + rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AddAXSXLoop;
- OPERATOR "+"*(CONST left: ARRAY [ ? ] OF LONGREAL; right: LONGREAL ): ARRAY [ ? ] OF LONGREAL;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGREAL ), AddAXSXLoop );
- RETURN RESULT
- END "+";
- OPERATOR "+"*(left: LONGREAL; CONST right: ARRAY [ ? ] OF LONGREAL): ARRAY [ ? ] OF LONGREAL;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( LONGREAL ), AddAXSXLoop );
- RETURN RESULT
- END "+";
- (** COMPLEX *)
- PROCEDURE AddAZSZLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: COMPLEX;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval + rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AddAZSZLoop;
- OPERATOR "+"*(CONST left: ARRAY [ ? ] OF COMPLEX; right: COMPLEX ): ARRAY [ ? ] OF COMPLEX;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( COMPLEX ),
- AddAZSZLoop );
- RETURN RESULT
- END "+";
- OPERATOR "+"*(left: COMPLEX; CONST right: ARRAY [ ? ] OF COMPLEX): ARRAY [ ? ] OF COMPLEX;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ), SIZEOF( COMPLEX ),
- AddAZSZLoop );
- RETURN RESULT
- END "+";
- (** LONGCOMPLEX *)
- PROCEDURE AddALZSLZLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lvalRe, lvalIm, rvalRe, rvalIm: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rvalRe ); SYSTEM.GET( radr+SIZEOF(LONGREAL), rvalIm );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- SYSTEM.PUT( dadr, lvalRe + rvalRe ); SYSTEM.PUT( dadr+SIZEOF(LONGREAL), lvalIm + rvalIm );
- INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AddALZSLZLoop;
- OPERATOR "+"*(CONST left: ARRAY [ ? ] OF LONGCOMPLEX; right: LONGCOMPLEX ): ARRAY [ ? ] OF LONGCOMPLEX;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( LONGCOMPLEX ),
- AddALZSLZLoop );
- RETURN RESULT
- END "+";
- OPERATOR "+"*(left: LONGCOMPLEX; CONST right: ARRAY [ ? ] OF LONGCOMPLEX): ARRAY [ ? ] OF LONGCOMPLEX;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ), SIZEOF( LONGCOMPLEX ),
- AddALZSLZLoop );
- RETURN RESULT
- END "+";
- (*** subtraction array - array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE SubASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval - rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END SubASASLoop;
- OPERATOR "-"*(CONST left,right: ARRAY [?] OF SHORTINT): ARRAY [?] OF SHORTINT;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( SHORTINT ), SubASASLoop );
- RETURN RESULT
- END "-";
- (** INTEGER *)
- PROCEDURE SubAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval - rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END SubAIAILoop;
- OPERATOR "-"*(CONST left,right: ARRAY [?] OF INTEGER): ARRAY [?] OF INTEGER;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( INTEGER ), SubAIAILoop );
- RETURN RESULT
- END "-";
- (** LONGINT *)
- PROCEDURE SubALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval - rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END SubALALLoop;
- OPERATOR "-"*(CONST left,right: ARRAY [?] OF LONGINT): ARRAY [?] OF LONGINT;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGINT ), SubALALLoop );
- RETURN RESULT
- END "-";
- (** REAL *)
- PROCEDURE SubARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval - rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END SubARARLoop;
- OPERATOR "-"*(CONST left,right: ARRAY [?] OF REAL): ARRAY [?] OF REAL;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( REAL ),
- SubARARLoop );
- RETURN RESULT
- END "-";
- (** LONGREAL *)
- PROCEDURE SubAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval - rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END SubAXAXLoop;
- OPERATOR "-"*(CONST left,right: ARRAY [?] OF LONGREAL): ARRAY [?] OF LONGREAL;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGREAL ), SubAXAXLoop );
- RETURN RESULT
- END "-";
- (** COMPLEX *)
- PROCEDURE SubAZAZLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: COMPLEX;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval - rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END SubAZAZLoop;
- OPERATOR "-"*(CONST left,right: ARRAY [?] OF COMPLEX): ARRAY [?] OF COMPLEX;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( COMPLEX ), SubAZAZLoop );
- RETURN RESULT
- END "-";
- (** LONGCOMPLEX *)
- PROCEDURE SubALZALZLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lvalRe, lvalIm, rvalRe, rvalIm: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- SYSTEM.GET( radr, rvalRe ); SYSTEM.GET( radr+SIZEOF(LONGREAL), rvalIm );
- SYSTEM.PUT( dadr, lvalRe-rvalRe ); SYSTEM.PUT( dadr+SIZEOF(LONGREAL), lvalIm-rvalIm );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END SubALZALZLoop;
- OPERATOR "-"*(CONST left,right: ARRAY [?] OF LONGCOMPLEX): ARRAY [?] OF LONGCOMPLEX;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGCOMPLEX ), SubALZALZLoop );
- RETURN RESULT
- END "-";
- (*** subtraction array-scalar -> array ********************************************************************)
- (** SHORTINT *)
- OPERATOR "-"*(CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): ARRAY [ ? ] OF SHORTINT; (* a: left, b: right, c: dest *)
- BEGIN
- RESULT := left + (-right);
- RETURN RESULT
- END "-";
- (** INTEGER *)
- OPERATOR "-"*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): ARRAY [ ? ] OF INTEGER;
- BEGIN
- RESULT := left + (-right);
- RETURN RESULT
- END "-";
- (** LONGINT *)
- OPERATOR "-"*(CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): ARRAY [ ? ] OF LONGINT;
- BEGIN
- RESULT := left + (-right);
- RETURN RESULT
- END "-";
- (** REAL *)
- OPERATOR "-"*(CONST left: ARRAY [ ? ] OF REAL; right: REAL ): ARRAY [ ? ] OF REAL;
- BEGIN
- RESULT := left + (-right);
- RETURN RESULT
- END "-";
- (** LONGREAL *)
- OPERATOR "-"*(CONST left: ARRAY [ ? ] OF LONGREAL; right: LONGREAL ): ARRAY [ ? ] OF LONGREAL;
- BEGIN
- RESULT := left + (-right);
- RETURN RESULT
- END "-";
- (** COMPLEX *)
- OPERATOR "-"*(CONST left: ARRAY [ ? ] OF COMPLEX; right: COMPLEX ): ARRAY [ ? ] OF COMPLEX;
- BEGIN
- RESULT := left + (-right);
- RETURN RESULT
- END "-";
- (** LONGCOMPLEX *)
- OPERATOR "-"*(CONST left: ARRAY [ ? ] OF LONGCOMPLEX; right: LONGCOMPLEX ): ARRAY [ ? ] OF LONGCOMPLEX;
- BEGIN
- RESULT := left + (-right);
- RETURN RESULT
- END "-";
- (*** subtraction scalar-array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE SubSSASLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval, dval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval - lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END SubSSASLoop;
- OPERATOR "-"*(left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT): ARRAY [ ? ] OF SHORTINT;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( SHORTINT ), SubSSASLoop );
- RETURN RESULT
- END "-";
- (** INTEGER *)
- PROCEDURE SubSIAILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval, dval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval - lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END SubSIAILoop;
- OPERATOR "-"*(left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER): ARRAY [ ? ] OF INTEGER;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( INTEGER ), SubSIAILoop );
- RETURN RESULT
- END "-";
- (** LONGINT *)
- PROCEDURE SubSLALLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval, dval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval - lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END SubSLALLoop;
- OPERATOR "-"*(left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT): ARRAY [ ? ] OF LONGINT;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( LONGINT ), SubSLALLoop );
- RETURN RESULT
- END "-";
- (** REAL *)
- PROCEDURE SubSRARLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval, dval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval - lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END SubSRARLoop;
- OPERATOR "-"*(left: REAL; CONST right: ARRAY [ ? ] OF REAL): ARRAY [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ), SIZEOF( REAL ),
- SubSRARLoop );
- RETURN RESULT
- END "-";
- (** LONGREAL *)
- PROCEDURE SubSXAXLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval, dval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval - lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END SubSXAXLoop;
- OPERATOR "-"*(left: LONGREAL; CONST right: ARRAY [ ? ] OF LONGREAL): ARRAY [ ? ] OF LONGREAL;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( LONGREAL ), SubSXAXLoop );
- RETURN RESULT
- END "-";
- (** COMPLEX *)
- PROCEDURE SubSZAZLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval, dval: COMPLEX;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval - lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END SubSZAZLoop;
- OPERATOR "-"*(left: COMPLEX; CONST right: ARRAY [ ? ] OF COMPLEX): ARRAY [ ? ] OF COMPLEX;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( COMPLEX ), SubSZAZLoop );
- RETURN RESULT
- END "-";
- (** LONGCOMPLEX *)
- PROCEDURE SubSLZALZLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lvalRe, lvalIm, rvalRe, rvalIm: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rvalRe ); SYSTEM.GET( radr+SIZEOF(LONGREAL), rvalIm );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- SYSTEM.PUT( dadr, rvalRe-lvalRe ); SYSTEM.PUT( dadr+SIZEOF(LONGREAL), rvalIm-lvalIm );
- INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END SubSLZALZLoop;
- OPERATOR "-"*(left: LONGCOMPLEX; CONST right: ARRAY [ ? ] OF LONGCOMPLEX): ARRAY [ ? ] OF LONGCOMPLEX;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( LONGCOMPLEX ), SubSLZALZLoop );
- RETURN RESULT
- END "-";
- (*** element-wise multiply array x array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE EMulASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval * rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EMulASASLoop;
- OPERATOR ".*"*(CONST left,right: ARRAY [?] OF SHORTINT): ARRAY [?] OF SHORTINT;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( SHORTINT ), EMulASASLoop );
- RETURN RESULT
- END ".*";
- (** INTEGER *)
- PROCEDURE EMulAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: INTEGER; dval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := lval * rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EMulAIAILoop;
- OPERATOR ".*"*(CONST left,right: ARRAY [?] OF INTEGER): ARRAY [?] OF INTEGER;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( INTEGER ), EMulAIAILoop );
- RETURN RESULT
- END ".*";
- (** LONGINT *)
- PROCEDURE EMulALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval * rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EMulALALLoop;
- OPERATOR ".*"*(CONST left,right: ARRAY [?] OF LONGINT): ARRAY [?] OF LONGINT;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGINT ), EMulALALLoop );
- RETURN RESULT
- END ".*";
- (** REAL *)
- PROCEDURE EMulARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval * rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EMulARARLoop;
- OPERATOR ".*"*(CONST left,right: ARRAY [?] OF REAL): ARRAY [?] OF REAL;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( REAL ),
- EMulARARLoop );
- RETURN RESULT
- END ".*";
- (** LONGREAL *)
- PROCEDURE EMulAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval * rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EMulAXAXLoop;
- OPERATOR ".*"*(CONST left,right: ARRAY [?] OF LONGREAL): ARRAY [?] OF LONGREAL;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGREAL ), EMulAXAXLoop );
- RETURN RESULT
- END ".*";
- (** COMPLEX *)
- PROCEDURE EMulAZAZLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: COMPLEX;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval * rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EMulAZAZLoop;
- OPERATOR ".*"*(CONST left,right: ARRAY [?] OF COMPLEX): ARRAY [?] OF COMPLEX;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( COMPLEX ), EMulAZAZLoop );
- RETURN RESULT
- END ".*";
- (** LONGCOMPLEX *)
- PROCEDURE EMulALZALZLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lvalRe, lvalIm, rvalRe, rvalIm: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- SYSTEM.GET( radr, rvalRe ); SYSTEM.GET( radr+SIZEOF(LONGREAL), rvalIm );
- SYSTEM.PUT( dadr, lvalRe*rvalRe - lvalIm*rvalIm ); SYSTEM.PUT( dadr+SIZEOF(LONGREAL), lvalRe*rvalIm + lvalIm*rvalRe );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EMulALZALZLoop;
- OPERATOR ".*"*(CONST left,right: ARRAY [?] OF LONGCOMPLEX): ARRAY [?] OF LONGCOMPLEX;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGCOMPLEX ), EMulALZALZLoop );
- RETURN RESULT
- END ".*";
- (*** element-wise multiply and add array x array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE EMulIncASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval,dval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.GET(dadr,dval); SYSTEM.PUT( dadr, dval + lval * rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EMulIncASASLoop;
- OPERATOR ".*+"*(CONST left,right: ARRAY [?] OF SHORTINT): ARRAY [?] OF SHORTINT;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( SHORTINT ), EMulIncASASLoop );
- END ".*+";
- (** INTEGER *)
- PROCEDURE EMulIncAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval,dval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );SYSTEM.GET(dadr,dval); dval := dval + lval * rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EMulIncAIAILoop;
- OPERATOR ".*+"*(CONST left,right: ARRAY [?] OF INTEGER): ARRAY [?] OF INTEGER;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( INTEGER ), EMulIncAIAILoop );
- END ".*+";
- (** LONGINT *)
- PROCEDURE EMulIncALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval,dval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.GET(dadr,dval); SYSTEM.PUT( dadr, dval+ lval * rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EMulIncALALLoop;
- OPERATOR ".*+"*(CONST left,right: ARRAY [?] OF LONGINT): ARRAY [?] OF LONGINT;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGINT ), EMulIncALALLoop );
- END ".*+";
- (** REAL *)
- PROCEDURE EMulIncARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval,dval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.GET(dadr,dval); SYSTEM.PUT( dadr, dval+ lval * rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EMulIncARARLoop;
- OPERATOR ".*+"*(CONST left,right: ARRAY [?] OF REAL): ARRAY [?] OF REAL;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( REAL ),
- EMulIncARARLoop );
- END ".*+";
- (** LONGREAL *)
- PROCEDURE EMulIncAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval,dval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.GET(dadr,dval); SYSTEM.PUT( dadr,dval+ lval * rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EMulIncAXAXLoop;
- OPERATOR ".*+"*(CONST left,right: ARRAY [?] OF LONGREAL): ARRAY [?] OF LONGREAL;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGREAL ), EMulIncAXAXLoop );
- END ".*+";
- (*** multiply array x scalar -> array and scalar + array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE MulASSSLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval * rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END MulASSSLoop;
- OPERATOR "*"*(CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): ARRAY [ ? ] OF SHORTINT;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( SHORTINT ), MulASSSLoop );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT): ARRAY [ ? ] OF SHORTINT;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( SHORTINT ), MulASSSLoop );
- RETURN RESULT
- END "*";
- (** INTEGER *)
- PROCEDURE MulAISILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval * rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END MulAISILoop;
- OPERATOR "*"*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): ARRAY [ ? ] OF INTEGER;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( INTEGER ), MulAISILoop );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER): ARRAY [ ? ] OF INTEGER;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( INTEGER ), MulAISILoop );
- RETURN RESULT
- END "*";
- (** LONGINT *)
- PROCEDURE MulALSLLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval * rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END MulALSLLoop;
- OPERATOR "*"*(CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): ARRAY [ ? ] OF LONGINT;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGINT ), MulALSLLoop );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT): ARRAY [ ? ] OF LONGINT;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( LONGINT ), MulALSLLoop );
- RETURN RESULT
- END "*";
- (** REAL *)
- PROCEDURE MulARSRLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval * rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END MulARSRLoop;
- OPERATOR "*"*(CONST left: ARRAY [ ? ] OF REAL; right: REAL ): ARRAY [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( REAL ),
- loopMulARSR );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(left: REAL; CONST right: ARRAY [ ? ] OF REAL): ARRAY [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ), SIZEOF( REAL ),
- loopMulARSR );
- RETURN RESULT
- END "*";
- (** LONGREAL *)
- PROCEDURE MulAXSXLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- IF debug THEN
- KernelLog.String( "MulAXSXLoop, ladr,radr,dadr,linc,dinc,len= " ); KernelLog.Int( ladr, 10 ); KernelLog.Int( radr, 10 );
- KernelLog.Int( dadr, 10 ); KernelLog.Int( linc, 10 ); KernelLog.Int( dinc, 10 );
- KernelLog.Int( len, 10 ); KernelLog.Ln;
- END;
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval * rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END MulAXSXLoop;
- OPERATOR "*"*(CONST left: ARRAY [ ? ] OF LONGREAL; right: LONGREAL ): ARRAY [ ? ] OF LONGREAL;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGREAL ), loopMulAXSX );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(left: LONGREAL; CONST right: ARRAY [ ? ] OF LONGREAL): ARRAY [ ? ] OF LONGREAL;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( LONGREAL ), loopMulAXSX );
- RETURN RESULT
- END "*";
- (** COMPLEX *)
- PROCEDURE MulAZSZLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: COMPLEX;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval * rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END MulAZSZLoop;
- OPERATOR "*"*(CONST left: ARRAY [ ? ] OF COMPLEX; right: COMPLEX ): ARRAY [ ? ] OF COMPLEX;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( COMPLEX ),
- loopMulAZSZ );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(left: COMPLEX; CONST right: ARRAY [ ? ] OF COMPLEX): ARRAY [ ? ] OF COMPLEX;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ), SIZEOF( COMPLEX ),
- loopMulAZSZ );
- RETURN RESULT
- END "*";
- (** LONGCOMPLEX *)
- PROCEDURE MulALZSLZLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lvalRe, lvalIm, rvalRe, rvalIm: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rvalRe ); SYSTEM.GET( radr+SIZEOF(LONGREAL), rvalIm );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- SYSTEM.PUT( dadr, lvalRe * rvalRe - lvalIm*rvalIm ); SYSTEM.PUT( dadr+SIZEOF(LONGREAL), lvalRe * rvalIm + lvalIm*rvalRe );
- INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END MulALZSLZLoop;
- OPERATOR "*"*(CONST left: ARRAY [ ? ] OF LONGCOMPLEX; right: LONGCOMPLEX ): ARRAY [ ? ] OF LONGCOMPLEX;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( LONGCOMPLEX ),
- loopMulALZSLZ );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(left: LONGCOMPLEX; CONST right: ARRAY [ ? ] OF LONGCOMPLEX): ARRAY [ ? ] OF LONGCOMPLEX;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ), SIZEOF( LONGCOMPLEX ),
- loopMulALZSLZ );
- RETURN RESULT
- END "*";
- (*** multiply and add array * scalar -> array and scalar * array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE IncMulASSSLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval, dval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( dadr, dval ); SYSTEM.PUT( dadr, dval + lval * rval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END IncMulASSSLoop;
- OPERATOR "INCMUL"*(CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): ARRAY [ ? ] OF SHORTINT;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( SHORTINT ), IncMulASSSLoop );
- END "INCMUL";
- OPERATOR "INCMUL"*(left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT): ARRAY [ ? ] OF SHORTINT;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( SHORTINT ), IncMulASSSLoop );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "DECMUL"*(CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): ARRAY [ ? ] OF SHORTINT;
- BEGIN
- RESULT := -RESULT;
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( SHORTINT ), IncMulASSSLoop );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*(left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT): ARRAY [ ? ] OF SHORTINT;
- BEGIN
- RESULT := -RESULT;
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( SHORTINT ), IncMulASSSLoop );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- (** INTEGER *)
- PROCEDURE IncMulAISILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval, dval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( dadr, dval ); SYSTEM.PUT( dadr, dval + lval * rval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END IncMulAISILoop;
- OPERATOR "INCMUL"*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): ARRAY [ ? ] OF INTEGER;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( INTEGER ), IncMulAISILoop );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "INCMUL"*(left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER): ARRAY [ ? ] OF INTEGER;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( INTEGER ), IncMulAISILoop );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "DECMUL"*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): ARRAY [ ? ] OF INTEGER;
- BEGIN
- RESULT := -RESULT;
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( INTEGER ), IncMulAISILoop );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*(left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER): ARRAY [ ? ] OF INTEGER;
- BEGIN
- RESULT := -RESULT;
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( INTEGER ), IncMulAISILoop );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- (** LONGINT *)
- PROCEDURE IncMulALSLLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval, dval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( dadr, dval ); SYSTEM.PUT( dadr, dval + lval * rval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END IncMulALSLLoop;
- OPERATOR "INCMUL"*(CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): ARRAY [ ? ] OF LONGINT;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGINT ), IncMulALSLLoop );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "INCMUL"*(left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT): ARRAY [ ? ] OF LONGINT;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( LONGINT ), IncMulALSLLoop );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "DECMUL"*(CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): ARRAY [ ? ] OF LONGINT;
- BEGIN
- RESULT := -RESULT;
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGINT ), IncMulALSLLoop );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*(left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT): ARRAY [ ? ] OF LONGINT;
- BEGIN
- RESULT := -RESULT;
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( LONGINT ), IncMulALSLLoop );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- (** REAL *)
- PROCEDURE IncMulARSRLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval, dval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( dadr, dval ); SYSTEM.PUT( dadr, dval + lval * rval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END IncMulARSRLoop;
- OPERATOR "INCMUL"*(CONST left: ARRAY [ ? ] OF REAL; right: REAL ): ARRAY [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( REAL ),
- loopIncMulARSR );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "INCMUL"*(left: REAL; CONST right: ARRAY [ ? ] OF REAL): ARRAY [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ), SIZEOF( REAL ),
- loopIncMulARSR );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "DECMUL"*(CONST left: ARRAY [ ? ] OF REAL; right: REAL ): ARRAY [ ? ] OF REAL;
- BEGIN
- RESULT := -RESULT;
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( REAL ),
- loopIncMulARSR );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*(left: REAL; CONST right: ARRAY [ ? ] OF REAL): ARRAY [ ? ] OF REAL;
- BEGIN
- RESULT := -RESULT;
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ), SIZEOF( REAL ),
- loopIncMulARSR );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- (** LONGREAL *)
- PROCEDURE IncMulAXSXLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval, dval: LONGREAL;
- BEGIN
- IF debug THEN
- KernelLog.String( "IncMulAXSXLoop, ladr,radr,dadr,linc,dinc,len= " ); KernelLog.Int( ladr, 10 ); KernelLog.Int( radr, 10 );
- KernelLog.Int( dadr, 10 ); KernelLog.Int( linc, 10 ); KernelLog.Int( dinc, 10 );
- KernelLog.Int( len, 10 ); KernelLog.Ln;
- END;
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( dadr, dval ); SYSTEM.PUT( dadr, dval + lval * rval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END IncMulAXSXLoop;
- OPERATOR "INCMUL"*(CONST left: ARRAY [ ? ] OF LONGREAL; right: LONGREAL ): ARRAY [ ? ] OF LONGREAL;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGREAL ), loopIncMulAXSX );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "INCMUL"*(left: LONGREAL; CONST right: ARRAY [ ? ] OF LONGREAL): ARRAY [ ? ] OF LONGREAL;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( LONGREAL ), loopIncMulAXSX );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "DECMUL"*(CONST left: ARRAY [ ? ] OF LONGREAL; right: LONGREAL ): ARRAY [ ? ] OF LONGREAL;
- BEGIN
- RESULT := -RESULT;
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGREAL ), loopIncMulAXSX );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*(left: LONGREAL; CONST right: ARRAY [ ? ] OF LONGREAL): ARRAY [ ? ] OF LONGREAL;
- BEGIN
- RESULT := -RESULT;
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( LONGREAL ), loopIncMulAXSX );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- (*** element-wise division array / array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE EDivideASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT; dval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := lval / rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EDivideASASLoop;
- OPERATOR "./"*(CONST left,right: ARRAY [?] OF SHORTINT): ARRAY [?] OF REAL;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( REAL ),
- EDivideASASLoop );
- RETURN RESULT
- END "./";
- (** INTEGER *)
- PROCEDURE EDivideAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: INTEGER; dval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := lval / rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EDivideAIAILoop;
- OPERATOR "./"*(CONST left,right: ARRAY [?] OF INTEGER): ARRAY [?] OF REAL;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( REAL ),
- EDivideAIAILoop );
- RETURN RESULT
- END "./";
- (** LONGINT *)
- PROCEDURE EDivideALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGINT; dval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := lval / rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EDivideALALLoop;
- OPERATOR "./"*(CONST left,right: ARRAY [?] OF LONGINT): ARRAY [?] OF REAL;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( REAL ),
- EDivideALALLoop );
- RETURN RESULT
- END "./";
- (** REAL *)
- PROCEDURE EDivideARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: REAL; dval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := lval / rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EDivideARARLoop;
- OPERATOR "./"*(CONST left,right: ARRAY [?] OF REAL): ARRAY [?] OF REAL;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( REAL ),
- EDivideARARLoop );
- RETURN RESULT
- END "./";
- (** LONGREAL *)
- PROCEDURE EDivideAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL; dval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := lval / rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EDivideAXAXLoop;
- OPERATOR "./"*(CONST left,right: ARRAY [?] OF LONGREAL): ARRAY [?] OF LONGREAL;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGREAL ), EDivideAXAXLoop );
- RETURN RESULT
- END "./";
- (** COMPLEX *)
- PROCEDURE EDivideAZAZLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: COMPLEX; dval: COMPLEX;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := lval / rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EDivideAZAZLoop;
- OPERATOR "./"*(CONST left,right: ARRAY [?] OF COMPLEX): ARRAY [?] OF COMPLEX;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( COMPLEX ), EDivideAZAZLoop );
- RETURN RESULT
- END "./";
- (** LONGCOMPLEX *)
- PROCEDURE EDivideALZALZLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lvalRe, lvalIm, rvalRe, rvalIm: LONGREAL; dvalRe, dvalIm: LONGREAL; v: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- SYSTEM.GET( radr, rvalRe ); SYSTEM.GET( radr+SIZEOF(LONGREAL), rvalIm );
- IF rvalIm # 0.0D0 THEN
- v := 1.0D0/(rvalRe*rvalRe + rvalIm*rvalIm);
- dvalRe := v*(lvalRe*rvalRe+lvalIm*rvalIm);
- dvalIm := v*(lvalIm*rvalRe-lvalRe*rvalIm);
- ELSE
- dvalRe := lvalRe/rvalRe;
- dvalIm := lvalIm/rvalRe;
- END;
- SYSTEM.PUT( dadr, dvalRe ); SYSTEM.PUT( dadr+SIZEOF(LONGREAL), dvalIm );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EDivideALZALZLoop;
- OPERATOR "./"*(CONST left,right: ARRAY [?] OF LONGCOMPLEX): ARRAY [?] OF LONGCOMPLEX;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGCOMPLEX ), EDivideALZALZLoop );
- RETURN RESULT
- END "./";
- (*** division array / scalar -> array and scalar / array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE DivideASSSLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT; dval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval / rval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END DivideASSSLoop;
- OPERATOR "/"*(CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): ARRAY [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( REAL ),
- DivideASSSLoop );
- RETURN RESULT
- END "/";
- PROCEDURE DivideSSASLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT; dval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval / lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END DivideSSASLoop;
- OPERATOR "/"*(left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT): ARRAY [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ), SIZEOF( REAL ),
- DivideSSASLoop );
- RETURN RESULT
- END "/";
- (** INTEGER *)
- PROCEDURE DivideAISILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: INTEGER; dval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval / rval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END DivideAISILoop;
- OPERATOR "/"*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): ARRAY [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( REAL ),
- DivideAISILoop );
- RETURN RESULT
- END "/";
- PROCEDURE DivideSIAILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: INTEGER; dval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval / lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END DivideSIAILoop;
- OPERATOR "/"*(left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER): ARRAY [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ), SIZEOF( REAL ),
- DivideSIAILoop );
- RETURN RESULT
- END "/";
- (** LONGINT *)
- PROCEDURE DivideALSLLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGINT; dval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval / rval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END DivideALSLLoop;
- OPERATOR "/"*(CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): ARRAY [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( REAL ),
- DivideALSLLoop );
- RETURN RESULT
- END "/";
- PROCEDURE DivideSLALLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGINT; dval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval / lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END DivideSLALLoop;
- OPERATOR "/"*(left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT): ARRAY [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ), SIZEOF( REAL ),
- DivideSLALLoop );
- RETURN RESULT
- END "/";
- (** REAL *)
- PROCEDURE DivideARSRLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: REAL; dval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval / rval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END DivideARSRLoop;
- OPERATOR "/"*(CONST left: ARRAY [ ? ] OF REAL; right: REAL ): ARRAY [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( REAL ),
- DivideARSRLoop );
- RETURN RESULT
- END "/";
- PROCEDURE DivideSRARLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: REAL; dval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval / lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END DivideSRARLoop;
- OPERATOR "/"*(left: REAL; CONST right: ARRAY [ ? ] OF REAL): ARRAY [ ? ] OF REAL;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ), SIZEOF( REAL ),
- DivideSRARLoop );
- RETURN RESULT
- END "/";
- (** LONGREAL *)
- PROCEDURE DivideAXSXLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL; dval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval / rval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END DivideAXSXLoop;
- OPERATOR "/"*(CONST left: ARRAY [ ? ] OF LONGREAL; right: LONGREAL ): ARRAY [ ? ] OF LONGREAL;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGREAL ), DivideAXSXLoop );
- RETURN RESULT
- END "/";
- PROCEDURE DivideSXAXLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL; dval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval / lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END DivideSXAXLoop;
- OPERATOR "/"*(left: LONGREAL; CONST right: ARRAY [ ? ] OF LONGREAL): ARRAY [ ? ] OF LONGREAL;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( LONGREAL ), DivideSXAXLoop );
- RETURN RESULT
- END "/";
- (** COMPLEX *)
- PROCEDURE DivideAZSZLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: COMPLEX; dval: COMPLEX;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval / rval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END DivideAZSZLoop;
- OPERATOR "/"*(CONST left: ARRAY [ ? ] OF COMPLEX; right: COMPLEX ): ARRAY [ ? ] OF COMPLEX;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( COMPLEX ), DivideAZSZLoop );
- RETURN RESULT
- END "/";
- PROCEDURE DivideSZAZLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: COMPLEX; dval: COMPLEX;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval / lval; SYSTEM.PUT( dadr, dval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END DivideSZAZLoop;
- OPERATOR "/"*(left: COMPLEX; CONST right: ARRAY [ ? ] OF COMPLEX): ARRAY [ ? ] OF COMPLEX;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( COMPLEX ), DivideSZAZLoop );
- RETURN RESULT
- END "/";
- (** LONGCOMPLEX *)
- PROCEDURE DivideALZSLZLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lvalRe, lvalIm, rvalRe, rvalIm: LONGREAL; dvalRe, dvalIm: LONGREAL; v: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rvalRe ); SYSTEM.GET( radr+SIZEOF(LONGREAL), rvalIm );
- IF rvalIm # 0.0D0 THEN
- v := 1.0D0/(rvalRe*rvalRe + rvalIm*rvalIm);
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- dvalRe := v*(lvalRe*rvalRe+lvalIm*rvalIm);
- dvalIm := v*(lvalIm*rvalRe-lvalRe*rvalIm);
- SYSTEM.PUT( dadr, dvalRe ); SYSTEM.PUT( dadr+SIZEOF(LONGREAL), dvalIm );
- INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- ELSE
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- dvalRe := lvalRe / rvalRe; dvalIm := lvalIm / rvalRe;
- SYSTEM.PUT( dadr, dvalRe ); SYSTEM.PUT( dadr+SIZEOF(LONGREAL), dvalIm );
- INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END;
- END DivideALZSLZLoop;
- OPERATOR "/"*(CONST left: ARRAY [ ? ] OF LONGCOMPLEX; right: LONGCOMPLEX ): ARRAY [ ? ] OF LONGCOMPLEX;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGCOMPLEX ), DivideALZSLZLoop );
- RETURN RESULT
- END "/";
- PROCEDURE DivideSLZALZLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lvalRe, lvalIm, rvalRe, rvalIm: LONGREAL; dvalRe, dvalIm: LONGREAL; v: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rvalRe ); SYSTEM.GET( radr+SIZEOF(LONGREAL), rvalIm );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- v := 1.0D0/(lvalRe*lvalRe + lvalIm*lvalIm);
- dvalRe := v*(rvalRe*lvalRe+rvalIm*lvalIm);
- dvalIm := v*(rvalIm*lvalRe-rvalRe*lvalIm);
- SYSTEM.PUT( dadr, dvalRe ); SYSTEM.PUT( dadr+SIZEOF(LONGREAL), dvalIm );
- INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END DivideSLZALZLoop;
- OPERATOR "/"*(left: LONGCOMPLEX; CONST right: ARRAY [ ? ] OF LONGCOMPLEX): ARRAY [ ? ] OF LONGCOMPLEX;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( LONGCOMPLEX ), DivideSLZALZLoop );
- RETURN RESULT
- END "/";
- (*** element-wise DIV array DIV array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE EDivASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT; dval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := lval DIV rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EDivASASLoop;
- OPERATOR "DIV"*(CONST left,right: ARRAY [?] OF SHORTINT): ARRAY [?] OF SHORTINT;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( SHORTINT ), EDivASASLoop );
- RETURN RESULT
- END "DIV";
- (** INTEGER *)
- PROCEDURE EDivAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: INTEGER; dval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := lval DIV rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EDivAIAILoop;
- OPERATOR "DIV"*(CONST left,right: ARRAY [?] OF INTEGER): ARRAY [?] OF INTEGER;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( INTEGER ), EDivAIAILoop );
- RETURN RESULT
- END "DIV";
- (** LONGINT *)
- PROCEDURE EDivALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGINT; dval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := lval DIV rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EDivALALLoop;
- OPERATOR "DIV"*(CONST left,right: ARRAY [?] OF LONGINT): ARRAY [?] OF LONGINT;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGINT ), EDivALALLoop );
- RETURN RESULT
- END "DIV";
- (*** division array DIV scalar -> array and scalar DIV array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE DivASSSLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT; dval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval DIV rval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END DivASSSLoop;
- OPERATOR "DIV"*(CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): ARRAY [ ? ] OF SHORTINT;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( SHORTINT ), DivASSSLoop );
- RETURN RESULT
- END "DIV";
- PROCEDURE DivSSASLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT; dval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval DIV lval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END DivSSASLoop;
- OPERATOR "DIV"*(left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT): ARRAY [ ? ] OF SHORTINT;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( SHORTINT ), DivSSASLoop );
- RETURN RESULT
- END "DIV";
- (** INTEGER *)
- PROCEDURE DivAISILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: INTEGER; dval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval DIV rval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END DivAISILoop;
- OPERATOR "DIV"*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): ARRAY [ ? ] OF INTEGER;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( INTEGER ), DivAISILoop );
- RETURN RESULT
- END "DIV";
- PROCEDURE DivSIAILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: INTEGER; dval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval DIV lval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END DivSIAILoop;
- OPERATOR "DIV"*(left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER): ARRAY [ ? ] OF INTEGER;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( INTEGER ), DivSIAILoop );
- RETURN RESULT
- END "DIV";
- (** LONGINT *)
- PROCEDURE DivALSLLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGINT; dval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval DIV rval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END DivALSLLoop;
- OPERATOR "DIV"*(CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): ARRAY [ ? ] OF LONGINT;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGINT ), DivALSLLoop );
- RETURN RESULT
- END "DIV";
- PROCEDURE DivSLALLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGINT; dval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval DIV lval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END DivSLALLoop;
- OPERATOR "DIV"*(left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT): ARRAY [ ? ] OF LONGINT;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( LONGINT ), DivSLALLoop );
- RETURN RESULT
- END "DIV";
- (*** element-wise modulus array MOD array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE EModASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT; dval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := lval MOD rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EModASASLoop;
- OPERATOR "MOD"*(CONST left,right: ARRAY [?] OF SHORTINT): ARRAY [?] OF SHORTINT;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( SHORTINT ), EModASASLoop );
- RETURN RESULT
- END "MOD";
- (** INTEGER *)
- PROCEDURE EModAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: INTEGER; dval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := lval MOD rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EModAIAILoop;
- OPERATOR "MOD"*(CONST left,right: ARRAY [?] OF INTEGER): ARRAY [?] OF INTEGER;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( INTEGER ), EModAIAILoop );
- RETURN RESULT
- END "MOD";
- (** LONGINT *)
- PROCEDURE EModALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGINT; dval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := lval MOD rval;
- SYSTEM.PUT( dadr, dval ); INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc );
- DEC( len );
- END;
- END EModALALLoop;
- OPERATOR "MOD"*(CONST left,right: ARRAY [?] OF LONGINT): ARRAY [?] OF LONGINT;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGINT ), EModALALLoop );
- RETURN RESULT
- END "MOD";
- (*** modulus array MOD scalar -> array and scalar MOD array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE ModASSSLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT; dval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval MOD rval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END ModASSSLoop;
- OPERATOR "MOD"*(CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): ARRAY [ ? ] OF SHORTINT;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( SHORTINT ), ModASSSLoop );
- RETURN RESULT
- END "MOD";
- PROCEDURE ModSSASLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT; dval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval MOD lval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END ModSSASLoop;
- OPERATOR "MOD"*(left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT): ARRAY [ ? ] OF SHORTINT;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( SHORTINT ), ModSSASLoop );
- RETURN RESULT
- END "MOD";
- (** INTEGER *)
- PROCEDURE ModAISILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: INTEGER; dval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval MOD rval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END ModAISILoop;
- OPERATOR "MOD"*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): ARRAY [ ? ] OF INTEGER;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( INTEGER ), ModAISILoop );
- RETURN RESULT
- END "MOD";
- PROCEDURE ModSIAILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: INTEGER; dval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval MOD lval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END ModSIAILoop;
- OPERATOR "MOD"*(left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER): ARRAY [ ? ] OF INTEGER;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( INTEGER ), ModSIAILoop );
- RETURN RESULT
- END "MOD";
- (** LONGINT *)
- PROCEDURE ModALSLLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGINT; dval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := lval MOD rval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END ModALSLLoop;
- OPERATOR "MOD"*(CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): ARRAY [ ? ] OF LONGINT;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGINT ), ModALSLLoop );
- RETURN RESULT
- END "MOD";
- PROCEDURE ModSLALLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGINT; dval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := rval MOD lval; SYSTEM.PUT( dadr, dval );
- INC( ladr, linc ); INC( dadr, dinc ); DEC( len );
- END;
- END ModSLALLoop;
- OPERATOR "MOD"*(left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT): ARRAY [ ? ] OF LONGINT;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( LONGINT ), ModSLALLoop );
- RETURN RESULT
- END "MOD";
- (*** scalar product <array,array> -> scalar ********************************************************************)
- (** SHORTINT *)
- PROCEDURE SPASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval: SHORTINT; dval: LONGINT;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := dval + rval * lval;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END SPASASLoop;
- OPERATOR "+*"*( CONST left, right: ARRAY [ ? ] OF SHORTINT ): LONGINT;
- VAR dest: LONGINT;
- BEGIN
- dest := 0;
- ApplyBinaryAASOp( ADDRESSOF( dest ), ADDRESSOF( left ), ADDRESSOF( right ), SPASASLoop );
- RETURN dest;
- END "+*";
- (** INTEGER *)
- PROCEDURE SPAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval: INTEGER; dval: LONGINT;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := dval + rval * lval;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END SPAIAILoop;
- OPERATOR "+*"*( CONST left, right: ARRAY [ ? ] OF INTEGER ): LONGINT;
- VAR dest: LONGINT;
- BEGIN
- dest := 0;
- ApplyBinaryAASOp( ADDRESSOF( dest ), ADDRESSOF( left ), ADDRESSOF( right ), SPAIAILoop );
- RETURN dest;
- END "+*";
- (** LONGINT *)
- PROCEDURE SPALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval: LONGINT; dval: LONGINT;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := dval + rval * lval;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END SPALALLoop;
- OPERATOR "+*"*( CONST left, right: ARRAY [ ? ] OF LONGINT ): LONGINT;
- VAR dest: LONGINT;
- BEGIN
- dest := 0;
- ApplyBinaryAASOp( ADDRESSOF( dest ), ADDRESSOF( left ), ADDRESSOF( right ), SPALALLoop );
- RETURN dest;
- END "+*";
- (** REAL *)
- PROCEDURE SPARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval: REAL; dval: REAL;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := dval + rval * lval;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END SPARARLoop;
- OPERATOR "+*"*( CONST left, right: ARRAY [ ? ] OF REAL ): REAL;
- VAR dest: REAL;
- BEGIN
- dest := 0;
- ApplyBinaryAASOp( ADDRESSOF( dest ), ADDRESSOF( left ), ADDRESSOF( right ), loopSPARAR );
- RETURN dest;
- END "+*";
- PROCEDURE SPAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval, dval: LONGREAL;
- BEGIN
- IF debug THEN
- KernelLog.String( "SPAXAX, ladr,radr,dadr,linc,rinc,len= " ); KernelLog.Int( ladr, 10 ); KernelLog.Int( radr, 10 );
- KernelLog.Int( dadr, 10 ); KernelLog.Int( linc, 10 ); KernelLog.Int( rinc, 10 );
- KernelLog.Int( len, 10 ); KernelLog.Ln;
- END;
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); INC( ladr, linc ); SYSTEM.GET( radr, rval ); INC( radr, rinc );
- dval := dval + rval * lval; DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END SPAXAXLoop;
- OPERATOR "+*"*( CONST left, right: ARRAY [ ? ] OF LONGREAL ): LONGREAL;
- VAR dest: LONGREAL;
- BEGIN
- dest := 0;
- ApplyBinaryAASOp( ADDRESSOF( dest ), ADDRESSOF( left ), ADDRESSOF( right ), loopSPAXAX );
- RETURN dest;
- END "+*";
- (** COMPLEX *)
- PROCEDURE SPAZAZLoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval: COMPLEX; dval: COMPLEX;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- RE(dval) := RE(dval) + RE(lval) * RE(rval) + IM(lval) * IM(rval);
- IM(dval) := IM(dval) - RE(lval) * IM(rval) + IM(lval) * RE(rval);
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END SPAZAZLoop;
- OPERATOR "+*"*( CONST left, right: ARRAY [ ? ] OF COMPLEX ): COMPLEX;
- VAR dest: COMPLEX;
- BEGIN
- dest := 0;
- ApplyBinaryAASOp( ADDRESSOF( dest ), ADDRESSOF( left ), ADDRESSOF( right ), loopSPAZAZ );
- RETURN dest;
- END "+*";
- (** COMPLEX *)
- PROCEDURE SPALZALZLoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lvalRe, lvalIm, rvalRe, rvalIm: LONGREAL; dvalRe, dvalIm: LONGREAL;
- BEGIN
- SYSTEM.GET( dadr, dvalRe ); SYSTEM.GET( dadr+SIZEOF(LONGREAL), dvalIm );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- SYSTEM.GET( radr, rvalRe ); SYSTEM.GET( radr+SIZEOF(LONGREAL), rvalIm );
- dvalRe := dvalRe + lvalRe * rvalRe + lvalIm * rvalIm;
- dvalIm := dvalIm - lvalRe * rvalIm + lvalIm * rvalRe;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dvalRe ); SYSTEM.PUT( dadr+SIZEOF(LONGREAL), dvalIm );
- END SPALZALZLoop;
- OPERATOR "+*"*( CONST left, right: ARRAY [ ? ] OF LONGCOMPLEX ): LONGCOMPLEX;
- VAR dest: LONGCOMPLEX;
- BEGIN
- dest := 0;
- ApplyBinaryAASOp( ADDRESSOF( dest ), ADDRESSOF( left ), ADDRESSOF( right ), loopSPALZALZ );
- RETURN dest;
- END "+*";
- (*** element-wise equal: array x array -> array of boolean ********************************************************************)
- (** BOOLEAN *)
- PROCEDURE EEqlABABLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: BOOLEAN;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval = rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EEqlABABLoop;
- OPERATOR ".="*(CONST left,right : ARRAY [?] OF BOOLEAN):ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EEqlABABLoop );
- RETURN RESULT
- END ".=";
- (** SHORTINT *)
- PROCEDURE EEqlASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval = rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EEqlASASLoop;
- OPERATOR ".="*(CONST left, right: ARRAY [ ? ] OF SHORTINT ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EEqlASASLoop );
- RETURN RESULT
- END ".=";
- (** INTEGER *)
- PROCEDURE EEqlAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval = rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EEqlAIAILoop;
- OPERATOR ".="*(CONST left, right: ARRAY [ ? ] OF INTEGER ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EEqlAIAILoop );
- RETURN RESULT
- END ".=";
- (** LONGINT *)
- PROCEDURE EEqlALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval = rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EEqlALALLoop;
- OPERATOR ".="*(CONST left, right: ARRAY [ ? ] OF LONGINT ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EEqlALALLoop );
- RETURN RESULT
- END ".=";
- (** REAL *)
- PROCEDURE EEqlARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval = rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EEqlARARLoop;
- OPERATOR ".="*(CONST left, right: ARRAY [ ? ] OF REAL ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EEqlARARLoop );
- RETURN RESULT
- END ".=";
- (** LONGREAL *)
- PROCEDURE EEqlAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval = rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EEqlAXAXLoop;
- OPERATOR ".="*(CONST left, right: ARRAY [ ? ] OF LONGREAL ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EEqlAXAXLoop );
- RETURN RESULT
- END ".=";
- (*** elementwise equal array x scalar -> array of boolean ********************************************************************)
- (** BOOLEAN *)
- PROCEDURE EEqlABSBLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: BOOLEAN;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval = rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EEqlABSBLoop;
- OPERATOR ".="*(CONST left : ARRAY [?] OF BOOLEAN; right: BOOLEAN):ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EEqlABSBLoop );
- RETURN RESULT
- END ".=";
- OPERATOR ".="*(left: BOOLEAN; CONST right : ARRAY [?] OF BOOLEAN):ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EEqlABSBLoop );
- RETURN RESULT
- END ".=";
- (** SHORTINT *)
- PROCEDURE EEqlASSSLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval = rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EEqlASSSLoop;
- OPERATOR ".="*(CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EEqlASSSLoop );
- RETURN RESULT
- END ".=";
- OPERATOR ".="*(left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EEqlASSSLoop );
- RETURN RESULT
- END ".=";
- (** INTEGER *)
- PROCEDURE EEqlAISILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval = rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EEqlAISILoop;
- OPERATOR ".="*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EEqlAISILoop );
- RETURN RESULT
- END ".=";
- OPERATOR ".="*(left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EEqlAISILoop );
- RETURN RESULT
- END ".=";
- (** LONGINT *)
- PROCEDURE EEqlALSLLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval = rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EEqlALSLLoop;
- OPERATOR ".="*(CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EEqlALSLLoop );
- RETURN RESULT
- END ".=";
- OPERATOR ".="*(left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EEqlALSLLoop );
- RETURN RESULT
- END ".=";
- (** REAL *)
- PROCEDURE EEqlARSRLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval = rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EEqlARSRLoop;
- OPERATOR ".="*(CONST left: ARRAY [ ? ] OF REAL; right: REAL ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EEqlARSRLoop );
- RETURN RESULT
- END ".=";
- OPERATOR ".="*(left: REAL; CONST right: ARRAY [ ? ] OF REAL): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EEqlARSRLoop );
- RETURN RESULT
- END ".=";
- (** LONGREAL *)
- PROCEDURE EEqlAXSXLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval = rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EEqlAXSXLoop;
- OPERATOR ".="*(CONST left: ARRAY [ ? ] OF LONGREAL; right: LONGREAL ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EEqlAXSXLoop );
- RETURN RESULT
- END ".=";
- OPERATOR ".="*(left: LONGREAL; CONST right: ARRAY [ ? ] OF LONGREAL): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EEqlAXSXLoop );
- RETURN RESULT
- END ".=";
- (*** elementwise nequal: array x array -> array of boolean ********************************************************************)
- (** BOOLEAN *)
- PROCEDURE ENeqABABLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: BOOLEAN;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval # rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ENeqABABLoop;
- OPERATOR ".#"*(CONST left,right : ARRAY [?] OF BOOLEAN):ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ENeqABABLoop );
- RETURN RESULT
- END ".#";
- (** SHORTINT *)
- PROCEDURE ENeqASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval # rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ENeqASASLoop;
- OPERATOR ".#"*(CONST left, right: ARRAY [ ? ] OF SHORTINT ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ENeqASASLoop );
- RETURN RESULT
- END ".#";
- (** INTEGER*)
- PROCEDURE ENeqAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval # rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ENeqAIAILoop;
- OPERATOR ".#"*(CONST left, right: ARRAY [ ? ] OF INTEGER ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ENeqAIAILoop );
- RETURN RESULT
- END ".#";
- (** LONGINT*)
- PROCEDURE ENeqALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval # rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ENeqALALLoop;
- OPERATOR ".#"*(CONST left, right: ARRAY [ ? ] OF LONGINT ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ENeqALALLoop );
- RETURN RESULT
- END ".#";
- (** REAL *)
- PROCEDURE ENeqARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval # rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ENeqARARLoop;
- OPERATOR ".#"*(CONST left, right: ARRAY [ ? ] OF REAL ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ENeqARARLoop );
- RETURN RESULT
- END ".#";
- (** LONGREAL *)
- PROCEDURE ENeqAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval # rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ENeqAXAXLoop;
- OPERATOR ".#"*(CONST left, right: ARRAY [ ? ] OF LONGREAL ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ENeqAXAXLoop );
- RETURN RESULT
- END ".#";
- (*** elementwise nequal array x scalar -> array of boolean ********************************************************************)
- (** BOOLEAN *)
- PROCEDURE ENeqABSBLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: BOOLEAN;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval # rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ENeqABSBLoop;
- OPERATOR ".#"*(CONST left : ARRAY [?] OF BOOLEAN; right: BOOLEAN):ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ENeqABSBLoop );
- RETURN RESULT
- END ".#";
- OPERATOR ".#"*(left: BOOLEAN; CONST right : ARRAY [?] OF BOOLEAN):ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ENeqABSBLoop );
- RETURN RESULT
- END ".#";
- (** SHORTINT *)
- PROCEDURE ENeqASSSLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval # rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ENeqASSSLoop;
- OPERATOR ".#"*(CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ENeqASSSLoop );
- RETURN RESULT
- END ".#";
- OPERATOR ".#"*(left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ENeqASSSLoop );
- RETURN RESULT
- END ".#";
- (** INTEGER *)
- PROCEDURE ENeqAISILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval # rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ENeqAISILoop;
- OPERATOR ".#"*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ENeqAISILoop );
- RETURN RESULT
- END ".#";
- OPERATOR ".#"*(left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ENeqAISILoop );
- RETURN RESULT
- END ".#";
- (** LONGINT *)
- PROCEDURE ENeqALSLLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval # rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ENeqALSLLoop;
- OPERATOR ".#"*(CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ENeqALSLLoop );
- RETURN RESULT
- END ".#";
- OPERATOR ".#"*(left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ENeqALSLLoop );
- RETURN RESULT
- END ".#";
- (** REAL *)
- PROCEDURE ENeqARSRLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval # rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ENeqARSRLoop;
- OPERATOR ".#"*(CONST left: ARRAY [ ? ] OF REAL; right: REAL ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ENeqARSRLoop );
- RETURN RESULT
- END ".#";
- OPERATOR ".#"*(left: REAL; CONST right: ARRAY [ ? ] OF REAL): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ENeqARSRLoop );
- RETURN RESULT
- END ".#";
- (** LONGREAL *)
- PROCEDURE ENeqAXSXLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval # rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ENeqAXSXLoop;
- OPERATOR ".#"*(CONST left: ARRAY [ ? ] OF LONGREAL; right: LONGREAL ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ENeqAXSXLoop );
- RETURN RESULT
- END ".#";
- OPERATOR ".#"*(left: LONGREAL; CONST right: ARRAY [ ? ] OF LONGREAL): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ENeqAXSXLoop );
- RETURN RESULT
- END ".#";
- (*** elementwise greater than: array x array -> array of boolean ********************************************************************)
- (** SHORTINT *)
- PROCEDURE EGtrASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval > rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EGtrASASLoop;
- OPERATOR ".>"*(CONST left, right: ARRAY [ ? ] OF SHORTINT ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGtrASASLoop );
- RETURN RESULT
- END ".>";
- (** INTEGER *)
- PROCEDURE EGtrAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval > rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EGtrAIAILoop;
- OPERATOR ".>"*(CONST left, right: ARRAY [ ? ] OF INTEGER ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGtrAIAILoop );
- RETURN RESULT
- END ".>";
- (** LONGINT *)
- PROCEDURE EGtrALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval > rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EGtrALALLoop;
- OPERATOR ".>"*(CONST left, right: ARRAY [ ? ] OF LONGINT ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGtrALALLoop );
- RETURN RESULT
- END ".>";
- (** REAL *)
- PROCEDURE EGtrARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval > rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EGtrARARLoop;
- OPERATOR ".>"*(CONST left, right: ARRAY [ ? ] OF REAL ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGtrARARLoop );
- RETURN RESULT
- END ".>";
- (** LONGREAL *)
- PROCEDURE EGtrAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval > rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EGtrAXAXLoop;
- OPERATOR ".>"*(CONST left, right: ARRAY [ ? ] OF LONGREAL ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGtrAXAXLoop );
- RETURN RESULT
- END ".>";
- (*** elementwise greater array x scalar -> array of boolean ********************************************************************)
- (** SHORTINT *)
- PROCEDURE EGtrASSSLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval > rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EGtrASSSLoop;
- OPERATOR ".>"*(CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGtrASSSLoop );
- RETURN RESULT
- END ".>";
- OPERATOR ".<"*(left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EGtrASSSLoop );
- RETURN RESULT
- END ".<";
- (** INTEGER *)
- PROCEDURE EGtrAISILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval > rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EGtrAISILoop;
- OPERATOR ".>"*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGtrAISILoop );
- RETURN RESULT
- END ".>";
- OPERATOR ".<"*(left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EGtrAISILoop );
- RETURN RESULT
- END ".<";
- (** LONGINT *)
- PROCEDURE EGtrALSLLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval > rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EGtrALSLLoop;
- OPERATOR ".>"*(CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGtrALSLLoop );
- RETURN RESULT
- END ".>";
- OPERATOR ".<"*(left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EGtrALSLLoop );
- RETURN RESULT
- END ".<";
- (** REAL *)
- PROCEDURE EGtrARSRLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval > rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EGtrARSRLoop;
- OPERATOR ".>"*(CONST left: ARRAY [ ? ] OF REAL; right: REAL ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGtrARSRLoop );
- RETURN RESULT
- END ".>";
- OPERATOR ".<"*(left: REAL; CONST right: ARRAY [ ? ] OF REAL): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EGtrARSRLoop );
- RETURN RESULT
- END ".<";
- (** LONGREAL *)
- PROCEDURE EGtrAXSXLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval > rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EGtrAXSXLoop;
- OPERATOR ".>"*(CONST left: ARRAY [ ? ] OF LONGREAL; right: LONGREAL ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGtrAXSXLoop );
- RETURN RESULT
- END ".>";
- OPERATOR ".<"*(left: LONGREAL; CONST right: ARRAY [ ? ] OF LONGREAL): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EGtrAXSXLoop );
- RETURN RESULT
- END ".<";
- (*** elementwise greater or equal: array x array -> array of boolean ********************************************************************)
- (** SHORTINT *)
- PROCEDURE EGeqASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval >= rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EGeqASASLoop;
- OPERATOR ".>="*(CONST left, right: ARRAY [ ? ] OF SHORTINT ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGeqASASLoop );
- RETURN RESULT
- END ".>=";
- (** INTEGER *)
- PROCEDURE EGeqAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval >= rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EGeqAIAILoop;
- OPERATOR ".>="*(CONST left, right: ARRAY [ ? ] OF INTEGER ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGeqAIAILoop );
- RETURN RESULT
- END ".>=";
- (** LONGINT *)
- PROCEDURE EGeqALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval >= rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EGeqALALLoop;
- OPERATOR ".>="*(CONST left, right: ARRAY [ ? ] OF LONGINT ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGeqALALLoop );
- RETURN RESULT
- END ".>=";
- (** REAL *)
- PROCEDURE EGeqARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval >= rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EGeqARARLoop;
- OPERATOR ".>="*(CONST left, right: ARRAY [ ? ] OF REAL ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGeqARARLoop );
- RETURN RESULT
- END ".>=";
- (** LONGREAL *)
- PROCEDURE EGeqAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval >= rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END EGeqAXAXLoop;
- OPERATOR ".>="*(CONST left, right: ARRAY [ ? ] OF LONGREAL ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGeqAXAXLoop );
- RETURN RESULT
- END ".>=";
- (*** elementwise geq array x scalar -> array of boolean ********************************************************************)
- (** SHORTINT *)
- PROCEDURE EGeqASSSLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval >= rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EGeqASSSLoop;
- OPERATOR ".>="*(CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGeqASSSLoop );
- RETURN RESULT
- END ".>=";
- OPERATOR ".<="*(left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EGeqASSSLoop );
- RETURN RESULT
- END ".<=";
- (** INTEGER *)
- PROCEDURE EGeqAISILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval >= rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EGeqAISILoop;
- OPERATOR ".>="*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGeqAISILoop );
- RETURN RESULT
- END ".>=";
- OPERATOR ".<="*(left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EGeqAISILoop );
- RETURN RESULT
- END ".<=";
- (** LONGINT *)
- PROCEDURE EGeqALSLLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval >= rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EGeqALSLLoop;
- OPERATOR ".>="*(CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGeqALSLLoop );
- RETURN RESULT
- END ".>=";
- OPERATOR ".<="*(left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EGeqALSLLoop );
- RETURN RESULT
- END ".<=";
- (** REAL *)
- PROCEDURE EGeqARSRLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval >= rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EGeqARSRLoop;
- OPERATOR ".>="*(CONST left: ARRAY [ ? ] OF REAL; right: REAL ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGeqARSRLoop );
- RETURN RESULT
- END ".>=";
- OPERATOR ".<="*(left: REAL; CONST right: ARRAY [ ? ] OF REAL): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EGeqARSRLoop );
- RETURN RESULT
- END ".<=";
- (** LONGREAL *)
- PROCEDURE EGeqAXSXLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval >= rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END EGeqAXSXLoop;
- OPERATOR ".>="*(CONST left: ARRAY [ ? ] OF LONGREAL; right: LONGREAL ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), EGeqAXSXLoop );
- RETURN RESULT
- END ".>=";
- OPERATOR ".<="*(left: LONGREAL; CONST right: ARRAY [ ? ] OF LONGREAL): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), EGeqAXSXLoop );
- RETURN RESULT
- END ".<=";
- (*** elementwise less than: array x array -> array of boolean ********************************************************************)
- (** SHORTINT *)
- PROCEDURE ELssASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval < rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ELssASASLoop;
- OPERATOR ".<"*(CONST left, right: ARRAY [ ? ] OF SHORTINT ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELssASASLoop );
- RETURN RESULT
- END ".<";
- (** INTEGER *)
- PROCEDURE ELssAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval < rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ELssAIAILoop;
- OPERATOR ".<"*(CONST left, right: ARRAY [ ? ] OF INTEGER ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELssAIAILoop );
- RETURN RESULT
- END ".<";
- (** LONGINT*)
- PROCEDURE ELssALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval < rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ELssALALLoop;
- OPERATOR ".<"*(CONST left, right: ARRAY [ ? ] OF LONGINT ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELssALALLoop );
- RETURN RESULT
- END ".<";
- (** REAL *)
- PROCEDURE ELssARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval < rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ELssARARLoop;
- OPERATOR ".<"*(CONST left, right: ARRAY [ ? ] OF REAL ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELssARARLoop );
- RETURN RESULT
- END ".<";
- (** LONGREAL *)
- PROCEDURE ELssAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval < rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ELssAXAXLoop;
- OPERATOR ".<"*(CONST left, right: ARRAY [ ? ] OF LONGREAL ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELssAXAXLoop );
- RETURN RESULT
- END ".<";
- (*** elementwise less array x scalar -> array of boolean ********************************************************************)
- (** SHORTINT *)
- PROCEDURE ELssASSSLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval < rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ELssASSSLoop;
- OPERATOR ".<"*(CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELssASSSLoop );
- RETURN RESULT
- END ".<";
- OPERATOR ".>"*(left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ELssASSSLoop );
- RETURN RESULT
- END ".>";
- (** INTEGER *)
- PROCEDURE ELssAISILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval < rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ELssAISILoop;
- OPERATOR ".<"*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELssAISILoop );
- RETURN RESULT
- END ".<";
- OPERATOR ".>"*(left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ELssAISILoop );
- RETURN RESULT
- END ".>";
- (** LONGINT *)
- PROCEDURE ELssALSLLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval < rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ELssALSLLoop;
- OPERATOR ".<"*(CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELssALSLLoop );
- RETURN RESULT
- END ".<";
- OPERATOR ".>"*(left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ELssALSLLoop );
- RETURN RESULT
- END ".>";
- (** REAL *)
- PROCEDURE ELssARSRLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval < rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ELssARSRLoop;
- OPERATOR ".<"*(CONST left: ARRAY [ ? ] OF REAL; right: REAL ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELssARSRLoop );
- RETURN RESULT
- END ".<";
- OPERATOR ".>"*(left: REAL; CONST right: ARRAY [ ? ] OF REAL): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ELssARSRLoop );
- RETURN RESULT
- END ".>";
- (** LONGREAL *)
- PROCEDURE ELssAXSXLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval < rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ELssAXSXLoop;
- OPERATOR ".<"*(CONST left: ARRAY [ ? ] OF LONGREAL; right: LONGREAL ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELssAXSXLoop );
- RETURN RESULT
- END ".<";
- OPERATOR ".>"*(left: LONGREAL; CONST right: ARRAY [ ? ] OF LONGREAL): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ELssAXSXLoop );
- RETURN RESULT
- END ".>";
- (*** elementwise less or equal: array x array -> array of boolean ********************************************************************)
- (** SHORTINT *)
- PROCEDURE ELeqASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval <= rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ELeqASASLoop;
- OPERATOR ".<="*(CONST left, right: ARRAY [ ? ] OF SHORTINT ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELeqASASLoop );
- RETURN RESULT
- END ".<=";
- (** INTEGER *)
- PROCEDURE ELeqAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval <= rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ELeqAIAILoop;
- OPERATOR ".<="*(CONST left, right: ARRAY [ ? ] OF INTEGER ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELeqAIAILoop );
- RETURN RESULT
- END ".<=";
- (** LONGINT *)
- PROCEDURE ELeqALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval <= rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ELeqALALLoop;
- OPERATOR ".<="*(CONST left, right: ARRAY [ ? ] OF LONGINT ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELeqALALLoop );
- RETURN RESULT
- END ".<=";
- (** REAL *)
- PROCEDURE ELeqARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval <= rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ELeqARARLoop;
- OPERATOR ".<="*(CONST left, right: ARRAY [ ? ] OF REAL ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELeqARARLoop );
- RETURN RESULT
- END ".<=";
- (** LONGREAL*)
- PROCEDURE ELeqAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval <= rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ELeqAXAXLoop;
- OPERATOR ".<="*(CONST left, right: ARRAY [ ? ] OF LONGREAL ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELeqAXAXLoop );
- RETURN RESULT
- END ".<=";
- (*** elementwise leq array x scalar -> array of boolean ********************************************************************)
- (** SHORTINT *)
- PROCEDURE ELeqASSSLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval <= rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ELeqASSSLoop;
- OPERATOR ".<="*(CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELeqASSSLoop );
- RETURN RESULT
- END ".<=";
- OPERATOR ".>="*(left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ELeqASSSLoop );
- RETURN RESULT
- END ".>=";
- (** INTEGER *)
- PROCEDURE ELeqAISILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval <= rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ELeqAISILoop;
- OPERATOR ".<="*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELeqAISILoop );
- RETURN RESULT
- END ".<=";
- OPERATOR ".>="*(left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ELeqAISILoop );
- RETURN RESULT
- END ".>=";
- (** LONGINT *)
- PROCEDURE ELeqALSLLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval <= rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ELeqALSLLoop;
- OPERATOR ".<="*(CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELeqALSLLoop );
- RETURN RESULT
- END ".<=";
- OPERATOR ".>="*(left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ELeqALSLLoop );
- RETURN RESULT
- END ".>=";
- (** REAL *)
- PROCEDURE ELeqARSRLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval <= rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ELeqARSRLoop;
- OPERATOR ".<="*(CONST left: ARRAY [ ? ] OF REAL; right: REAL ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELeqARSRLoop );
- RETURN RESULT
- END ".<=";
- OPERATOR ".>="*(left: REAL; CONST right: ARRAY [ ? ] OF REAL): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ELeqARSRLoop );
- RETURN RESULT
- END ".>=";
- (** LONGREAL *)
- PROCEDURE ELeqAXSXLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval <= rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ELeqAXSXLoop;
- OPERATOR ".<="*(CONST left: ARRAY [ ? ] OF LONGREAL; right: LONGREAL ): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ELeqAXSXLoop );
- RETURN RESULT
- END ".<=";
- OPERATOR ".>="*(left: LONGREAL; CONST right: ARRAY [ ? ] OF LONGREAL): ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ELeqAXSXLoop );
- RETURN RESULT
- END ".>=";
- (*** elementwise or, elementwise and ********************************************************************)
- (** array x array *)
- PROCEDURE ElOrABABLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: BOOLEAN;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, (lval OR rval) );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ElOrABABLoop;
- OPERATOR "OR"*(CONST left,right : ARRAY [?] OF BOOLEAN):ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ElOrABABLoop );
- RETURN RESULT
- END "OR";
- PROCEDURE ElAndABABLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len:SIZE );
- VAR lval, rval: BOOLEAN;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); SYSTEM.PUT( dadr, lval & rval );
- INC( ladr, linc ); INC( radr, rinc ); INC( dadr, dinc ); DEC( len );
- END;
- END ElAndABABLoop;
- OPERATOR "&"*(CONST left,right : ARRAY [?] OF BOOLEAN):ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ElAndABABLoop );
- RETURN RESULT
- END "&";
- (** array x boolean *)
- PROCEDURE ElOrABSBLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: BOOLEAN;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval OR rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ElOrABSBLoop;
- OPERATOR "OR"*(CONST left : ARRAY [?] OF BOOLEAN; right: BOOLEAN):ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ElOrABSBLoop );
- RETURN RESULT
- END "OR";
- OPERATOR "OR"*(left: BOOLEAN; CONST right : ARRAY [?] OF BOOLEAN):ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ElOrABSBLoop );
- RETURN RESULT
- END "OR";
- PROCEDURE ElAndABSBLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, rval: BOOLEAN;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, lval & rval ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END ElAndABSBLoop;
- OPERATOR "&"*(CONST left : ARRAY [?] OF BOOLEAN; right: BOOLEAN):ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( BOOLEAN ), ElAndABSBLoop );
- RETURN RESULT
- END "&";
- OPERATOR "&"*(left: BOOLEAN; CONST right : ARRAY [?] OF BOOLEAN):ARRAY [ ? ] OF BOOLEAN;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( right ), ADDRESSOF( left ),
- SIZEOF( BOOLEAN ), ElAndABSBLoop );
- RETURN RESULT
- END "&";
- (*** less than, greater or equal: array x array -> boolean ********************************************************************)
- (** SHORTINT *)
- PROCEDURE LssASASLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval <= lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END LssASASLoop;
- OPERATOR "<"*( CONST left, right: ARRAY [ ? ] OF SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), LssASASLoop , FALSE);
- END "<";
- PROCEDURE GeqASASLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval > lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END GeqASASLoop;
- OPERATOR ">="*( CONST left, right: ARRAY [ ? ] OF SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), GeqASASLoop , FALSE);
- END ">=";
- (** INTEGER *)
- PROCEDURE LssAIAILoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval <= lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END LssAIAILoop;
- OPERATOR "<"*( CONST left, right: ARRAY [ ? ] OF INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), LssAIAILoop , FALSE);
- END "<";
- PROCEDURE GeqAIAILoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval > lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END GeqAIAILoop;
- OPERATOR ">="*( CONST left, right: ARRAY [ ? ] OF INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), GeqAIAILoop , FALSE);
- END ">=";
- (** LONGINT *)
- PROCEDURE LssALALLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval <= lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END LssALALLoop;
- OPERATOR "<"*( CONST left, right: ARRAY [ ? ] OF LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), LssALALLoop , FALSE);
- END "<";
- PROCEDURE GeqALALLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval > lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END GeqALALLoop;
- OPERATOR ">="*( CONST left, right: ARRAY [ ? ] OF LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), GeqALALLoop , FALSE);
- END ">=";
- (** REAL *)
- PROCEDURE LssARARLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval <= lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END LssARARLoop;
- OPERATOR "<"*( CONST left, right: ARRAY [ ? ] OF REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), LssARARLoop , FALSE);
- END "<";
- PROCEDURE GeqARARLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval > lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END GeqARARLoop;
- OPERATOR ">="*( CONST left, right: ARRAY [ ? ] OF REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), GeqARARLoop , FALSE);
- END ">=";
- (** LONGREAL *)
- PROCEDURE LssAXAXLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval <= lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END LssAXAXLoop;
- OPERATOR "<"*( CONST left, right: ARRAY [ ? ] OF LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), LssAXAXLoop , FALSE);
- END "<";
- PROCEDURE GeqAXAXLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval > lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END GeqAXAXLoop;
- OPERATOR ">="*( CONST left, right: ARRAY [ ? ] OF LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), GeqAXAXLoop , FALSE);
- END ">=";
- (*** less than, greater or equal: array x array -> boolean ********************************************************************)
- (** SHORTINT *)
- PROCEDURE GtrASASLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval >= lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END GtrASASLoop;
- OPERATOR ">"*( CONST left, right: ARRAY [ ? ] OF SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), GtrASASLoop , FALSE);
- END ">";
- PROCEDURE LeqASASLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval < lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END LeqASASLoop;
- OPERATOR "<="*( CONST left, right: ARRAY [ ? ] OF SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), LeqASASLoop , FALSE);
- END "<=";
- (** INTEGER *)
- PROCEDURE GtrAIAILoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval >= lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END GtrAIAILoop;
- OPERATOR ">"*( CONST left, right: ARRAY [ ? ] OF INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), GtrAIAILoop , FALSE);
- END ">";
- PROCEDURE LeqAIAILoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval < lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END LeqAIAILoop;
- OPERATOR "<="*( CONST left, right: ARRAY [ ? ] OF INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), LeqAIAILoop ,FALSE);
- END "<=";
- (** LONGINT *)
- PROCEDURE GtrALALLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval >= lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END GtrALALLoop;
- OPERATOR ">"*( CONST left, right: ARRAY [ ? ] OF LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), GtrALALLoop , FALSE);
- END ">";
- PROCEDURE LeqALALLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval < lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END LeqALALLoop;
- OPERATOR "<="*( CONST left, right: ARRAY [ ? ] OF LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), LeqALALLoop , FALSE);
- END "<=";
- (** REAL *)
- PROCEDURE GtrARARLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval >= lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END GtrARARLoop;
- OPERATOR ">"*( CONST left, right: ARRAY [ ? ] OF REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), GtrARARLoop , FALSE);
- END ">";
- PROCEDURE LeqARARLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval < lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END LeqARARLoop;
- OPERATOR "<="*( CONST left, right: ARRAY [ ? ] OF REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), LeqARARLoop , FALSE);
- END "<=";
- (** LONGREAL *)
- PROCEDURE GtrAXAXLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval >= lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END GtrAXAXLoop;
- OPERATOR ">"*( CONST left, right: ARRAY [ ? ] OF LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), GtrAXAXLoop , FALSE);
- END ">";
- PROCEDURE LeqAXAXLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval < lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END LeqAXAXLoop;
- OPERATOR "<="*( CONST left, right: ARRAY [ ? ] OF LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), LeqAXAXLoop , FALSE);
- END "<=";
- (*** equals: array x array -> boolean ********************************************************************)
- (** BOOLEAN *)
- PROCEDURE EqlABABLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: BOOLEAN;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval # lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlABABLoop;
- OPERATOR "="*( CONST left, right: ARRAY [ ? ] OF BOOLEAN ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), EqlABABLoop, FALSE);
- END "=";
- OPERATOR "#"*( CONST left, right: ARRAY [ ? ] OF BOOLEAN ): BOOLEAN;
- BEGIN
- RETURN ~ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), EqlABABLoop, FALSE);
- END "#";
- (** SHORTINT *)
- PROCEDURE EqlASASLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval # lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlASASLoop;
- OPERATOR "="*( CONST left, right: ARRAY [ ? ] OF SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), EqlASASLoop , FALSE);
- END "=";
- OPERATOR "#"*( CONST left, right: ARRAY [ ? ] OF SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ~ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), EqlASASLoop, FALSE );
- END "#";
- (** INTEGER *)
- PROCEDURE EqlAIAILoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval # lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlAIAILoop;
- OPERATOR "="*( CONST left, right: ARRAY [ ? ] OF INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), EqlAIAILoop, FALSE );
- END "=";
- OPERATOR "#"*( CONST left, right: ARRAY [ ? ] OF INTEGER ): BOOLEAN;
- BEGIN
- RETURN ~ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), EqlAIAILoop, FALSE );
- END "#";
- (** LONGINT *)
- PROCEDURE EqlALALLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval # lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlALALLoop;
- OPERATOR "="*( CONST left, right: ARRAY [ ? ] OF LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), EqlALALLoop, FALSE );
- END "=";
- OPERATOR "#"*( CONST left, right: ARRAY [ ? ] OF LONGINT ): BOOLEAN;
- BEGIN
- RETURN ~ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), EqlALALLoop, FALSE );
- END "#";
- (** REAL *)
- PROCEDURE EqlARARLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval # lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlARARLoop;
- OPERATOR "="*( CONST left, right: ARRAY [ ? ] OF REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), EqlARARLoop, FALSE );
- END "=";
- OPERATOR "#"*( CONST left, right: ARRAY [ ? ] OF REAL ): BOOLEAN;
- BEGIN
- RETURN ~ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), EqlARARLoop, FALSE );
- END "#";
- (** LONGREAL *)
- PROCEDURE EqlAXAXLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval # lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlAXAXLoop;
- OPERATOR "="*( CONST left, right: ARRAY [ ? ] OF LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), EqlAXAXLoop, FALSE );
- END "=";
- OPERATOR "#"*( CONST left, right: ARRAY [ ? ] OF LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ~ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), EqlAXAXLoop, FALSE );
- END "#";
- (** COMPLEX *)
- PROCEDURE EqlAZAZLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lval, rval: COMPLEX;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- IF rval # lval THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlAZAZLoop;
- OPERATOR "="*( CONST left, right: ARRAY [ ? ] OF COMPLEX ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), EqlAZAZLoop, FALSE );
- END "=";
- OPERATOR "#"*( CONST left, right: ARRAY [ ? ] OF COMPLEX ): BOOLEAN;
- BEGIN
- RETURN ~ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), EqlAZAZLoop, FALSE );
- END "#";
- (** LONGCOMPLEX *)
- PROCEDURE EqlALZALZLoop( ladr, radr: ADDRESS; linc, rinc, len: SIZE ): BOOLEAN;
- VAR lvalRe, lvalIm, rvalRe, rvalIm: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- SYSTEM.GET( radr, rvalRe ); SYSTEM.GET( radr+SIZEOF(LONGREAL), rvalIm );
- IF (rvalRe # lvalRe) OR (rvalIm # lvalIm) THEN RETURN FALSE END;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlALZALZLoop;
- OPERATOR "="*( CONST left, right: ARRAY [ ? ] OF LONGCOMPLEX ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), EqlALZALZLoop, FALSE );
- END "=";
- OPERATOR "#"*( CONST left, right: ARRAY [ ? ] OF LONGCOMPLEX ): BOOLEAN;
- BEGIN
- RETURN ~ApplyBinaryAABOp( ADDRESSOF( left ), ADDRESSOF( right ), EqlALZALZLoop, FALSE );
- END "#";
- (*** equals: array x scalar -> boolean ********************************************************************)
- (** BOOLEAN *)
- PROCEDURE EqlABSBLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: BOOLEAN;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval # rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlABSBLoop;
- OPERATOR "="*( CONST left: ARRAY [ ? ] OF BOOLEAN;
- right: BOOLEAN ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( left ), ADDRESSOF( right ), EqlABSBLoop );
- END "=";
- OPERATOR "="*( left: BOOLEAN;
- CONST right: ARRAY [ ? ] OF BOOLEAN ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( right ), ADDRESSOF( left ), EqlABSBLoop );
- END "=";
- OPERATOR "#"*( CONST left: ARRAY [ ? ] OF BOOLEAN;
- right: BOOLEAN ): BOOLEAN;
- BEGIN
- RETURN ~(left = right);
- END "#";
- OPERATOR "#"*( left: BOOLEAN;
- CONST right: ARRAY [ ? ] OF BOOLEAN ): BOOLEAN;
- BEGIN
- RETURN ~( left = right );
- END "#";
- (** SHORTINT *)
- PROCEDURE EqlASSSLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval # rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlASSSLoop;
- OPERATOR "="*( CONST left: ARRAY [ ? ] OF SHORTINT;right: SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( left ), ADDRESSOF( right ), EqlASSSLoop );
- END "=";
- OPERATOR "="*( left: SHORTINT;CONST right: ARRAY [ ? ] OF SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( right ), ADDRESSOF( left ), EqlASSSLoop );
- END "=";
- OPERATOR "#"*( CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ~( left= right );
- END "#";
- OPERATOR "#"*( left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ~( left= right );
- END "#";
- (** INTEGER *)
- PROCEDURE EqlAISILoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval # rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlAISILoop;
- OPERATOR "="*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( left ), ADDRESSOF( right ), EqlAISILoop );
- END "=";
- OPERATOR "="*( left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( right ), ADDRESSOF( left ), EqlAISILoop );
- END "=";
- OPERATOR "#"*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): BOOLEAN;
- BEGIN
- RETURN ~( left = right );
- END "#";
- OPERATOR "#"*( left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER ): BOOLEAN;
- BEGIN
- RETURN ~( left = right );
- END "#";
- (** LONGINT *)
- PROCEDURE EqlALSLLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval # rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlALSLLoop;
- OPERATOR "="*( CONST left: ARRAY [ ? ] OF LONGINT;
- right: LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( left ), ADDRESSOF( right ), EqlALSLLoop );
- END "=";
- OPERATOR "="*( left: LONGINT;
- CONST right: ARRAY [ ? ] OF LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( right ), ADDRESSOF( left ), EqlALSLLoop );
- END "=";
- OPERATOR "#"*( CONST left: ARRAY [ ? ] OF LONGINT;
- right: LONGINT ): BOOLEAN;
- BEGIN
- RETURN ~(left = right);
- END "#";
- OPERATOR "#"*( left: LONGINT;
- CONST right: ARRAY [ ? ] OF LONGINT ): BOOLEAN;
- BEGIN
- RETURN ~(left = right);
- END "#";
- (** REAL *)
- PROCEDURE EqlARSRLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval # rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlARSRLoop;
- OPERATOR "="*( CONST left: ARRAY [ ? ] OF REAL;
- right: REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( left ), ADDRESSOF( right ), EqlARSRLoop );
- END "=";
- OPERATOR "="*( left: REAL;
- CONST right: ARRAY [ ? ] OF REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( right ), ADDRESSOF( left ), EqlARSRLoop );
- END "=";
- OPERATOR "#"*( CONST left: ARRAY [ ? ] OF REAL;
- right: REAL ): BOOLEAN;
- BEGIN
- RETURN ~( left = right );
- END "#";
- OPERATOR "#"*( left: REAL;
- CONST right: ARRAY [ ? ] OF REAL ): BOOLEAN;
- BEGIN
- RETURN ~( left = right );
- END "#";
- (** LONGREAL *)
- PROCEDURE EqlAXSXLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval # rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END EqlAXSXLoop;
- OPERATOR "="*( CONST left: ARRAY [ ? ] OF LONGREAL;
- right: LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( left ), ADDRESSOF( right ), EqlAXSXLoop );
- END "=";
- OPERATOR "="*( left: LONGREAL;
- CONST right: ARRAY [ ? ] OF LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( right ), ADDRESSOF( left ), EqlAXSXLoop );
- END "=";
- OPERATOR "#"*( CONST left: ARRAY [ ? ] OF LONGREAL;
- right: LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ~( left = right );
- END "#";
- OPERATOR "#"*( left: LONGREAL;CONST right: ARRAY [ ? ] OF LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ~( left= right );
- END "#";
- (*** gtr : array x scalar -> boolean ********************************************************************)
- (** SHORTINT *)
- PROCEDURE GtrASSSLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval <= rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END GtrASSSLoop;
- OPERATOR ">"*( CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( left ), ADDRESSOF( right ), GtrASSSLoop );
- END ">";
- OPERATOR "<"*( left: SHORTINT;CONST right: ARRAY [ ? ] OF SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( right ), ADDRESSOF( left ), GtrASSSLoop );
- END "<";
- (** INTEGER *)
- PROCEDURE GtrAISILoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval <= rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END GtrAISILoop;
- OPERATOR ">"*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( left ), ADDRESSOF( right ), GtrAISILoop );
- END ">";
- OPERATOR "<"*( left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( right ), ADDRESSOF( left ), GtrAISILoop );
- END "<";
- (** LONGINT *)
- PROCEDURE GtrALSLLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval <= rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END GtrALSLLoop;
- OPERATOR ">"*( CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( left ), ADDRESSOF( right ), GtrALSLLoop );
- END ">";
- OPERATOR "<"*( left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( right ), ADDRESSOF( left ), GtrALSLLoop );
- END "<";
- (** REAL *)
- PROCEDURE GtrARSRLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval <= rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END GtrARSRLoop;
- OPERATOR ">"*( CONST left: ARRAY [ ? ] OF REAL;
- right: REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( left ), ADDRESSOF( right ), GtrARSRLoop );
- END ">";
- OPERATOR "<"*( left: REAL;
- CONST right: ARRAY [ ? ] OF REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( right ), ADDRESSOF( left ), GtrARSRLoop );
- END "<";
- (** LONGREAL *)
- PROCEDURE GtrAXSXLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval <= rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END GtrAXSXLoop;
- OPERATOR ">"*( CONST left: ARRAY [ ? ] OF LONGREAL;
- right: LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( left ), ADDRESSOF( right ), GtrAXSXLoop );
- END ">";
- OPERATOR "<"*( left: LONGREAL;
- CONST right: ARRAY [ ? ] OF LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( right ), ADDRESSOF( left ), GtrAXSXLoop );
- END "<";
- (*** geq : array x scalar -> boolean ********************************************************************)
- (** SHORTINT *)
- PROCEDURE GeqASSSLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval < rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END GeqASSSLoop;
- OPERATOR ">="*( CONST left: ARRAY [ ? ] OF SHORTINT;
- right: SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( left ), ADDRESSOF( right ), GeqASSSLoop );
- END ">=";
- OPERATOR "<="*( left: SHORTINT;
- CONST right: ARRAY [ ? ] OF SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( right ), ADDRESSOF( left ), GeqASSSLoop );
- END "<=";
- (** INTEGER *)
- PROCEDURE GeqAISILoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval < rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END GeqAISILoop;
- OPERATOR ">="*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( left ), ADDRESSOF( right ), GeqAISILoop );
- END ">=";
- OPERATOR "<="*( left: INTEGER;
- CONST right: ARRAY [ ? ] OF INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( right ), ADDRESSOF( left ), GeqAISILoop );
- END "<=";
- (** LONGINT *)
- PROCEDURE GeqALSLLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval < rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END GeqALSLLoop;
- OPERATOR ">="*( CONST left: ARRAY [ ? ] OF LONGINT;
- right: LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( left ), ADDRESSOF( right ), GeqALSLLoop );
- END ">=";
- OPERATOR "<="*( left: LONGINT;
- CONST right: ARRAY [ ? ] OF LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( right ), ADDRESSOF( left ), GeqALSLLoop );
- END "<=";
- (** REAL *)
- PROCEDURE GeqARSRLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval < rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END GeqARSRLoop;
- OPERATOR ">="*( CONST left: ARRAY [ ? ] OF REAL;
- right: REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( left ), ADDRESSOF( right ), GeqARSRLoop );
- END ">=";
- OPERATOR "<="*( left: REAL; CONST right: ARRAY [ ? ] OF REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( right ), ADDRESSOF( left ), GeqARSRLoop );
- END "<=";
- (** LONGREAL *)
- PROCEDURE GeqAXSXLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval < rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END GeqAXSXLoop;
- OPERATOR ">="*( CONST left: ARRAY [ ? ] OF LONGREAL; right: LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( left ), ADDRESSOF( right ), GeqAXSXLoop );
- END ">=";
- OPERATOR "<="*( left: LONGREAL; CONST right: ARRAY [ ? ] OF LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( right ), ADDRESSOF( left ), GeqAXSXLoop );
- END "<=";
- (*** leq : array x scalar -> boolean ********************************************************************)
- (** SHORTINT *)
- PROCEDURE LeqASSSLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval > rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END LeqASSSLoop;
- OPERATOR "<="*( CONST left: ARRAY [ ? ] OF SHORTINT;right: SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( left ), ADDRESSOF( right ), LeqASSSLoop );
- END "<=";
- OPERATOR ">="*( left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( right ), ADDRESSOF( left ), LeqASSSLoop );
- END ">=";
- (** INTEGER *)
- PROCEDURE LeqAISILoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval > rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END LeqAISILoop;
- OPERATOR "<="*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( left ), ADDRESSOF( right ), LeqAISILoop );
- END "<=";
- OPERATOR ">="*( left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( right ), ADDRESSOF( left ), LeqAISILoop );
- END ">=";
- (** LONGINT *)
- PROCEDURE LeqALSLLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval > rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END LeqALSLLoop;
- OPERATOR "<="*( CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( left ), ADDRESSOF( right ), LeqALSLLoop );
- END "<=";
- OPERATOR ">="*( left: LONGINT; CONST right: ARRAY [ ? ] OF LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( right ), ADDRESSOF( left ), LeqALSLLoop );
- END ">=";
- (** REAL *)
- PROCEDURE LeqARSRLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval > rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END LeqARSRLoop;
- OPERATOR "<="*( CONST left: ARRAY [ ? ] OF REAL; right: REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( left ), ADDRESSOF( right ), LeqARSRLoop );
- END "<=";
- OPERATOR ">="*( left: REAL; CONST right: ARRAY [ ? ] OF REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( right ), ADDRESSOF( left ), LeqARSRLoop );
- END ">=";
- (** LONGREAL *)
- PROCEDURE LeqAXSXLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval > rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END LeqAXSXLoop;
- OPERATOR "<="*( CONST left: ARRAY [ ? ] OF LONGREAL; right: LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( left ), ADDRESSOF( right ), LeqAXSXLoop );
- END "<=";
- OPERATOR ">="*( left: LONGREAL; CONST right: ARRAY [ ? ] OF LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( right ), ADDRESSOF( left ), LeqAXSXLoop );
- END ">=";
- (*** lss: array x scalar -> boolean ********************************************************************)
- (** SHORTINT *)
- PROCEDURE LssASSSLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval >= rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END LssASSSLoop;
- OPERATOR "<"*( CONST left: ARRAY [ ? ] OF SHORTINT; right: SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( left ), ADDRESSOF( right ), LssASSSLoop );
- END "<";
- OPERATOR ">"*( left: SHORTINT; CONST right: ARRAY [ ? ] OF SHORTINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( right ), ADDRESSOF( left ), LssASSSLoop );
- END ">";
- (** INTEGER *)
- PROCEDURE LssAISILoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: INTEGER;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval >= rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END LssAISILoop;
- OPERATOR "<"*(CONST left: ARRAY [ ? ] OF INTEGER; right: INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( left ), ADDRESSOF( right ), LssAISILoop );
- END "<";
- OPERATOR ">"*( left: INTEGER; CONST right: ARRAY [ ? ] OF INTEGER ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( right ), ADDRESSOF( left ), LssAISILoop );
- END ">";
- (** LONGINT *)
- PROCEDURE LssALSLLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGINT;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval >= rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END LssALSLLoop;
- OPERATOR "<"*( CONST left: ARRAY [ ? ] OF LONGINT; right: LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( left ), ADDRESSOF( right ), LssALSLLoop );
- END "<";
- OPERATOR ">"*( left: LONGINT;CONST right: ARRAY [ ? ] OF LONGINT ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( right ), ADDRESSOF( left ), LssALSLLoop );
- END ">";
- (** REAL *)
- PROCEDURE LssARSRLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: REAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval >= rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END LssARSRLoop;
- OPERATOR "<"*( CONST left: ARRAY [ ? ] OF REAL;
- right: REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( left ), ADDRESSOF( right ), LssARSRLoop );
- END "<";
- OPERATOR ">"*( left: REAL;
- CONST right: ARRAY [ ? ] OF REAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( right ), ADDRESSOF( left ), LssARSRLoop );
- END ">";
- (** LONGREAL *)
- PROCEDURE LssAXSXLoop( ladr, radr: ADDRESS; linc, len: SIZE ): BOOLEAN;
- VAR lval, rval: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, rval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval >= rval THEN RETURN FALSE END;
- INC( ladr, linc ); DEC( len );
- END;
- RETURN TRUE;
- END LssAXSXLoop;
- OPERATOR "<"*( CONST left: ARRAY [ ? ] OF LONGREAL;
- right: LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( left ), ADDRESSOF( right ), LssAXSXLoop );
- END "<";
- OPERATOR ">"*( left: LONGREAL;
- CONST right: ARRAY [ ? ] OF LONGREAL ): BOOLEAN;
- BEGIN
- RETURN ApplyBinaryASBOp( ADDRESSOF( right ), ADDRESSOF( left ), LssAXSXLoop );
- END ">";
- (**** binary max/min operators array x scalar-> array ********************************************************************)
-
- PROCEDURE MaxAXSXLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, val: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, val );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- INC( ladr, linc ); DEC( len );
- IF lval>val THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT(dadr, val) END;;
- INC(dadr,dinc);
- END;
- END MaxAXSXLoop;
-
- OPERATOR "MAX"*(CONST left: ARRAY [?] OF LONGREAL; right: LONGREAL): ARRAY [?] OF LONGREAL;
- TYPE Type = LONGREAL;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( Type ), MaxAXSXLoop );
- RETURN RESULT
- END "MAX";
- PROCEDURE MaxARSRLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, val: REAL;
- BEGIN
- SYSTEM.GET( radr, val );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- INC( ladr, linc ); DEC( len );
- IF lval>val THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT(dadr, val) END;;
- INC(dadr,dinc);
- END;
- END MaxARSRLoop;
-
- OPERATOR "MAX"*(CONST left: ARRAY [?] OF REAL; right: REAL): ARRAY [?] OF REAL;
- TYPE Type = REAL;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( Type ), MaxARSRLoop );
- RETURN RESULT
- END "MAX";
-
-
- PROCEDURE MaxALSLLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, val: LONGINT;
- BEGIN
- SYSTEM.GET( radr, val );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- INC( ladr, linc ); DEC( len );
- IF lval>val THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT(dadr, val) END;
- INC(dadr,dinc);
- END;
- END MaxALSLLoop;
-
- OPERATOR "MAX"*(CONST left: ARRAY [?] OF LONGINT; right: LONGINT): ARRAY [?] OF LONGINT;
- TYPE Type = LONGINT;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( Type ), MaxALSLLoop );
- RETURN RESULT
- END "MAX";
-
- PROCEDURE MaxAISILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, val: INTEGER;
- BEGIN
- SYSTEM.GET( radr, val );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- INC( ladr, linc ); DEC( len );
- IF lval>val THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT(dadr, val) END;
- INC(dadr,dinc);
- END;
- END MaxAISILoop;
-
- OPERATOR "MAX"*(CONST left: ARRAY [?] OF INTEGER; right: INTEGER): ARRAY [?] OF INTEGER;
- TYPE Type = INTEGER;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( Type ), MaxAISILoop );
- RETURN RESULT
- END "MAX";
- PROCEDURE MaxASSSLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, val: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, val );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- INC( ladr, linc ); DEC( len );
- IF lval>val THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT(dadr, val) END;
- INC(dadr,dinc);
- END;
- END MaxASSSLoop;
-
- OPERATOR "MAX"*(CONST left: ARRAY [?] OF SHORTINT; right: SHORTINT): ARRAY [?] OF SHORTINT;
- TYPE Type = SHORTINT;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( Type ), MaxASSSLoop );
- RETURN RESULT
- END "MAX";
-
- PROCEDURE MinAXSXLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, val: LONGREAL;
- BEGIN
- SYSTEM.GET( radr, val );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- INC( ladr, linc ); DEC( len );
- IF lval<val THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT(dadr, val) END;;
- INC(dadr,dinc);
- END;
- END MinAXSXLoop;
-
- OPERATOR "MIN"*(CONST left: ARRAY [?] OF LONGREAL; right: LONGREAL): ARRAY [?] OF LONGREAL;
- TYPE Type = LONGREAL;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( Type ), MinAXSXLoop );
- RETURN RESULT
- END "MIN";
-
- PROCEDURE MinARSRLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, val: REAL;
- BEGIN
- SYSTEM.GET( radr, val );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- INC( ladr, linc ); DEC( len );
- IF lval<val THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT(dadr, val) END;;
- INC(dadr,dinc);
- END;
- END MinARSRLoop;
-
- OPERATOR "MIN"*(CONST left: ARRAY [?] OF REAL; right: REAL): ARRAY [?] OF REAL;
- TYPE Type = REAL;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( Type ), MinARSRLoop );
- RETURN RESULT
- END "MIN";
-
- PROCEDURE MinALSLLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, val: LONGINT;
- BEGIN
- SYSTEM.GET( radr, val );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- INC( ladr, linc ); DEC( len );
- IF lval<val THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT(dadr, val) END;
- INC(dadr,dinc);
- END;
- END MinALSLLoop;
-
- OPERATOR "MIN"*(CONST left: ARRAY [?] OF LONGINT; right: LONGINT): ARRAY [?] OF LONGINT;
- TYPE Type = LONGINT;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( Type ), MinALSLLoop );
- RETURN RESULT
- END "MIN";
- PROCEDURE MinAISILoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, val: INTEGER;
- BEGIN
- SYSTEM.GET( radr, val );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- INC( ladr, linc ); DEC( len );
- IF lval<val THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT(dadr, val) END;
- INC(dadr,dinc);
- END;
- END MinAISILoop;
-
- OPERATOR "MIN"*(CONST left: ARRAY [?] OF INTEGER; right: INTEGER): ARRAY [?] OF INTEGER;
- TYPE Type = INTEGER;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( Type ), MinAISILoop );
- RETURN RESULT
- END "MIN";
-
- PROCEDURE MinASSSLoop( ladr, radr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval, val: SHORTINT;
- BEGIN
- SYSTEM.GET( radr, val );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- INC( ladr, linc ); DEC( len );
- IF lval<val THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT(dadr, val) END;
- INC(dadr,dinc);
- END;
- END MinASSSLoop;
-
- OPERATOR "MIN"*(CONST left: ARRAY [?] OF SHORTINT; right: SHORTINT): ARRAY [?] OF SHORTINT;
- TYPE Type = SHORTINT;
- BEGIN
- ApplyBinaryASAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( Type ), MinASSSLoop );
- RETURN RESULT
- END "MIN";
- (**** binary max/min operators array x array -> array ********************************************************************)
- PROCEDURE MaxAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- INC( ladr, linc ); INC(radr,rinc ); DEC( len );
- IF lval>rval THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT (dadr,rval) END;
- INC(dadr,dinc);
- END;
- END MaxAXAXLoop;
- OPERATOR "MAX"*(CONST left, right: ARRAY [?] OF LONGREAL): ARRAY [?] OF LONGREAL;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( LONGREAL ), MaxAXAXLoop );
- RETURN RESULT
- END "MAX";
-
- PROCEDURE MaxARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: REAL ;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- INC( ladr, linc ); INC(radr,rinc ); DEC( len );
- IF lval>rval THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT (dadr,rval) END;
- INC(dadr,dinc);
- END;
- END MaxARARLoop;
- OPERATOR "MAX"*(CONST left, right: ARRAY [?] OF REAL): ARRAY [?] OF REAL;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( REAL ), MaxARARLoop );
- RETURN RESULT
- END "MAX";
- PROCEDURE MaxALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- INC( ladr, linc ); INC(radr,rinc ); DEC( len );
- IF lval>rval THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT (dadr,rval) END;
- INC(dadr,dinc);
- END;
- END MaxALALLoop;
- OPERATOR "MAX"*(CONST left, right: ARRAY [?] OF LONGINT): ARRAY [?] OF LONGINT ;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( LONGINT ), MaxALALLoop );
- RETURN RESULT
- END "MAX";
-
- PROCEDURE MaxAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- INC( ladr, linc ); INC(radr,rinc ); DEC( len );
- IF lval>rval THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT (dadr,rval) END;
- INC(dadr,dinc);
- END;
- END MaxAIAILoop;
- OPERATOR "MAX"*(CONST left, right: ARRAY [?] OF INTEGER): ARRAY [?] OF INTEGER;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( INTEGER ), MaxAIAILoop );
- RETURN RESULT
- END "MAX";
-
- PROCEDURE MaxASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- INC( ladr, linc ); INC(radr,rinc ); DEC( len );
- IF lval>rval THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT (dadr,rval) END;
- INC(dadr,dinc);
- END;
- END MaxASASLoop;
- OPERATOR "MAX"*(CONST left, right: ARRAY [?] OF SHORTINT): ARRAY [?] OF SHORTINT;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( SHORTINT ), MaxASASLoop );
- RETURN RESULT
- END "MAX";
- PROCEDURE MinAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- INC( ladr, linc ); INC(radr,rinc ); DEC( len );
- IF lval<rval THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT (dadr,rval) END;
- INC(dadr,dinc);
- END;
- END MinAXAXLoop;
-
- OPERATOR "MIN"*(CONST left, right: ARRAY [?] OF LONGREAL): ARRAY [?] OF LONGREAL;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( LONGREAL ), MinAXAXLoop );
- RETURN RESULT
- END "MIN";
-
- PROCEDURE MinARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: REAL ;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- INC( ladr, linc ); INC(radr,rinc ); DEC( len );
- IF lval<rval THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT (dadr,rval) END;
- INC(dadr,dinc);
- END;
- END MinARARLoop;
- OPERATOR "MIN"*(CONST left, right: ARRAY [?] OF REAL): ARRAY [?] OF REAL;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( REAL ), MinARARLoop );
- RETURN RESULT
- END "MIN";
-
- (*PROCEDURE MinALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- INC( ladr, linc ); INC(radr,rinc ); DEC( len );
- IF lval<rval THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT (dadr,rval) END;
- INC(dadr,dinc);
- END;
- END MinALALLoop;
- *)
- TYPE
- LongintPtr = POINTER {UNSAFE,UNTRACED} TO RECORD val: LONGINT END;
-
- PROCEDURE MinALALLoop( ladr, radr, dadr: LongintPtr; linc, rinc, dinc, len: SIZE);
- BEGIN
- WHILE (len > 0) DO
- IF ladr.val < ladr.val THEN dadr.val := ladr.val ELSE dadr.val := radr.val END;
- ladr := ladr + linc;
- radr := radr + rinc;
- dadr := dadr + dinc;
- DEC(len);
- END;
- END MinALALLoop;
- OPERATOR "MIN"*(CONST left, right: ARRAY [?] OF LONGINT): ARRAY [?] OF LONGINT ;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( LONGINT ), MinALALLoop );
- RETURN RESULT
- END "MIN";
-
- PROCEDURE MinAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- INC( ladr, linc ); INC(radr,rinc ); DEC( len );
- IF lval<rval THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT (dadr,rval) END;
- INC(dadr,dinc);
- END;
- END MinAIAILoop;
- OPERATOR "MIN"*(CONST left, right: ARRAY [?] OF INTEGER): ARRAY [?] OF INTEGER;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( INTEGER ), MinAIAILoop );
- RETURN RESULT
- END "MIN";
-
- PROCEDURE MinASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, dinc, len: SIZE );
- VAR lval, rval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval );
- INC( ladr, linc ); INC(radr,rinc ); DEC( len );
- IF lval<rval THEN SYSTEM.PUT( dadr, lval) ELSE SYSTEM.PUT (dadr,rval) END;
- INC(dadr,dinc);
- END;
- END MinASASLoop;
- OPERATOR "MIN"*(CONST left, right: ARRAY [?] OF SHORTINT): ARRAY [?] OF SHORTINT;
- BEGIN
- ApplyBinaryAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( SHORTINT ), MinASASLoop );
- RETURN RESULT
- END "MIN";
- (**** unary operators array -> scalar ********************************************************************)
- (*** min: array -> scalar ****************************************)
- (** SHORTINT *)
- PROCEDURE MinASLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: SHORTINT;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval < dval THEN dval := lval END;
- INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MinASLoop;
- OPERATOR "MIN"*( CONST left: ARRAY [ ? ] OF SHORTINT ): SHORTINT;
- TYPE Type = SHORTINT;
- VAR val: Type;
- BEGIN
- val := MAX( Type );
- ApplyUnaryASOp( ADDRESSOF( val ), ADDRESSOF( left ), MinASLoop ); RETURN val;
- END "MIN";
- (** INTEGER *)
- PROCEDURE MinAILoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: INTEGER;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval < dval THEN dval := lval END;
- INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MinAILoop;
- OPERATOR "MIN"*( CONST left: ARRAY [ ? ] OF INTEGER ): INTEGER;
- TYPE Type = INTEGER;
- VAR val: Type;
- BEGIN
- val := MAX( Type );
- ApplyUnaryASOp( ADDRESSOF( val ), ADDRESSOF( left ), MinAILoop ); RETURN val;
- END "MIN";
- (** LONGINT *)
- PROCEDURE MinALLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: LONGINT;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval < dval THEN dval := lval END;
- INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MinALLoop;
- OPERATOR "MIN"*( CONST left: ARRAY [ ? ] OF LONGINT ): LONGINT;
- TYPE Type = LONGINT;
- VAR val: Type;
- BEGIN
- val := MAX( Type );
- ApplyUnaryASOp( ADDRESSOF( val ), ADDRESSOF( left ), MinALLoop ); RETURN val;
- END "MIN";
- (** REAL *)
- PROCEDURE MinARLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: REAL;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval < dval THEN dval := lval END;
- INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MinARLoop;
- OPERATOR "MIN"*( CONST left: ARRAY [ ? ] OF REAL ): REAL;
- TYPE Type = REAL;
- VAR val: Type;
- BEGIN
- val := MAX( Type );
- ApplyUnaryASOp( ADDRESSOF( val ), ADDRESSOF( left ), MinARLoop ); RETURN val;
- END "MIN";
- (** LONGREAL *)
- PROCEDURE MinAXLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: LONGREAL;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval < dval THEN dval := lval END;
- INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MinAXLoop;
- OPERATOR "MIN"*( CONST left: ARRAY [ ? ] OF LONGREAL ): LONGREAL;
- TYPE Type = LONGREAL;
- VAR val: Type;
- BEGIN
- val := MAX( Type );
- ApplyUnaryASOp( ADDRESSOF( val ), ADDRESSOF( left ), MinAXLoop ); RETURN val;
- END "MIN";
- (*** max: array -> scalar ********************************************************************)
- (** SHORTINT *)
- PROCEDURE MaxASLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: SHORTINT;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval > dval THEN dval := lval END;
- INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MaxASLoop;
- OPERATOR "MAX"*( CONST left: ARRAY [ ? ] OF SHORTINT ): SHORTINT;
- TYPE Type = SHORTINT;
- VAR val: Type;
- BEGIN
- val := MIN( Type );
- ApplyUnaryASOp( ADDRESSOF( val ), ADDRESSOF( left ), MaxASLoop ); RETURN val;
- END "MAX";
- (** INTEGER *)
- PROCEDURE MaxAILoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: INTEGER;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval > dval THEN dval := lval END;
- INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MaxAILoop;
- OPERATOR "MAX"*( CONST left: ARRAY [ ? ] OF INTEGER ): INTEGER;
- TYPE Type = INTEGER;
- VAR val: Type;
- BEGIN
- val := MIN( Type );
- ApplyUnaryASOp( ADDRESSOF( val ), ADDRESSOF( left ), MaxAILoop ); RETURN val;
- END "MAX";
- (** LONGINT *)
- PROCEDURE MaxALLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: LONGINT;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval > dval THEN dval := lval END;
- INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MaxALLoop;
- OPERATOR "MAX"*( CONST left: ARRAY [ ? ] OF LONGINT ): LONGINT;
- TYPE Type = LONGINT;
- VAR val: Type;
- BEGIN
- val := MIN( Type );
- ApplyUnaryASOp( ADDRESSOF( val ), ADDRESSOF( left ), MaxALLoop ); RETURN val;
- END "MAX";
- (** REAL *)
- PROCEDURE MaxARLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: REAL;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval > dval THEN dval := lval END;
- INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MaxARLoop;
- OPERATOR "MAX"*( CONST left: ARRAY [ ? ] OF REAL ): REAL;
- TYPE Type = REAL;
- VAR val: Type;
- BEGIN
- val := MIN( Type );
- ApplyUnaryASOp( ADDRESSOF( val ), ADDRESSOF( left ), MaxARLoop ); RETURN val;
- END "MAX";
- (** LONGREAL *)
- PROCEDURE MaxAXLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: LONGREAL;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval );
- IF lval > dval THEN dval := lval END;
- INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MaxAXLoop;
- OPERATOR "MAX"*( CONST left: ARRAY [ ? ] OF LONGREAL ): LONGREAL;
- TYPE Type = LONGREAL;
- VAR val: Type;
- BEGIN
- val := MIN( Type );
- ApplyUnaryASOp( ADDRESSOF( val ), ADDRESSOF( left ), MaxAXLoop ); RETURN val;
- END "MAX";
- (*** LEN: array -> array **)
- OPERATOR "LEN"*(CONST left: ARRAY [?]): ARRAY [*] OF SIZE;
- VAR src: ADDRESS; dim,i: SIZE;
- BEGIN
- src := SYSTEM.VAL(ADDRESS,left);
- dim := GetDim( src );
- IF (DIM(RESULT)#1) OR (LEN(RESULT,0) # dim) THEN NEW(RESULT,dim) END;
- FOR i := 0 TO dim-1 DO RESULT[i] := GetLen(src,i) END;
- RETURN RESULT
- END "LEN";
- (*** SUM: array -> scalar ********************************************************************)
- (** SHORTINT *)
- PROCEDURE SumASLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: SHORTINT;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := dval + lval; INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END SumASLoop;
- OPERATOR "SUM"*( CONST left: ARRAY [ ? ] OF SHORTINT ): SHORTINT;
- TYPE Type = SHORTINT;
- VAR val: Type;
- BEGIN
- val := 0; ApplyUnaryASOp( ADDRESSOF( val ), ADDRESSOF( left ), SumASLoop );
- RETURN val;
- END "SUM";
- (** INTEGER *)
- PROCEDURE SumAILoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: INTEGER;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := dval + lval; INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END SumAILoop;
- OPERATOR "SUM"*( CONST left: ARRAY [ ? ] OF INTEGER ): INTEGER;
- TYPE Type = INTEGER;
- VAR val: Type;
- BEGIN
- val := 0; ApplyUnaryASOp( ADDRESSOF( val ), ADDRESSOF( left ), SumAILoop );
- RETURN val;
- END "SUM";
- (** LONGINT *)
- PROCEDURE SumALLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: LONGINT;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := dval + lval; INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END SumALLoop;
- OPERATOR "SUM"*( CONST left: ARRAY [ ? ] OF LONGINT ): LONGINT;
- TYPE Type = LONGINT;
- VAR val: Type;
- BEGIN
- val := 0; ApplyUnaryASOp( ADDRESSOF( val ), ADDRESSOF( left ), SumALLoop );
- RETURN val;
- END "SUM";
- (** REAL *)
- PROCEDURE SumARLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: REAL;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := dval + lval; INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END SumARLoop;
- OPERATOR "SUM"*( CONST left: ARRAY [ ? ] OF REAL ): REAL;
- TYPE Type = REAL;
- VAR val: Type;
- BEGIN
- val := 0; ApplyUnaryASOp( ADDRESSOF( val ), ADDRESSOF( left ), SumARLoop );
- RETURN val;
- END "SUM";
- (** LONGREAL *)
- PROCEDURE SumAXLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: LONGREAL;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := dval + lval; INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END SumAXLoop;
- OPERATOR "SUM"*( CONST left: ARRAY [ ? ] OF LONGREAL ): LONGREAL;
- TYPE Type = LONGREAL;
- VAR val: Type;
- BEGIN
- val := 0; ApplyUnaryASOp( ADDRESSOF( val ), ADDRESSOF( left ), SumAXLoop );
- RETURN val;
- END "SUM";
- (** COMPLEX *)
- PROCEDURE SumAZLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lval, dval: COMPLEX;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); dval := dval + lval; INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END SumAZLoop;
- OPERATOR "SUM"*( CONST left: ARRAY [ ? ] OF COMPLEX ): COMPLEX;
- TYPE Type = COMPLEX;
- VAR val: Type;
- BEGIN
- val := 0; ApplyUnaryASOp( ADDRESSOF( val ), ADDRESSOF( left ), SumAZLoop );
- RETURN val;
- END "SUM";
- (** LONGCOMPLEX *)
- PROCEDURE SumALZLoop( ladr, dadr: ADDRESS; linc, len: SIZE );
- VAR lvalRe, lvalIm, dvalRe, dvalIm: LONGREAL;
- BEGIN
- SYSTEM.GET( dadr, dvalRe ); SYSTEM.GET( dadr+SIZEOF(LONGREAL), dvalIm );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- dvalRe := dvalRe + lvalRe; dvalIm := dvalIm + lvalIm;
- INC( ladr, linc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dvalRe ); SYSTEM.PUT( dadr+SIZEOF(LONGREAL), dvalIm );
- END SumALZLoop;
- OPERATOR "SUM"*( CONST left: ARRAY [ ? ] OF LONGCOMPLEX ): LONGCOMPLEX;
- TYPE Type = LONGCOMPLEX;
- VAR val: Type;
- BEGIN
- val := 0; ApplyUnaryASOp( ADDRESSOF( val ), ADDRESSOF( left ), SumALZLoop );
- RETURN val;
- END "SUM";
- (*** monadic ABS array -> array ********************************************************************)
- (** SHORTINT *)
- PROCEDURE AbsLoopS( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: SHORTINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, ABS( lval ) ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AbsLoopS;
- OPERATOR "ABS"*(CONST src: ARRAY [ ? ] OF SHORTINT): ARRAY [ ? ] OF SHORTINT;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( SHORTINT ), AbsLoopS );
- RETURN RESULT
- END "ABS";
- (** INTEGER *)
- PROCEDURE AbsLoopI( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: INTEGER;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, ABS( lval ) ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AbsLoopI;
- OPERATOR "ABS"*(CONST src: ARRAY [ ? ] OF INTEGER): ARRAY [ ? ] OF INTEGER;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( INTEGER ), AbsLoopI );
- RETURN RESULT
- END "ABS";
- (** LONGINT *)
- PROCEDURE AbsLoopL( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: LONGINT;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, ABS( lval ) ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AbsLoopL;
- OPERATOR "ABS"*(CONST src: ARRAY [ ? ] OF LONGINT): ARRAY [ ? ] OF LONGINT;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( LONGINT ), AbsLoopL );
- RETURN RESULT
- END "ABS";
- (** REAL *)
- PROCEDURE AbsLoopR( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: REAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, ABS( lval ) ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AbsLoopR;
- OPERATOR "ABS"*(CONST src: ARRAY [ ? ] OF REAL): ARRAY [ ? ] OF REAL;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( REAL ), AbsLoopR );
- RETURN RESULT
- END "ABS";
- (** LONGREAL *)
- PROCEDURE AbsLoopX( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, ABS( lval ) ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AbsLoopX;
- OPERATOR "ABS"*(CONST src: ARRAY [ ? ] OF LONGREAL): ARRAY [ ? ] OF LONGREAL;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( LONGREAL ), AbsLoopX );
- RETURN RESULT
- END "ABS";
- (** COMPLEX *)
- PROCEDURE AbsLoopZ( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lval: COMPLEX;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.PUT( dadr, ABS(lval) ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AbsLoopZ;
- OPERATOR "ABS"*(CONST src: ARRAY [ ? ] OF COMPLEX): ARRAY [ ? ] OF REAL;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( REAL ), AbsLoopZ );
- RETURN RESULT
- END "ABS";
- (** LONGCOMPLEX *)
- PROCEDURE AbsLoopLZ( ladr, dadr: ADDRESS; linc, dinc, len: SIZE );
- VAR lvalRe, lvalIm: LONGREAL;
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- SYSTEM.PUT( dadr, MathL.sqrt(lvalRe*lvalRe + lvalIm*lvalIm) );
- INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- END AbsLoopLZ;
- OPERATOR "ABS"*(CONST src: ARRAY [ ? ] OF LONGCOMPLEX): ARRAY [ ? ] OF LONGREAL;
- BEGIN
- ApplyUnaryAAOp( ADDRESSOF( RESULT ), ADDRESSOF( src ), SIZEOF( LONGREAL ), AbsLoopLZ );
- RETURN RESULT
- END "ABS";
- (*** assign number to array (initialisation) ********************************************************************)
- (** BOOLEAN *)
- PROCEDURE AssignSBABLoop( ladr, dadr: ADDRESS; dinc, len: SIZE );
- VAR lval: BOOLEAN;
- BEGIN
- SYSTEM.GET( ladr, lval );
- WHILE (len > 0) DO SYSTEM.PUT( dadr, lval ); INC( dadr, dinc ); DEC( len ); END;
- END AssignSBABLoop;
- OPERATOR ":="*(VAR dest: ARRAY [?] OF BOOLEAN; right: BOOLEAN);
- BEGIN
- ApplyUnarySAOp( ADDRESSOF( dest ), ADDRESSOF( right ), AssignSBABLoop );
- END ":=";
- (** SHORTINT*)
- PROCEDURE AssignSSASLoop( ladr, dadr: ADDRESS; dinc, len: SIZE );
- VAR lval: SHORTINT;
- BEGIN
- SYSTEM.GET( ladr, lval );
- WHILE (len > 0) DO SYSTEM.PUT( dadr, lval ); INC( dadr, dinc ); DEC( len ); END;
- END AssignSSASLoop;
- OPERATOR ":="*(VAR dest: ARRAY [?] OF SHORTINT; right: SHORTINT);
- BEGIN
- ApplyUnarySAOp( ADDRESSOF( dest ), ADDRESSOF( right ), AssignSSASLoop );
- END ":=";
- (**INTEGER *)
- PROCEDURE AssignSIAILoop( ladr, dadr: ADDRESS; dinc, len: SIZE );
- VAR lval: INTEGER;
- BEGIN
- SYSTEM.GET( ladr, lval );
- WHILE (len > 0) DO SYSTEM.PUT( dadr, lval ); INC( dadr, dinc ); DEC( len ); END;
- END AssignSIAILoop;
- OPERATOR ":="*(VAR dest: ARRAY [?] OF INTEGER; right: INTEGER);
- BEGIN
- ApplyUnarySAOp( ADDRESSOF( dest ), ADDRESSOF( right ), AssignSIAILoop );
- END ":=";
- (** LONGINT *)
- PROCEDURE AssignSLALLoop( ladr, dadr: ADDRESS; dinc, len: SIZE );
- VAR lval: LONGINT;
- BEGIN
- SYSTEM.GET( ladr, lval );
- WHILE (len > 0) DO SYSTEM.PUT( dadr, lval ); INC( dadr, dinc ); DEC( len ); END;
- END AssignSLALLoop;
- OPERATOR ":="*(VAR dest: ARRAY [?] OF LONGINT; right: LONGINT);
- BEGIN
- ApplyUnarySAOp( ADDRESSOF( dest ), ADDRESSOF( right ), AssignSLALLoop );
- END ":=";
- (** REAL *)
- PROCEDURE AssignSRARLoop( ladr, dadr: ADDRESS; dinc, len: SIZE );
- VAR lval: REAL;
- BEGIN
- SYSTEM.GET( ladr, lval );
- WHILE (len > 0) DO SYSTEM.PUT( dadr, lval ); INC( dadr, dinc ); DEC( len ); END;
- END AssignSRARLoop;
- OPERATOR ":="*(VAR dest: ARRAY [?] OF REAL; right: REAL);
- BEGIN
- ApplyUnarySAOp( ADDRESSOF( dest ), ADDRESSOF( right ), AssignSRARLoop );
- END ":=";
- (** LONGREAL *)
- PROCEDURE AssignSXAXLoop( ladr, dadr: ADDRESS; dinc, len: SIZE );
- VAR lval: LONGREAL;
- BEGIN
- SYSTEM.GET( ladr, lval );
- WHILE (len > 0) DO SYSTEM.PUT( dadr, lval ); INC( dadr, dinc ); DEC( len ); END;
- END AssignSXAXLoop;
- OPERATOR ":="*(VAR dest: ARRAY [?] OF LONGREAL; right: LONGREAL);
- BEGIN
- ApplyUnarySAOp( ADDRESSOF( dest ), ADDRESSOF( right ), AssignSXAXLoop );
- END ":=";
- (** COMPLEX *)
- PROCEDURE AssignSZAZLoop( ladr, dadr: ADDRESS; dinc, len: SIZE );
- VAR lval: COMPLEX;
- BEGIN
- SYSTEM.GET( ladr, lval );
- WHILE (len > 0) DO SYSTEM.PUT( dadr, lval ); INC( dadr, dinc ); DEC( len ); END;
- END AssignSZAZLoop;
- OPERATOR ":="*(VAR dest: ARRAY [?] OF COMPLEX; right: COMPLEX);
- BEGIN
- ApplyUnarySAOp( ADDRESSOF( dest ), ADDRESSOF( right ), AssignSZAZLoop );
- END ":=";
- (** LONGCOMPLEX *)
- PROCEDURE AssignSLZALZLoop( ladr, dadr: ADDRESS; dinc, len: SIZE );
- VAR lvalRe, lvalIm: LONGREAL;
- BEGIN
- SYSTEM.GET( ladr, lvalRe ); SYSTEM.GET( ladr+SIZEOF(LONGREAL), lvalIm );
- WHILE (len > 0) DO SYSTEM.PUT( dadr, lvalRe ); SYSTEM.PUT( dadr+SIZEOF(LONGREAL), lvalIm ); INC( dadr, dinc ); DEC( len ); END;
- END AssignSLZALZLoop;
- OPERATOR ":="*(VAR dest: ARRAY [?] OF LONGCOMPLEX; right: LONGCOMPLEX);
- BEGIN
- ApplyUnarySAOp( ADDRESSOF( dest ), ADDRESSOF( right ), AssignSLZALZLoop );
- END ":=";
- (*** matrix multipliation ********************************************************************)
- PROCEDURE AllocateMatrix( dest: ADDRESS;
- rows, cols, elementsize: SIZE ): ANY;
- VAR p: ANY;
- BEGIN
- (*
- KernelLog.String( "ALLOCATE MATRIX WAS CALLED" ); KernelLog.Ln;
- *)
- SYSTEM.NEW( p, rows * cols * elementsize + ArrayAlignment); PutLen( dest, 1, cols );
- PutLen( dest, 0, rows ); PutInc( dest, 1, elementsize );
- PutInc( dest, 0, elementsize * cols ); PutAdr( dest, Align(p) );
- PutPtr( dest, p); RETURN p;
- END AllocateMatrix;
- PROCEDURE AllocateVector( dest: ADDRESS; l0, elementsize: SIZE ): ANY;
- VAR p: ANY;
- BEGIN
- SYSTEM.NEW( p, l0 * elementsize + ArrayAlignment); PutLen( dest, 0, l0 );
- PutInc( dest, 0, elementsize ); PutAdr( dest, Align(p) );
- PutPtr( dest, p ); RETURN p;
- END AllocateVector;
- PROCEDURE ApplyMatMulLoop( dest, left, right: ADDRESS; Size: SIZE;
- loop: BinaryAASLoop;
- fast: FastMatMul ); (* Size= element-size *)
- VAR ladr, radr, dadr: ADDRESS; dadri, radri, rowsL, colsL, rowsR, colsR, incL, incR, incD, strideR, strideL, strideD, colsRi: SIZE;
- p: ANY; overlap: BOOLEAN; destOld, destNew: ADDRESS;
- BEGIN
- (*
- <- 1 ->
- xxx xxxx -> xxxx
- ^ xxx xxxx xxxx
- 0 xxx xxxx xxxx
- v xxx xxxx
- xxx xxxx
- Len(..,1): #columns ; Inc(..,1): inc in rows
- Len(..,0): #rows ; Inc(..,0): inc between rows
- *)
- (* apply multiplication D = L * R *)
- rowsL := GetLen( left, 0 ); (* # left rows = # dest rows*)
- colsL := GetLen( left, 1 ); (* # left columns *)
- rowsR := GetLen( right, 0 ); (* # right rows =!= left columns *)
- colsR := GetLen( right, 1 ); (* # right columns = # dest columns*)
- (* check geometric restriction *)
- IF colsL # rowsR THEN Halt( GeometryMismatch, left, right, 0 ); END;
- IF GetAdr( dest ) = 0 THEN p := AllocateMatrix( dest, rowsL, colsR, Size );
- ELSIF (GetLen( dest, 0 ) # rowsL) OR (GetLen( dest, 1 ) # colsR) THEN
- IF RangeFlag IN GetFlags( dest ) THEN
- Halt( GeometryMismatch, left, right, dest )
- ELSE p := AllocateMatrix( dest, rowsL, colsR, Size );
- END;
- END;
- overlap := Overlap( left, dest ) OR Overlap( right, dest );
- IF overlap THEN
- destOld := dest; destNew := 0;
- p := AllocateSame( destNew, destOld, Size );
- CopyContent( destNew, destOld, Size ); (* for INCMUL ! *)
- dest := destNew;
- END;
- IF (GetLen( dest, 0 ) # rowsL) OR (GetLen( dest, 1 ) # colsR) THEN
- HALT( 9999 )
- END;
- ladr := GetAdr( left ); radr := GetAdr( right ); dadr := GetAdr( dest );
- incL := GetIncr( left, 1 ); strideL := GetIncr( left, 0 ); (* increment and stride of left matrix *)
- incR := GetIncr( right, 1 ); strideR := GetIncr( right, 0 ); (* increment and stride of right matrix *)
- incD := GetIncr( dest, 1 ); strideD := GetIncr( dest, 0 ); (* increment and stride of dest matrix *)
- (*
- KernelLog.String("incD="); KernelLog.Int(incD,10); KernelLog.Ln;
- KernelLog.String("strideD="); KernelLog.Int(strideD,10); KernelLog.Ln;
- KernelLog.String("Len(dest,0) [rows]="); KernelLog.Int(GetLen(dest,0),10); KernelLog.Ln;
- KernelLog.String("Len(dest,1) [cols]="); KernelLog.Int(GetLen(dest,1),10); KernelLog.Ln;
- *)
- IF rowsL = 0 THEN RETURN
- ELSIF colsL=0 THEN RETURN
- ELSIF colsR=0 THEN RETURN
- ELSIF (fast = NIL ) OR
- ~(fast( ladr, radr, dadr, incL, strideL, incR, strideR, incD, strideD, rowsL, colsL, rowsR, colsR )) THEN
- WHILE (rowsL > 0) DO (* outer loop: traverse rows of left matrix *)
- radri := radr; dadri := dadr; colsRi := colsR;
- WHILE (colsRi > 0) DO (* inner loop: traverse columns of right matrix *)
- loop( ladr, radri, dadri, incL, strideR, colsL ); INC( radri, incR );
- INC( dadri, incD ); DEC( colsRi );
- END;
- INC( ladr, strideL ); INC( dadr, strideD ); DEC( rowsL );
- END;
- END;
- IF overlap THEN CopyContent( destOld, dest, Size );
- END;
- END ApplyMatMulLoop;
- PROCEDURE ApplyMatVecMulLoop( dest, left, right: ADDRESS;
- Size: SIZE; loop: BinaryAASLoop;
- fast: FastMatMul ); (* Size= element-size *)
- VAR ladr, radr, dadr: ADDRESS; li1, li0, ri0, di0, l1, l2: SIZE; p: ANY;
- overlap: BOOLEAN; destOld, destNew: ADDRESS;
- BEGIN
- (*
- <- 0 ->
- xxx T(xxx) -> T(xxxxx)
- xxx
- 1 xxx
- xxx
- xxx
- Len(..,0): #columns ; Inc(..,0): inc in rows
- Len(..,1): #rows ; Inc(..,1): inc between rows
- *)
- (* check geometric restriction *)
- IF GetLen( left, 1 ) # GetLen( right, 0 ) THEN
- Halt( GeometryMismatch, left, right,0 );
- END;
- l1 := GetLen( left, 0 ); (* number of destination's rows *)
- l2 := GetLen( left, 1 ); (* inner loop len *)
- IF GetAdr( dest ) = 0 THEN p := AllocateVector( dest, l1, Size );
- ELSIF (GetLen( dest, 0 ) # l1) THEN
- IF RangeFlag IN GetFlags( dest ) THEN
- Halt( GeometryMismatch, left, right, dest );
- ELSE p := AllocateVector( dest, l1, Size );
- END;
- END;
- overlap := Overlap( left, dest ) OR Overlap( right, dest );
- IF overlap THEN
- destOld := dest; destNew := 0;
- p := AllocateSame( destNew, destOld, Size );
- CopyContent( destNew, destOld, Size ); (* for INCMUL ! *)
- dest := destNew;
- END;
- (*
- IF GetAdr( dest ) = -1 THEN p := AllocateVector( dest, l1, Size ); ELSE
- IF (GetLen( dest, 0 ) # l1) THEN HALT( 102 ) END;
- END;
- *)
- ladr := GetAdr( left ); radr := GetAdr( right ); dadr := GetAdr( dest );
- li0 := GetIncr( left, 1 ); li1 := GetIncr( left, 0 ); ri0 := GetIncr( right, 0 );
- di0 := GetIncr( dest, 0 );
- IF l1=0 THEN RETURN
- ELSIF l2=0 THEN RETURN
- ELSIF (fast = NIL ) OR
- ~(fast( ladr, radr, dadr, li0, li1, ri0, ri0, di0, di0, l1, l2, l2, 1 )) THEN
- WHILE (l1 > 0) DO (* inner loop: traverse columns of right matrix *)
- loop( ladr, radr, dadr, li0, ri0, l2 ); INC( ladr, li1 ); INC( dadr, di0 );
- DEC( l1 );
- END;
- END;
- IF overlap THEN CopyContent( destOld, dest, Size );
- END;
- END ApplyMatVecMulLoop;
- PROCEDURE ApplyVecMatMulLoop( dest, left, right: ADDRESS;
- Size: SIZE; loop: BinaryAASLoop;
- fast: FastMatMul ); (* Size= element-size *)
- VAR ladr, radr, dadr: ADDRESS; li0, ri1, ri0, di0, l0, l2: SIZE; p: ANY;
- overlap: BOOLEAN; destOld, destNew: ADDRESS;
- BEGIN
- (*
- <- 0 ->
- xxx xxxx -> xxxx
- xxxx
- 1 xxxx
- Len(..,0): #columns ; Inc(..,0): inc in rows
- Len(..,1): #rows ; Inc(..,1): inc between rows
- *)
- (* check geometric restriction *)
- IF GetLen( left, 0 ) # GetLen( right, 0 ) THEN HALT( GeometryMismatch ); END;
- l0 := GetLen( right, 1 ); (* number of destination's column *)
- l2 := GetLen( right, 0 ); (* inner loop len *)
- IF GetAdr( dest ) = 0 THEN p := AllocateVector( dest, l0, Size );
- ELSIF (GetLen( dest, 0 ) # l0) THEN
- IF RangeFlag IN GetFlags( dest ) THEN HALT( GeometryMismatch )
- ELSE p := AllocateVector( dest, l0, Size );
- END;
- END;
- overlap := Overlap( left, dest ) OR Overlap( right, dest );
- IF overlap THEN
- destOld := dest; destNew := 0;
- p := AllocateSame( destNew, destOld, Size );
- CopyContent( destNew, destOld, Size ); (* for INCMUL ! *)
- dest := destNew;
- END;
- (*
- IF GetAdr( dest ) = -1 THEN p := AllocateVector( dest, l0, Size ); ELSE
- IF (GetLen( dest, 0 ) # l0) THEN HALT( 102 ) END;
- END;
- *)
- ladr := GetAdr( left ); radr := GetAdr( right ); dadr := GetAdr( dest );
- li0 := GetIncr( left, 0 ); ri0 := GetIncr( right, 1 ); ri1 := GetIncr( right, 0 );
- di0 := GetIncr( dest, 0 );
- IF l2=0 THEN RETURN
- ELSIF l0=0 THEN RETURN
- ELSIF (fast = NIL ) OR ~fast( ladr, radr, dadr, li0, li0, ri0, ri1, di0, di0, 1, l2, l2, l0 ) THEN
- WHILE (l0 > 0) DO (* inner loop: traverse columns of right matrix *)
- loop( ladr, radr, dadr, li0, ri1, l2 ); INC( radr, ri0 ); INC( dadr, di0 );
- DEC( l0 );
- END;
- END;
- IF overlap THEN CopyContent( destOld, dest, Size );
- END;
- END ApplyVecMatMulLoop;
- (** SHORTINT *)
- PROCEDURE MatMulASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval, dval: SHORTINT;
- BEGIN
- dval := 0;
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := dval + lval * rval;
- (* KernelLog.String("mul with: "); KernelLog.Int(lval,10); KernelLog.Int(rval,10); KernelLog.Ln; *)
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MatMulASASLoop;
- OPERATOR "*"*(CONST left, right: ARRAY [ * , * ] OF SHORTINT ): ARRAY [ * , * ] OF SHORTINT;
- BEGIN
- ApplyMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( SHORTINT ), MatMulASASLoop, NIL );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(CONST left: ARRAY [ * , * ] OF SHORTINT; CONST right: ARRAY [ * ] OF SHORTINT): ARRAY [ * ] OF SHORTINT;
- BEGIN
- ApplyMatVecMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( SHORTINT ), MatMulASASLoop, NIL );
- RETURN RESULT
- END "*";
- OPERATOR "*"*( CONST left: ARRAY [ * ] OF SHORTINT; CONST right: ARRAY [ * , * ] OF SHORTINT ): ARRAY [ * ] OF SHORTINT;
- BEGIN
- ApplyVecMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( SHORTINT ), MatMulASASLoop, NIL );
- RETURN RESULT
- END "*";
- (** INTEGER *)
- PROCEDURE MatMulAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval, dval: INTEGER;
- BEGIN
- dval := 0;
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := dval + lval * rval;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MatMulAIAILoop;
- OPERATOR "*"*( CONST left, right: ARRAY [ * , * ] OF INTEGER ): ARRAY [ * , * ] OF INTEGER;
- BEGIN
- ApplyMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( INTEGER ), MatMulAIAILoop, NIL );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(CONST left: ARRAY [ * , * ] OF INTEGER;
- CONST right: ARRAY [ * ] OF INTEGER ): ARRAY [ * ] OF INTEGER;
- BEGIN
- ApplyMatVecMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( INTEGER ), MatMulAIAILoop, NIL );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(CONST left: ARRAY [ * ] OF INTEGER;
- CONST right: ARRAY [ * , * ] OF INTEGER ): ARRAY [ * ] OF INTEGER;
- BEGIN
- ApplyVecMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( INTEGER ), MatMulAIAILoop, NIL );
- RETURN RESULT
- END "*";
- (** LONGINT *)
- PROCEDURE MatMulALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval, dval: LONGINT;
- BEGIN
- dval := 0;
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := dval + lval * rval;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MatMulALALLoop;
- OPERATOR "*"*(CONST left, right: ARRAY [ * , * ] OF LONGINT ): ARRAY [ * , * ] OF LONGINT;
- BEGIN
- (*
- KernelLog.String("MatMulALAL");
- KernelLog.Int(SYSTEM.VAL(LONGINT,dest),10);
- KernelLog.Int(SYSTEM.VAL(LONGINT,left),10);
- KernelLog.Int(SYSTEM.VAL(LONGINT,right),10);
- KernelLog.Ln;
- *)
- ApplyMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGINT ), MatMulALALLoop, NIL );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(CONST left: ARRAY [ * , * ] OF LONGINT; CONST right: ARRAY [ * ] OF LONGINT ): ARRAY [ * ] OF LONGINT;
- BEGIN
- ApplyMatVecMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGINT ), MatMulALALLoop, NIL );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(CONST left: ARRAY [ * ] OF LONGINT;
- CONST right: ARRAY [ * , * ] OF LONGINT): ARRAY [ * ] OF LONGINT;
- BEGIN
- ApplyVecMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGINT ), MatMulALALLoop, NIL );
- RETURN RESULT
- END "*";
- (** REAL *)
- PROCEDURE MatMulARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval, dval: REAL;
- BEGIN
- dval := 0;
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := dval + lval * rval;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MatMulARARLoop;
- (*
- Optimized for small matrices (Alexey Morozov)
- use of CONST for left, right makes execution slower, it seems that a new descriptor is created in this case
- *)
- OPERATOR "*"*(CONST left, right: ARRAY [ * , * ] OF REAL ): ARRAY [ * , * ] OF REAL;
- VAR flags: SET; dadr, ladr, radr: ADDRESS;
- BEGIN
- dadr := GetAdr(ADDRESSOF(RESULT));
- ladr := GetAdr(ADDRESSOF(left));
- radr := GetAdr(ADDRESSOF(right));
- (* account possible inplace left := left*right, right := left*right, left := left*left, right := right*right *)
- IF (ladr # dadr) & (radr # dadr) THEN
- flags := SmallArrayMask * SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(left)+MathFlagsOffset)) * SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(right)+MathFlagsOffset));
- CASE SYSTEM.VAL(LONGINT,flags) OF
- Mat2x2:
- IF SYSTEM.VAL(LONGINT,SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset)) * SmallArrayMask) # Mat2x2 THEN
- IF dadr = 0 THEN NEW(RESULT,2,2); dadr := GetAdr(ADDRESSOF(RESULT));
- ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
- END;
- END;
- IF matMulR2x2 # NIL THEN matMulR2x2(dadr,ladr,radr);
- ELSE
- RESULT[0,0] := left[0,0]*right[0,0] + left[0,1]*right[1,0];
- RESULT[0,1] := left[0,0]*right[0,1] + left[0,1]*right[1,1];
- RESULT[1,0] := left[1,0]*right[0,0] + left[1,1]*right[1,0];
- RESULT[1,1] := left[1,0]*right[0,1] + left[1,1]*right[1,1];
- END;
- |Mat3x3:
- IF SYSTEM.VAL(LONGINT,SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset)) * SmallArrayMask) # Mat3x3 THEN
- IF dadr = 0 THEN NEW(RESULT,3,3);dadr := GetAdr(ADDRESSOF(RESULT));
- ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
- END;
- END;
- IF matMulR3x3 # NIL THEN matMulR3x3(dadr,ladr,radr);
- ELSE
- RESULT[0,0] := left[0,0]*right[0,0] + left[0,1]*right[1,0] + left[0,2]*right[2,0];
- RESULT[0,1] := left[0,0]*right[0,1] + left[0,1]*right[1,1] + left[0,2]*right[2,1];
- RESULT[0,2] := left[0,0]*right[0,2] + left[0,1]*right[1,2] + left[0,2]*right[2,2];
- RESULT[1,0] := left[1,0]*right[0,0] + left[1,1]*right[1,0] + left[1,2]*right[2,0];
- RESULT[1,1] := left[1,0]*right[0,1] + left[1,1]*right[1,1] + left[1,2]*right[2,1];
- RESULT[1,2] := left[1,0]*right[0,2] + left[1,1]*right[1,2] + left[1,2]*right[2,2];
- RESULT[2,0] := left[2,0]*right[0,0] + left[2,1]*right[1,0] + left[2,2]*right[2,0];
- RESULT[2,1] := left[2,0]*right[0,1] + left[2,1]*right[1,1] + left[2,2]*right[2,1];
- RESULT[2,2] := left[2,0]*right[0,2] + left[2,1]*right[1,2] + left[2,2]*right[2,2];
- END;
- |Mat4x4:
- IF SYSTEM.VAL(LONGINT,SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset)) * SmallArrayMask) # Mat4x4 THEN
- IF dadr = 0 THEN NEW(RESULT,4,4); dadr := GetAdr(ADDRESSOF(RESULT));
- ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
- END;
- END;
- IF matMulR4x4 # NIL THEN matMulR4x4(dadr,ladr,radr);
- ELSE
- RESULT[0,0] := left[0,0]*right[0,0] + left[0,1]*right[1,0] + left[0,2]*right[2,0] + left[0,3]*right[3,0];
- RESULT[0,1] := left[0,0]*right[0,1] + left[0,1]*right[1,1] + left[0,2]*right[2,1] + left[0,3]*right[3,1];
- RESULT[0,2] := left[0,0]*right[0,2] + left[0,1]*right[1,2] + left[0,2]*right[2,2] + left[0,3]*right[3,2];
- RESULT[0,3] := left[0,0]*right[0,3] + left[0,1]*right[1,3] + left[0,2]*right[2,3] + left[0,3]*right[3,3];
- RESULT[1,0] := left[1,0]*right[0,0] + left[1,1]*right[1,0] + left[1,2]*right[2,0] + left[1,3]*right[3,0];
- RESULT[1,1] := left[1,0]*right[0,1] + left[1,1]*right[1,1] + left[1,2]*right[2,1] + left[1,3]*right[3,1];
- RESULT[1,2] := left[1,0]*right[0,2] + left[1,1]*right[1,2] + left[1,2]*right[2,2] + left[1,3]*right[3,2];
- RESULT[1,3] := left[1,0]*right[0,3] + left[1,1]*right[1,3] + left[1,2]*right[2,3] + left[1,3]*right[3,3];
- RESULT[2,0] := left[2,0]*right[0,0] + left[2,1]*right[1,0] + left[2,2]*right[2,0] + left[2,3]*right[3,0];
- RESULT[2,1] := left[2,0]*right[0,1] + left[2,1]*right[1,1] + left[2,2]*right[2,1] + left[2,3]*right[3,1];
- RESULT[2,2] := left[2,0]*right[0,2] + left[2,1]*right[1,2] + left[2,2]*right[2,2] + left[2,3]*right[3,2];
- RESULT[2,3] := left[2,0]*right[0,3] + left[2,1]*right[1,3] + left[2,2]*right[2,3] + left[2,3]*right[3,3];
- RESULT[3,0] := left[3,0]*right[0,0] + left[3,1]*right[1,0] + left[3,2]*right[2,0] + left[3,3]*right[3,0];
- RESULT[3,1] := left[3,0]*right[0,1] + left[3,1]*right[1,1] + left[3,2]*right[2,1] + left[3,3]*right[3,1];
- RESULT[3,2] := left[3,0]*right[0,2] + left[3,1]*right[1,2] + left[3,2]*right[2,2] + left[3,3]*right[3,2];
- RESULT[3,3] := left[3,0]*right[0,3] + left[3,1]*right[1,3] + left[3,2]*right[2,3] + left[3,3]*right[3,3];
- END;
- ELSE
- ApplyMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( REAL ),
- loopMatMulARAR, matMulR );
- END;
- ELSE
- ApplyMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( REAL ),
- loopMatMulARAR, matMulR );
- END;
- RETURN RESULT
- END "*";
- (*
- Optimized for small arrays (Alexey Morozov)
- use of CONST for left, right makes execution slower, it seems that a new descriptor is created in this case
- *)
- OPERATOR "*"*(CONST left: ARRAY [ * , * ] OF REAL; CONST right: ARRAY [ * ] OF REAL ): ARRAY [ * ] OF REAL;
- VAR
- flags: SET; dadr, ladr, radr: ADDRESS;
- v0, v1, v2: REAL;
- BEGIN
- dadr := GetAdr(ADDRESSOF(RESULT));
- ladr := GetAdr(ADDRESSOF(left));
- radr := GetAdr(ADDRESSOF(right));
- flags := SmallArrayMask * SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(left)+MathFlagsOffset)) * SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(right)+MathFlagsOffset));
- CASE SYSTEM.VAL(LONGINT,flags) OF
- MatVec2x2:
- IF SYSTEM.VAL(LONGINT,SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset)) * SmallArrayMask) # Vec2 THEN
- IF dadr = 0 THEN NEW(RESULT,2);dadr := GetAdr(ADDRESSOF(RESULT));
- ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
- END;
- END;
- IF matVecMulR2x2 # NIL THEN matVecMulR2x2(dadr,ladr,radr);
- ELSE
- (* account possible overlapping *)
- v0 := right[0];
- RESULT[0] := left[0,0]*v0 + left[0,1]*right[1];
- RESULT[1] := left[1,0]*v0 + left[1,1]*right[1];
- END;
- |MatVec3x3:
- IF SYSTEM.VAL(LONGINT,SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset)) * SmallArrayMask) # Vec3 THEN
- IF dadr = 0 THEN NEW(RESULT,3);dadr := GetAdr(ADDRESSOF(RESULT));
- ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
- END;
- END;
- IF matVecMulR3x3 # NIL THEN matVecMulR3x3(dadr,ladr,radr);
- ELSE
- (* account possible overlapping *)
- v0 := right[0]; v1 := right[1];
- RESULT[0] := left[0,0]*v0 + left[0,1]*v1 + left[0,2]*right[2];
- RESULT[1] := left[1,0]*v0 + left[1,1]*v1 + left[1,2]*right[2];
- RESULT[2] := left[2,0]*v0 + left[2,1]*v1 + left[2,2]*right[2];
- END;
- |MatVec4x4:
- IF SYSTEM.VAL(LONGINT,SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset)) * SmallArrayMask) # Vec4 THEN
- IF dadr = 0 THEN NEW(RESULT,4);dadr := GetAdr(ADDRESSOF(RESULT));
- ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
- END;
- END;
- IF matVecMulR4x4 # NIL THEN matVecMulR4x4(dadr,ladr,radr);
- ELSE
- (* account possible overlapping *)
- v0 := right[0]; v1 := right[1]; v2 := right[2];
- RESULT[0] := left[0,0]*v0 + left[0,1]*v1 + left[0,2]*v2 + left[0,3]*right[3];
- RESULT[1] := left[1,0]*v0 + left[1,1]*v1 + left[1,2]*v2 + left[1,3]*right[3];
- RESULT[2] := left[2,0]*v0 + left[2,1]*v1 + left[2,2]*v2 + left[2,3]*right[3];
- RESULT[3] := left[3,0]*v0 + left[3,1]*v1 + left[3,2]*v2 + left[3,3]*right[3];
- END;
- ELSE
- ApplyMatVecMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( REAL ), loopMatMulARAR, matMulR );
- END;
- RETURN RESULT
- END "*";
- OPERATOR "*"*( CONST left: ARRAY [ * ] OF REAL;
- CONST right: ARRAY [ * , * ] OF REAL ): ARRAY [ * ] OF REAL;
- BEGIN
- ApplyVecMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( REAL ), loopMatMulARAR, matMulR );
- RETURN RESULT
- END "*";
- (** LONGREAL *)
- PROCEDURE MatMulAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval, dval: LONGREAL;
- BEGIN
- dval := 0;
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := dval + lval * rval;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MatMulAXAXLoop;
- (*
- Optimized for small matrices (Alexey Morozov)
- use of CONST for left, right makes execution slower, it seems that a new descriptor is created in this case
- *)
- OPERATOR "*"*( CONST left, right: ARRAY [ * , * ] OF LONGREAL): ARRAY [ * , * ] OF LONGREAL;
- VAR
- flags: SET; dadr, ladr, radr: ADDRESS;
- BEGIN
- dadr := GetAdr(ADDRESSOF(RESULT));
- ladr := GetAdr(ADDRESSOF(left));
- radr := GetAdr(ADDRESSOF(right));
- IF (ladr # dadr) & (radr # dadr) THEN
- flags := SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(left)+MathFlagsOffset)) * SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(right)+MathFlagsOffset));
- CASE SYSTEM.VAL(LONGINT,flags) OF
- Mat2x2:
- IF SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset) # Mat2x2 THEN
- IF dadr = 0 THEN NEW(RESULT,2,2);
- ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
- END;
- END;
- IF matMulLR2x2 # NIL THEN matMulLR2x2(dadr,ladr,radr);
- ELSE
- RESULT[0,0] := left[0,0]*right[0,0] + left[0,1]*right[1,0];
- RESULT[0,1] := left[0,0]*right[0,1] + left[0,1]*right[1,1];
- RESULT[1,0] := left[1,0]*right[0,0] + left[1,1]*right[1,0];
- RESULT[1,1] := left[1,0]*right[0,1] + left[1,1]*right[1,1];
- END;
- |Mat3x3:
- IF SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset) # Mat3x3 THEN
- IF dadr = 0 THEN NEW(RESULT,3,3);
- ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
- END;
- END;
- IF matMulLR3x3 # NIL THEN matMulLR3x3(dadr,ladr,radr);
- ELSE
- RESULT[0,0] := left[0,0]*right[0,0] + left[0,1]*right[1,0] + left[0,2]*right[2,0];
- RESULT[0,1] := left[0,0]*right[0,1] + left[0,1]*right[1,1] + left[0,2]*right[2,1];
- RESULT[0,2] := left[0,0]*right[0,2] + left[0,1]*right[1,2] + left[0,2]*right[2,2];
- RESULT[1,0] := left[1,0]*right[0,0] + left[1,1]*right[1,0] + left[1,2]*right[2,0];
- RESULT[1,1] := left[1,0]*right[0,1] + left[1,1]*right[1,1] + left[1,2]*right[2,1];
- RESULT[1,2] := left[1,0]*right[0,2] + left[1,1]*right[1,2] + left[1,2]*right[2,2];
- RESULT[2,0] := left[2,0]*right[0,0] + left[2,1]*right[1,0] + left[2,2]*right[2,0];
- RESULT[2,1] := left[2,0]*right[0,1] + left[2,1]*right[1,1] + left[2,2]*right[2,1];
- RESULT[2,2] := left[2,0]*right[0,2] + left[2,1]*right[1,2] + left[2,2]*right[2,2];
- END;
- |Mat4x4:
- IF SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset) # Mat4x4 THEN
- IF dadr = 0 THEN NEW(RESULT,4,4);
- ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
- END;
- END;
- IF matMulLR4x4 # NIL THEN matMulLR4x4(dadr,ladr,radr);
- ELSE
- RESULT[0,0] := left[0,0]*right[0,0] + left[0,1]*right[1,0] + left[0,2]*right[2,0] + left[0,3]*right[3,0];
- RESULT[0,1] := left[0,0]*right[0,1] + left[0,1]*right[1,1] + left[0,2]*right[2,1] + left[0,3]*right[3,1];
- RESULT[0,2] := left[0,0]*right[0,2] + left[0,1]*right[1,2] + left[0,2]*right[2,2] + left[0,3]*right[3,2];
- RESULT[0,3] := left[0,0]*right[0,3] + left[0,1]*right[1,3] + left[0,2]*right[2,3] + left[0,3]*right[3,3];
- RESULT[1,0] := left[1,0]*right[0,0] + left[1,1]*right[1,0] + left[1,2]*right[2,0] + left[1,3]*right[3,0];
- RESULT[1,1] := left[1,0]*right[0,1] + left[1,1]*right[1,1] + left[1,2]*right[2,1] + left[1,3]*right[3,1];
- RESULT[1,2] := left[1,0]*right[0,2] + left[1,1]*right[1,2] + left[1,2]*right[2,2] + left[1,3]*right[3,2];
- RESULT[1,3] := left[1,0]*right[0,3] + left[1,1]*right[1,3] + left[1,2]*right[2,3] + left[1,3]*right[3,3];
- RESULT[2,0] := left[2,0]*right[0,0] + left[2,1]*right[1,0] + left[2,2]*right[2,0] + left[2,3]*right[3,0];
- RESULT[2,1] := left[2,0]*right[0,1] + left[2,1]*right[1,1] + left[2,2]*right[2,1] + left[2,3]*right[3,1];
- RESULT[2,2] := left[2,0]*right[0,2] + left[2,1]*right[1,2] + left[2,2]*right[2,2] + left[2,3]*right[3,2];
- RESULT[2,3] := left[2,0]*right[0,3] + left[2,1]*right[1,3] + left[2,2]*right[2,3] + left[2,3]*right[3,3];
- RESULT[3,0] := left[3,0]*right[0,0] + left[3,1]*right[1,0] + left[3,2]*right[2,0] + left[3,3]*right[3,0];
- RESULT[3,1] := left[3,0]*right[0,1] + left[3,1]*right[1,1] + left[3,2]*right[2,1] + left[3,3]*right[3,1];
- RESULT[3,2] := left[3,0]*right[0,2] + left[3,1]*right[1,2] + left[3,2]*right[2,2] + left[3,3]*right[3,2];
- RESULT[3,3] := left[3,0]*right[0,3] + left[3,1]*right[1,3] + left[3,2]*right[2,3] + left[3,3]*right[3,3];
- END;
- ELSE
- ApplyMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( LONGREAL ),
- loopMatMulAXAX, matMulX );
- END;
- ELSE
- ApplyMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( LONGREAL ),
- loopMatMulAXAX, matMulX );
- END;
- RETURN RESULT
- END "*";
- (*
- Optimized for small arrays (Alexey Morozov)
- use of CONST for left, right makes execution slower, it seems that a new descriptor is created in this case
- *)
- OPERATOR "*"*(CONST left: ARRAY [ * , * ] OF LONGREAL;
- CONST right: ARRAY [ * ] OF LONGREAL ): ARRAY [ * ] OF LONGREAL;
- VAR
- flags: SET; dadr, ladr, radr: ADDRESS;
- v0, v1, v2: LONGREAL;
- BEGIN
- dadr := GetAdr(ADDRESSOF(RESULT));
- ladr := GetAdr(ADDRESSOF(left));
- radr := GetAdr(ADDRESSOF(right));
- flags := SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(left)+MathFlagsOffset)) * SYSTEM.VAL(SET,SYSTEM.GET32(ADDRESSOF(right)+MathFlagsOffset));
- CASE SYSTEM.VAL(LONGINT,flags) OF
- MatVec2x2:
- IF SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset) # Vec2 THEN
- IF dadr = 0 THEN NEW(RESULT,2);
- ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
- END;
- END;
- IF matVecMulLR2x2 # NIL THEN matVecMulLR2x2(dadr,ladr,radr);
- ELSE
- (* account possible overlapping *)
- v0 := right[0];
- RESULT[0] := left[0,0]*v0 + left[0,1]*right[1];
- RESULT[1] := left[1,0]*v0 + left[1,1]*right[1];
- END;
- |MatVec3x3:
- IF SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset) # Vec3 THEN
- IF dadr = 0 THEN NEW(RESULT,3);
- ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
- END;
- END;
- IF matVecMulLR3x3 # NIL THEN matVecMulLR3x3(dadr,ladr,radr);
- ELSE
- (* account possible overlapping *)
- v0 := right[0]; v1 := right[1];
- RESULT[0] := left[0,0]*v0 + left[0,1]*v1 + left[0,2]*right[2];
- RESULT[1] := left[1,0]*v0 + left[1,1]*v1 + left[1,2]*right[2];
- RESULT[2] := left[2,0]*v0 + left[2,1]*v1 + left[2,2]*right[2];
- END;
- |MatVec4x4:
- IF SYSTEM.GET32(ADDRESSOF(RESULT)+MathFlagsOffset) # Vec4 THEN
- IF dadr = 0 THEN NEW(RESULT,4);
- ELSE Halt(GeometryMismatch,ADDRESSOF(left),ADDRESSOF(right),0);
- END;
- END;
- IF matVecMulLR4x4 # NIL THEN matVecMulLR4x4(dadr,ladr,radr);
- ELSE
- (* account possible overlapping *)
- v0 := right[0]; v1 := right[1]; v2 := right[2];
- RESULT[0] := left[0,0]*v0 + left[0,1]*v1 + left[0,2]*v2 + left[0,3]*right[3];
- RESULT[1] := left[1,0]*v0 + left[1,1]*v1 + left[1,2]*v2 + left[1,3]*right[3];
- RESULT[2] := left[2,0]*v0 + left[2,1]*v1 + left[2,2]*v2 + left[2,3]*right[3];
- RESULT[3] := left[3,0]*v0 + left[3,1]*v1 + left[3,2]*v2 + left[3,3]*right[3];
- END;
- ELSE
- ApplyMatVecMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGREAL ), loopMatMulAXAX, matMulX );
- END;
- RETURN RESULT
- END "*";
- OPERATOR "*"*( CONST left: ARRAY [ * ] OF LONGREAL;
- CONST right: ARRAY [ * , * ] OF LONGREAL ): ARRAY [ * ] OF LONGREAL;
- BEGIN
- ApplyVecMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGREAL ), loopMatMulAXAX, matMulX );
- RETURN RESULT
- END "*";
- (** SHORTINT *)
- PROCEDURE MatMulIncASASLoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval, dval: SHORTINT;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := dval + lval * rval;
- (* KernelLog.String("mul with: "); KernelLog.Int(lval,10); KernelLog.Int(rval,10); KernelLog.Ln; *)
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MatMulIncASASLoop;
- OPERATOR "INCMUL"*(CONST left, right: ARRAY [ * , * ] OF SHORTINT ): ARRAY [ * , * ] OF SHORTINT;
- BEGIN
- ApplyMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( SHORTINT ), MatMulIncASASLoop, NIL );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "INCMUL"*(CONST left: ARRAY [ * , * ] OF SHORTINT;
- CONST right: ARRAY [ * ] OF SHORTINT ): ARRAY [ * ] OF SHORTINT;
- BEGIN
- ApplyMatVecMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( SHORTINT ), MatMulIncASASLoop, NIL );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "INCMUL"*( CONST left: ARRAY [ * ] OF SHORTINT;
- CONST right: ARRAY [ * , * ] OF SHORTINT ): ARRAY [ * ] OF SHORTINT;
- BEGIN
- ApplyVecMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( SHORTINT ), MatMulIncASASLoop, NIL );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "DECMUL"*(CONST left, right: ARRAY [ * , * ] OF SHORTINT ): ARRAY [ * , * ] OF SHORTINT;
- BEGIN
- RESULT := -RESULT;
- ApplyMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( SHORTINT ), MatMulIncASASLoop, NIL );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*(CONST left: ARRAY [ * , * ] OF SHORTINT;
- CONST right: ARRAY [ * ] OF SHORTINT ): ARRAY [ * ] OF SHORTINT;
- BEGIN
- RESULT := -RESULT;
- ApplyMatVecMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( SHORTINT ), MatMulIncASASLoop, NIL );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*( CONST left: ARRAY [ * ] OF SHORTINT;
- CONST right: ARRAY [ * , * ] OF SHORTINT ): ARRAY [ * ] OF SHORTINT;
- BEGIN
- RESULT := -RESULT;
- ApplyVecMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( SHORTINT ), MatMulIncASASLoop, NIL );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- (** INTEGER *)
- PROCEDURE MatMulIncAIAILoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval, dval: INTEGER;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := dval + lval * rval;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MatMulIncAIAILoop;
- OPERATOR "INCMUL"*(CONST left, right: ARRAY [ * , * ] OF INTEGER ): ARRAY [ * , * ] OF INTEGER;
- BEGIN
- ApplyMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( INTEGER ), MatMulIncAIAILoop, NIL );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "INCMUL"*(CONST left: ARRAY [ * , * ] OF INTEGER; CONST right: ARRAY [ * ] OF INTEGER): ARRAY [ * ] OF INTEGER;
- BEGIN
- ApplyMatVecMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( INTEGER ), MatMulIncAIAILoop, NIL );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "INCMUL"*( CONST left: ARRAY [ * ] OF INTEGER; CONST right: ARRAY [ * , * ] OF INTEGER ): ARRAY [ * ] OF INTEGER;
- BEGIN
- ApplyVecMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( INTEGER ), MatMulIncAIAILoop, NIL );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "DECMUL"*(CONST left, right: ARRAY [ * , * ] OF INTEGER ): ARRAY [ * , * ] OF INTEGER;
- BEGIN
- RESULT := -RESULT;
- ApplyMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( INTEGER ), MatMulIncAIAILoop, NIL );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*( CONST left: ARRAY [ * , * ] OF INTEGER; CONST right: ARRAY [ * ] OF INTEGER ): ARRAY [ * ] OF INTEGER;
- BEGIN
- RESULT := -RESULT;
- ApplyMatVecMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( INTEGER ), MatMulIncAIAILoop, NIL );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*( CONST left: ARRAY [ * ] OF INTEGER; CONST right: ARRAY [ * , * ] OF INTEGER ): ARRAY [ * ] OF INTEGER;
- BEGIN
- RESULT := -RESULT;
- ApplyVecMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( INTEGER ), MatMulIncAIAILoop, NIL );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- (** LONGINT *)
- PROCEDURE MatMulIncALALLoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval, dval: LONGINT;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := dval + lval * rval;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MatMulIncALALLoop;
- OPERATOR "INCMUL"*(CONST left, right: ARRAY [ * , * ] OF LONGINT ): ARRAY [ * , * ] OF LONGINT;
- BEGIN
- ApplyMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGINT ), MatMulIncALALLoop, NIL );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "INCMUL"*(CONST left: ARRAY [ * , * ] OF LONGINT; CONST right: ARRAY [ * ] OF LONGINT ): ARRAY [ * ] OF LONGINT;
- BEGIN
- ApplyMatVecMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGINT ), MatMulIncALALLoop, NIL );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "INCMUL"*( CONST left: ARRAY [ * ] OF LONGINT; CONST right: ARRAY [ * , * ] OF LONGINT ): ARRAY [ * ] OF LONGINT;
- BEGIN
- ApplyVecMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGINT ), MatMulIncALALLoop, NIL );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "DECMUL"*( CONST left, right: ARRAY [ * , * ] OF LONGINT ): ARRAY [ * , * ] OF LONGINT;
- BEGIN
- RESULT := -RESULT;
- ApplyMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGINT ), MatMulIncALALLoop, NIL );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*(CONST left: ARRAY [ * , * ] OF LONGINT; CONST right: ARRAY [ * ] OF LONGINT ): ARRAY [ * ] OF LONGINT;
- BEGIN
- RESULT := -RESULT;
- ApplyMatVecMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGINT ), MatMulIncALALLoop, NIL );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*(CONST left: ARRAY [ * ] OF LONGINT; CONST right: ARRAY [ * , * ] OF LONGINT ): ARRAY [ * ] OF LONGINT;
- BEGIN
- RESULT := -RESULT;
- ApplyVecMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGINT ), MatMulIncALALLoop, NIL );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- (** REAL *)
- PROCEDURE MatMulIncARARLoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval, dval: REAL;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := dval + lval * rval;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MatMulIncARARLoop;
- OPERATOR "INCMUL"*(CONST left, right: ARRAY [ * , * ] OF REAL ): ARRAY [ * , * ] OF REAL;
- BEGIN
- ApplyMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( REAL ),
- loopMatMulIncARAR, matMulIncR );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "INCMUL"*(CONST left: ARRAY [ * , * ] OF REAL;CONST right: ARRAY [ * ] OF REAL ): ARRAY [ * ] OF REAL;
- BEGIN
- ApplyMatVecMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( REAL ), loopMatMulIncARAR, matMulIncR );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "INCMUL"*( CONST left: ARRAY [ * ] OF REAL; CONST right: ARRAY [ * , * ] OF REAL ): ARRAY [ * ] OF REAL;
- BEGIN
- ApplyVecMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( REAL ), loopMatMulIncARAR, matMulIncR );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "DECMUL"*(CONST left, right: ARRAY [ * , * ] OF REAL ): ARRAY [ * , * ] OF REAL;
- BEGIN
- RESULT := -RESULT;
- ApplyMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( REAL ),
- loopMatMulIncARAR, matMulIncR );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*( CONST left: ARRAY [ * , * ] OF REAL; CONST right: ARRAY [ * ] OF REAL ): ARRAY [ * ] OF REAL;
- BEGIN
- RESULT := -RESULT;
- ApplyMatVecMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( REAL ), loopMatMulIncARAR, matMulIncR );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*(CONST left: ARRAY [ * ] OF REAL; CONST right: ARRAY [ * , * ] OF REAL ): ARRAY [ * ] OF REAL;
- BEGIN
- RESULT := -RESULT;
- ApplyVecMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( REAL ), loopMatMulIncARAR, matMulIncR );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- (** LONGREAL *)
- PROCEDURE MatMulIncAXAXLoop( ladr, radr, dadr: ADDRESS; linc, rinc, len: SIZE );
- VAR lval, rval, dval: LONGREAL;
- BEGIN
- SYSTEM.GET( dadr, dval );
- WHILE (len > 0) DO
- SYSTEM.GET( ladr, lval ); SYSTEM.GET( radr, rval ); dval := dval + lval * rval;
- INC( ladr, linc ); INC( radr, rinc ); DEC( len );
- END;
- SYSTEM.PUT( dadr, dval );
- END MatMulIncAXAXLoop;
- OPERATOR "INCMUL"*(CONST left, right: ARRAY [ * , * ] OF LONGREAL ): ARRAY [ * , * ] OF LONGREAL;
- BEGIN
- ApplyMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGREAL ), loopMatMulIncAXAX, matMulIncX );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "INCMUL"*(CONST left: ARRAY [ * , * ] OF LONGREAL; CONST right: ARRAY [ * ] OF LONGREAL ): ARRAY [ * ] OF LONGREAL;
- BEGIN
- ApplyMatVecMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGREAL ), loopMatMulIncAXAX, matMulIncX );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "INCMUL"*( CONST left: ARRAY [ * ] OF LONGREAL; CONST right: ARRAY [ * , * ] OF LONGREAL ): ARRAY [ * ] OF LONGREAL;
- BEGIN
- ApplyVecMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGREAL ), loopMatMulIncAXAX, matMulIncX );
- RETURN RESULT
- END "INCMUL";
- OPERATOR "DECMUL"*(CONST left, right: ARRAY [ * , * ] OF LONGREAL ): ARRAY [ * , * ] OF LONGREAL;
- BEGIN
- RESULT := -RESULT;
- ApplyMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGREAL ), loopMatMulIncAXAX, matMulIncX );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*( CONST left: ARRAY [ * , * ] OF LONGREAL; CONST right: ARRAY [ * ] OF LONGREAL ): ARRAY [ * ] OF LONGREAL;
- BEGIN
- RESULT := -RESULT;
- ApplyMatVecMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGREAL ), loopMatMulIncAXAX, matMulIncX );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- OPERATOR "DECMUL"*( CONST left: ARRAY [ * ] OF LONGREAL; CONST right: ARRAY [ * , * ] OF LONGREAL ): ARRAY [ * ] OF LONGREAL;
- BEGIN
- RESULT := -RESULT;
- ApplyVecMatMulLoop( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGREAL ), loopMatMulIncAXAX, matMulIncX );
- RESULT := -RESULT;
- RETURN RESULT
- END "DECMUL";
- (*** Cross product ********************************************************************)
- OPERATOR "*"*(CONST left, right: ARRAY [ * ] OF SHORTINT ): ARRAY [ * ] OF SHORTINT;
- VAR vl1, vl2, vl3, vr1, vr2, vr3: SHORTINT;
- BEGIN
- IF (LEN( left,0 ) # 3) OR (LEN( right,0 ) # 3) THEN
- Halt( GeometryMismatch, ADDRESSOF( left ), ADDRESSOF( right ), 0 )
- END;
- IF LEN( RESULT,0 ) # 3 THEN NEW( RESULT, 3 ) END; (* will trap if not allowed *)
- vl1 := left[0]; vl2 := left[1]; vl3 := left[2]; vr1 := right[0]; vr2 := right[1];
- vr3 := right[2]; RESULT[0] := vl2 * vr3 - vl3 * vr2;
- RESULT[1] := vl3 * vr1 - vl1 * vr3; RESULT[2] := vl1 * vr2 - vl2 * vr1;
- RETURN RESULT
- END "*";
- OPERATOR "*"*(CONST left, right: ARRAY [ * ] OF INTEGER ): ARRAY [ * ] OF INTEGER;
- VAR vl1, vl2, vl3, vr1, vr2, vr3: INTEGER;
- BEGIN
- IF (LEN( left,0 ) # 3) OR (LEN( right,0 ) # 3) THEN
- Halt( GeometryMismatch, ADDRESSOF( left ), ADDRESSOF( right ), 0 )
- END;
- IF LEN( RESULT,0 ) # 3 THEN NEW( RESULT, 3 ) END; (* will trap if not allowed *)
- vl1 := left[0]; vl2 := left[1]; vl3 := left[2]; vr1 := right[0]; vr2 := right[1];
- vr3 := right[2]; RESULT[0] := vl2 * vr3 - vl3 * vr2;
- RESULT[1] := vl3 * vr1 - vl1 * vr3; RESULT[2] := vl1 * vr2 - vl2 * vr1;
- RETURN RESULT
- END "*";
- OPERATOR "*"*(CONST left, right: ARRAY [ * ] OF LONGINT ): ARRAY [ * ] OF LONGINT;
- VAR vl1, vl2, vl3, vr1, vr2, vr3: LONGINT;
- BEGIN
- IF (LEN( left,0 ) # 3) OR (LEN( right,0 ) # 3) THEN
- Halt( GeometryMismatch, ADDRESSOF( left ), ADDRESSOF( right ), 0 )
- END;
- IF LEN( RESULT,0 ) # 3 THEN NEW( RESULT, 3 ) END; (* will trap if not allowed *)
- vl1 := left[0]; vl2 := left[1]; vl3 := left[2]; vr1 := right[0]; vr2 := right[1];
- vr3 := right[2]; RESULT[0] := vl2 * vr3 - vl3 * vr2;
- RESULT[1] := vl3 * vr1 - vl1 * vr3; RESULT[2] := vl1 * vr2 - vl2 * vr1;
- RETURN RESULT
- END "*";
- OPERATOR "*"*(CONST left, right: ARRAY [ * ] OF REAL ): ARRAY [ * ] OF REAL;
- VAR vl1, vl2, vl3, vr1, vr2, vr3: REAL;
- BEGIN
- IF (LEN( left,0 ) # 3) OR (LEN( right,0 ) # 3) THEN
- Halt( GeometryMismatch, ADDRESSOF( left ), ADDRESSOF( right ), 0 )
- END;
- IF LEN( RESULT,0 ) # 3 THEN NEW( RESULT, 3 ) END; (* will trap if not allowed *)
- vl1 := left[0]; vl2 := left[1]; vl3 := left[2]; vr1 := right[0]; vr2 := right[1];
- vr3 := right[2]; RESULT[0] := vl2 * vr3 - vl3 * vr2;
- RESULT[1] := vl3 * vr1 - vl1 * vr3; RESULT[2] := vl1 * vr2 - vl2 * vr1;
- RETURN RESULT
- END "*";
- OPERATOR "*"*(CONST left, right: ARRAY [ * ] OF LONGREAL ): ARRAY [ * ] OF LONGREAL;
- VAR vl1, vl2, vl3, vr1, vr2, vr3: LONGREAL;
- BEGIN
- IF (LEN( left,0 ) # 3) OR (LEN( right,0 ) # 3) THEN
- Halt( GeometryMismatch, ADDRESSOF( left ), ADDRESSOF( right ), 0 )
- END;
- IF LEN( RESULT,0 ) # 3 THEN NEW( RESULT, 3 ) END; (* will trap if not allowed *)
- vl1 := left[0]; vl2 := left[1]; vl3 := left[2]; vr1 := right[0]; vr2 := right[1];
- vr3 := right[2]; RESULT[0] := vl2 * vr3 - vl3 * vr2;
- RESULT[1] := vl3 * vr1 - vl1 * vr3; RESULT[2] := vl1 * vr2 - vl2 * vr1;
- RETURN RESULT
- END "*";
-
- OPERATOR "*"*(CONST left, right: ARRAY [ ? ] OF LONGREAL ): ARRAY [ ? ] OF LONGREAL;
- VAR tensor: Tensor;
- BEGIN
- IF (DIM(left) = 2) & (DIM(right)=2) THEN
- EnsureArrayDesc(2, SYSTEM.VAL(Tensor, RESULT));
- ELSIF (DIM(left) = 2) & (DIM(right)=1) THEN
- EnsureArrayDesc(1, SYSTEM.VAL(Tensor, RESULT));
- ELSE HALT(200);
- END;
- ApplyMatMulLoop(SYSTEM.VAL(Tensor, RESULT), SYSTEM.VAL(Tensor, left), SYSTEM.VAL(Tensor, right), SIZEOF( LONGREAL ),
- loopMatMulAXAX, matMulX );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(CONST left, right: ARRAY [ ? ] OF REAL ): ARRAY [ ? ] OF REAL;
- BEGIN
- IF (DIM(left) = 2) & (DIM(right)=2) THEN
- EnsureArrayDesc(2, SYSTEM.VAL(Tensor, RESULT));
- ELSIF (DIM(left) = 2) & (DIM(right)=1) THEN
- EnsureArrayDesc(1, SYSTEM.VAL(Tensor, RESULT));
- ELSE HALT(200);
- END;
- ApplyMatMulLoop(SYSTEM.VAL(Tensor, RESULT), SYSTEM.VAL(Tensor, left), SYSTEM.VAL(Tensor, right), SIZEOF( REAL ),
- loopMatMulARAR, matMulR );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(CONST left, right: ARRAY [ ? ] OF LONGINT ): ARRAY [ ? ] OF LONGINT;
- BEGIN
- IF (DIM(left) = 2) & (DIM(right)=2) THEN
- EnsureArrayDesc(2, SYSTEM.VAL(Tensor, RESULT));
- ELSIF (DIM(left) = 2) & (DIM(right)=1) THEN
- EnsureArrayDesc(1, SYSTEM.VAL(Tensor, RESULT));
- ELSE HALT(200);
- END;
- ApplyMatMulLoop(SYSTEM.VAL(Tensor, RESULT), SYSTEM.VAL(Tensor, left), SYSTEM.VAL(Tensor, right), SIZEOF( LONGINT ),
- MatMulALALLoop, NIL );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(CONST left, right: ARRAY [ ? ] OF INTEGER ): ARRAY [ ? ] OF INTEGER;
- BEGIN
- IF (DIM(left) = 2) & (DIM(right)=2) THEN
- EnsureArrayDesc(2, SYSTEM.VAL(Tensor, RESULT));
- ELSIF (DIM(left) = 2) & (DIM(right)=1) THEN
- EnsureArrayDesc(1, SYSTEM.VAL(Tensor, RESULT));
- ELSE HALT(200);
- END;
- ApplyMatMulLoop(SYSTEM.VAL(Tensor, RESULT), SYSTEM.VAL(Tensor, left), SYSTEM.VAL(Tensor, right), SIZEOF( INTEGER ),
- MatMulAIAILoop,NIL );
- RETURN RESULT
- END "*";
- OPERATOR "*"*(CONST left, right: ARRAY [ ? ] OF SHORTINT ): ARRAY [ ? ] OF SHORTINT;
- BEGIN
- IF (DIM(left) = 2) & (DIM(right)=2) THEN
- EnsureArrayDesc(2, SYSTEM.VAL(Tensor, RESULT));
- ELSIF (DIM(left) = 2) & (DIM(right)=1) THEN
- EnsureArrayDesc(1, SYSTEM.VAL(Tensor, RESULT));
- ELSE HALT(200);
- END;
- ApplyMatMulLoop(SYSTEM.VAL(Tensor, RESULT), SYSTEM.VAL(Tensor, left), SYSTEM.VAL(Tensor, right), SIZEOF( SHORTINT ),
- MatMulASASLoop, NIL );
- RETURN RESULT
- END "*";
- (** Transpose ********************************************************************)
- PROCEDURE Overlap( src1, src2: ADDRESS ): BOOLEAN;
- VAR from1, from2, to1, to2: ADDRESS; dim: SIZE;
- BEGIN
- from1 := GetAdr( src1 ); from2 := GetAdr( src2 ); to1 := from1; to2 := from2;
- dim := GetDim( src1 ) - 1;
- WHILE (dim > 0) DO
- to1 := to1 + (GetLen( src1, dim ) - 1) * GetIncr( src1, dim ); DEC( dim );
- END;
- dim := GetDim( src2 ) - 1;
- WHILE (dim > 0) DO
- to2 := to2 + (GetLen( src2, dim ) - 1) * GetIncr( src2, dim ); DEC( dim );
- END;
- IF from1 < from2 THEN RETURN to1 >= from2;
- ELSIF from2 < from1 THEN RETURN to2 >= from1;
- ELSE RETURN TRUE;
- END;
- END Overlap;
- (*
- PROCEDURE Overlap( src1, src2, dim: ADDRESS ): BOOLEAN;
- VAR from1, from2, to1, to2: ADDRESS;
- BEGIN
- from1 := GetAdr( src1 ); from2 := GetAdr( src2 ); to1 := from1; to2 := from2;
- DEC( dim );
- WHILE (dim > 0) DO
- to1 := to1 + (GetLen( src1, dim ) - 1) * GetIncr( src1, dim );
- to2 := to2 + (GetLen( src2, dim ) - 1) * GetIncr( src2, dim ); DEC( dim );
- END;
- IF from1 < from2 THEN RETURN to1 >= from2;
- ELSIF from2 < from1 THEN RETURN to2 >= from1;
- ELSE RETURN TRUE;
- END;
- END Overlap;
- *)
- PROCEDURE AllocateTransposed( VAR dest: ADDRESS; src: ADDRESS; elementsize: SIZE ): ANY;
- VAR ptr, data: ANY; Size: SIZE;
- (* allocate a structure in dest compatible with src, if necessary. returns if allocation has taken place *)
- PROCEDURE TransposedShape( l, r: ADDRESS ): BOOLEAN;
- VAR dim,max: SIZE;
- BEGIN
- dim := GetDim( l );
- IF dim # GetDim( r ) THEN RETURN FALSE END;
- max := dim-1;
- WHILE (dim > 0) DO
- DEC( dim );
- IF GetLen( l, max-dim ) # GetLen( r, dim ) THEN RETURN FALSE END;
- END;
- RETURN TRUE;
- END TransposedShape;
- PROCEDURE NewData;
- VAR max,dim, len, size: SIZE;
- BEGIN
- dim := GetDim( src ); size := elementsize;
- PutDim( dest, dim );
- PutSize( dest, elementsize );
- max := dim-1;
- WHILE (dim > 0) DO
- DEC( dim );
- len := GetLen( src, max-dim ); PutLen( dest, dim, len );
- PutInc( dest, dim, size ); size := size * len;
- END;
- SYSTEM.NEW( data, size + ArrayAlignment);
- PutAdr( dest, Align(data) );
- PutPtr( dest, data );
- END NewData;
- BEGIN
- IF dest # 0 THEN Size := GetSize( dest ); ASSERT( Size = elementsize ); END;
- IF debug THEN KernelLog.String( "Allocate same " ); Report( "allocation source", src ); Report( "allocation des", dest ); END;
- IF dest = 0 THEN (* NIL pointer, guaranteed to be tensor *)
- ptr := GetArrayDesc( GetDim( src ) ); dest := ptr;
- Heaps.CheckAssignment(ADDRESS OF dest, ptr);
- PutFlags(dest, {TensorFlag});
- NewData();
- RETURN ptr;
- ELSIF GetDim( dest ) # GetDim( src ) THEN (* different dimension *)
- (* check if re-allocation of descriptor is allowed *)
- IF ~(TensorFlag IN GetFlags( dest )) &
- ~(TemporaryFlag IN GetFlags( dest )) THEN (* no, not allowed*)
- HALT( 100 );
- END;
- ptr := GetArrayDesc( GetDim( src ) ); dest := ptr;
- Heaps.CheckAssignment(ADDRESS OF dest, ptr);
- PutFlags(dest, {TensorFlag});
- NewData(); RETURN ptr;
- ELSIF (GetAdr( dest ) = 0) OR ~TransposedShape( dest, src ) THEN
- (* check if re-allocation of array data is allowed *)
- IF RangeFlag IN GetFlags( dest ) THEN (* no! not allowed *)
- HALT( 100 );
- END;
- NewData();
- RETURN data;
- ELSE (* nothing to do *)
- RETURN NIL;
- END;
- END AllocateTransposed;
- PROCEDURE Transpose*( dest, left: ADDRESS; Size: SIZE );
- VAR len0, len1, linc0, linc1, dinc0, dinc1: SIZE; ladr, dadr: ADDRESS; p: ANY;
- PROCEDURE CopyLoop( src, dest: ADDRESS; srcinc, destinc, len: SIZE );
- BEGIN
- WHILE (len > 0) DO
- SYSTEM.MOVE( src, dest, Size ); INC( src, srcinc ); INC( dest, destinc );
- DEC( len );
- END;
- END CopyLoop;
- BEGIN
- IF TemporaryFlag IN GetFlags( dest ) THEN (* destination is on the stack: can optimize transposition *)
- PutAdr( dest, GetAdr( left ) ); PutPtr( dest, GetPtr( left ) );
- PutLen( dest, 1, GetLen( left, 0 ) ); PutLen( dest, 0, GetLen( left, 1 ) );
- PutInc( dest, 1, GetIncr( left, 0 ) ); PutInc( dest, 0, GetIncr( left, 1 ) );
- ELSE
- len0 := GetLen( left, 0 ); len1 := GetLen( left, 1 );
- p := AllocateTransposed(dest,left,Size);
- IF Overlap( left, dest ) THEN (* copy data first, then transpose *)
- SYSTEM.NEW( p, len0 * len1 * Size + ArrayAlignment); dinc0 := Size; dinc1 := len0 * Size;
- dadr := Align(p); linc0 := GetIncr( left, 0 );
- linc1 := GetIncr( left, 1 ); ladr := GetAdr( left );
- WHILE (len0 > 0) DO
- CopyLoop( ladr, dadr, linc1, dinc1, len1 ); INC( ladr, linc0 );
- INC( dadr, dinc0 ); DEC( len0 );
- END;
- len0 := GetLen( left, 0 ); linc0 := Size; linc1 := len0 * Size;
- ladr := p;
- ELSE
- linc0 := GetIncr( left, 0 ); linc1 := GetIncr( left, 1 ); ladr := GetAdr( left );
- END;
- dinc0 := GetIncr( dest, 0 ); dinc1 := GetIncr( dest, 1 );
- dadr := GetAdr( dest );
- IF (Size = 4) & (transpose4 # NIL ) THEN
- transpose4( ladr, dadr, linc0, linc1, dinc0, dinc1, len0, len1 );
- ELSIF (Size = 8) & (transpose8 # NIL ) THEN
- transpose8( ladr, dadr, linc0, linc1, dinc0, dinc1, len0, len1 );
- ELSE
- WHILE (len0 > 0) DO
- CopyLoop( ladr, dadr, linc1, dinc0, len1 ); INC( ladr, linc0 );
- INC( dadr, dinc1 ); DEC( len0 );
- END;
- END;
- END;
- END Transpose;
- OPERATOR "`"*(CONST left: ARRAY [ * , * ] OF SHORTINT): ARRAY [ * , * ] OF SHORTINT;
- BEGIN
- Transpose( ADDRESSOF( RESULT ), ADDRESSOF( left ), SIZEOF( SHORTINT ) );
- RETURN RESULT
- END "`";
- OPERATOR "`"*( CONST left: ARRAY [ * , * ] OF INTEGER ):ARRAY [ * , * ] OF INTEGER ;
- BEGIN
- Transpose( ADDRESSOF( RESULT ), ADDRESSOF( left ), SIZEOF( INTEGER ) );
- RETURN RESULT
- END "`";
- OPERATOR "`"*( CONST left: ARRAY [ * , * ] OF LONGINT ): ARRAY [ * , * ] OF LONGINT;
- BEGIN
- Transpose( ADDRESSOF( RESULT ), ADDRESSOF( left ), SIZEOF( LONGINT ) );
- RETURN RESULT
- END "`";
- OPERATOR "`"*( CONST left: ARRAY [ * , * ] OF REAL ): ARRAY [ * , * ] OF REAL;
- BEGIN
- Transpose( ADDRESSOF( RESULT ), ADDRESSOF( left ), SIZEOF( REAL ) );
- RETURN RESULT
- END "`";
- OPERATOR "`"*( CONST left: ARRAY [ * , * ] OF LONGREAL ): ARRAY [ * , * ] OF LONGREAL;
- BEGIN
- Transpose( ADDRESSOF( RESULT ), ADDRESSOF( left ), SIZEOF( LONGREAL ) );
- RETURN RESULT
- END "`";
- PROCEDURE CheckTensorGeometry( left, right, dest: ADDRESS; ldim, rdim: SIZE ): BOOLEAN;
- VAR i: SIZE;
- BEGIN
- FOR i := 0 TO rdim - 1 DO
- IF GetLen( right, i ) # GetLen( dest, i ) THEN RETURN FALSE END;
- END;
- FOR i := 0 TO ldim - 1 DO
- IF GetLen( left, i ) # GetLen( dest, rdim + i ) THEN RETURN FALSE END;
- END;
- RETURN TRUE;
- END CheckTensorGeometry;
- (*
- PROCEDURE Zero(p: ANY; size: LONGINT);
- VAR adr: LONGINT;
- BEGIN
- adr := SYSTEM.VAL(LONGINT,p);
- WHILE(size>0) DO
- SYSTEM.PUT8(adr,0); DEC(size);INC(adr);
- END;
- END Zero;
- *)
- PROCEDURE DoReshape*( VAR dest: ADDRESS; src: ADDRESS; CONST shape: ARRAY [ * ] OF LONGINT );
- VAR i, Size: SIZE; ptr, data: ANY; new: ADDRESS;
- oldSize, newSize: SIZE; oldDim, newDim: SIZE;
- squeezingReshape: BOOLEAN;
- PROCEDURE CheckAlloc;
- BEGIN
- ASSERT( (dest = NIL) OR (TensorFlag IN GetFlags(dest)) & ~(RangeFlag IN GetFlags(dest)) );
- END CheckAlloc;
-
- PROCEDURE NewDescriptor;
- BEGIN
- CheckAlloc;
- ptr := GetArrayDesc( newDim ); new := ptr;
- END NewDescriptor;
- (* Added by Alexey
- Returns TRUE if the new shape is the result of squeezing (removing of singleton dimensions)
- *)
- PROCEDURE SqueezingReshape(): BOOLEAN;
- VAR
- i, j, n: SIZE;
- BEGIN
- IF oldDim > newDim THEN
- i := 0; j := 0;
- WHILE (i < oldDim) & (j < newDim) DO
- n := GetLen(src,i);
- IF n = shape[j] THEN INC(j); END;
- INC(i);
- END;
- WHILE (i < oldDim) & (GetLen(src,i) = 1) DO INC(i); END; (* account for a trailing sequence of 1 *)
- ELSE
- squeezingReshape := FALSE;
- END;
- squeezingReshape := (i = oldDim) & (j = newDim);
- RETURN squeezingReshape;
- END SqueezingReshape;
-
- (*returns TRUE if the target is already allocated coninuous memory of correct length*)
- PROCEDURE TargetContinuous(): BOOLEAN;
- VAR
- i, n: SIZE;
- continue: BOOLEAN;
- BEGIN
- i := GetDim(dest)-1; n := GetIncr(dest,i);
- continue := TRUE;
- WHILE (i > 0) & continue DO
- n := n * GetLen(dest,i);
- DEC(i);
- continue := GetIncr(dest,i) = n;
- END;
- (*TRACE(i,continue,Size,GetSize(dest));*)
- (*tod obviously size is not what I expect it to be*)
- IF (i = 0) & (n#0) & continue & (Size=GetSize(dest)) THEN (* destination array is continuous memory of the proper lenght *)
- RETURN TRUE;
- ELSE
- RETURN FALSE;
- END;
- END TargetContinuous;
- (* returns TRUE if reshape preserves contiguity pattern and thus is valid even for subranged arrays *)
- PROCEDURE PreservesContiguity(): BOOLEAN;
- VAR
- i, n: SIZE;
- continue: BOOLEAN;
- BEGIN
- i := oldDim-1; n := GetIncr(src,i);
- continue := TRUE;
- WHILE (i > 0) & continue DO
- n := n * GetLen(src,i);
- DEC(i);
- continue := GetIncr(src,i) = n;
- END;
- IF (i = 0) & continue THEN (* array can be fully linearized and, therefore, can be reshaped to any size *)
- RETURN TRUE;
- ELSE Err("Not yet implemented!");
- END;
- END PreservesContiguity;
- (* Added by Alexey *)
- PROCEDURE NewDescriptorForSameData;
- VAR len, size, i, j: SIZE;
- BEGIN
- CheckAlloc();
- ptr := GetArrayDesc( newDim ); new := ptr;
- IF ~squeezingReshape THEN
- size := Size;
- FOR i := newDim - 1 TO 0 BY -1 DO
- len := shape[i]; PutInc( new, i, size ); PutLen( new, i, len );
- size := size * len;
- END;
- ELSE (* squeezing reshape *)
- j := 0; len := shape[j];
- FOR i := 0 TO oldDim-1 DO
- IF GetLen(src,i) = len THEN
- PutInc(new,j,GetIncr(src,i)); PutLen(new,j,len);
- INC(j);
- IF j < newDim THEN len := shape[j]; END;
- END;
- END;
- END;
- IF RangeFlag IN GetFlags(src) THEN (* keep range awareness for case of squeezing reshape and preservation of contiguity *)
- PutFlags(new,GetFlags(new)+{RangeFlag});
- END;
- PutAdr( new, GetAdr(src) );
- PutPtr( new, GetPtr(src) ); PutDim( new, newDim );
- PutSize( new, Size );
- END NewDescriptorForSameData;
- PROCEDURE NewData;
- VAR len, size, i: SIZE;
- BEGIN
- size := Size;
- FOR i := newDim - 1 TO 0 BY -1 DO
- len := shape[i]; PutInc( new, i, size ); PutLen( new, i, len );
- size := size * len;
- END;
- SYSTEM.NEW( data, size + ArrayAlignment); (* Zero(data,size*Size); *)
- PutAdr( new, Align(data) );
- PutPtr( new, data ); PutDim( new, newDim );
- PutSize( new, Size );
- END NewData;
- PROCEDURE CopyData;
- VAR d, s: SIZE; dadr: ADDRESS;
- PROCEDURE Loop( dim: SIZE; sadr: ADDRESS );
- VAR inc, len, i: SIZE;
- BEGIN
- IF dim = d THEN
- inc := GetIncr( src, dim ); len := GetLen( src, dim );
- FOR i := 0 TO len - 1 DO
- SYSTEM.MOVE( sadr, dadr, s ); INC( dadr, s ); INC( sadr, inc );
- END;
- ELSE
- inc := GetIncr( src, dim ); len := GetLen( src, dim ); INC( dim );
- FOR i := 0 TO len - 1 DO Loop( dim, sadr ); INC( sadr, inc ); END;
- END;
- END Loop;
- BEGIN
- s := Size; ASSERT( GetSize( src ) = s ); d := GetDim( src ) - 1;
- WHILE (d >= 0) & (GetIncr( src, d ) = s) DO
- s := s * GetLen( src, d ); DEC( d );
- END;
- IF d = -1 THEN (* special case: both continuous *)
- SYSTEM.MOVE( GetAdr( src ), GetAdr( new ), s );
- ELSE dadr := GetAdr( new ); Loop( 0, GetAdr( src ) );
- END;
- END CopyData;
- PROCEDURE CopyDataBack;
- VAR d, s: SIZE; sadr: ADDRESS;
- PROCEDURE Loop( dim: SIZE; dadr: ADDRESS );
- VAR inc, len, i: SIZE;
- BEGIN
- IF dim = d THEN
- inc := GetIncr( dest, dim ); len := GetLen( dest, dim );
- FOR i := 0 TO len - 1 DO
- SYSTEM.MOVE( sadr, dadr, s ); INC( dadr, inc ); INC( sadr, s );
- END;
- ELSE
- inc := GetIncr( dest, dim ); len := GetLen( dest, dim ); INC( dim );
- FOR i := 0 TO len - 1 DO Loop( dim, dadr ); INC( dadr, inc ); END;
- END;
- END Loop;
- BEGIN
- s := Size; ASSERT( GetSize( dest ) = s ); d := GetDim( dest ) - 1;
- WHILE (d >= 0) & (GetIncr( dest, d ) = s) DO
- s := s * GetLen( dest, d ); DEC( d );
- END;
- IF d = -1 THEN (* special case: both continuous *)
- SYSTEM.MOVE( GetAdr( new ), GetAdr( dest ), s );
- ELSE sadr := GetAdr( new ); Loop( 0, GetAdr( dest ) );
- END;
- END CopyDataBack;
- PROCEDURE CopyDescriptor( src, dest: ADDRESS );
- BEGIN
- ASSERT( GetDim( src ) = GetDim( dest ) );
- SYSTEM.MOVE( src, dest, MathLenOffset + GetDim( src ) * 8 );
- PutPtr(dest, GetPtr(src)); (* GC ! *)
- END CopyDescriptor;
- PROCEDURE ShapeDiffers( ): BOOLEAN;
- VAR i: SIZE;
- BEGIN
- ASSERT(GetDim(dest) = newDim);
- FOR i := 0 TO newDim - 1 DO
- IF GetLen(dest,i) # shape[i] THEN RETURN TRUE END;
- END;
- RETURN FALSE;
- END ShapeDiffers;
- BEGIN
- (*
- cases
- 1.) descriptor may be replaced = dimension may vary: dest = TENSOR
- 2.) descriptor may be reshaped: dest = ARRAY but no RANGE
- 3.) descriptor may not be reshaped: dest = RANGE
- *)
- (* first check invariants *)
- oldDim := GetDim( src );
- IF oldDim = 0 THEN oldSize := 0
- ELSE
- oldSize := 1;
- FOR i := 0 TO oldDim - 1 DO oldSize := oldSize * GetLen( src, i ); END;
- END;
- newDim := LEN( shape, 0 );
- IF newDim = 0 THEN newSize := 0
- ELSE
- newSize := 1;
- FOR i := 0 TO newDim - 1 DO newSize := newSize * shape[i]; END;
- END;
- IF oldSize # newSize THEN Err( "RESHAPE: Total length mismatch" ); END;
- Size := GetSize( src );
- ASSERT( (Size > 0) & (Size < 128) ); (*! heuristic, remove upper bound *)
- IF dest = src THEN (* added by Alexey *)
- IF ~(RangeFlag IN GetFlags(dest)) OR PreservesContiguity() OR SqueezingReshape() THEN
- NewDescriptorForSameData;
- dest := new;
- ELSIF ((newDim = oldDim) & ~ShapeDiffers()) THEN
- (* create a copy of the original descriptor *)
- CheckAlloc();
- ptr := GetArrayDesc(newDim); dest := ptr;
- Heaps.CheckAssignment(ADDRESS OF dest, ptr);
- CopyDescriptor(src,dest);
- ELSE
- Err( "RESHAPE: given RANGE array can not be reshaped!" );
- END;
- ELSIF (dest = 0) THEN (* is tensor for sure *)
- NewDescriptor; NewData; CopyData; dest := new;
- ELSIF (dest = temporary) THEN
- NewDescriptorForSameData;
- dest := new;
- ELSIF TargetContinuous() THEN
- NewDescriptor; new:=dest; CopyData;
- (*todo: check if target continous memory of correct size, if so don't allocate memory*)
- ELSIF (newDim # GetDim( dest )) THEN (* must be tensor *)
- IF ~(TensorFlag IN GetFlags( dest )) THEN (* no, not allowed*)
- Err( "RESHAPE: new dimension only allowed for TENSOR" );
- END;
- NewDescriptor; NewData; CopyData;
- dest := new;
- ELSIF ShapeDiffers() THEN (* same dim but shape of destination does not match *)
- IF RangeFlag IN GetFlags( dest ) THEN Err( "RESHAPE: new shape not allowed for RANGE" ); END;
- (*
- NewDescriptor; *)
- new := dest;
- NewData; CopyData;
- new := NIL;
- (*CopyDescriptor( new, dest );*)
- ELSIF ~SameShape( src, dest ) THEN (* shape for destination matches but that of src is different *)
- NewDescriptor; NewData; CopyData; CopyDataBack;
- ELSE (* same shape, just copy *)
- CopyContent( src, dest, Size ); RETURN;
- END;
- IF dest = new THEN (* new block *)
- Heaps.CheckAssignment(ADDRESSOF(dest),new);
- END;
- END DoReshape;
- (* this is memory safe: the allocation result is written to a pointer in the call chain *)
- PROCEDURE AllocateTensorA*( CONST a: ARRAY OF SIZE; elementSize: SIZE; tag: ADDRESS; VAR dest: UnsafeArray );
- VAR descr, data: ANY; same: BOOLEAN; i: SIZE; dim: SIZE;
- PROCEDURE NewData;
- VAR len, size, i: SIZE;
- BEGIN
- size := elementSize;
- FOR i := dim - 1 TO 0 BY -1 DO
- len := a[i];
- PutInc( dest, i, size ); PutLen( dest, i, len ); size := size * len;
- END;
- IF tag = 0 THEN
- SYSTEM.NEW( data, size + ArrayAlignment); (* Zero(data,size*Size); *)
- dest.adr := Align(data);
- ELSE
- Heaps.NewArr(data, tag, size DIV elementSize,1,FALSE);
- dest.adr := data + ArrDataArrayOffset;
- END;
- SafePut(dest.ptr, data);
- (*dest.ptr := data;*)
- PutSize( dest, elementSize );
- END NewData;
- PROCEDURE ClearData;
- (*! todo *)
- END ClearData;
- BEGIN
- dim := LEN( a,0 );
- IF (dest = 0) OR (dim # GetDim( dest )) THEN
- IF dest # 0 THEN
- IF (~(TensorFlag IN GetFlags( dest ))) THEN Err( "Array's number of dimension must not be modified (no TENSOR !)" ); END;
- END;
- descr := GetArrayDesc( LEN( a,0 ) );
- dest := descr;
- NewData;
- Heaps.SetPC(data);
- ELSE
- i := 0;
- same := TRUE;
- WHILE (i < dim) & same DO
- IF GetLen( dest, i ) # a[i] THEN same := FALSE; END;
- INC( i );
- END;
- IF ~same THEN
- IF (RangeFlag IN GetFlags( dest )) THEN Err( "Array's shape must not be modified (is RANGE !) " ); END;
- NewData;
- Heaps.SetPC(data);
- ELSE ClearData
- END;
- END;
- END AllocateTensorA;
- PROCEDURE AllocateArrayA*( CONST a: ARRAY OF SIZE; elementSize: SIZE; tag: ADDRESS; dest: UnsafeArray );
- BEGIN
- AllocateTensorA(a,elementSize,tag,dest);
- IF dest.ptr # NIL THEN Heaps.SetPC(dest.ptr) END;
- END AllocateArrayA;
- PROCEDURE AllocateTensorX*( VAR destA: ARRAY [?]; CONST a: ARRAY [ * ] OF SIZE; Size: SIZE; tag: ADDRESS );
- VAR descr, data: ANY; same: BOOLEAN; i: SIZE; dim: SIZE; dest: ADDRESS;
- PROCEDURE NewData;
- VAR len, size: SIZE; i: SIZE;
- BEGIN
- size := Size;
- FOR i := dim - 1 TO 0 BY -1 DO
- len := a[i];
- (*
- KernelLog.Int(len,10); KernelLog.Ln;
- *)
- PutInc( dest, i, size ); PutLen( dest, i, len ); size := size * len;
- END;
- IF tag = 0 THEN
- SYSTEM.NEW( data, size + ArrayAlignment); (* Zero(data,size*Size); *)
- PutAdr( dest, Align(data) );
- ELSE
- Heaps.NewArr(data, tag, size DIV Size,1,FALSE);
- PutAdr( dest, data+ ArrDataArrayOffset );
- END;
- PutPtr( dest, data ); PutSize( dest, Size );
- END NewData;
- PROCEDURE ClearData;
- (*! todo *)
- END ClearData;
- BEGIN
- dim := LEN( a,0 );
- dest := SYSTEM.VAL(ADDRESS,destA);
- (*! check range flag! *)
- IF (dest = 0) OR (dim # GetDim( dest )) THEN
- IF dest # 0 THEN
- IF (~(TensorFlag IN GetFlags( dest ))) THEN Err( "Array's number of dimension must not be modified (no TENSOR !)" ); END;
- END;
- descr := GetArrayDesc( LEN( a,0 ) ); dest := descr;
- NewData;
- ELSE
- i := 0;
- WHILE (i < dim) & same DO
- IF GetLen( dest, i ) # a[i] THEN same := FALSE; END;
- INC( i );
- END;
- IF ~same THEN
- IF (RangeFlag IN GetFlags( dest )) THEN Err( "Array's shape must not be modified (is RANGE !) " ); END;
- NewData
- ELSE ClearData
- END;
- END;
- SYSTEM.PUT(ADDRESSOF(destA),dest);
- IF dest = descr THEN (* new block *)
- Heaps.CheckAssignment(ADDRESSOF(destA),dest);
- END;
- END AllocateTensorX;
- PROCEDURE LenA*( VAR dest: ARRAY [ * ] OF SIZE; src: ADDRESS );
- VAR dim, i: SIZE;
- BEGIN
- dim := GetDim( src );
- IF LEN( dest, 0 ) # dim THEN NEW( dest, dim ); END;
- FOR i := 0 TO dim - 1 DO dest[i] := GetLen( src, i ); END;
- END LenA;
- PROCEDURE IncrA*( VAR dest: ARRAY [ * ] OF SIZE; src: ADDRESS );
- VAR dim, len: SIZE; i: SIZE;
- BEGIN
- dim := GetDim( src ); len := LEN( dest, 0 );
- IF len # dim THEN NEW( dest, dim ); END;
- FOR i := 0 TO dim - 1 DO dest[i] := GetIncr( src, i ); END;
- END IncrA;
- PROCEDURE Len*(src: ADDRESS; d: SIZE): SIZE;
- VAR dim: SIZE;
- BEGIN
- dim := GetDim(src);
- IF (d<0) OR (d>=dim) THEN HALT(100)
- ELSE
- RETURN GetLen(src,d);
- END;
- END Len;
- PROCEDURE Incr*(src: ADDRESS; d: SIZE): SIZE;
- VAR dim: SIZE;
- BEGIN
- dim := GetDim(src);
- IF (d<0) OR (d>=dim) THEN HALT(100)
- ELSE
- RETURN GetIncr(src,d);
- END;
- END Incr;
- PROCEDURE AllocateTensor( VAR dest: ADDRESS; left, right: ADDRESS;
- Size: SIZE ): ANY;
- VAR ldim, rdim: SIZE; ptr, data: ANY;
- PROCEDURE NewData;
- VAR len, size, i: SIZE;
- BEGIN
- size := 1;
- FOR i := 0 TO ldim - 1 DO
- len := GetLen( left, i ); size := size * len; PutLen( dest, i, len );
- END;
- FOR i := 0 TO rdim - 1 DO
- len := GetLen( right, i ); size := size * len; PutLen( dest, ldim + i, len );
- END;
- SYSTEM.NEW( data, size * Size + ArrayAlignment); (* Zero(data,size*Size); *)
- (*
- KernelLog.String("adr data="); KernelLog.Int(SYSTEM.VAL(LONGINT,data),10); KernelLog.Ln;
- KernelLog.String("adr dest="); KernelLog.Int(dest,10); KernelLog.Ln;
- *)
- size := Size;
- FOR i := ldim + rdim - 1 TO 0 BY -1 DO
- PutInc( dest, i, size ); size := size * GetLen( dest, i );
- END;
- PutAdr( dest, Align(data) );
- PutPtr( dest, data );
- END NewData;
- BEGIN
- ldim := GetDim( left ); rdim := GetDim( right );
- IF dest = 0 THEN (* NIL pointer, guaranteed to be tensor *)
- ptr := GetArrayDesc( ldim + rdim ); dest := ptr;
- Heaps.CheckAssignment(ADDRESS OF dest, ptr);
- NewData(); RETURN ptr;
- ELSIF (ldim + rdim # GetDim( dest )) THEN
- IF ~(TensorFlag IN GetFlags( dest )) &
- ~(TemporaryFlag IN GetFlags( dest )) THEN (* no, not allowed*)
- HALT( 100 );
- END;
- ptr := GetArrayDesc( ldim + rdim ); dest := ptr;
- Heaps.CheckAssignment(ADDRESS OF dest, ptr);
- NewData(); RETURN ptr;
- ELSIF ~CheckTensorGeometry( left, right, dest, ldim, rdim ) THEN (* dimension matches but not geometry *)
- IF RangeFlag IN GetFlags( dest ) THEN (* no! not allowed *)
- HALT( 100 );
- END;
- NewData(); RETURN data;
- END;
- RETURN NIL;
- END AllocateTensor;
- (* find the largest block with a regular pattern of the form offset+{i*linc: 0<=i<len} for two arrays simultaneously. d is dimension applying to the resulting loop *)
- PROCEDURE FindPatternTensor( left, right: ADDRESS;
- VAR rdim, len, linc, ri: SIZE );
- (* geometric precondition: lengths must coincide *)
- VAR ldim: SIZE;
- BEGIN
- ldim := GetDim( left ) - 1; rdim := GetDim( right ) - 1;
- len := GetLen( left, ldim ); ASSERT( len = GetLen( right, rdim ) );
- WHILE (len = 1) & (ldim > 0) & (rdim > 0) DO
- DEC( ldim ); DEC( rdim ); len := GetLen( left, ldim );
- ASSERT( GetLen( left, ldim ) = GetLen( right, rdim ) );
- END;
- linc := GetIncr( left, ldim ); ri := GetIncr( right, rdim ); DEC( rdim );
- DEC( ldim );
- WHILE (ldim >= 0) & (rdim >= 0) & (GetIncr( left, ldim ) = len * linc) &
- (GetIncr( right, rdim ) = len * ri) DO
- len := len * GetLen( left, ldim );
- ASSERT( GetLen( left, ldim ) = GetLen( right, rdim ) ); DEC( rdim );
- DEC( ldim );
- END;
- INC( ldim ); INC( rdim );
- IF debug THEN
- KernelLog.String( "FindPatternTensor: " ); KernelLog.Int( rdim, 10 ); KernelLog.Int( len, 10 );
- KernelLog.Int( linc, 10 ); KernelLog.Int( ri, 10 ); KernelLog.Ln;
- END;
- END FindPatternTensor;
- PROCEDURE ApplyTensorAAAOp( d, l, r: ADDRESS; elementSize: SIZE;
- Loop: BinaryASALoop );
- VAR loopd, looplen, loopri, loopdi, lDim, rDim: SIZE; p: ANY;
- origdest: ADDRESS; left, right, dest: ADDRESS;
- PROCEDURE Traverse( ladr, radr, dadr: ADDRESS; ldim, rdim: SIZE );
- VAR len: SIZE; linc, rinc, dinc: SIZE;
- BEGIN
- IF (ldim < lDim) THEN
- len := GetLen( left, ldim ); linc := GetIncr( left, ldim );
- dinc := GetIncr( dest, ldim + rdim ); INC( ldim );
- WHILE (len > 0) DO
- Traverse( ladr, radr, dadr, ldim, rdim ); INC( ladr, linc );
- INC( dadr, dinc ); DEC( len );
- END;
- ELSIF (rdim # loopd) THEN
- len := GetLen( right, rdim ); rinc := GetIncr( right, rdim );
- dinc := GetIncr( dest, ldim + rdim ); INC( rdim );
- WHILE (len > 0) DO
- Traverse( ladr, radr, dadr, ldim, rdim ); INC( radr, rinc );
- INC( dadr, dinc ); DEC( len );
- END;
- ELSE
- (*
- KernelLog.String("MulALSLLoop"); KernelLog.Int(dadr,10); KernelLog.Int(loopdi,10); KernelLog.Int(looplen,10);
- KernelLog.Int(GetAdr(dest),10);
- KernelLog.Int(GetAdr(dest)+clen,10);
- KernelLog.Ln;
- *)
- Loop( radr, ladr, dadr, loopri, loopdi, looplen );
- (* loop over right matrix and destination highest continuous dimension D[x,y,z,..] := L[x,y] ** R[z,..] *)
- END;
- END Traverse;
- BEGIN
- SYSTEM.GET( d, dest ); SYSTEM.GET( l, left ); SYSTEM.GET( r, right );
- (* check array lengths *)
- origdest := 0; lDim := GetDim( left ); rDim := GetDim( right );
- p := AllocateTensor( dest, left, right, elementSize );
- (*
- IF (dest = 0) OR (GetPtr( dest ) = 0) THEN
- p := AllocateTensor( left, right, dest, elementSize )
- ELSIF ~CheckTensorGeometry( left, right, dest, lDim, rDim ) THEN
- IF GetPtr( dest ) = -1 THEN HALT( GeometryMismatch )
- ELSE p := AllocateTensor( left, right, dest, elementSize );
- END;
- (*! to be done: treat overlapping memory *)
- END;
- *)
- (* debugging *)
- IF debug THEN Report( "AAA:left", left ); Report( "AAA:right", right ); Report( "AAA:dest", dest ); END;
- (* check pattern: longest piece that can be done with a loop *)
- FindPatternTensor( dest, right, loopd, looplen, loopri, loopdi );
- (* run through dimensions *)
- Traverse( GetAdr( left ), GetAdr( right ), GetAdr( dest ), 0, 0 );
- SYSTEM.PUT( d, dest );
- IF p = dest THEN
- Heaps.CheckAssignment(d,dest);
- END;
- END ApplyTensorAAAOp;
- OPERATOR "**"*(CONST left,right: ARRAY [?] OF SHORTINT): ARRAY [?] OF SHORTINT;
- BEGIN
- ApplyTensorAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( SHORTINT ), MulASSSLoop );
- RETURN RESULT
- END "**";
- OPERATOR "**"*(CONST left,right: ARRAY [?] OF INTEGER): ARRAY [?] OF INTEGER;
- BEGIN
- ApplyTensorAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( INTEGER ), MulAISILoop );
- RETURN RESULT
- END "**";
- OPERATOR "**"*(CONST left,right: ARRAY [?] OF LONGINT): ARRAY [?] OF LONGINT;
- BEGIN
- ApplyTensorAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGINT ), MulALSLLoop );
- RETURN RESULT
- END "**";
- OPERATOR "**"*(CONST left,right: ARRAY [?] OF REAL): ARRAY [?] OF REAL;
- BEGIN
- ApplyTensorAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( REAL ),
- loopMulARSR );
- RETURN RESULT
- END "**";
- OPERATOR "**"*(CONST left,right: ARRAY [?] OF LONGREAL): ARRAY [?] OF LONGREAL;
- BEGIN
- ApplyTensorAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ),
- SIZEOF( LONGREAL ), loopMulAXSX );
- RETURN RESULT
- END "**";
- OPERATOR "**"*(CONST left,right: ARRAY [?] OF COMPLEX): ARRAY [?] OF COMPLEX;
- BEGIN
- ApplyTensorAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( COMPLEX ),
- loopMulAZSZ );
- RETURN RESULT
- END "**";
- OPERATOR "**"*(CONST left,right: ARRAY [?] OF LONGCOMPLEX): ARRAY [?] OF LONGCOMPLEX;
- BEGIN
- ApplyTensorAAAOp( ADDRESSOF( RESULT ), ADDRESSOF( left ), ADDRESSOF( right ), SIZEOF( LONGCOMPLEX ),
- loopMulALZSLZ );
- RETURN RESULT
- END "**";
- PROCEDURE InitOptimization;
- VAR p: PROCEDURE;
- BEGIN
- GETPROCEDURE("FoxArrayBaseOptimized","Install",p);
- IF p # NIL THEN
- p;
- ELSE
- KernelLog.String( "Warning: ArrayBase runtime library optimizer not installed." ); KernelLog.Ln;
- END;
- END InitOptimization;
- (* functionality used for index designators of including a questiomark such as A[x,*,?,*,x] *)
- PROCEDURE CopyDescriptor*(VAR destPtr: ANY; src: ADDRESS; prefixIndices, prefixRanges, suffixIndices, suffixRanges: SIZE);
- VAR size: SIZE; srcDim, destDim,i,len,incr: SIZE; dest: ADDRESS;
- BEGIN
- IF src = 0 THEN
- HALT(100);
- ELSE
- srcDim := GetDim(src);
- destDim := srcDim - prefixIndices - suffixIndices;
-
- (*
- KernelLog.String("srcDim "); KernelLog.Int(srcDim,1); KernelLog.Ln;
- KernelLog.String("prefixIndices "); KernelLog.Int(prefixIndices,1); KernelLog.Ln;
- KernelLog.String("prefixRanges "); KernelLog.Int(prefixRanges,1); KernelLog.Ln;
- KernelLog.String("suffixIndices "); KernelLog.Int(suffixIndices,1); KernelLog.Ln;
- KernelLog.String("suffixRanges "); KernelLog.Int(suffixRanges,1); KernelLog.Ln;
- KernelLog.String("destDim "); KernelLog.Int(destDim,1); KernelLog.Ln;
- *)
- destPtr := GetArrayDesc(destDim); (* destination dimension included *)
- dest := SYSTEM.VAL(ADDRESS,destPtr);
- (* SYSTEM.MOVE(src,dest,MathLenOffset); *)
- PutAdr(dest,GetAdr(src));
- PutPtr(dest,GetPtr(src));
- PutFlags(dest,GetFlags(src));
- PutSize(dest,GetSize(src));
- FOR i := 0 TO srcDim-suffixIndices-suffixRanges-prefixIndices-prefixRanges-1 DO
- srcDim := i + prefixIndices + prefixRanges;
- destDim := i + prefixRanges;
- len := GetLen(src,srcDim);
- incr := GetIncr(src,srcDim);
- PutLen(dest,destDim,len);
- PutInc(dest,destDim,incr);
- END;
- (*
- Report("copy descriptor src",src);
- Report("copy descriptor dest",dest);
- *)
- END;
- END CopyDescriptor;
- (* when Reshape is called by a compiler, the arguments are - for the compiler - replaced as follows, this makes them compatible
- VAR dest: ARRAY [?] OF basetype
- CONST src: ARRAY [?] OF basetype
- CONST shape: ARRAY [*] OF LONGINT
- *)
- PROCEDURE Reshape*(CONST left: ARRAY [?]; CONST right: ARRAY [*] OF LONGINT): ARRAY [?];
- BEGIN
- DoReshape(SYSTEM.VAL(ADDRESS,RESULT), SYSTEM.VAL(ADDRESS,left), right);
- RETURN RESULT
- END Reshape;
- (* OLIVIER *)
- (** creates a degenerated range from an integer.
- - makes it possible to convert the result of an integer-valued procedure F() into a range
- without executing the procedure twice as it would happen in "(F() .. F() BY 1)"
- **)
- PROCEDURE RangeFromInteger*(CONST integer: SIZE): RANGE;
- BEGIN RETURN (integer .. integer BY 1)
- END RangeFromInteger;
- (* OLIVIER *)
- (** create an array with the same data but with more dimensions
- - each element in the array 'keptDimensions' corresponds to a dimension in the resulting array
- - if element = TRUE: use a dimension from the source array, i.e. reuse length and increment
- - if element = FALSE: insert a new dimension having length = 1 and increment = 0
- e.g.:
- ExpandDimensions(array, [FALSE, TRUE, FALSE, FALSE, TRUE])
- performs the following type transformation:
- ARRAY [10, 20] OF REAL -> ARRAY [1, 10, 1, 1, 20] OF REAL
- **)
- PROCEDURE ExpandDimensions*(CONST sourceArray: ARRAY [?]; CONST keptDimensions: ARRAY [*] OF BOOLEAN): ARRAY [?];
- VAR
- targetDimensionality, sourceIndex, targetIndex: SIZE;
- sourceADDRESS, targetADDRESS: ADDRESS;
- targetArrayDescriptor: ANY;
- BEGIN
- sourceADDRESS := SYSTEM.VAL(ADDRESS, sourceArray);
- targetDimensionality := LEN(keptDimensions, 0);
- targetArrayDescriptor := GetArrayDesc(targetDimensionality); (* create a new array descriptor *)
- SYSTEM.PUT(ADDRESSOF(RESULT), targetArrayDescriptor);
- targetADDRESS := SYSTEM.VAL(ADDRESS, RESULT);
- PutAdr(targetADDRESS, GetAdr(sourceADDRESS));
- PutPtr(targetADDRESS, GetPtr(sourceADDRESS));
- PutFlags(targetADDRESS, {TensorFlag});
- PutSize(targetADDRESS, GetSize(sourceADDRESS));
- (* set increments and lengths *)
- sourceIndex := 0;
- FOR targetIndex := 0 TO targetDimensionality - 1 DO
- IF keptDimensions[targetIndex] THEN
- (* reuse length and increment from source array *)
- ASSERT(sourceIndex < DIM(sourceArray));
- PutLen(targetADDRESS, targetIndex, GetLen(sourceADDRESS, sourceIndex));
- PutInc(targetADDRESS, targetIndex, GetIncr(sourceADDRESS, sourceIndex));
- INC(sourceIndex)
- ELSE
- (* set length = 1 and increment = 0 *)
- PutLen(targetADDRESS, targetIndex, 1);
- PutInc(targetADDRESS, targetIndex, 0);
- END
- END;
- (* Report("expand dimensions: ", targetADDRESS); *)
- RETURN RESULT
- END ExpandDimensions;
- (* index ranges *)
- (* the length of a range, i.e. the number of indices that it stands for *)
- OPERATOR "LEN"*(CONST range: RANGE): SIZE;
- VAR
- temp, result: SIZE;
- BEGIN
- IF (LAST(range) < FIRST(range)) OR (FIRST(range) < 0) OR (STEP(range) < 1) THEN
- (* invalid range *)
- result := 0
- ELSIF LAST(range) = MAX(LONGINT) THEN
- (* open-ended range *)
- result := MAX(LONGINT)
- ELSE
- temp := 1 + LAST(range) - FIRST(range);
- result := temp DIV STEP(range);
- IF (temp MOD STEP(range)) # 0 THEN
- INC(result)
- END
- END;
- RETURN result
- END "LEN";
-
- OPERATOR "ALL"*(CONST x: ARRAY [?] OF SHORTINT; op: PROCEDURE(x: SHORTINT): SHORTINT): ARRAY[?] OF SHORTINT; (*should also accept operator ?*)
- BEGIN
- ApplyGenericUnaryAAOpS(ADDRESSOF(RESULT),ADDRESSOF(x),SIZEOF(SHORTINT),GenericLoopS,op);
- RETURN RESULT;
- END "ALL";
- OPERATOR "ALL"*(CONST x: ARRAY [?] OF INTEGER; op: PROCEDURE(x: INTEGER): INTEGER): ARRAY[?] OF INTEGER; (*should also accept operator ?*)
- BEGIN
- ApplyGenericUnaryAAOpI(ADDRESSOF(RESULT),ADDRESSOF(x),SIZEOF(INTEGER),GenericLoopI,op);
- RETURN RESULT;
- END "ALL";
-
- OPERATOR "ALL"*(CONST x: ARRAY [?] OF LONGINT; op: PROCEDURE(x: LONGINT): LONGINT): ARRAY[?] OF LONGINT; (*should also accept operator ?*)
- BEGIN
- ApplyGenericUnaryAAOpL(ADDRESSOF(RESULT),ADDRESSOF(x),SIZEOF(LONGINT),GenericLoopL,op);
- RETURN RESULT;
- END "ALL";
-
- OPERATOR "ALL"*(CONST x: ARRAY [?] OF HUGEINT; op: PROCEDURE(x: HUGEINT): HUGEINT): ARRAY[?] OF HUGEINT; (*should also accept operator ?*)
- BEGIN
- ApplyGenericUnaryAAOpH(ADDRESSOF(RESULT),ADDRESSOF(x),SIZEOF(HUGEINT),GenericLoopH,op);
- RETURN RESULT;
- END "ALL";
- OPERATOR "ALL"*(CONST x: ARRAY [?] OF REAL; op: PROCEDURE(x: REAL): REAL): ARRAY[?] OF REAL; (*should also accept operator ?*)
- BEGIN
- ApplyGenericUnaryAAOpR(ADDRESSOF(RESULT),ADDRESSOF(x),SIZEOF(REAL),GenericLoopR,op);
- RETURN RESULT;
- END "ALL";
- OPERATOR "ALL"*(CONST x: ARRAY [?] OF LONGREAL; op: PROCEDURE(x: LONGREAL): LONGREAL): ARRAY[?] OF LONGREAL; (*should also accept operator ?*)
- BEGIN
- ApplyGenericUnaryAAOpX(ADDRESSOF(RESULT),ADDRESSOF(x),SIZEOF(LONGREAL),GenericLoopX,op);
- RETURN RESULT;
- END "ALL";
-
- OPERATOR "ALL"*(CONST x: ARRAY [?] OF COMPLEX; op: PROCEDURE(x: COMPLEX): COMPLEX): ARRAY[?] OF COMPLEX; (*should also accept operator ?*)
- BEGIN
- ApplyGenericUnaryAAOpZ(ADDRESSOF(RESULT),ADDRESSOF(x),SIZEOF(COMPLEX),GenericLoopZ,op);
- RETURN RESULT;
- END "ALL";
- OPERATOR "ALL"*(CONST x: ARRAY [?] OF LONGCOMPLEX; op: PROCEDURE(x: LONGCOMPLEX): LONGCOMPLEX): ARRAY[?] OF LONGCOMPLEX; (*should also accept operator ?*)
- BEGIN
- ApplyGenericUnaryAAOpLZ(ADDRESSOF(RESULT),ADDRESSOF(x),SIZEOF(LONGCOMPLEX),GenericLoopLZ,op);
- RETURN RESULT;
- END "ALL";
- BEGIN
- alloc := 0; NEW(temporary);
- PutFlags(temporary,{TensorFlag});
- PutDim(temporary, 0);
- SetDefaults(); InitOptimization(); (* CreateTypePool; *)
- END FoxArrayBase.
- Compiler.Compile FoxArrayBase.Mod ~
- SystemTools.ListModules
|