page0027
の編集
http://osecpu.osask.jp/wiki/?page0027
[
トップ
] [
編集
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
BracketName
FormattingRules
FrontPage
Fulyn
Fulyn-v2
Fulyn_Samples
Help
InterWiki
InterWikiName
InterWikiSandBox
K
KOR_PIT8254
KWVM.NET
Liva
MANA
MenuBar
OSECPU_FPGA
PG_MANA
PHP
PukiWiki
PukiWiki/1.4
PukiWiki/1.4/Manual
PukiWiki/1.4/Manual/Plugin
PukiWiki/1.4/Manual/Plugin/A-D
PukiWiki/1.4/Manual/Plugin/E-G
PukiWiki/1.4/Manual/Plugin/H-K
PukiWiki/1.4/Manual/Plugin/L-N
PukiWiki/1.4/Manual/Plugin/O-R
PukiWiki/1.4/Manual/Plugin/S-U
PukiWiki/1.4/Manual/Plugin/V-Z
RecentDeleted
SandBox
WikiEngines
WikiName
WikiWikiWeb
YukiWiki
hikalium
hikarupsp
hikarupsp_ELCHNOS
hikarupsp_ELCHNOS_IDE
hikarupsp_FrontEndCode
hikarupsp_WebCPU-VM
hikarupsp_WebCPU-VM_internal
hikarupsp_study_hh4
impressions
impressions0000
jpag0000
jpag0001
jpag0002
jpag0003
jpag0004
jpag0005
lambdalice
mandel59
members
memo0000
memo0001
memo0002
memo0003
memo0004
memo0005
memo0006
memo0007
memo0008
memo0009
memo0010
osask
osecpu4android
page0000
page0001
page0002
page0003
page0004
page0005
page0006
page0007
page0008
page0009
page0010
page0011
page0012
page0013
page0014
page0015
page0016
page0017
page0018
page0019
page0020
page0021
page0022
page0023
page0024
page0025
page0026
page0027
page0028
page0029
page0030
page0031
page0032
page0033
page0034
page0035
page0036
page0037
page0038
page0039
page0040
page0041
page0042
page0043
page0044
page0045
page0046
page0047
page0048
page0049
page0050
page0051
page0052
page0053
page0054
page0055
page0056
page0057
page0058
page0059
page0060
page0061
page0062
page0063
page0064
page0065
page0066
page0067
page0068
page0069
page0070
page0071
page0072
page0073
page0074
page0075
page0076
page0077
page0078
page0079
page0080
page0081
page0082
page0083
page0084
page0085
page0086
page0087
page0088
page0089
page0090
page0091
page0092
page0093
page0094
page0095
page0096
page0097
page0098
page0099
page0100
page0101
page0102
page0103
page0104
page0105
page0106
page0107
page0108
page0109
pagenames
populars
seccamp2013
seccamp2014
seccamp2017
ttwilb
ttwilb-asmi
yao
* 実レジスタ活用 -(by [[K]], 2013.04.20) ** もくてき -実レジスタを使ったらもっと速くなるんじゃないかという話。 ** こうさつ -(1) x86の32bitモードは、32bitレジスタが8本しかない。しかもそのうちの1つはスタックポインタで、自由には使えない。 --まずR00-R3F,P00-P1Fへのアクセスのためには、すくなくとも2つの作業用のレジスタが必要になる。LIMMとかADDとかだけならEAXだけで何とかなるけど、LMEMとかSMEMとかをやるときにはどうしてもEAXだけではうまくいかない。もう一つレジスタが必要になる。 ---それにシフト演算のときもCLを使う必要がある。 ---割り算をするときには、EDXを使う必要がある。 --実はosecpu027aでは、レジスタを結構雑に使っていて、他にもいろんなレジスタを汚してしまっている。反省。 -(2) いくつかのよく使う仮想レジスタを余った実レジスタに固定で割り振れるとしたら、なんかとっても速くなりそうな気はする。 --まあ実際のところは試してみないと分からないんだけど。 -ということで、思いっきりレジスタを節約する方向で考えてみる。 -まず、現在EBP上に展開しているレジスタイメージを、スタック上にコピーしてしまおう。そうすれば、EBPがあく。 --OSECPUは関数callなどをしても実CPUのスタックにリターンアドレスを積んだりはしないので、ESPが変化しない。だからこそできるテクニックだ。 -次にECX/EDXを必要とする命令は少数なので、これを特別扱いにして、それらの命令のときだけECX/EDXを仮想レジスタ域に退避して、そしてECX/EDXを使って目的を達して、その後にECX/EDXを復元する。 --こうすれば、ECX/EDXもあく。 -これで結局、EAXとESP以外のレジスタが使えて、ECX/EDXもまあまあ使えるということになる。5.5レジスタくらいというところかな。 --おお、これは結構いいんじゃないか? -(3) この5.5レジスタを、どのように割り振るべきかは意見の分かれるところだろうなあ。 --やっぱり使用頻度の高いレジスタに割り当てるべきなんだろうな。 --というかむしろ発想は逆で、実レジスタに割り当てることになったものを人間が積極的に使えばいいわけだ。OSECPUのアセンブラで。 --コンパイラとか使う人は、速度が大して重要じゃなくてとにかく楽して作ることを優先している人だから、その人のことを考える必要はない。 ---もし速度が出したくなったらそこだけアセンブラで書いてうまいレジスタの使い方をすればいいだけなんだから。 --ということで、こうしてみようかと検討中: R00 R01 R02 P01 P02 P03 EBX ECX EDX EBP ESI EDI --実レジスタと仮想レジスタが混ざるとJITコンパイラってどのくらいめんどくさくなるのかな。そんなに大変でもなさそうかな。適当に手抜きもできそうだ。 ---手抜き:EBX~EDIを一度スタック上に書き戻して従来の処理をして、またEBX~EDIに読み込む。 ---とりあえずこれをはさめば、少しずつ実レジスタ対応できる。 --やばいなー、なんだか超ワクワクしてきたぞ!(笑) -他のCPUのことも考えてコメントするとこんな感じ: --実レジスタに余裕のあるときは、以下の方針でレジスタを実レジスタ化します。 --P02,R00,P03,R01,P01,R02,P04,R03,P05,R04,P06,R05...の順に割り振ります。 --ポインタが若干優先されるのは、ポインタアクセスがボトルネックになりやすそうだという推測に基づきます。 --ポインタは、P02,P03,P01,P04,P05,P06,...の順に割り振ります。 ---P01よりもP02やP03が優先されるのは、P01がベースポインタであって用途が限定されるため、もっと汎用のものを優先した結果です。 ---ペースポインタ上にあるものを頻繁にアクセスする場合は、あえてP02=P01;としたあと、P02経由でアクセスすると、実レジスタ数の少ないCPUでも比較的高速に実行されるかもしれません。 --この方針は推奨されているだけであって義務ではありません。 ---実レジスタに余裕があっても、全部メモリ上に割り当ててもいいですし、JITCの実装の都合で他の割り当て方針でもかまいません。 ** こめんと欄 -このページにこめんと欄はありません。このページの内容にコメントしたいときは[[impressions]]にお願いします。
タイムスタンプを変更しない
* 実レジスタ活用 -(by [[K]], 2013.04.20) ** もくてき -実レジスタを使ったらもっと速くなるんじゃないかという話。 ** こうさつ -(1) x86の32bitモードは、32bitレジスタが8本しかない。しかもそのうちの1つはスタックポインタで、自由には使えない。 --まずR00-R3F,P00-P1Fへのアクセスのためには、すくなくとも2つの作業用のレジスタが必要になる。LIMMとかADDとかだけならEAXだけで何とかなるけど、LMEMとかSMEMとかをやるときにはどうしてもEAXだけではうまくいかない。もう一つレジスタが必要になる。 ---それにシフト演算のときもCLを使う必要がある。 ---割り算をするときには、EDXを使う必要がある。 --実はosecpu027aでは、レジスタを結構雑に使っていて、他にもいろんなレジスタを汚してしまっている。反省。 -(2) いくつかのよく使う仮想レジスタを余った実レジスタに固定で割り振れるとしたら、なんかとっても速くなりそうな気はする。 --まあ実際のところは試してみないと分からないんだけど。 -ということで、思いっきりレジスタを節約する方向で考えてみる。 -まず、現在EBP上に展開しているレジスタイメージを、スタック上にコピーしてしまおう。そうすれば、EBPがあく。 --OSECPUは関数callなどをしても実CPUのスタックにリターンアドレスを積んだりはしないので、ESPが変化しない。だからこそできるテクニックだ。 -次にECX/EDXを必要とする命令は少数なので、これを特別扱いにして、それらの命令のときだけECX/EDXを仮想レジスタ域に退避して、そしてECX/EDXを使って目的を達して、その後にECX/EDXを復元する。 --こうすれば、ECX/EDXもあく。 -これで結局、EAXとESP以外のレジスタが使えて、ECX/EDXもまあまあ使えるということになる。5.5レジスタくらいというところかな。 --おお、これは結構いいんじゃないか? -(3) この5.5レジスタを、どのように割り振るべきかは意見の分かれるところだろうなあ。 --やっぱり使用頻度の高いレジスタに割り当てるべきなんだろうな。 --というかむしろ発想は逆で、実レジスタに割り当てることになったものを人間が積極的に使えばいいわけだ。OSECPUのアセンブラで。 --コンパイラとか使う人は、速度が大して重要じゃなくてとにかく楽して作ることを優先している人だから、その人のことを考える必要はない。 ---もし速度が出したくなったらそこだけアセンブラで書いてうまいレジスタの使い方をすればいいだけなんだから。 --ということで、こうしてみようかと検討中: R00 R01 R02 P01 P02 P03 EBX ECX EDX EBP ESI EDI --実レジスタと仮想レジスタが混ざるとJITコンパイラってどのくらいめんどくさくなるのかな。そんなに大変でもなさそうかな。適当に手抜きもできそうだ。 ---手抜き:EBX~EDIを一度スタック上に書き戻して従来の処理をして、またEBX~EDIに読み込む。 ---とりあえずこれをはさめば、少しずつ実レジスタ対応できる。 --やばいなー、なんだか超ワクワクしてきたぞ!(笑) -他のCPUのことも考えてコメントするとこんな感じ: --実レジスタに余裕のあるときは、以下の方針でレジスタを実レジスタ化します。 --P02,R00,P03,R01,P01,R02,P04,R03,P05,R04,P06,R05...の順に割り振ります。 --ポインタが若干優先されるのは、ポインタアクセスがボトルネックになりやすそうだという推測に基づきます。 --ポインタは、P02,P03,P01,P04,P05,P06,...の順に割り振ります。 ---P01よりもP02やP03が優先されるのは、P01がベースポインタであって用途が限定されるため、もっと汎用のものを優先した結果です。 ---ペースポインタ上にあるものを頻繁にアクセスする場合は、あえてP02=P01;としたあと、P02経由でアクセスすると、実レジスタ数の少ないCPUでも比較的高速に実行されるかもしれません。 --この方針は推奨されているだけであって義務ではありません。 ---実レジスタに余裕があっても、全部メモリ上に割り当ててもいいですし、JITCの実装の都合で他の割り当て方針でもかまいません。 ** こめんと欄 -このページにこめんと欄はありません。このページの内容にコメントしたいときは[[impressions]]にお願いします。
テキスト整形のルールを表示する