package Ġcom . so y wiz . k ps pe mu . cpu . dyn are c Ċ Ċ import Ġcom . so y wiz . dyn are k 2 .* Ċ import Ġcom . so y wiz . k ps pe mu . cpu .* Ċ Ċ class ĠDyn are k Method Builder Ġ: ĠBase Dyn are c Method Builder () Ġ{ ĊĊĠĠĠ Ġ// ĠAL U ĊĠĠĠ Ġoverride Ġfun Ġl ui ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRT Ġ= Ġ(( IR . u _ imm 1 6 Ġshl Ġ 1 6 ). lit ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmov z ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĊĠĠĠĠĠĠĠ Ġ// RD Ġ= Ġ:: dyn a _ mov z . invoke ( RT , ĠRD , ĠRS ) ĊĠĠĠĠĠĠĠ ĠIF Ġ( RT ĠE Q Ġ 0 . lit ) Ġ{ ĠRD Ġ= ĠRS Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġmov n ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĊĠĠĠĠĠĠĠ Ġ// RD Ġ= Ġ:: dyn a _ mov n . invoke ( RT , ĠRD , ĠRS ) ĊĠĠĠĠĠĠĠ ĠIF Ġ( RT ĠNE Ġ 0 . lit ) Ġ{ ĠRD Ġ= ĠRS Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġext ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRT Ġ= Ġ:: dyn a _ ext . invoke ( RS , ĠPOS , ĠSIZE _ E ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġins ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRT Ġ= Ġ:: dyn a _ ins . invoke ( RT , ĠRS , ĠPOS , ĠSIZE _ I ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcl z ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRD Ġ= Ġ:: dyn a _ cl z . invoke ( RS ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġclo ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRD Ġ= Ġ:: dyn a _ clo . invoke ( RS ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġse b ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRD Ġ= Ġ:: dyn a _ se b . invoke ( RT ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġse h ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRD Ġ= Ġ:: dyn a _ se h . invoke ( RT ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġw sb h ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRD Ġ= Ġ:: dyn a _ ws bh . invoke ( RT ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġw sb w ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRD Ġ= Ġ:: dyn a _ ws bw . invoke ( RT ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmax ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRD Ġ= Ġ:: dyn a _ max . invoke ( RS , ĠRT ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġmin ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRD Ġ= Ġ:: dyn a _ min . invoke ( RS , ĠRT ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRD Ġ= ĠRS Ġ+ ĠRT Ġ} ĊĠĠĠ Ġoverride Ġfun Ġadd u ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRD Ġ= ĠRS Ġ+ ĠRT Ġ} ĊĠĠĠ Ġoverride Ġfun Ġsub ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRD Ġ= ĠRS Ġ- ĠRT Ġ} ĊĠĠĠ Ġoverride Ġfun Ġsub u ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRD Ġ= ĠRS Ġ- ĠRT Ġ} ĊĠĠĠ Ġoverride Ġfun Ġadd i ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRT Ġ= ĠRS Ġ+ ĠS _ IM M 1 6 Ġ} ĊĠĠĠ Ġoverride Ġfun Ġadd iu ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRT Ġ= ĠRS Ġ+ ĠS _ IM M 1 6 Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdiv ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĊĠĠĠĠĠĠĠ ĠLO Ġ= ĠRS Ġ/ ĠRT ĊĠĠĠĠĠĠĠ ĠHI Ġ= ĠRS Ġ% ĠRT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdiv u ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĊĠĠĠĠĠĠĠ ĠLO Ġ= Ġ:: dyn a _ div u _ LO . invoke ( RS , ĠRT ) ĊĠĠĠĠĠĠĠ ĠHI Ġ= Ġ:: dyn a _ div u _ HI . invoke ( RS , ĠRT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmult ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĊĠĠĠĠĠĠĠ Ġ// HI _ LO Ġ= Ġ:: dyn a _ mult . invoke ( RS , ĠRT ) ĊĠĠĠĠĠĠĠ ĠLO Ġ= Ġ:: dyn a _ mult _ LO . invoke ( RS , ĠRT ) ĊĠĠĠĠĠĠĠ ĠHI Ġ= Ġ:: dyn a _ mult _ HI . invoke ( RS , ĠRT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmult u ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĊĠĠĠĠĠĠĠ ĠLO Ġ= Ġ:: dyn a _ mult u _ LO . invoke ( RS , ĠRT ) ĊĠĠĠĠĠĠĠ ĠHI Ġ= Ġ:: dyn a _ mult u _ HI . invoke ( RS , ĠRT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġm add ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠSTM (:: dyn a _ m add . invoke ( EXTERNAL , ĠRS , ĠRT )) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġm add u ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠSTM (:: dyn a _ m add u . invoke ( EXTERNAL , ĠRS , ĠRT )) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġm sub ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠSTM (:: dyn a _ ms ub . invoke ( EXTERNAL , ĠRS , ĠRT )) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġm sub u ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠSTM (:: dyn a _ ms ub u . invoke ( EXTERNAL , ĠRS , ĠRT )) Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġm flo ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRD Ġ= ĠLO Ġ} ĊĠĠĠ Ġoverride Ġfun Ġmf hi ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRD Ġ= ĠHI Ġ} ĊĠĠĠ Ġoverride Ġfun Ġmf ic ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRT Ġ= ĠIC Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmt lo ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠLO Ġ= ĠRS Ġ} ĊĠĠĠ Ġoverride Ġfun Ġm thi ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠHI Ġ= ĠRS Ġ} ĊĠĠĠ Ġoverride Ġfun Ġmt ic ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠIC Ġ= ĠRT Ġ} ĊĊĠĠĠ Ġ// ĠAL U : ĠBit ĊĠĠĠ Ġoverride Ġfun Ġor ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRD Ġ= ĠRS ĠOR ĠRT Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġxor ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRD Ġ= ĠRS ĠXOR ĠRT Ġ} ĊĠĠĠ Ġoverride Ġfun Ġand ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRD Ġ= ĠRS ĠAND ĠRT Ġ} ĊĠĠĠ Ġoverride Ġfun Ġnor ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRD Ġ= ĠIN V ( RS ĠOR ĠRT ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġori ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRT Ġ= ĠRS ĠOR ĠU _ IM M 1 6 Ġ} ĊĠĠĠ Ġoverride Ġfun Ġx ori ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRT Ġ= ĠRS ĠXOR ĠU _ IM M 1 6 Ġ} ĊĠĠĠ Ġoverride Ġfun Ġand i ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRT Ġ= ĠRS ĠAND ĠU _ IM M 1 6 Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġs ll ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRD Ġ= Ġ:: dyn a _ s ll . invoke ( RT , ĠPOS ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġs ra ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRD Ġ= Ġ:: dyn a _ s ra . invoke ( RT , ĠPOS ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġs rl ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRD Ġ= Ġ:: dyn a _ srl . invoke ( RT , ĠPOS ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġs ll v ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRD Ġ= Ġ:: dyn a _ s ll . invoke ( RT , ĠRS ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġsr av ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRD Ġ= Ġ:: dyn a _ s ra . invoke ( RT , ĠRS ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġs rl v ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRD Ġ= Ġ:: dyn a _ srl . invoke ( RT , ĠRS ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġbit rev ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRD Ġ= Ġ:: dyn a _ bit rev 3 2 . invoke ( RT ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġro tr ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRD Ġ= Ġ:: dyn a _ ro tr . invoke ( RT , ĠPOS ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġro tr v ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRD Ġ= Ġ:: dyn a _ ro tr . invoke ( RT , ĠRS ) Ġ} ĊĊĠĠĠ Ġfun ĠD 2 Builder . r address ( address : ĠD 2 Expr I , Ġshift : ĠInt ): ĠD 2 Expr I Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġr addr Ġ= Ġaddress ĠAND Ġ 0 x 0 FFFF FFF . lit ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( shift Ġ!= Ġ 0 ) Ġ( r addr ĠU SH R Ġshift . lit ) Ġelse Ġr addr ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠD 2 Builder . MEM 8 ( address : ĠD 2 Expr I ) Ġ= ĠD 2 Expr . Ref I ( D 2 Mem Slot . MEM , ĠD 2 Size . BYTE , Ġr address ( address , Ġ 0 )) ĊĠĠĠ Ġfun ĠD 2 Builder . U _ MEM 8 ( address : ĠD 2 Expr I ) Ġ= ĠMEM 8 ( address ) ĠAND Ġ 0 xFF . lit ĊĊĠĠĠ Ġfun ĠD 2 Builder . MEM 1 6 ( address : ĠD 2 Expr I ) Ġ= ĠD 2 Expr . Ref I ( D 2 Mem Slot . MEM , ĠD 2 Size . SHORT , Ġr address ( address , Ġ 1 )) ĊĠĠĠ Ġfun ĠD 2 Builder . U _ MEM 1 6 ( address : ĠD 2 Expr I ) Ġ= ĠMEM 1 6 ( address ) ĠAND Ġ 0 xFFFF . lit ĊĊĠĠĠ Ġfun ĠD 2 Builder . MEM 3 2 ( address : ĠD 2 Expr I ) Ġ= ĠD 2 Expr . Ref I ( D 2 Mem Slot . MEM , ĠD 2 Size . INT , Ġr address ( address , Ġ 2 )) ĊĊĠĠĠ Ġ// ĠMemory ĊĠĠĠ Ġoverride Ġfun Ġlb ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRT Ġ= ĠMEM 8 ( RS _ IM M 1 6 ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġl bu ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRT Ġ= ĠU _ MEM 8 ( RS _ IM M 1 6 ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġlh ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRT Ġ= ĠMEM 1 6 ( RS _ IM M 1 6 ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġl hu ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRT Ġ= ĠU _ MEM 1 6 ( RS _ IM M 1 6 ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġlw ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRT Ġ= ĠMEM 3 2 ( RS _ IM M 1 6 ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġll ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRT Ġ= ĠMEM 3 2 ( RS _ IM M 1 6 ) Ġ} ĊĊĠĠĠ Ġ// override Ġfun Ġl wl ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRT Ġ= ĠC pu State :: l wl . invoke ( p 0 , ĠRS _ IM M 1 6 , ĠRT ) Ġ} ĊĠĠĠ Ġ// override Ġfun Ġl wr ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRT Ġ= ĠC pu State :: l wr . invoke ( p 0 , ĠRS _ IM M 1 6 , ĠRT ) Ġ} ĊĠĠĠ Ġ// ĊĠĠĠ Ġ// override Ġfun Ġsw l ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠSTM ( Cpu State :: sw l . invoke ( p 0 , ĠRS _ IM M 1 6 , ĠRT )) Ġ} ĊĠĠĠ Ġ// override Ġfun Ġsw r ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠSTM ( Cpu State :: sw r . invoke ( p 0 , ĠRS _ IM M 1 6 , ĠRT )) Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsb ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠSET ( MEM 8 ( RS _ IM M 1 6 ), ĠRT ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġsh ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠSET ( MEM 1 6 ( RS _ IM M 1 6 ), ĠRT ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġsw ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠSET ( MEM 3 2 ( RS _ IM M 1 6 ), ĠRT ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġsc ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠSET ( MEM 3 2 ( RS _ IM M 1 6 ), ĠRT ); ĠRT Ġ= Ġ 1 . lit Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġl wc 1 ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠFT _ I Ġ= ĠMEM 3 2 ( RS _ IM M 1 6 ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġsw c 1 ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠSET ( MEM 3 2 ( RS _ IM M 1 6 ), ĠFT _ I ) Ġ} ĊĊĠĠĠ Ġ// ĠSpecial ĊĠĠĠ Ġoverride Ġfun Ġsyscall ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= ĊĠĠĠĠĠĠĠ Ġs . p read v ance And Flow Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTEMP 0 Ġ= Ġ:: dyn a _ syscall . invoke ( EXTERNAL , ĠSY SCALL ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIF ( TEMP 0 ĠNE Ġ 0 . lit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRETURN ( TEMP 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ_ break ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . p read v ance And Flow Ġ{ ĊĠĠĠĠĠĠĠ Ġ// STM (:: dyn a _ break . invoke ( SYSCALL )) ĊĠĠĠĠĠĠĠ ĠRETURN ( SYSCALL ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠSet Ġless ĊĠĠĠ Ġoverride Ġfun Ġs lt ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRD Ġ= Ġ:: dyn a _ slt . invoke ( RS , ĠRT ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġs lt u ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRD Ġ= Ġ:: dyn a _ sl tu . invoke ( RS , ĠRT ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġs lt i ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRT Ġ= Ġ:: dyn a _ slt . invoke ( RS , ĠS _ IM M 1 6 ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġs lt iu ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRT Ġ= Ġ:: dyn a _ sl tu . invoke ( RS , ĠS _ IM M 1 6 ) Ġ} ĊĊĠĠĠ Ġ// ĠBranch ĊĠĠĠ Ġoverride Ġfun Ġbe q ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . branch Ġ{ ĠRS ĠE Q ĠRT Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġb ne ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . branch Ġ{ ĠRS ĠNE ĠRT Ġ} ĊĠĠĠ Ġoverride Ġfun Ġb lt z ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . branch Ġ{ ĠRS ĠLT Ġ 0 . lit Ġ} ĊĠĠĠ Ġoverride Ġfun Ġble z ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . branch Ġ{ ĠRS ĠLE Ġ 0 . lit Ġ} ĊĠĠĠ Ġoverride Ġfun Ġb gt z ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . branch Ġ{ ĠRS ĠGT Ġ 0 . lit Ġ} ĊĠĠĠ Ġoverride Ġfun Ġb ge z ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . branch Ġ{ ĠRS ĠGE Ġ 0 . lit Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbe ql ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . branch Lik ely Ġ{ ĠRS ĠE Q ĠRT Ġ} ĊĠĠĠ Ġoverride Ġfun Ġb nel ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . branch Lik ely Ġ{ ĠRS ĠNE ĠRT Ġ} ĊĠĠĠ Ġoverride Ġfun Ġb lt zl ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . branch Lik ely Ġ{ ĠRS ĠLT Ġ 0 . lit Ġ} ĊĠĠĠ Ġoverride Ġfun Ġble zl ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . branch Lik ely Ġ{ ĠRS ĠLE Ġ 0 . lit Ġ} ĊĠĠĠ Ġoverride Ġfun Ġb gt zl ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . branch Lik ely Ġ{ ĠRS ĠGT Ġ 0 . lit Ġ} ĊĠĠĠ Ġoverride Ġfun Ġb ge zl ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . branch Lik ely Ġ{ ĠRS ĠGE Ġ 0 . lit Ġ} ĊĊĠĠĠ Ġ// Ġ@ TODO : ĠThis Ġis Ġprobably Ġwrong !! ĊĠĠĠ Ġoverride Ġfun Ġb ge z al ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . branch Ġ{ ĠRA Ġ= Ġ_ n PC Ġ+ Ġ 4 . lit ; ĠRS ĠGE Ġ 0 . lit Ġ} ĊĠĠĠ Ġoverride Ġfun Ġb lt z al ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . branch Ġ{ ĠRA Ġ= Ġ_ n PC Ġ+ Ġ 4 . lit ; ĠRS ĠLT Ġ 0 . lit Ġ} ĊĠĠĠ Ġoverride Ġfun Ġb ge z all ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . branch Lik ely Ġ{ ĠRA Ġ= Ġ_ n PC Ġ+ Ġ 4 . lit ; ĠRS ĠGE Ġ 0 . lit Ġ} ĊĠĠĠ Ġoverride Ġfun Ġb lt z all ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . branch Lik ely Ġ{ ĠRA Ġ= Ġ_ n PC Ġ+ Ġ 4 . lit ; ĠRS ĠLT Ġ 0 . lit Ġ} ĊĊĠĠĠ Ġ// override Ġfun Ġbc 1 f ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . branch Ġ{ ĠC pu State :: f _ get _ f cr 3 1 _ cc _ not . invoke ( p 0 ) Ġ} ĊĠĠĠ Ġ// override Ġfun Ġbc 1 t ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . branch Ġ{ ĠC pu State :: f _ get _ f cr 3 1 _ cc . invoke ( p 0 ) Ġ} ĊĠĠĠ Ġ// override Ġfun Ġbc 1 fl ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . branch Lik ely Ġ{ ĠC pu State :: f _ get _ f cr 3 1 _ cc _ not . invoke ( p 0 ) Ġ} ĊĠĠĠ Ġ// override Ġfun Ġbc 1 tl ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . branch Lik ely Ġ{ ĠC pu State :: f _ get _ f cr 3 1 _ cc . invoke ( p 0 ) Ġ} ĊĊĠĠĠ Ġ// override Ġfun Ġbc 1 f ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . branch Ġ{ Ġf cr 3 1 _ cc . not () Ġ} ĊĠĠĠ Ġ// override Ġfun Ġbc 1 t ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . branch Ġ{ Ġf cr 3 1 _ cc Ġ} ĊĠĠĠ Ġ// override Ġfun Ġbc 1 fl ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . branch Lik ely Ġ{ Ġf cr 3 1 _ cc . not () Ġ} ĊĠĠĠ Ġ// override Ġfun Ġbc 1 tl ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . branch Lik ely Ġ{ Ġf cr 3 1 _ cc Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġj ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . jump Ġ{ Ġreal _ jump _ address . lit Ġ} Ġ// Ġ 0 xf 0 0 0 0 0 0 0 ĊĠĠĠ Ġoverride Ġfun Ġj r ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . jump Ġ{ ĠRS Ġ} ĊĠĠĠ Ġoverride Ġfun Ġj al ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . jump ({ ĠRA Ġ= Ġ( ii . PC Ġ+ Ġ 8 ). lit Ġ}) Ġ{ Ġreal _ jump _ address . lit Ġ} ĊĠĠĠ Ġoverride Ġfun Ġj al r ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . jump ({ ĠRD Ġ= Ġ( ii . PC Ġ+ Ġ 8 ). lit Ġ}) Ġ{ ĠRS Ġ} ĊĊĠĠĠ Ġ// ĠFloat ĊĠĠĠ Ġ// override Ġfun Ġc fc 1 ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRT Ġ= ĠC pu State :: cfc 1 . invoke ( p 0 , ĠIR . rd . lit , ĠRT ) Ġ} ĊĠĠĠ Ġ// override Ġfun Ġc tc 1 ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠSTM ( Cpu State :: ct c 1 . invoke ( p 0 , ĠIR . rd . lit , ĠRT )) Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġm fc 1 ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠRT Ġ= ĠFS _ I Ġ} ĊĠĠĠ Ġoverride Ġfun Ġm tc 1 ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠFS _ I Ġ= ĠRT Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcv t _ s _ w ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠFD Ġ= Ġ:: dyn a _ cvt _ s _ w . invoke ( FS _ I ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġcv t _ w _ s ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠFD _ I Ġ= Ġ:: dyn a _ cvt _ w _ s . invoke ( EXTERNAL , ĠFS ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtrunc _ w _ s ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠFD _ I Ġ= Ġ:: dyn a _ trunc _ w _ s . invoke ( FS ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġround _ w _ s ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠFD _ I Ġ= Ġ:: dyn a _ round _ w _ s . invoke ( FS ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġceil _ w _ s ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠFD _ I Ġ= Ġ:: dyn a _ ceil _ w _ s . invoke ( FS ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġfloor _ w _ s ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ ĠFD _ I Ġ= Ġ:: dyn a _ floor _ w _ s . invoke ( FS ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmov _ s ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . check Nan Ġ{ ĠFD Ġ= ĠFS Ġ} ĊĠĠĠ Ġoverride Ġfun Ġadd _ s ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . check Nan Ġ{ ĠFD Ġ= ĠFS Ġ+ ĠFT Ġ} ĊĠĠĠ Ġoverride Ġfun Ġsub _ s ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . check Nan Ġ{ ĠFD Ġ= ĠFS Ġ- ĠFT Ġ} ĊĠĠĠ Ġoverride Ġfun Ġmul _ s ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . check Nan Ġ{ ĠFD Ġ= Ġ:: dyn a _ f mul . invoke ( EXTERNAL , ĠFS , ĠFT ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġdiv _ s ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . check Nan Ġ{ ĠFD Ġ= ĠFS Ġ/ ĠFT Ġ} ĊĠĠĠ Ġoverride Ġfun Ġneg _ s ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . check Nan Ġ{ ĠFD Ġ= Ġ:: dyn a _ f neg . invoke ( FS ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġabs _ s ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . check Nan Ġ{ ĠFD Ġ= Ġ:: dyn a _ fabs . invoke ( FS ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġsqrt _ s ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs . check Nan Ġ{ ĠFD Ġ= Ġ:: dyn a _ fs qrt . invoke ( FS ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġc _ f _ s ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ Ġf cr 3 1 _ cc Ġ= Ġ:: dyn a _ c _ f _ s . invoke ( FS , ĠFT ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġc _ un _ s ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ Ġf cr 3 1 _ cc Ġ= Ġ:: dyn a _ c _ un _ s . invoke ( FS , ĠFT ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġc _ eq _ s ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ Ġf cr 3 1 _ cc Ġ= Ġ:: dyn a _ c _ eq _ s . invoke ( FS , ĠFT ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġc _ ue q _ s ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ Ġf cr 3 1 _ cc Ġ= Ġ:: dyn a _ c _ ue q _ s . invoke ( FS , ĠFT ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġc _ olt _ s ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ Ġf cr 3 1 _ cc Ġ= Ġ:: dyn a _ c _ olt _ s . invoke ( FS , ĠFT ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġc _ ult _ s ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ Ġf cr 3 1 _ cc Ġ= Ġ:: dyn a _ c _ ult _ s . invoke ( FS , ĠFT ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġc _ ole _ s ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ Ġf cr 3 1 _ cc Ġ= Ġ:: dyn a _ c _ ole _ s . invoke ( FS , ĠFT ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġc _ ule _ s ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ Ġf cr 3 1 _ cc Ġ= Ġ:: dyn a _ c _ ule _ s . invoke ( FS , ĠFT ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġc _ sf _ s ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ Ġf cr 3 1 _ cc Ġ= Ġ:: dyn a _ c _ f _ s . invoke ( FS , ĠFT ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġc _ ng le _ s ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ Ġf cr 3 1 _ cc Ġ= Ġ:: dyn a _ c _ un _ s . invoke ( FS , ĠFT ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġc _ seq _ s ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ Ġf cr 3 1 _ cc Ġ= Ġ:: dyn a _ c _ eq _ s . invoke ( FS , ĠFT ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġc _ ng l _ s ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ Ġf cr 3 1 _ cc Ġ= Ġ:: dyn a _ c _ ue q _ s . invoke ( FS , ĠFT ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġc _ lt _ s ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ Ġf cr 3 1 _ cc Ġ= Ġ:: dyn a _ c _ olt _ s . invoke ( FS , ĠFT ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġc _ n ge _ s ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ Ġf cr 3 1 _ cc Ġ= Ġ:: dyn a _ c _ ult _ s . invoke ( FS , ĠFT ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġc _ le _ s ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ Ġf cr 3 1 _ cc Ġ= Ġ:: dyn a _ c _ ole _ s . invoke ( FS , ĠFT ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġc _ ng t _ s ( i : ĠInt , Ġs : ĠInstruction Info ) Ġ= Ġs Ġ{ Ġf cr 3 1 _ cc Ġ= Ġ:: dyn a _ c _ ule _ s . invoke ( FS , ĠFT ) Ġ} Ċ } Ċ Ċ data Ġclass ĠInstruction Info ( var ĠPC : ĠInt , Ġvar ĠIR : ĠInt ) Ċ Ċ open Ġclass ĠBase Dyn are c Method Builder Ġ: ĠInstruction Evaluator < Instruction Info >() Ġ{ ĊĠĠĠ Ġ// var Ġs st ms Ġ= ĠSt m Builder ( Unit :: class , ĠC pu State :: class , ĠUnit :: class ) ĊĠĠĠ Ġvar Ġs st ms Ġ= ĠD 2 Builder () ĊĠĠĠ Ġval Ġdispatcher Ġ= ĠInstruction Dispatcher ( this ) ĊĊĠĠĠ Ġ// fun Ġgenerate Function (): ĠD Function 1 Ġ= ĠD Function 1 ( D VOID , ĠD Class ( Cpu State :: class ), Ġs st ms . build ()) ĊĠĠĠ Ġfun Ġgenerate Function (): ĠD 2 Func Ġ= ĠD 2 Func ( sst ms . build ()) ĊĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġinternal Ġval Ġii Ġ= ĠInstruction Info ( 0 , Ġ 0 ) ĊĠĠĠ Ġval ĠIR Ġget () Ġ= Ġii . IR ĊĠĠĠ Ġ// val ĠPC Ġget () Ġ= Ġii . PC ĊĊĠĠĠ Ġinline Ġfun ĠD 2 Builder . use Temp ( callback : ĠD 2 Builder . () Ġ-> ĠUnit ): ĠD 2 Builder Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġold Ġ= Ġthis @ Base Dyn are c Method Builder . sst ms ĊĠĠĠĠĠĠĠ Ġthis @ Base Dyn are c Method Builder . sst ms Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( this ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Base Dyn are c Method Builder . sst ms Ġ= Ġold ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġreached Flow Ġ= Ġfalse ĊĊĠĠĠ Ġfun Ġdispatch ( pc : ĠInt , Ġi : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġii . PC Ġ= Ġpc ĊĠĠĠĠĠĠĠ Ġii . IR Ġ= Ġi ĊĊĠĠĠĠĠĠĠ Ġval Ġdelayed Ġ= Ġthis . delayed ĊĠĠĠĠĠĠĠ Ġif Ġ( delayed Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold St ms Ġ= Ġs st ms ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs st ms Ġ= ĠD 2 Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatcher . dispatch ( ii , Ġpc , Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew St ms Ġ= Ġs st ms ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs st ms Ġ= Ġold St ms ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs st ms . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcond Ġ= Ġdelayed . cond ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cond Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIF ( cond ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTM ( new St ms . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Temp Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPC Ġ= Ġdelayed . jump To ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRET _ VOID () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĠELSE Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Temp Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincrement PC () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! delayed . likely ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTM ( new St ms . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRET _ VOID () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( re ached Flow ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Temp Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPC Ġ= Ġdelayed . jump To ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelayed . after ?. let Ġ{ ĠSTM ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTM ( new St ms . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRET _ VOID () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Temp Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelayed . after ?. let Ġ{ ĠSTM ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTM ( new St ms . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Temp Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPC Ġ= Ġdelayed . jump To ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRET _ VOID () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs st ms Ġ= Ġold St ms ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . delayed Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreached Flow Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatcher . dispatch ( ii , Ġpc , Ġi ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreg ( index : ĠInt ): ĠD 2 Expr . Ref < Int > Ġ= Ġs st ms Ġ{ ĠRE GS 3 2 ( index ) Ġ} ĊĠĠĠ Ġfun Ġset Reg ( index : ĠInt , Ġvalue : ĠD 2 Expr I ) Ġ= Ġs st ms Ġ{ ĠSET ( reg ( index ), Ġvalue ) Ġ} ĊĊĠĠĠ Ġfun Ġreg 6 4 ( index : ĠInt ): ĠD 2 Expr . Ref < Long > Ġ= Ġs st ms Ġ{ ĠRE GS 6 4 ( index ) Ġ} ĊĠĠĠ Ġfun Ġset Reg 6 4 ( index : ĠInt , Ġvalue : ĠD 2 Expr L ) Ġ= Ġs st ms Ġ{ ĠSET ( reg 6 4 ( index ), Ġvalue ) Ġ} ĊĊĠĠĠ Ġfun Ġg pr ( index : ĠInt ): ĠD 2 Expr . Ref < Int > Ġ= Ġreg ( Reg Off . G PR ( index )) ĊĠĠĠ Ġfun Ġset G pr ( index : ĠInt , Ġvalue : ĠD 2 Expr I ) Ġ= Ġs st ms Ġ{ ĠSET ( g pr ( index ), Ġvalue ) Ġ} ĊĊĠĠĠ Ġfun Ġf pr I ( index : ĠInt ): ĠD 2 Expr . Ref < Int > Ġ= Ġreg ( Reg Off . F PR ( index )) ĊĠĠĠ Ġfun Ġset F pr I ( index : ĠInt , Ġvalue : ĠD 2 Expr I ) Ġ= Ġs st ms Ġ{ ĠSET ( fpr I ( index ), Ġvalue ) Ġ} ĊĊĠĠĠ Ġfun Ġf pr ( index : ĠInt ): ĠD 2 Expr . Ref < Float > Ġ= Ġs st ms Ġ{ ĠRE GF 3 2 ( Reg Off . F PR ( index )) Ġ} ĊĠĠĠ Ġfun Ġset F pr ( index : ĠInt , Ġvalue : ĠD 2 Expr F ) Ġ= Ġs st ms Ġ{ ĠSET ( fpr ( index ), Ġvalue ) Ġ} ĊĊĠĠĠ Ġ////////////////////////////////// / ĊĊĠĠĠ Ġvar ĠTEMP 0 : ĠD 2 Expr I ; Ġset ( value ) Ġ= Ġset Reg ( Reg Off . TEMP 0 , Ġvalue ); Ġget () Ġ= Ġreg ( Reg Off . TEMP 0 ) ĊĊĠĠĠ Ġvar ĠRD : ĠD 2 Expr I ; Ġset ( value ) Ġ= Ġset G pr ( IR . rd , Ġvalue ); Ġget () Ġ= Ġg pr ( IR . rd ) ĊĠĠĠ Ġvar ĠRS : ĠD 2 Expr I ; Ġset ( value ) Ġ= Ġset G pr ( IR . rs , Ġvalue ); Ġget () Ġ= Ġg pr ( IR . rs ) ĊĠĠĠ Ġvar ĠRT : ĠD 2 Expr I ; Ġset ( value ) Ġ= Ġset G pr ( IR . rt , Ġvalue ); Ġget () Ġ= Ġg pr ( IR . rt ) ĊĊĠĠĠ Ġvar ĠFS _ I : ĠD 2 Expr I ; Ġset ( value ) Ġ= Ġset F pr I ( IR . fs , Ġvalue ); Ġget () Ġ= Ġf pr I ( IR . fs ) ĊĠĠĠ Ġvar ĠFD _ I : ĠD 2 Expr I ; Ġset ( value ) Ġ= Ġset F pr I ( IR . fd , Ġvalue ); Ġget () Ġ= Ġf pr I ( IR . fd ) ĊĠĠĠ Ġvar ĠFT _ I : ĠD 2 Expr I ; Ġset ( value ) Ġ= Ġset F pr I ( IR . ft , Ġvalue ); Ġget () Ġ= Ġf pr I ( IR . ft ) ĊĊĠĠĠ Ġvar ĠFS : ĠD 2 Expr F ; Ġset ( value ) Ġ= Ġset F pr ( IR . fs , Ġvalue ); Ġget () Ġ= Ġf pr ( IR . fs ) ĊĠĠĠ Ġvar ĠFD : ĠD 2 Expr F ; Ġset ( value ) Ġ= Ġset F pr ( IR . fd , Ġvalue ); Ġget () Ġ= Ġf pr ( IR . fd ) ĊĠĠĠ Ġvar ĠFT : ĠD 2 Expr F ; Ġset ( value ) Ġ= Ġset F pr ( IR . ft , Ġvalue ); Ġget () Ġ= Ġf pr ( IR . ft ) ĊĊĠĠĠ Ġvar Ġf cr 3 1 : ĠD 2 Expr I ; Ġset ( value ) Ġ= Ġset Reg ( Reg Off . F CR _ CC ( 3 1 ), Ġvalue ); Ġget () Ġ= Ġreg ( Reg Off . F CR _ CC ( 3 1 )) ĊĊĠĠĠ Ġvar Ġf cr 3 1 _ cc : ĠD 2 Expr B ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ= Ġs st ms Ġ{ Ġf cr 3 1 Ġ= Ġf cr 3 1 . INSERT ( 2 3 , Ġ 1 , Ġvalue ) Ġ} ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġs st ms Ġ{ Ġf cr 3 1 . EXTRACT ( 2 3 , Ġ 1 ) Ġ} ĊĊĊĠĠĠ Ġ////////////////////////////////// / ĊĠĠĠ Ġvar ĠLO : ĠD 2 Expr I Ġset ( value ) Ġ= Ġset Reg ( Reg Off . LO , Ġvalue ); Ġget () Ġ= Ġreg ( Reg Off . LO ) ĊĠĠĠ Ġvar ĠHI : ĠD 2 Expr I Ġset ( value ) Ġ= Ġset Reg ( Reg Off . HI , Ġvalue ); Ġget () Ġ= Ġreg ( Reg Off . HI ) ĊĠĠĠ Ġvar ĠIC : ĠD 2 Expr I Ġset ( value ) Ġ= Ġset Reg ( Reg Off . IC , Ġvalue ); Ġget () Ġ= Ġreg ( Reg Off . IC ) ĊĊĠĠĠ Ġvar ĠHI _ LO : ĠD 2 Expr L Ġset ( value ) Ġ= Ġset Reg 6 4 ( Reg Off . HI _ LO , Ġvalue ); Ġget () Ġ= Ġreg 6 4 ( Reg Off . HI _ LO ) ĊĊĠĠĠ Ġvar Ġ_ PC : ĠD 2 Expr I Ġset ( value ) Ġ= Ġset Reg ( Reg Off . PC , Ġvalue ); Ġget () Ġ= Ġreg ( Reg Off . PC ) ĊĠĠĠ Ġvar Ġ_ n PC : ĠD 2 Expr I Ġset ( value ) Ġ= Ġset Reg ( Reg Off . n PC , Ġvalue ); Ġget () Ġ= Ġreg ( Reg Off . n PC ) ĊĊĠĠĠ Ġvar ĠPC : ĠD 2 Expr I ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ= Ġs st ms Ġ{ Ġ_ PC Ġ= Ġvalue ; Ġ_ n PC Ġ= Ġvalue Ġ+ Ġ 4 . lit Ġ} ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġs st ms Ġ{ Ġ_ PC Ġ} ĊĊĠĠĠ Ġvar ĠRA : ĠD 2 Expr I Ġset ( value ) Ġ= Ġset Reg ( Reg Off . RA , Ġvalue ); Ġget () Ġ= Ġreg ( Reg Off . RA ) ĊĊĠĠĠ Ġval ĠPOS Ġget () Ġ= Ġs st ms Ġ{ ĠIR . pos . lit Ġ} ĊĠĠĠ Ġval ĠSIZE _ E Ġget () Ġ= Ġs st ms Ġ{ ĠIR . size _ e . lit Ġ} ĊĠĠĠ Ġval ĠSIZE _ I Ġget () Ġ= Ġs st ms Ġ{ ĠIR . size _ i . lit Ġ} ĊĠĠĠ Ġval ĠS _ IM M 1 6 Ġget () Ġ= Ġs st ms Ġ{ ĠIR . s _ imm 1 6 . lit Ġ} ĊĠĠĠ Ġval ĠU _ IM M 1 6 Ġget () Ġ= Ġs st ms Ġ{ ĠIR . u _ imm 1 6 . lit Ġ} ĊĠĠĠ Ġval ĠSY SCALL Ġget () Ġ= Ġs st ms Ġ{ ĠIR . syscall . lit Ġ} ĊĠĠĠ Ġval ĠJ UMP _ ADDRESS Ġget () Ġ= Ġs st ms Ġ{ ĠIR . jump _ address . lit Ġ} ĊĊĠĠĠ Ġval ĠRS _ IM M 1 6 Ġget () Ġ= Ġs st ms Ġ{ ĠRS Ġ+ ĠS _ IM M 1 6 Ġ} ĊĠĠĠ Ġval Ġreal _ jump _ address Ġget () Ġ= Ġ( ii . PC Ġand Ġ(- 2 6 8 4 3 5 4 5 6 )) Ġor ĠIR . jump _ address ĊĊĊĠĠĠ Ġval ĠS _ IM M 1 6 _ V : ĠInt Ġget () Ġ= Ġs st ms Ġ{ ĠIR . s _ imm 1 6 Ġ} ĊĠĠĠ Ġval ĠU _ IM M 1 6 _ V : ĠInt Ġget () Ġ= Ġs st ms Ġ{ ĠIR . u _ imm 1 6 Ġ} ĊĊĠĠĠ Ġ// fun Ġset _ pc ( value : ĠInt ) Ġ{ ĊĠĠĠ Ġ// ĠĠĠ Ġs st ms . run Ġ{ ĊĠĠĠ Ġ// ĠĠĠĠĠĠĠ ĠSET ( p 0 [ Cpu State ::_ PC ], Ġvalue . lit ) ĊĠĠĠ Ġ// ĠĠĠĠĠĠĠ ĠSET ( p 0 [ Cpu State ::_ n PC ], Ġvalue . lit ) ĊĠĠĠ Ġ// ĠĠĠ Ġ} ĊĠĠĠ Ġ//} ĊĊĠĠĠ Ġinline Ġoperator Ġfun ĠInstruction Info . invoke ( callback : ĠD 2 Builder .( Instruction Info ) Ġ-> ĠUnit ): ĠUnit Ġ{ ĊĠĠĠĠĠĠĠ Ġcallback ( sst ms , Ġthis ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun ĠInstruction Info . check Nan ( callback : ĠD 2 Builder .( Instruction Info ) Ġ-> ĠUnit ): ĠUnit Ġ{ ĊĠĠĠĠĠĠĠ Ġcallback ( sst ms , Ġthis ) ĊĠĠĠĠĠĠĠ Ġs st ms . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSTM (:: dyn a _ check FN an . invoke ( EXTERNAL , ĠFD )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun ĠInstruction Info . p read v ance And Flow ( callback : ĠD 2 Builder .( Instruction Info ) Ġ-> ĠUnit ): ĠUnit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( delayed Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġincrement PC () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcallback ( sst ms , Ġthis ) ĊĠĠĠĠĠĠĠ Ġreached Flow Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġincrement PC () Ġ= Ġs st ms Ġ{ ĊĠĠĠĠĠĠĠ Ġ// PC Ġ= Ġ( ii . PC Ġ+ Ġ 4 ). lit ĊĠĠĠĠĠĠĠ Ġ// this . PC Ġ= Ġs st ms Ġ{ Ġ( ii . PC Ġ+ Ġ 4 ). lit Ġ} ĊĠĠĠĠĠĠĠ Ġ_ PC Ġ= Ġ( ii . PC Ġ+ Ġ 4 ). lit ĊĠĠĠĠĠĠĠ Ġ_ n PC Ġ= Ġ( ii . PC Ġ+ Ġ 8 ). lit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠDelay ed ( val Ġcond : ĠD 2 Expr B ?, Ġval Ġjump To : ĠD 2 Expr I , Ġval Ġafter : ĠD 2 St m ?, Ġval Ġlikely : ĠBoolean ) ĊĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġinternal Ġvar Ġdelayed : ĠDelay ed ? Ġ= Ġnull ĊĊĠĠĠ Ġinline Ġfun ĠInstruction Info . branch ( callback : ĠD 2 Builder .( Instruction Info ) Ġ-> ĠD 2 Expr I ): ĠUnit Ġ= ĊĠĠĠĠĠĠĠ Ġ_ branch ( likely Ġ= Ġfalse , Ġcallback Ġ= Ġcallback ) ĊĊĠĠĠ Ġinline Ġfun ĠInstruction Info . branch Lik ely ( callback : ĠD 2 Builder .( Instruction Info ) Ġ-> ĠD 2 Expr I ): ĠUnit Ġ= ĊĠĠĠĠĠĠĠ Ġ_ branch ( likely Ġ= Ġtrue , Ġcallback Ġ= Ġcallback ) ĊĊĠĠĠ Ġinline Ġfun ĠInstruction Info ._ branch ( ĊĠĠĠĠĠĠĠ Ġlikely : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġcallback : ĠD 2 Builder .( Instruction Info ) Ġ-> ĠD 2 Expr I ĊĠĠĠ Ġ): ĠUnit Ġ{ ĊĠĠĠĠĠĠĠ Ġs st ms . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelayed Ġ= ĠDelay ed ( callback ( this , Ġthis @ _ branch ), Ġ( ii . PC Ġ+ ĠIR . s _ imm 1 6 Ġ* Ġ 4 Ġ+ Ġ 4 ). lit , Ġnull , Ġlikely Ġ= Ġlikely ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun ĠInstruction Info . jump ( ĊĠĠĠĠĠĠĠ Ġno inline Ġexec : Ġ( D 2 Builder . () Ġ-> ĠUnit )? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġcallback : ĠD 2 Builder .( Instruction Info ) Ġ-> ĠD 2 Expr I ĊĠĠĠ Ġ): ĠUnit Ġ{ ĊĠĠĠĠĠĠĠ Ġs st ms . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextra St m Ġ= Ġif Ġ( exec Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠD 2 Builder (). use Temp Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexec () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelayed Ġ= ĠDelay ed ( null , Ġcallback ( this , Ġthis @ jump ), Ġextra St m , Ġlikely Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠD 2 Func . generate Cpu State Function ( ctx : ĠD 2 Context , Ġname : ĠString ? Ġ= Ġnull , Ġdebug : ĠBoolean Ġ= Ġfalse ): Ġ( Cpu State ) Ġ-> ĠUnit Ġ{ ĊĠĠĠ Ġreturn Ġgenerate ( ctx Ġ, name , Ġdebug ). generate Cpu State Function () Ċ } Ċ Ċ fun ĠD 2 Result . generate Cpu State Function (): Ġ( Cpu State ) Ġ-> ĠUnit Ġ{ ĊĠĠĠ Ġval Ġr func Ġ= Ġthis . func ĊĠĠĠ Ġreturn Ġ{ Ġcpu Ġ-> ĊĠĠĠĠĠĠĠ Ġ// println (" Executing Ġfunction ... Ġ${ this . name }") ĊĠĠĠĠĠĠĠ Ġ// cpu . dump () ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġr func ( cpu . registers . data . mem , Ġcpu . mem , Ġnull , Ġcpu ) ĊĠĠĠĠĠĠĠ Ġ// println (" Ġ--> Ġresult =$ result ") ĊĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠC pu Break Exception Cached ( result ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ