diff --git a/data/languages/xtensa.sinc b/data/languages/xtensa.sinc index 0d269ac..5260c3a 100644 --- a/data/languages/xtensa.sinc +++ b/data/languages/xtensa.sinc @@ -4,6 +4,13 @@ define alignment=1; define space ram type=ram_space size=4 default; define space register type=register_space size=4; define space special_register type=ram_space size=4; +define space save_register type=ram_space size=4; + +# Address registers (AR). +define save_register offset=0x0000 size=4 [ + sa0 sa1 sa2 sa3 sa4 sa5 sa6 sa7 sa8 sa9 sa10 sa11 sa12 sa13 sa14 sa15 +]; + # Address registers (AR). define register offset=0x0000 size=4 [ diff --git a/data/languages/xtensaTodo.sinc b/data/languages/xtensaTodo.sinc index a27e51a..c40177c 100644 --- a/data/languages/xtensaTodo.sinc +++ b/data/languages/xtensaTodo.sinc @@ -11,6 +11,22 @@ macro popVal(val32) { } +macro save() { + sa3 = a3; + sa4 = a4; + sa5 = a5; + sa6 = a6; + sa7 = a7; +} + +macro restore() { + a3 = sa3; + a4 = sa4; + a5 = sa5; + a6 = sa6; + a7 = sa7; +} + ## Windowed Register Option ## @@ -28,6 +44,7 @@ macro popVal(val32) { # 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 { local dst = srel_6.23_sb2; + save(); #s2=a2; #s3=a3; #s4=a4; @@ -42,6 +59,7 @@ macro popVal(val32) { a7=a15; a0 = inst_start + 3; call [dst]; + restore(); } # CALL12 - Call PC-relative, Rotate Window by 12, pg. 302.