forked from yath/ghidra-xtensa
Improved stack allocation on enter
This commit is contained in:
@@ -1,3 +1,17 @@
|
|||||||
|
macro pushVal(val32) {
|
||||||
|
local addr:4 = a1;
|
||||||
|
a1 = a1 - 4;
|
||||||
|
*:4 addr = val32;
|
||||||
|
}
|
||||||
|
|
||||||
|
macro popVal(val32) {
|
||||||
|
local addr:4 = a1;
|
||||||
|
val32 = *:4 addr;
|
||||||
|
a1 = a1 + 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Windowed Register Option ##
|
## Windowed Register Option ##
|
||||||
|
|
||||||
# CALL4 - Call PC-relative, Rotate Window by 4, pg. 298.
|
# CALL4 - Call PC-relative, Rotate Window by 4, pg. 298.
|
||||||
@@ -14,6 +28,12 @@
|
|||||||
# CALL8 - Call PC-relative, Rotate Window by 8, pg. 300.
|
# CALL8 - Call PC-relative, Rotate Window by 8, pg. 300.
|
||||||
:call8 srel_6.23_sb2 is srel_6.23_sb2 & u2_4.5 = 0b10 & op0 = 0b0101 {
|
:call8 srel_6.23_sb2 is srel_6.23_sb2 & u2_4.5 = 0b10 & op0 = 0b0101 {
|
||||||
local dst = srel_6.23_sb2;
|
local dst = srel_6.23_sb2;
|
||||||
|
#s2=a2;
|
||||||
|
#s3=a3;
|
||||||
|
#s4=a4;
|
||||||
|
#s5=a5;
|
||||||
|
#s6=a6;
|
||||||
|
#s7=a7;
|
||||||
a2=a10;
|
a2=a10;
|
||||||
a3=a11;
|
a3=a11;
|
||||||
a4=a12;
|
a4=a12;
|
||||||
@@ -35,8 +55,10 @@
|
|||||||
|
|
||||||
# ENTRY - Subroutine Entry, pg. 340.
|
# ENTRY - Subroutine Entry, pg. 340.
|
||||||
:entry as, u15_12.23_sb3 is u15_12.23_sb3 & as & u2_6.7 = 0b00 & u2_4.5 = 0b11 & op0 = 0b0110 {
|
:entry as, u15_12.23_sb3 is u15_12.23_sb3 & as & u2_6.7 = 0b00 & u2_4.5 = 0b11 & op0 = 0b0110 {
|
||||||
#local amn = sext(u15_12.23_sb3);
|
local amn = sext(u15_12.23_sb3);
|
||||||
#as = as + amn;
|
#as = as + amn;
|
||||||
|
WindowBase = amn;
|
||||||
|
a1 = a1 - amn;
|
||||||
}
|
}
|
||||||
|
|
||||||
# if (u15_12.23_sb3 ==4)
|
# if (u15_12.23_sb3 ==4)
|
||||||
@@ -94,6 +116,12 @@
|
|||||||
# CALLX8 - Call Register, Rotate Window by 8, pg. 307.
|
# CALLX8 - Call Register, Rotate Window by 8, pg. 307.
|
||||||
:callx8 as is op2 = 0 & op1 = 0 & ar = 0 & as & u2_6.7 = 0b11 & u2_4.5 = 0b10 & op0 = 0 {
|
:callx8 as is op2 = 0 & op1 = 0 & ar = 0 & as & u2_6.7 = 0b11 & u2_4.5 = 0b10 & op0 = 0 {
|
||||||
local dst = as;
|
local dst = as;
|
||||||
|
#s2=a2;
|
||||||
|
#s3=a3;
|
||||||
|
#s4=a4;
|
||||||
|
#s5=a5;
|
||||||
|
#s6=a6;
|
||||||
|
#s7=a7;
|
||||||
a2=a10;
|
a2=a10;
|
||||||
a3=a11;
|
a3=a11;
|
||||||
a4=a12;
|
a4=a12;
|
||||||
@@ -123,6 +151,20 @@
|
|||||||
|
|
||||||
# RETW - Windowed Return, pg. 480.
|
# RETW - Windowed Return, pg. 480.
|
||||||
:retw is op2 = 0 & op1 = 0 & ar = 0 & as = 0 & u2_6.7 = 0b10 & u2_4.5 = 0b01 & op0 = 0 {
|
:retw is op2 = 0 & op1 = 0 & ar = 0 & as = 0 & u2_6.7 = 0b10 & u2_4.5 = 0b01 & op0 = 0 {
|
||||||
|
# Assume call8
|
||||||
|
a10=a2;
|
||||||
|
a11=a3;
|
||||||
|
a12=a4;
|
||||||
|
a13=a5;
|
||||||
|
a14=a6;
|
||||||
|
a15=a7;
|
||||||
|
#a2=s2;
|
||||||
|
#a3=s3;
|
||||||
|
#a4=s4;
|
||||||
|
#a5=s5;
|
||||||
|
#a6=s6;
|
||||||
|
#a7=s7;
|
||||||
|
a1 = a1 + WindowBase;
|
||||||
return [a0];
|
return [a0];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -134,6 +176,7 @@
|
|||||||
a13=a5;
|
a13=a5;
|
||||||
a14=a6;
|
a14=a6;
|
||||||
a15=a7;
|
a15=a7;
|
||||||
|
a1 = a1 + WindowBase;
|
||||||
return [a0];
|
return [a0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user