a21_txt02_10b
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* 「10日くらいでできる!プログラミング言語自作入門」の続...
-(by [[K]], 2021.05.13)
** (1) HL-20b
-HL-20aでレジスタ変数の扱いがまともになって、きっと実行速...
|[[a21_txt02_4]]|HL-14|RIGHT:865行|RIGHT:21.5KB|レジスタ...
|[[a21_txt02_4a]]|HL-14a|RIGHT:906行|RIGHT:22.5KB|レジス...
||||||||
|[[a21_txt02_10]]|HL-20|RIGHT:964行|RIGHT:36.0KB|レジスタ...
|[[a21_txt02_10a]]|HL-20a|RIGHT:1014行|RIGHT:37.0KB|レジ...
-これはおそらく「コードアライン」ということをちゃんとやっ...
-[1]defLabel()関数を以下のものと差し替え
int align;
void defLabel(int i)
{
+ if (align > 0) {
+ int j = (icq - ic) & 15; // 0-15.
+ if (j > 0 && j <= 7) {
+ putIcX64("66_0f_1f_84_00_00_00_00_00", 0, 0,...
+ j = (j + 9) & 15;
+ }
+ if (j > 0) { // 8-15.
+ static char *table[8] = {
+ "0f_1f_84_00_00_00_00_00", "0f_1f_80_00_...
+ "66_0f_1f_44_00_00", "0f_1f_44_00_00", "...
+ };
+ putIcX64(table[j - 8], 0, 0, 0, 0);
+ }
+ align--;
+ }
var[i] = icq - ic;
}
-[2]compile()関数に以下を追加
+ } else if (phrCmp(39, "align();", pc)) {
+ align = 1;
+ } else if (phrCmp(40, "align(!!*0);", pc)) {
+ align = var[tc[wpc[0]]];
----
-以上すべての改造を終えると、プログラムは1035行になります。
** (3) プログラムの説明
-これはx64に限らないのですが、多くのCPUでは分岐先のアドレ...
-ということで必要な時に最高速度が出せるように、必要に応じ...
-align命令でアライン機能が有効な時は、defLabel()するとき...
-x64のアライン用のNOP命令(ちなみにx86でも同じです)
|1バイトのNOP|90;|
|2バイトのNOP|66_90;|
|3バイトのNOP|0f_1f_00;|
|4バイトのNOP|0f_1f_40_00;|
|5バイトのNOP|0f_1f_44_00_00;|
|6バイトのNOP|66_0f_1f_44_00_00;|
|7バイトのNOP|0f_1f_80_00_00_00_00;|
|8バイトのNOP|0f_1f_84_00_00_00_00_00;|
|9バイトのNOP|66_0f_1f_84_00_00_00_00_00;|
-align()命令では、カッコ内に数値を書かなければ、次の1つの...
-10億回ループのプログラムをrunする前に、align(100);とかを...
** (4) 効果の確認
|[[a21_txt02_10]]|HL-20|RIGHT:964行|RIGHT:36.0KB|レジスタ...
|[[a21_txt02_10a]]|HL-20a|RIGHT:1014行|RIGHT:37.0KB|レジ...
|[[a21_txt02_10b]]|HL-20b|RIGHT:1035行|RIGHT:37.5KB|アラ...
** 次回に続く
-次回: [[a21_txt02_11]]
*こめんと欄
#comment
終了行:
* 「10日くらいでできる!プログラミング言語自作入門」の続...
-(by [[K]], 2021.05.13)
** (1) HL-20b
-HL-20aでレジスタ変数の扱いがまともになって、きっと実行速...
|[[a21_txt02_4]]|HL-14|RIGHT:865行|RIGHT:21.5KB|レジスタ...
|[[a21_txt02_4a]]|HL-14a|RIGHT:906行|RIGHT:22.5KB|レジス...
||||||||
|[[a21_txt02_10]]|HL-20|RIGHT:964行|RIGHT:36.0KB|レジスタ...
|[[a21_txt02_10a]]|HL-20a|RIGHT:1014行|RIGHT:37.0KB|レジ...
-これはおそらく「コードアライン」ということをちゃんとやっ...
-[1]defLabel()関数を以下のものと差し替え
int align;
void defLabel(int i)
{
+ if (align > 0) {
+ int j = (icq - ic) & 15; // 0-15.
+ if (j > 0 && j <= 7) {
+ putIcX64("66_0f_1f_84_00_00_00_00_00", 0, 0,...
+ j = (j + 9) & 15;
+ }
+ if (j > 0) { // 8-15.
+ static char *table[8] = {
+ "0f_1f_84_00_00_00_00_00", "0f_1f_80_00_...
+ "66_0f_1f_44_00_00", "0f_1f_44_00_00", "...
+ };
+ putIcX64(table[j - 8], 0, 0, 0, 0);
+ }
+ align--;
+ }
var[i] = icq - ic;
}
-[2]compile()関数に以下を追加
+ } else if (phrCmp(39, "align();", pc)) {
+ align = 1;
+ } else if (phrCmp(40, "align(!!*0);", pc)) {
+ align = var[tc[wpc[0]]];
----
-以上すべての改造を終えると、プログラムは1035行になります。
** (3) プログラムの説明
-これはx64に限らないのですが、多くのCPUでは分岐先のアドレ...
-ということで必要な時に最高速度が出せるように、必要に応じ...
-align命令でアライン機能が有効な時は、defLabel()するとき...
-x64のアライン用のNOP命令(ちなみにx86でも同じです)
|1バイトのNOP|90;|
|2バイトのNOP|66_90;|
|3バイトのNOP|0f_1f_00;|
|4バイトのNOP|0f_1f_40_00;|
|5バイトのNOP|0f_1f_44_00_00;|
|6バイトのNOP|66_0f_1f_44_00_00;|
|7バイトのNOP|0f_1f_80_00_00_00_00;|
|8バイトのNOP|0f_1f_84_00_00_00_00_00;|
|9バイトのNOP|66_0f_1f_84_00_00_00_00_00;|
-align()命令では、カッコ内に数値を書かなければ、次の1つの...
-10億回ループのプログラムをrunする前に、align(100);とかを...
** (4) 効果の確認
|[[a21_txt02_10]]|HL-20|RIGHT:964行|RIGHT:36.0KB|レジスタ...
|[[a21_txt02_10a]]|HL-20a|RIGHT:1014行|RIGHT:37.0KB|レジ...
|[[a21_txt02_10b]]|HL-20b|RIGHT:1035行|RIGHT:37.5KB|アラ...
** 次回に続く
-次回: [[a21_txt02_11]]
*こめんと欄
#comment
ページ名: