mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-02-18 00:20:10 +00:00
SPARC: Various changes
- additional patterns - minor instruction fixes in mul/div/64-bit math - do not pass g0 to zeroflags - conditional trap
This commit is contained in:
parent
c8a455e197
commit
34e1329595
@ -492,8 +492,9 @@ macro unpackflags(ccr) {
|
|||||||
:addcc RS1,regorimm,RD is op=2 & RD & op3=0x10 & RS1 & regorimm
|
:addcc RS1,regorimm,RD is op=2 & RD & op3=0x10 & RS1 & regorimm
|
||||||
{
|
{
|
||||||
addflags(RS1,regorimm);
|
addflags(RS1,regorimm);
|
||||||
RD = RS1 + regorimm;
|
local res:$(SIZE) = RS1 + regorimm;
|
||||||
zeroflags(RD);
|
zeroflags(res);
|
||||||
|
RD = res;
|
||||||
}
|
}
|
||||||
|
|
||||||
:addc RS1,regorimm,RD is op=2 & RD & op3=0x8 & RS1 & regorimm {RD = RS1 + regorimm + zext(i_cf);}
|
:addc RS1,regorimm,RD is op=2 & RD & op3=0x8 & RS1 & regorimm {RD = RS1 + regorimm + zext(i_cf);}
|
||||||
@ -502,8 +503,9 @@ macro unpackflags(ccr) {
|
|||||||
{
|
{
|
||||||
local original_i_cf:$(SIZE) = zext(i_cf);
|
local original_i_cf:$(SIZE) = zext(i_cf);
|
||||||
addCarryFlags(RS1,regorimm);
|
addCarryFlags(RS1,regorimm);
|
||||||
RD = RS1 + regorimm + original_i_cf;
|
local res:$(SIZE) = RS1 + regorimm + original_i_cf;
|
||||||
zeroflags(RD);
|
zeroflags(res);
|
||||||
|
RD = res;
|
||||||
}
|
}
|
||||||
#-----------------------
|
#-----------------------
|
||||||
:and RS1,regorimm,RD is op=2 & RD & op3=0x1 & RS1 & regorimm {RD = RS1 & regorimm;}
|
:and RS1,regorimm,RD is op=2 & RD & op3=0x1 & RS1 & regorimm {RD = RS1 & regorimm;}
|
||||||
@ -511,16 +513,18 @@ macro unpackflags(ccr) {
|
|||||||
:andcc RS1,regorimm,RD is op=2 & RD & op3=0x11 & RS1 & regorimm
|
:andcc RS1,regorimm,RD is op=2 & RD & op3=0x11 & RS1 & regorimm
|
||||||
{
|
{
|
||||||
logicflags();
|
logicflags();
|
||||||
RD = RS1 & regorimm;
|
local res:$(SIZE) = RS1 & regorimm;
|
||||||
zeroflags(RD);
|
zeroflags(res);
|
||||||
|
RD = res;
|
||||||
}
|
}
|
||||||
:andn RS1,regorimm,RD is op=2 & RD & op3=0x5 & RS1 & regorimm {RD = RS1 & ~regorimm;}
|
:andn RS1,regorimm,RD is op=2 & RD & op3=0x5 & RS1 & regorimm {RD = RS1 & ~regorimm;}
|
||||||
|
|
||||||
:andncc RS1,regorimm,RD is op=2 & RD & op3=0x15 & RS1 & regorimm
|
:andncc RS1,regorimm,RD is op=2 & RD & op3=0x15 & RS1 & regorimm
|
||||||
{
|
{
|
||||||
logicflags();
|
logicflags();
|
||||||
RD = RS1 & ~regorimm;
|
local res:$(SIZE) = RS1 & ~regorimm;
|
||||||
zeroflags(RD);
|
zeroflags(res);
|
||||||
|
RD = res;
|
||||||
}
|
}
|
||||||
|
|
||||||
:or RS1,regorimm,RD is op=2 & RD & op3=0x2 & RS1 & regorimm {RD = RS1 | regorimm;}
|
:or RS1,regorimm,RD is op=2 & RD & op3=0x2 & RS1 & regorimm {RD = RS1 | regorimm;}
|
||||||
@ -528,24 +532,27 @@ macro unpackflags(ccr) {
|
|||||||
:orcc RS1,regorimm,RD is op=2 & RD & op3=0x12 & RS1 & regorimm
|
:orcc RS1,regorimm,RD is op=2 & RD & op3=0x12 & RS1 & regorimm
|
||||||
{
|
{
|
||||||
logicflags();
|
logicflags();
|
||||||
RD = RS1 | regorimm;
|
local res:$(SIZE) = RS1 | regorimm;
|
||||||
zeroflags(RD);
|
zeroflags(res);
|
||||||
|
RD = res;
|
||||||
}
|
}
|
||||||
:orn RS1,regorimm,RD is op=2 & RD & op3=0x6 & RS1 & regorimm {RD = RS1 | ~regorimm;}
|
:orn RS1,regorimm,RD is op=2 & RD & op3=0x6 & RS1 & regorimm {RD = RS1 | ~regorimm;}
|
||||||
|
|
||||||
:orncc RS1,regorimm,RD is op=2 & RD & op3=0x16 & RS1 & regorimm
|
:orncc RS1,regorimm,RD is op=2 & RD & op3=0x16 & RS1 & regorimm
|
||||||
{
|
{
|
||||||
logicflags();
|
logicflags();
|
||||||
RD = RS1 | ~regorimm;
|
local res:$(SIZE) = RS1 | ~regorimm;
|
||||||
zeroflags(RD);
|
zeroflags(res);
|
||||||
|
RD = res;
|
||||||
}
|
}
|
||||||
:xor RS1,regorimm,RD is op=2 & RD & op3=0x3 & RS1 & regorimm {RD = RS1 ^ regorimm;}
|
:xor RS1,regorimm,RD is op=2 & RD & op3=0x3 & RS1 & regorimm {RD = RS1 ^ regorimm;}
|
||||||
|
|
||||||
:xorcc RS1,regorimm,RD is op=2 & RD & op3=0x13 & RS1 & regorimm
|
:xorcc RS1,regorimm,RD is op=2 & RD & op3=0x13 & RS1 & regorimm
|
||||||
{
|
{
|
||||||
logicflags();
|
logicflags();
|
||||||
RD = RS1 ^ regorimm;
|
local res:$(SIZE) = RS1 ^ regorimm;
|
||||||
zeroflags(RD);
|
zeroflags(res);
|
||||||
|
RD = res;
|
||||||
}
|
}
|
||||||
|
|
||||||
:xnor RS1,regorimm,RD is op=2 & RD & op3=0x7 & RS1 & regorimm {RD = RS1 ^ ~regorimm;}
|
:xnor RS1,regorimm,RD is op=2 & RD & op3=0x7 & RS1 & regorimm {RD = RS1 ^ ~regorimm;}
|
||||||
@ -553,8 +560,9 @@ macro unpackflags(ccr) {
|
|||||||
:xnorcc RS1,regorimm,RD is op=2 & RD & op3=0x17 & RS1 & regorimm
|
:xnorcc RS1,regorimm,RD is op=2 & RD & op3=0x17 & RS1 & regorimm
|
||||||
{
|
{
|
||||||
logicflags();
|
logicflags();
|
||||||
RD = RS1 ^ ~regorimm;
|
local res:$(SIZE) = RS1 ^ ~regorimm;
|
||||||
zeroflags(RD);
|
zeroflags(res);
|
||||||
|
RD = res;
|
||||||
}
|
}
|
||||||
|
|
||||||
# ---------------
|
# ---------------
|
||||||
@ -615,8 +623,9 @@ macro unpackflags(ccr) {
|
|||||||
:subcc RS1,regorimm,RD is op=2 & RD & op3=0x14 & RS1 & regorimm
|
:subcc RS1,regorimm,RD is op=2 & RD & op3=0x14 & RS1 & regorimm
|
||||||
{
|
{
|
||||||
subflags(RS1,regorimm);
|
subflags(RS1,regorimm);
|
||||||
RD = RS1 - regorimm;
|
local res:$(SIZE) = RS1 - regorimm;
|
||||||
zeroflags(RD);
|
zeroflags(res);
|
||||||
|
RD = res;
|
||||||
}
|
}
|
||||||
|
|
||||||
:subc RS1,regorimm,RD is op=2 & RD & op3=0xc & RS1 & regorimm
|
:subc RS1,regorimm,RD is op=2 & RD & op3=0xc & RS1 & regorimm
|
||||||
@ -628,8 +637,9 @@ macro unpackflags(ccr) {
|
|||||||
{
|
{
|
||||||
local original_cf:$(SIZE) = zext(i_cf);
|
local original_cf:$(SIZE) = zext(i_cf);
|
||||||
subCarryFlags(RS1,regorimm);
|
subCarryFlags(RS1,regorimm);
|
||||||
RD = RS1 - regorimm - original_cf;
|
local res:$(SIZE) = RS1 - regorimm - original_cf;
|
||||||
zeroflags(RD);
|
zeroflags(res);
|
||||||
|
RD = res;
|
||||||
}
|
}
|
||||||
|
|
||||||
# ---------------
|
# ---------------
|
||||||
@ -641,8 +651,8 @@ macro unpackflags(ccr) {
|
|||||||
:cmp RS1,regorimm is op=0x2 & rd=0x0 & op3=0x14 & RS1 & regorimm
|
:cmp RS1,regorimm is op=0x2 & rd=0x0 & op3=0x14 & RS1 & regorimm
|
||||||
{
|
{
|
||||||
subflags(RS1,regorimm);
|
subflags(RS1,regorimm);
|
||||||
local tmp = RS1 - regorimm;
|
local res:$(SIZE) = RS1 - regorimm;
|
||||||
zeroflags(tmp);
|
zeroflags(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -825,43 +835,65 @@ callreloff: reloc is disp30 [reloc=inst_start+4*disp30;] { export *:$(SIZE) rel
|
|||||||
|
|
||||||
#----------------MULTIPLY 32 bit
|
#----------------MULTIPLY 32 bit
|
||||||
@if SIZE=="8"
|
@if SIZE=="8"
|
||||||
:umul RS1,regorimm,RD is op=2 & RD & op3=0x0a & RS1 & regorimm {RD = zext(RS1:4) * zext(regorimm:4); Y=RD>>32;}
|
:umul RS1,regorimm,RD is op=2 & RD & op3=0x0a & RS1 & regorimm
|
||||||
:smul RS1,regorimm,RD is op=2 & RD & op3=0x0b & RS1 & regorimm {RD = sext(RS1:4) * sext(regorimm:4); Y=RD>>32;}
|
{
|
||||||
:umulcc RS1,regorimm,RD is op=2 & RD & op3=0x1a & RS1 & regorimm {RD = zext(RS1:4) * zext(regorimm:4); Y=RD>>32; zeroflags(RD); logicflags();}
|
local res:8 = zext(RS1:4) * zext(regorimm:4);
|
||||||
:smulcc RS1,regorimm,RD is op=2 & RD & op3=0x1b & RS1 & regorimm {RD = sext(RS1:4) * sext(regorimm:4); Y=RD>>32; zeroflags(RD); logicflags();}
|
Y = res >> 32;
|
||||||
|
RD = res:4;
|
||||||
|
}
|
||||||
|
:smul RS1,regorimm,RD is op=2 & RD & op3=0x0b & RS1 & regorimm
|
||||||
|
{
|
||||||
|
local res:8 = sext(RS1:4) * sext(regorimm:4);
|
||||||
|
Y = res s>> 32;
|
||||||
|
RD = res:4;
|
||||||
|
}
|
||||||
|
:umulcc RS1,regorimm,RD is op=2 & RD & op3=0x1a & RS1 & regorimm
|
||||||
|
{
|
||||||
|
local res:8 = zext(RS1:4) * zext(regorimm:4);
|
||||||
|
Y = res >> 32;
|
||||||
|
zeroflags(res:4);
|
||||||
|
RD = res:4;
|
||||||
|
logicflags();
|
||||||
|
}
|
||||||
|
:smulcc RS1,regorimm,RD is op=2 & RD & op3=0x1b & RS1 & regorimm
|
||||||
|
{
|
||||||
|
local res:8 = sext(RS1:4) * sext(regorimm:4);
|
||||||
|
Y = res s>> 32;
|
||||||
|
zeroflags(res:4);
|
||||||
|
RD = res:4;
|
||||||
|
logicflags();
|
||||||
|
}
|
||||||
|
|
||||||
@else
|
@else
|
||||||
# size = 4
|
# size = 4
|
||||||
:umul RS1,regorimm,RD is op=2 & RD & op3=0x0a & RS1 & regorimm
|
:umul RS1,regorimm,RD is op=2 & RD & op3=0x0a & RS1 & regorimm
|
||||||
{
|
{
|
||||||
tmp_RS1:8 = zext(RS1);
|
local res:8 = zext(RS1:4) * zext(regorimm:4);
|
||||||
tmp_regorimm:8 = zext(regorimm);
|
Y = res[32,32];
|
||||||
tmp:8 = tmp_RS1 * tmp_regorimm;
|
RD = res:4;
|
||||||
RD = tmp:4; tmp2:8 = tmp >> 32;
|
|
||||||
Y = tmp2:4;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
:smul RS1,regorimm,RD is op=2 & RD & op3=0x0b & RS1 & regorimm
|
:smul RS1,regorimm,RD is op=2 & RD & op3=0x0b & RS1 & regorimm
|
||||||
{
|
{
|
||||||
tmp_RS1:8 = sext(RS1);
|
local res:8 = sext(RS1:4) * sext(regorimm:4);
|
||||||
tmp_regorimm:8 = sext(regorimm);
|
Y = res[32,32];
|
||||||
tmp:8 = tmp_RS1 * tmp_regorimm;
|
RD = res:4;
|
||||||
RD = tmp:4; tmp2:8 = tmp >> 32;
|
|
||||||
Y = tmp2:4;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
:umulcc RS1,regorimm,RD is op=2 & RD & op3=0x1a & RS1 & regorimm
|
:umulcc RS1,regorimm,RD is op=2 & RD & op3=0x1a & RS1 & regorimm
|
||||||
{
|
{
|
||||||
RD = zext(RS1:4) * zext(regorimm:4);
|
local res:8 = zext(RS1:4) * zext(regorimm:4);
|
||||||
Y=RD>>32;
|
Y = res[32,32];
|
||||||
zeroflags(RD);
|
zeroflags(res:4);
|
||||||
|
RD = res:4;
|
||||||
logicflags();
|
logicflags();
|
||||||
}
|
}
|
||||||
:smulcc RS1,regorimm,RD is op=2 & RD & op3=0x1b & RS1 & regorimm
|
:smulcc RS1,regorimm,RD is op=2 & RD & op3=0x1b & RS1 & regorimm
|
||||||
{
|
{
|
||||||
RD = zext(RS1:4) * zext(regorimm:4);
|
local res:8 = sext(RS1:4) * sext(regorimm:4);
|
||||||
Y=RD>>32;
|
Y = res[32,32];
|
||||||
zeroflags(RD);
|
zeroflags(res:4);
|
||||||
|
RD = res:4;
|
||||||
logicflags();
|
logicflags();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -883,8 +915,9 @@ callreloff: reloc is disp30 [reloc=inst_start+4*disp30;] { export *:$(SIZE) rel
|
|||||||
addflags32(addend,shifted);
|
addflags32(addend,shifted);
|
||||||
#upper 32 bits of RD are undefined according to the manual
|
#upper 32 bits of RD are undefined according to the manual
|
||||||
local tbit:4 = (RS1:4 & 0x1:4) << 31;
|
local tbit:4 = (RS1:4 & 0x1:4) << 31;
|
||||||
RD = zext(sum);
|
local res:$(SIZE) = zext(sum);
|
||||||
zeroflags(RD);
|
zeroflags(res);
|
||||||
|
RD = res;
|
||||||
#Y is 64 bits in Sparc 9 but the high 32 are fixed to 0
|
#Y is 64 bits in Sparc 9 but the high 32 are fixed to 0
|
||||||
Y = zext((Y:4 >> 1:4) | tbit);
|
Y = zext((Y:4 >> 1:4) | tbit);
|
||||||
}
|
}
|
||||||
@ -896,35 +929,39 @@ callreloff: reloc is disp30 [reloc=inst_start+4*disp30;] { export *:$(SIZE) rel
|
|||||||
|
|
||||||
:udiv RS1,regorimm,RD is op=2 & RD & op3=0x0e & RS1 & regorimm
|
:udiv RS1,regorimm,RD is op=2 & RD & op3=0x0e & RS1 & regorimm
|
||||||
{
|
{
|
||||||
numerator:$(SIZE)= (Y << 32) + (RS1 & 0xffffffff);
|
numerator:8 = (zext(Y) << 32) + zext(RS1);
|
||||||
denom:$(SIZE) = regorimm & 0xffffffff;
|
denom:8 = zext(regorimm:4);
|
||||||
RD = numerator / denom;
|
local res:8 = numerator / denom;
|
||||||
|
RD = zext(res:4);
|
||||||
}
|
}
|
||||||
:sdiv RS1,regorimm,RD is op=2 & RD & op3=0x0f & RS1 & regorimm
|
:sdiv RS1,regorimm,RD is op=2 & RD & op3=0x0f & RS1 & regorimm
|
||||||
{
|
{
|
||||||
numerator:$(SIZE)= (Y << 32) + (RS1 & 0xffffffff);
|
numerator:8 = (sext(Y) << 32) + zext(RS1:4);
|
||||||
denom:$(SIZE) = regorimm & 0xffffffff;
|
denom:8 = sext(regorimm:4);
|
||||||
RD = numerator s/ denom;
|
local res:8 = numerator s/ denom;
|
||||||
|
RD = sext(res:4);
|
||||||
}
|
}
|
||||||
|
|
||||||
:udivcc RS1,regorimm,RD is op=2 & RD & op3=0x1e & RS1 & regorimm
|
:udivcc RS1,regorimm,RD is op=2 & RD & op3=0x1e & RS1 & regorimm
|
||||||
{
|
{
|
||||||
numerator:$(SIZE)= ( Y << 32) + (RS1 & 0xffffffff);
|
numerator:8 = (zext(Y) << 32) + zext(RS1:4);
|
||||||
denom:$(SIZE) = regorimm & 0xffffffff;
|
denom:8 = zext(regorimm:4);
|
||||||
RD = numerator / denom;
|
local res:8 = numerator / denom;
|
||||||
zeroflags(RD);
|
zeroflags(res:4);
|
||||||
i_vf = RD > 0xffffffff;
|
RD = zext(res:4);
|
||||||
|
i_vf = res > 0xffffffff;
|
||||||
i_cf = 0;
|
i_cf = 0;
|
||||||
x_vf = 0;
|
x_vf = 0;
|
||||||
x_cf = 0;
|
x_cf = 0;
|
||||||
}
|
}
|
||||||
:sdivcc RS1,regorimm,RD is op=2 & RD & op3=0x1f & RS1 & regorimm
|
:sdivcc RS1,regorimm,RD is op=2 & RD & op3=0x1f & RS1 & regorimm
|
||||||
{
|
{
|
||||||
numerator:$(SIZE)= (Y << 32) + (RS1 & 0xffffffff);
|
numerator:8 = (sext(Y) << 32) + (zext(RS1) & 0xffffffff);
|
||||||
denom:$(SIZE) = regorimm & 0xffffffff;
|
denom:8 = sext(regorimm:4);
|
||||||
RD = numerator s/ denom;
|
local res:8 = numerator s/ denom;
|
||||||
zeroflags(RD);
|
zeroflags(res:4);
|
||||||
i_vf = (RD s>= 0x80000000) || (RD s<= -0x7fffffff);
|
RD = sext(res:4);
|
||||||
|
i_vf = (res s>= 0x80000000) || (res s<= -0x7ffffffff);
|
||||||
i_cf = 0;
|
i_cf = 0;
|
||||||
x_vf = 0;
|
x_vf = 0;
|
||||||
x_cf = 0;
|
x_cf = 0;
|
||||||
@ -990,6 +1027,12 @@ sethidisp: "%hi("^hi^")" is udisp22 [hi=udisp22<<10;] { export *[const]:$(SIZE)
|
|||||||
:restore RS1,regorimm,RD is op=0x2 & RD & op3=0x3d & RS1 & regorimm { local tmp = RS1 + regorimm; restore(); didrestore=1; RD = tmp; }
|
:restore RS1,regorimm,RD is op=0x2 & RD & op3=0x3d & RS1 & regorimm { local tmp = RS1 + regorimm; restore(); didrestore=1; RD = tmp; }
|
||||||
:restore is op=0x2 & rd=0 & op3=0x3d { restore(); didrestore=1; }
|
:restore is op=0x2 & rd=0 & op3=0x3d { restore(); didrestore=1; }
|
||||||
|
|
||||||
|
# FIXME 'jmpl' can have 'return' in the delayslot to return from a user trap handler
|
||||||
|
# - jmpl sets the trapped PC supplied to user trap handler
|
||||||
|
# - return sets the trapped nPC supplied to user trap handler
|
||||||
|
# Nothing in instruction encoding defines this, requiring a context register;
|
||||||
|
# or a fake 8-byte instruction, requiring logic for 64-bits of tokens
|
||||||
|
|
||||||
:return retea is op=0x2 & op3=0x39 & retea { build retea; restore(); delayslot(1); didrestore=1; return [retea]; }
|
:return retea is op=0x2 & op3=0x39 & retea { build retea; restore(); delayslot(1); didrestore=1; return [retea]; }
|
||||||
|
|
||||||
:jmpl retea,RD is op=0x2 & RD & op3=0x38 & retea { build retea; RD = inst_start; delayslot(1); goto [retea]; }
|
:jmpl retea,RD is op=0x2 & RD & op3=0x38 & retea { build retea; RD = inst_start; delayslot(1); goto [retea]; }
|
||||||
@ -1013,52 +1056,70 @@ casa_ea: [RS1]%ASI is i=1 & RS1 & ASI { local tmp = RS1+segment(ASI); ex
|
|||||||
:casa casa_ea,RS2,RD is op=0x3 & RD & op3=0x3c & casa_ea & RS2
|
:casa casa_ea,RS2,RD is op=0x3 & RD & op3=0x3c & casa_ea & RS2
|
||||||
{
|
{
|
||||||
local tmp:4=RD:4;
|
local tmp:4=RD:4;
|
||||||
RD=zext(*:4 casa_ea);
|
local tmp2:$(SIZE) = RS2;
|
||||||
if ((RS2 & 0xFFFFFFFF)!=RD) goto <end>;
|
local tmp_ea:$(SIZE) = casa_ea;
|
||||||
*:4 casa_ea=tmp;
|
RD=zext(*:4 tmp_ea);
|
||||||
|
if ((tmp2 & 0xFFFFFFFF)!=RD) goto <end>;
|
||||||
|
*:4 tmp_ea=tmp;
|
||||||
<end>
|
<end>
|
||||||
}
|
}
|
||||||
:casxa casa_ea,RS2,RD is op=0x3 & RD & op3=0x3e & casa_ea & RS2
|
:casxa casa_ea,RS2,RD is op=0x3 & RD & op3=0x3e & casa_ea & RS2
|
||||||
{
|
{
|
||||||
local tmp=RD;
|
local tmp=RD;
|
||||||
RD=*:$(SIZE) casa_ea;
|
local tmp2:$(SIZE) = RS2;
|
||||||
if (RS2!=RD) goto <end>;
|
local tmp_ea:$(SIZE) = casa_ea;
|
||||||
*:$(SIZE) casa_ea=tmp;
|
RD=*:$(SIZE) tmp_ea;
|
||||||
|
if (tmp2!=RD) goto <end>;
|
||||||
|
*:$(SIZE) tmp_ea=tmp;
|
||||||
<end>
|
<end>
|
||||||
}
|
}
|
||||||
|
|
||||||
:impdef1 is op=0x2 & op3=0x36 unimpl
|
:impdef1 is op=0x2 & op3=0x36 unimpl
|
||||||
:impdef2 is op=0x2 & op3=0x37 unimpl
|
:impdef2 is op=0x2 & op3=0x37 unimpl
|
||||||
|
|
||||||
:ldstub ea,RD is op=0x3 & RD & op3=0xd & ea { RD = zext(*:1 ea); *:1 ea = 0xFF; }
|
:ldstub ea,RD is op=0x3 & RD & op3=0xd & ea
|
||||||
:ldstuba ea_alt,RD is op=0x3 & RD & op3=0x1d & ea_alt { RD = zext(*:1 ea_alt); *:1 ea_alt = 0xFF; }
|
{
|
||||||
|
local tmp_ea:$(SIZE) = ea;
|
||||||
|
RD = zext(*:1 tmp_ea);
|
||||||
|
*:1 tmp_ea = 0xFF;
|
||||||
|
}
|
||||||
|
:ldstuba ea_alt,RD is op=0x3 & RD & op3=0x1d & ea_alt
|
||||||
|
{
|
||||||
|
local tmp_ea:$(SIZE) = ea_alt;
|
||||||
|
RD = zext(*:1 tmp_ea);
|
||||||
|
*:1 tmp_ea = 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
:swap ea,RD is op=0x3 & RD & op3=0xF & ea { tmp:4=RD:4; RD = zext(*:4 ea); *:4 ea = tmp; }
|
:swap ea,RD is op=0x3 & RD & op3=0xF & ea { local tmp_ea:$(SIZE) = ea; tmp:4=RD:4; RD = zext(*:4 tmp_ea); *:4 tmp_ea = tmp; }
|
||||||
:swapa ea_alt,RD is op=0x3 & RD & op3=0x1F & ea_alt { tmp:4=RD:4; RD = zext(*:4 ea_alt); *:4 ea_alt = tmp; }
|
:swapa ea_alt,RD is op=0x3 & RD & op3=0x1F & ea_alt { local tmp_ea:$(SIZE) = ea_alt; tmp:4=RD:4; RD = zext(*:4 tmp_ea); *:4 tmp_ea = tmp; }
|
||||||
|
|
||||||
:taddcc RS1,regorimm,RD is op=2 & RD & op3=0x20 & RS1 & regorimm
|
:taddcc RS1,regorimm,RD is op=2 & RD & op3=0x20 & RS1 & regorimm
|
||||||
{
|
{
|
||||||
taddflags(RS1,regorimm);
|
taddflags(RS1,regorimm);
|
||||||
RD = RS1 + regorimm;
|
local res:$(SIZE) = RS1 + regorimm;
|
||||||
zeroflags(RD);
|
zeroflags(res);
|
||||||
|
RD = res;
|
||||||
}
|
}
|
||||||
:taddcctv RS1,regorimm,RD is op=2 & RD & op3=0x22 & RS1 & regorimm
|
:taddcctv RS1,regorimm,RD is op=2 & RD & op3=0x22 & RS1 & regorimm
|
||||||
{
|
{
|
||||||
taddflags(RS1,regorimm);
|
taddflags(RS1,regorimm);
|
||||||
RD = RS1 + regorimm;
|
local res:$(SIZE) = RS1 + regorimm;
|
||||||
zeroflags(RD);
|
zeroflags(res);
|
||||||
|
RD = res;
|
||||||
}
|
}
|
||||||
:tsubcc RS1,regorimm,RD is op=2 & RD & op3=0x21 & RS1 & regorimm
|
:tsubcc RS1,regorimm,RD is op=2 & RD & op3=0x21 & RS1 & regorimm
|
||||||
{
|
{
|
||||||
tsubflags(RS1,regorimm);
|
tsubflags(RS1,regorimm);
|
||||||
RD = RS1 - regorimm;
|
local res:$(SIZE) = RS1 - regorimm;
|
||||||
zeroflags(RD);
|
zeroflags(res);
|
||||||
|
RD = res;
|
||||||
}
|
}
|
||||||
:tsubcctv RS1,regorimm,RD is op=2 & RD & op3=0x23 & RS1 & regorimm
|
:tsubcctv RS1,regorimm,RD is op=2 & RD & op3=0x23 & RS1 & regorimm
|
||||||
{
|
{
|
||||||
tsubflags(RS1,regorimm);
|
tsubflags(RS1,regorimm);
|
||||||
RD = RS1 - regorimm;
|
local res:$(SIZE) = RS1 - regorimm;
|
||||||
zeroflags(RD);
|
zeroflags(res);
|
||||||
|
RD = res;
|
||||||
}
|
}
|
||||||
|
|
||||||
tcc: icc is cc1_4=0 & cc0_4=0 & icc { export icc; }
|
tcc: icc is cc1_4=0 & cc0_4=0 & icc { export icc; }
|
||||||
@ -1070,7 +1131,11 @@ TICC: "%xcc" is cc1_4=1 &cc0_4=0 { }
|
|||||||
trap: RS1+RS2 is i=0 & RS1 & RS2 { local tmp = ((RS1 + RS2) & 0x7F); export tmp; }
|
trap: RS1+RS2 is i=0 & RS1 & RS2 { local tmp = ((RS1 + RS2) & 0x7F); export tmp; }
|
||||||
trap: RS1+swtrap is i=1 & RS1 & swtrap { local tmp = ((RS1 + swtrap) & 0x7F); export tmp; }
|
trap: RS1+swtrap is i=1 & RS1 & swtrap { local tmp = ((RS1 + swtrap) & 0x7F); export tmp; }
|
||||||
|
|
||||||
:t^tcc TICC, trap is op=0x2 & op3=0x3a & tcc & TICC & trap { sw_trap(trap); }
|
:t^tcc TICC, trap is op=0x2 & op3=0x3a & tcc & TICC & trap
|
||||||
|
{
|
||||||
|
if (!tcc) goto inst_next;
|
||||||
|
sw_trap(trap);
|
||||||
|
}
|
||||||
|
|
||||||
membar_mask: is cmask & mmask { tmp:1 = (cmask << 4) | mmask; export tmp; }
|
membar_mask: is cmask & mmask { tmp:1 = (cmask << 4) | mmask; export tmp; }
|
||||||
|
|
||||||
|
@ -2,30 +2,21 @@
|
|||||||
<patternpairs totalbits="32" postbits="16">
|
<patternpairs totalbits="32" postbits="16">
|
||||||
<prepatterns>
|
<prepatterns>
|
||||||
<data>0x81f00000 </data> <!-- done -->
|
<data>0x81f00000 </data> <!-- done -->
|
||||||
<data>0x81c7e008 0x........ </data> <!-- RET : delayslot filler -->
|
<data>0x81c7e008 0x........ </data> <!-- RET : delayslot -->
|
||||||
<data>0x81c7e008 0x........ 0x00000000 </data> <!-- RET : delayslot filler -->
|
<data>0x81c7e008 0x........ 0000000. 0x000000 </data> <!-- RET : delayslot filler/nop -->
|
||||||
<data>0x81c7e008 0x........ 0x00000000 0x00000000 </data> <!-- RET : delayslot filler -->
|
<data>0x81c3e008 0x........ </data> <!-- RETL : delayslot -->
|
||||||
<data>0x81c7e008 0x........ 0x00000000 0x00000000 0x00000000 </data> <!-- RET : delayslot filler -->
|
<data>0x81c3e008 0x........ 0000000. 0x000000 </data> <!-- RETL : delayslot filler/nop -->
|
||||||
<data>0x81c7e008 0x........ 0x00000000 0x00000000 0x00000000 0x00000000 </data> <!-- RET : delayslot filler -->
|
<data>0x81cfe008 0x........ </data> <!-- RETURN : delayslot -->
|
||||||
<data>0x81c7e008 0x........ 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 </data> <!-- RET : delayslot filler -->
|
<data>0x81cfe008 0x........ 0000000. 0x000000 </data> <!-- RETURN : delayslot filler/nop -->
|
||||||
<data>0x81c7e008 0x........ 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 </data> <!-- RET : delayslot filler -->
|
<data>0x10 101..... 0x.... 0x........ </data> <!-- BA -label : delayslot -->
|
||||||
<data>0x81c7e008 0x........ 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 </data> <!-- RET : delayslot filler -->
|
<data>0x10 101..... 0x.... 0x........ 0000000. 0x000000 </data> <!-- BA -label : delayslot filler/nop -->
|
||||||
<data>0x81c3e008 0x........ </data> <!-- RETL : delayslot filler -->
|
<data>0x30 101..... 0x.... </data> <!-- BA,A -label (no delayslot)-->
|
||||||
<data>0x81c3e008 0x........ 0x00000000 </data> <!-- RETL : delayslot filler -->
|
<data>0x30 101..... 0x.... 0000000. 0x000000 </data> <!-- BA,A -label (no delayslot): filler/nop -->
|
||||||
<data>0x81c3e008 0x........ 0x00000000 0x00000000 </data> <!-- RETL : delayslot filler -->
|
<data>01...... 0x...... 10.....1 11101... 0x.... </data> <!-- CALL label; RESTORE : filler/nop -->
|
||||||
<data>0x81c3e008 0x........ 0x00000000 0x00000000 0x00000000 </data> <!-- RETL : delayslot filler -->
|
<data>01...... 0x...... 10.....1 11101... 0x.... 0000000. 0x000000 </data> <!-- CALL label; RESTORE : filler/nop -->
|
||||||
<data>0x81c3e008 0x........ 0x00000000 0x00000000 0x00000000 0x00000000 </data> <!-- RETL : delayslot filler -->
|
<data>01...... 0x...... 0x9E 00010... 0x.... </data> <!-- CALL label; OR rs1,rs2,o7 : filler/nop -->
|
||||||
<data>0x81c3e008 0x........ 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 </data> <!-- RETL : delayslot filler -->
|
<data>01...... 0x...... 0x9E 00010... 0x.... 0000000. 0x000000 </data> <!-- CALL label; OR rs1,rs2,o7 : filler/nop -->
|
||||||
<data>0x81c3e008 0x........ 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 </data> <!-- RETL : delayslot filler -->
|
<data>0000000. 0x000000 0000000. 0x000000 </data> <!-- filler/nop -->
|
||||||
<data>0x81c3e008 0x........ 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 </data> <!-- RETL : delayslot filler -->
|
|
||||||
<data>0x81cfe008 0x........ </data> <!-- RETURN : delayslot filler -->
|
|
||||||
<data>0x81cfe008 0x........ 0x00000000 </data> <!-- RETURN : delayslot filler -->
|
|
||||||
<data>0x81cfe008 0x........ 0x00000000 0x00000000 </data> <!-- RETURN : delayslot filler -->
|
|
||||||
<data>0x81cfe008 0x........ 0x00000000 0x00000000 0x00000000 </data> <!-- RETURN : delayslot filler -->
|
|
||||||
<data>0x81cfe008 0x........ 0x00000000 0x00000000 0x00000000 0x00000000 </data> <!-- RETURN : delayslot filler -->
|
|
||||||
<data>0x81cfe008 0x........ 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 </data> <!-- RETURN : delayslot filler -->
|
|
||||||
<data>0x81cfe008 0x........ 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 </data> <!-- RETURN : delayslot filler -->
|
|
||||||
<data>0x81cfe008 0x........ 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 </data> <!-- RETURN : delayslot filler -->
|
|
||||||
</prepatterns>
|
</prepatterns>
|
||||||
<postpatterns>
|
<postpatterns>
|
||||||
<data>10011101 11100011 10111... ........</data> <!-- save sp, xx, sp -->
|
<data>10011101 11100011 10111... ........</data> <!-- save sp, xx, sp -->
|
||||||
|
Loading…
Reference in New Issue
Block a user