sem call {
    set_op(new_inst,0 ,0 ,0 ); Rx_dest(new_inst,15);
    rmap_write(0,PC?addr,instq?length());
    nPC2 = PC + disp30?sext(32)<<2;
    new_inst.taken = true;
    is_call = true;
};

sem jmpl {
    set_op(new_inst,188 ,1 ,1);
    Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; Rx_dest(new_inst,rd);
    rmap_write(0,PC?addr,instq?length());
    new_inst.taken = true;
    is_jmpl = true;
};

sem retrn {
    set_op(new_inst,187 ,1 ,1);
    Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ;
    window_restore(new_inst);
    new_inst.taken = true;
    is_jmpl = true;
};

sem [	brz	brlez	brlz	brnz	brgz	brgez	] {
    set_op(new_inst,Op,1 ,1);
    Rx_src(new_inst,rs1);
    val target = PC+(d16hi?sext(32)<<16)|(d16lo?ext(32)<<2);
    new_inst.srcq?push_back(literal_src(target?addr));
    if(predict(PC?addr)) { nPC2 = target; new_inst.taken = true; }
    is_ccti = true;
} where Op in [ 1  2  3  4  5  6  ];

sem [ fba ba ] {
    set_op(new_inst,0 ,0 ,0 );
    nPC2 = PC + disp22?sext(32)<<2;
    new_inst.taken = true;
    if(a) { nPC = nPC2; nPC2 = nPC + 4; }
};

sem [ fbpa bpa ] {
    set_op(new_inst,0 ,0 ,0 );
    nPC2 = PC + disp19?sext(32)<<2;
    new_inst.taken = true;
    if(a) { nPC = nPC2; nPC2 = nPC + 4; }
};

sem [ fbn fbpn bn bpn ] {
    set_op(new_inst,0 ,0 ,0 );
    if(a) { nPC = nPC2; nPC2 = nPC + 4; }
};

sem [			fbu	fbg	fbug	fbl	fbul	fblg
	fbne	fbe	fbue	fbge	fbuge	fble	fbule	fbo	] {
    set_op(new_inst,Op,1 ,1);
    new_inst.srcq?push_back(rmap_src(10 ,0));
    val target = PC+disp22?sext(32)<<2;
    new_inst.srcq?push_back(literal_src(target?addr));
    if(predict(PC?addr)) {
	nPC2 = target; new_inst.taken = true;
    } else if(a) { nPC = nPC2; nPC2 = nPC + 4; }
    is_ccti = true;
} where Op in [		7 	8 	9 	10 	11 	12 
	13 	14 	15 	16 	17  18  19  20  ];

sem [			fbpu	fbpg	fbpug	fbpl	fbpul	fbplg
	fbpne	fbpe	fbpue	fbpge	fbpuge	fbple	fbpule	fbpo	] {
    set_op(new_inst,Op,1 ,1);
    new_inst.srcq?push_back(rmap_src(10 ,bpccr));
    val target = PC+disp19?sext(32)<<2;
    new_inst.srcq?push_back(literal_src(target?addr));
    if(predict(PC?addr)) {
	nPC2 = target; new_inst.taken = true;
    } else if(a) { nPC = nPC2; nPC2 = nPC + 4; }
    is_ccti = true;
} where Op in [		7 	8 	9 	10 	11 	12 
	13 	14 	15 	16 	17  18  19  20  ];

sem [			bne	be	bg	ble	bge	bl
	bgu	bleu	bcc	bcs	bpos	bneg	bvc	bvs	] {
    set_op(new_inst,Op,1 ,1);
    new_inst.srcq?push_back(rmap_src(9 ,0));
    val target = PC+disp22?sext(32)<<2;
    new_inst.srcq?push_back(literal_src(target?addr));
    if(predict(PC?addr)) {
	nPC2 = target; new_inst.taken = true;
    } else if(a) { nPC = nPC2; nPC2 = nPC + 4; }
    is_ccti = true;
} where Op in [		21 	22 	23 	24 	25 	26 
	27 	28 	29 	30 	31 	32 	33 	34 	];

sem [			bpne	bpe	bpg	bple	bpge	bpl
	bpgu	bpleu	bpcc	bpcs	bppos	bpneg	bpvc	bpvs	] {
    set_op(new_inst,Op,1 ,1);
    new_inst.srcq?push_back(rmap_src(9 ,bpcc1));
    val target = PC+disp19?sext(32)<<2;
    new_inst.srcq?push_back(literal_src(target?addr));
    if(predict(PC?addr)) {
	nPC2 = target; new_inst.taken = true;
    } else if(a) { nPC = nPC2; nPC2 = nPC + 4; }
    is_ccti = true;
} where Op in [		21 	22 	23 	24 	25 	26 
	27 	28 	29 	30 	31 	32 	33 	34 	];

sem [ fmovfsn fmovfdn fmovsn fmovdn] {
    set_op(new_inst,0 ,0 ,0 );
};

sem [ fmovfsa fmovsa ] {
    set_op(new_inst,35 ,1 ,1);
    F4_src(new_inst,rs2); F4_dest(new_inst,rd);
};

sem [ fmovfda fmovda ] {
    set_op(new_inst,35 ,1 ,1);
    F8_src(new_inst,rs2); F8_dest(new_inst,rd);
};

sem [					fmovsne		fmovse
	fmovsg		fmovsle		fmovsge		fmovsl
	fmovsgu		fmovsleu	fmovscc		fmovscs
	fmovspos	fmovsneg	fmovsvc		fmovsvs	] {
    set_op(new_inst,Op,1 ,1);
    new_inst.srcq?push_back(rmap_src(9 ,bpcc1));
    F4_src(new_inst,rs2); F4_dest(new_inst,rd);
} where Op in [				36 	37 
	38 		39 	40 	41 
	42 	43 	44 	45 
	46 	47 	48 	49  ];

sem [					fmovdne		fmovde
	fmovdg		fmovdle		fmovdge		fmovdl
	fmovdgu		fmovdleu	fmovdcc		fmovdcs
	fmovdpos	fmovdneg	fmovdvc		fmovdvs	] {
    set_op(new_inst,Op,1 ,1);
    new_inst.srcq?push_back(rmap_src(9 ,bpcc1));
    F8_src(new_inst,rs2); F8_dest(new_inst,rd);
} where Op in [				36 	37 
	38 		39 	40 	41 
	42 	43 	44 	45 
	46 	47 	48 	49  ];

sem [					fmovfsu		fmovfsg
	fmovfsug	fmovfsl		fmovfsul	fmovfslg
	fmovfsne	fmovfse		fmovfsue	fmovfsge
	fmovfsuge	fmovfsle	fmovfsule	fmovfso	] {
    set_op(new_inst,Op,1 ,1);
    new_inst.srcq?push_back(rmap_src(10 ,bpccr));
    F4_src(new_inst,rs2); F4_dest(new_inst,rd);
} where Op in [				50 	51 
	52 	53 	54 	55 
	56 	57 	58 	59 
	60 	61 	62 	63  ];

sem [					fmovfdu		fmovfdg
	fmovfdug	fmovfdl		fmovfdul	fmovfdlg
	fmovfdne	fmovfde		fmovfdue	fmovfdge
	fmovfduge	fmovfdle	fmovfdule	fmovfdo	] {
    set_op(new_inst,Op,1 ,1);
    new_inst.srcq?push_back(rmap_src(10 ,bpccr));
    F8_src(new_inst,rs2); F8_dest(new_inst,rd);
} where Op in [				50 	51 
	52 	53 	54 	55 
	56 	57 	58 	59 
	60 	61 	62 	63  ];

sem [ fmovrsz fmovrslez fmovrslz fmovrsnz fmovrsgz fmovrsgez ] {
    set_op(new_inst,Op,1 ,1);
    Rx_src(new_inst,rs1); F4_src(new_inst,rs2);
    F4_dest(new_inst,rd);
} where Op in [64  65  66  67  68  69 ];

sem [ fmovrdz fmovrdlez fmovrdlz fmovrdnz fmovrdgz fmovrdgez ] {
    set_op(new_inst,Op,1 ,1); Rx_src(new_inst,rs1);
    F8_src(new_inst,rs2); F8_dest(new_inst,rd);
} where Op in [64  65  66  67  68  69 ];

sem [ mova movfa ] {
    set_op(new_inst,35 ,1 ,1);
    Rx_src(new_inst,rs2); Rx_dest(new_inst,rd);
};

sem [					movne		move
	movg		movle		movge		movl
	movgu		movleu		movcc		movcs
	movpos		movneg		movvc		movvs	] {
    set_op(new_inst,Op,1 ,1);
    new_inst.srcq?push_back(rmap_src(9 ,bpcc1));
    Rx_src(new_inst,rs2); Rx_dest(new_inst,rd);
} where Op in [				36 	37 
	38 		39 	40 	41 
	42 	43 	44 	45 
	46 	47 	48 	49  ];

sem [			movfu	movfg	movfug	movfl	movful	movflg
	movfne	movfe	movfue	movfge	movfuge	movfle	movfule	movfo	] {
    set_op(new_inst,Op,1 ,1);
    new_inst.srcq?push_back(rmap_src(10 ,bpccr));
    Rx_src(new_inst,rs2); Rx_dest(new_inst,rd);
} where Op in [				50 	51 
	52 	53 	54 	55 
	56 	57 	58 	59 
	60 	61 	62 	63  ];

sem [ movrz movrlez movrlz movrnz movrgz movrgez ] {
    set_op(new_inst,Op,1 ,1); Rx_src(new_inst,rs1);
    Rx_src(new_inst,rs2); Rx_dest(new_inst,rd);
} where Op in [64  65  66  67  68  69 ];

sem tn {
    set_op(new_inst,0 ,0 ,0 );
};

sem ta {
    set_op(new_inst,70 ,1 ,1);
    if(i) new_inst.srcq?push_back(literal_src(sw_trap));
    else Rx_src(new_inst,rs2);
    is_trap = true;
};

sem [			tne	te	tg	tle	tge	tl
	tgu	tleu	tcc	tcs	tpos	tneg	tvc	tvs	] {
    set_op(new_inst,Op,1 ,1);
    new_inst.srcq?push_back(rmap_src(9 ,bpcc1));
    if(i) new_inst.srcq?push_back(literal_src(sw_trap));
    else Rx_src(new_inst,rs2);
    is_trap = true;
} where Op in [		71 	72 	73 	74 	75 	76 
	77 	78 	79 	80 	81 	82 	83 	84 	];

sem [		add	sub	and	andn	or	orn	xor	xnor
		sll	srl	sra		sllx	srlx	srax
		mulx		sdivx		udivx			] {
    set_op(new_inst,Op,1 ,ft);
    Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; Rx_dest(new_inst,rd);
} where Op in [	85 	89 	93 	95 	97 	99 	101 	103 
		108 	109 	110 		111 	112 	113 
		105 		106 	107 		],
	ft in [	1	1	1	1	1	1	1	1
		1	1	1		1	1	1
		2		10		10			];

sem [		addcc		subcc		andcc		andncc
		orcc		orncc		xorcc		xnorcc	] {
    set_op(new_inst,Op,1 ,1);
    Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; Rx_dest(new_inst,rd);
    new_inst.destq?push_back(rmap_dest(9 ,0));
} where Op in [	86 	90 	94 	96 
		98 		100 	102 	104  ];

sem [		addc		subc	] {
    set_op(new_inst,Op,1 ,1);
    Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; Rx_dest(new_inst,rd);
    new_inst.srcq?push_back(rmap_src(9 ,0));
} where Op in [	87 		91 	];

sem [		addccc		subccc
		taddcc		taddcctv
		tsubcc		tsubcctv	] {
    set_op(new_inst,Op,1 ,1);
    Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; Rx_dest(new_inst,rd);
    new_inst.srcq?push_back(rmap_src(9 ,0));
    new_inst.destq?push_back(rmap_dest(9 ,0));
} where Op in [	88 	92 
		114 	115 
		116 	117 	];

sem [ udiv sdiv ] {
    set_op(new_inst,Op,1 ,10);
    new_inst.srcq?push_back(rmap_src(11 ,0));
    Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; Rx_dest(new_inst,rd);
} where Op in [118  119 ];

sem [ umul smul ] {
    set_op(new_inst,Op,1 ,2);
    Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ;
    new_inst.destq?push_back(rmap_dest(11 ,0));
    Rx_dest(new_inst,rd);
} where Op in [120  121 ];

sem [ udivcc sdivcc ] {
    set_op(new_inst,Op,1 ,10);
    new_inst.srcq?push_back(rmap_src(11 ,0));
    Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ; Rx_dest(new_inst,rd);
    new_inst.destq?push_back(rmap_dest(9 ,0));
} where Op in [122  123 ];

sem [ umulcc smulcc ] {
    set_op(new_inst,Op,1 ,2);
    Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ;
    new_inst.destq?push_back(rmap_dest(11 ,0));
    Rx_dest(new_inst,rd);
    new_inst.destq?push_back(rmap_dest(9 ,0));
} where Op in [124  125 ];

sem mulscc {
    set_op(new_inst,126 ,1 ,1);
    new_inst.srcq?push_back(rmap_src(11 ,0));
    Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ;
    new_inst.srcq?push_back(rmap_src(9 ,0));
    new_inst.destq?push_back(rmap_dest(11 ,0));
    Rx_dest(new_inst,rd);
    new_inst.destq?push_back(rmap_dest(9 ,0));
};

sem popc {
    set_op(new_inst,127 ,1 ,1);
    Rx_src(new_inst,rs1); Rx_dest(new_inst,rd);
};

sem flush { set_op(new_inst,0 ,0 ,0 ); };

sem flushw { set_op(new_inst,129 ,0 ,0 ); is_trap = true; };

sem rd {
    set_op(new_inst,130 ,1 ,1);
    switch(rs1?ext(32)) {
     case 0:	new_inst.srcq?push_back(rmap_src(11 ,0));
     case 2:	new_inst.srcq?push_back(rmap_src(9 ,0));
     case 5:	new_inst.srcq?push_back(literal_src(PC?addr));
     case 15:	assert(rd?ext(32)==0); new_inst.op = 0 ?cvt(ushort);
     default:
	 
	assert(false);
    }
    Rx_dest(new_inst,rd);
};

sem wr {
    set_op(new_inst,131 ,1 ,1);
    Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ;
    switch(rd?ext(32)) {
     case 0:	new_inst.destq?push_back(rmap_dest(11 ,0));
     case 2:	new_inst.destq?push_back(rmap_dest(9 ,0));
     default:
	 
	assert(false);
    }
};

sem [ save restore ] {
    set_op(new_inst,Op,1 ,1);
    Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ;
    adjust_window(new_inst);
    Rx_dest(new_inst,rd);
} where adjust_window in [ window_save window_restore ],
	Op in [ 185  186  ];

sem sethi {
    set_op(new_inst,0 ,0 ,0 );
    val literal = imm22?ext(64) << 10;
    new_inst.srcq?push_back(literal_src(literal));    
    Rx_dest(new_inst,rd);
    rmap_write(0,literal,instq?length());
};

sem [		fadds		fsubs		fmuls		fdivs	] {
    set_op(new_inst,Op,2 ,ft);
    F4_src(new_inst,rs1); F4_src(new_inst,rs2);
    F4_dest(new_inst,rd);
} where Op in [	133 	135 	157 	159  ],
	ft in [	1		1		2		10	];

sem [		faddd		fsubd		fmuld		fdivd	] {
    set_op(new_inst,Op,2 ,ft);
    F8_src(new_inst,rs1); F8_src(new_inst,rs2);
    F8_dest(new_inst,rd);
} where Op in [	134 	136 	158 	160  ],
	ft in [	1		1		5		23	];

sem fsmuld {
    set_op(new_inst,161 ,2 ,2);
    F4_src(new_inst,rs1); F4_src(new_inst,rs2);
    F8_dest(new_inst,rd);
};

sem [		fcmps		fcmpes		] {
    set_op(new_inst,Op,2 ,1);
    F4_src(new_inst,rs1); F4_src(new_inst,rs2);
    new_inst.destq?push_back(rmap_dest(10 ,cond));
} where Op in [	137 	139 	];

sem [		fcmpd		fcmped		] {
    set_op(new_inst,Op,2 ,1);
    F8_src(new_inst,rs1); F8_src(new_inst,rs2);
    new_inst.destq?push_back(rmap_dest(10 ,cond));
} where Op in [	138 	140 	];

sem [		fstox		fitod		fstod	] {
    set_op(new_inst,Op,2 ,1);
    F4_src(new_inst,rs2);
    F8_dest(new_inst,rd);
} where Op in [	141 	149 	145  ];

sem [		fdtox		fxtod
		fmovd		fnegd		fabsd		fsqrtd	] {
    set_op(new_inst,Op,2 ,1);
    F8_src(new_inst,rs2);
    F8_dest(new_inst,rd);
} where Op in [	142 	147 
		152 	154 	156 	163  ];

sem [		fxtos		fdtos		fdtoi		] {
    set_op(new_inst,Op,2 ,1);
    F8_src(new_inst,rs2);
    F4_dest(new_inst,rd);
} where Op in [	146 	150 	144 	];

sem [		fitos		fstoi
		fmovs		fnegs		fabss		fsqrts	] {
    set_op(new_inst,Op,2 ,1);
    F4_src(new_inst,rs2);
    F4_dest(new_inst,rd);
} where Op in [	148 	143 
		151 	153 	155 	162  ];

sem [ ldf ldfa ] {
    set_op(new_inst,169 ,3 ,1);
    Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ;
    F4_dest(new_inst,rd);
    new_inst.align = 2?cvt(uchar);
};

sem [ lddf lddfa ] {
    set_op(new_inst,171 ,3 ,1);
    Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ;
    F8_dest(new_inst,rd);
    new_inst.align = 3?cvt(uchar);
};

sem [		ldsb	ldsh	ldsw	ldub	lduh	lduw	ldx
		ldsba	ldsha	ldswa	lduba	lduha	lduwa	ldxa	] {
    set_op(new_inst,Op,3 ,1);
    Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ;
    Rx_dest(new_inst,rd);
    new_inst.align = align?cvt(uchar);
} where Op in [	164 	165 	166 	167 	168 	169 	170 
		164 	165 	166 	167 	168 	169 	170 	],
     align in [	0	1	2	0	1	2	3
		0	1	2	0	1	2	3	];

sem [ ldd ldda ] {
    set_op(new_inst,171 ,3 ,1);
    Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ;
    R8_dest(new_inst,rd);
    new_inst.align = 3?cvt(uchar);
};

sem [ stf stfa ] {
    set_op(new_inst,176 ,3 ,1);
    Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ;
    F4_src(new_inst,rd);
    new_inst.align = 2?cvt(uchar);
};

sem [ stdf stdfa ] {
    set_op(new_inst,178 ,3 ,1);
    Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ;
    F8_src(new_inst,rd);
    new_inst.align = 3?cvt(uchar);
};

sem [		stb		sth		stw		stx	] {
    set_op(new_inst,Op,3 ,1);
    Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ;
    Rx_src(new_inst,rd);
    new_inst.align = align?cvt(uchar);
} where Op in [ 174 		175 		176 		177 	],
     align in [	0		1		2		3	];

sem [ std stda ] {
    set_op(new_inst,178 ,3 ,1);
    Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ;
    R8_src(new_inst,rd);
    new_inst.align = 3?cvt(uchar);
};

sem casa {
    set_op(new_inst,181 ,3 ,1);
    Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ;
    Rx_src(new_inst,rd);
    Rx_dest(new_inst,rd);
    new_inst.align = 2?cvt(uchar);
};

sem casxa {
    set_op(new_inst,182 ,3 ,1);
    Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ;
    R8_src(new_inst,rd);
    R8_dest(new_inst,rd);
    new_inst.align = 3?cvt(uchar);
};

sem [ ldstub ldstuba ] {
    set_op(new_inst,183 ,3 ,1);
    Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ;
    Rx_dest(new_inst,rd);
    new_inst.align = 0?cvt(uchar);
};

sem [ prefetch prefetcha ] {
    set_op(new_inst,0 ,3 ,0 );
};

sem [ swap swapa ] {
    set_op(new_inst,184 ,3 ,1);
    Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ;
    Rx_src(new_inst,rd);
    Rx_dest(new_inst,rd);
    new_inst.align = 2?cvt(uchar);
};

sem [		ldfsr		ldxfsr		] {
    set_op(new_inst,Op,3 ,1);
    Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ;
    new_inst.destq?push_back(rmap_dest(12 ,0));
    new_inst.align = align?cvt(uchar);
    is_trap = true;
} where Op in [	172 	173 	],
     align in [ 2		3		];

sem [		stfsr		stxfsr		] {
    set_op(new_inst,Op,3 ,1);
    Rx_src(new_inst,rs1); set_src2(new_inst,i,rs2,simm13) ;
    new_inst.srcq?push_back(rmap_src(12 ,0));
    new_inst.align = align?cvt(uchar);
    is_trap = true;
} where Op in [	179 	180 	],
     align in [	2		3		];