Mercurial > hg > CbC > old > device
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 もう少しかかりそうだね。 |