comparison Changes @ 377:b23568be1155

ARM continue (const table)
author kono
date Tue, 13 Jul 2004 21:43:58 +0900
parents d81e1be4036f
children b3c6c479c522
comparison
equal deleted inserted replaced
376:d81e1be4036f 377:b23568be1155
5770 r30 r1 5770 r30 r1
5771 5771
5772 とするのは、PowerPC では変更が大きすぎる。レジスタセーブする場所 5772 とするのは、PowerPC では変更が大きすぎる。レジスタセーブする場所
5773 が良くわからないし。 5773 が良くわからないし。
5774 5774
5775 もしかして、register save 領域は固定?! 5775 もしかして、register save 領域は固定?!
5776
5776 5777
5777 Mon Jul 12 05:35:33 JST 2004 5778 Mon Jul 12 05:35:33 JST 2004
5778 5779
5779 うーん、やっぱり、難しいよな... 何故か、printf が local variable 5780 うーん、やっぱり、難しいよな... 何故か、printf が local variable
5780 を壊してしまう。 5781 を壊してしまう。
5781 5782
5783 register save 領域は固定なわけきゃないだろ。最初からやり直して、
5784
5785 function call stack frame
5786 <-------r1_offset------------------------------>
5787 <------------lvar_offset0------>
5788 <--lvar_offset-->
5789 r+ +------------+---+---------------+----------+--------------+----+ -
5790 callee arg xx register save local caller arg xx
5791 reg_save disp max_func_args*SIZE_OF_INT
5792 lvar>0 lvar<0 lvar>0x1000 0000
5793
5794 ということになりました。frame の設定のところだけ無条件に32bit add
5795 になったが仕方ないな。これだと、callee arg は不定オフセットにならざる
5796 を得ない。reg_save が最後まで決まらないから。
5797
5782 はぁ。大変なのはPowerPCだけで、MIPSとia32 は、そのまま動くというのが 5798 はぁ。大変なのはPowerPCだけで、MIPSとia32 は、そのまま動くというのが
5783 わかりました。 5799 わかりました。
5800
5801 Mon Jul 12 12:54:14 JST 2004
5802
5803 が、結局、MIPSを $fp からの裸オフセットにするのは苦労したね。
5804 .frame $fp じゃなくて、 .frame $sp にすると動くのか。
5805 あと、goto 関連は、
5806 code_environment
5807 code_fix_frame_pointer
5808 leave
5809 の三つを直さないとだめなのね。
5810
5811 この変更は、ARMのオフセット計算を固定オフセットで行うために
5812 やっているんだけど、ARMのレジスタセーブを固定領域にすれば、
5813 あるいは、どこかに追いやれば、callee arg も含めて固定に出来
5814 るはず。
5815
5816
5817 なんか浮動小数点レジスタは f4 だけみたいね。
5818
5819 mov ip, sp
5820 stmfd sp!, {r4, r5, r6, r7, r8, r9, sl, fp, ip, lr, pc}
5821 sub fp, ip, #4
5822 sub sp, sp, #12
5823 .L3:
5824 ldmea fp, {r4, r5, r6, r7, r8, r9, sl, fp, sp, pc}
5825 .Lfe1:
5826
5827 まるで、6809 の PSHS X,Y,D だね。PULS X,PC とか。
5828
5829 なんだけど、これだと、
5830
5831 <-------r1_offset------------------------------>
5832 <------------lvar_offset0------>
5833 <--lvar_offset-->
5834 r+ +------------+---+---------------+----------+--------------+----+ -
5835 callee arg xx register save local caller arg xx
5836 reg_save disp max_func_args*SIZE_OF_INT
5837 lvar>0 lvar<0 lvar>0x1000 0000
5838
5839 にならざるを得ない。となると、どっちかは、不定オフセットだな。
5840 ま、callee 側でしょう。ま、これに習うか。あるいは、ポインタ
5841 で指してもいいんだよね。ていうか、reg_save に関わらず決まった領域
5842 をとっちゃえばいいんじゃない? 大した量じゃないし。浮動小数点
5843 レジスタも一つだしね。
5844
5845 もう少しかかりそうだね。