<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
		<id>https://is.zng.info/wiki/experiment/index.php?feed=atom&amp;namespace=0&amp;title=%E7%89%B9%E5%88%A5%3A%E6%96%B0%E3%81%97%E3%81%84%E3%83%9A%E3%83%BC%E3%82%B8</id>
		<title>IS2005 Wiki (CPU実験) - 新しいページ [ja]</title>
		<link rel="self" type="application/atom+xml" href="https://is.zng.info/wiki/experiment/index.php?feed=atom&amp;namespace=0&amp;title=%E7%89%B9%E5%88%A5%3A%E6%96%B0%E3%81%97%E3%81%84%E3%83%9A%E3%83%BC%E3%82%B8"/>
		<link rel="alternate" type="text/html" href="https://is.zng.info/wiki/experiment/index.php/%E7%89%B9%E5%88%A5:%E6%96%B0%E3%81%97%E3%81%84%E3%83%9A%E3%83%BC%E3%82%B8"/>
		<updated>2026-04-07T09:04:31Z</updated>
		<subtitle>提供: IS2005 Wiki (CPU実験)</subtitle>
		<generator>MediaWiki 1.25.2</generator>

	<entry>
		<id>https://is.zng.info/wiki/experiment/index.php/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</id>
		<title>メインページ</title>
		<link rel="alternate" type="text/html" href="https://is.zng.info/wiki/experiment/index.php/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8"/>
				<updated>2015-11-29T06:36:05Z</updated>
		
		<summary type="html">&lt;p&gt;Maintenance script: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== News ==&lt;br /&gt;
&lt;br /&gt;
* 10月13日、なんでもセミナー発表資料を追加しました。&lt;br /&gt;
* 5月19日、スケジューラが改良され、実機にて実行したところ、 21.951s を記録し、CPU実験の歴代記録を更新しました。&lt;br /&gt;
* 5月18日、コンパイラにスケジューラが搭載され、実機にて実行したところ、 22.463s を記録し、CPU実験の歴代記録における首位の座を奪還いたしました。&lt;br /&gt;
&lt;br /&gt;
== Table of Contents ==&lt;br /&gt;
&lt;br /&gt;
*[[命令セット|命令セット [1x]]]&lt;br /&gt;
*[[命令セット(ドラフト)|命令セット [2x]]]&lt;br /&gt;
*[[プロセッサ|プロセッサ [1x]]]&lt;br /&gt;
*[[プロセッサ 2x|プロセッサ [2x]]]&lt;br /&gt;
*[[コンパイラ]]&lt;br /&gt;
*[[シミュレータ]]&lt;br /&gt;
*[[アセンブラ]]&lt;br /&gt;
*[[ライブラリ]]&lt;/div&gt;</summary>
		<author><name>MediaWiki default</name></author>	</entry>

	<entry>
		<id>https://is.zng.info/wiki/experiment/index.php/%E9%80%A3%E7%B5%A1%E5%85%88</id>
		<title>連絡先</title>
		<link rel="alternate" type="text/html" href="https://is.zng.info/wiki/experiment/index.php/%E9%80%A3%E7%B5%A1%E5%85%88"/>
				<updated>2015-11-29T06:11:34Z</updated>
		
		<summary type="html">&lt;p&gt;Maintenance script: ページの作成:「;平野貴仁:hiranotaka@zng.info  ;木戸浩正:hkido@is.s.u-tokyo.ac.jp  ;高山健志:kenshi@is.s.u-tokyo.ac.jp  ;letter:hogerappa@gmail.com」&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;;平野貴仁:hiranotaka@zng.info&lt;br /&gt;
;木戸浩正:hkido@is.s.u-tokyo.ac.jp&lt;br /&gt;
;高山健志:kenshi@is.s.u-tokyo.ac.jp&lt;br /&gt;
;letter:hogerappa@gmail.com&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>	</entry>

	<entry>
		<id>https://is.zng.info/wiki/experiment/index.php/%E5%91%BD%E4%BB%A4%E3%82%BB%E3%83%83%E3%83%88(%E3%83%89%E3%83%A9%E3%83%95%E3%83%88)</id>
		<title>命令セット(ドラフト)</title>
		<link rel="alternate" type="text/html" href="https://is.zng.info/wiki/experiment/index.php/%E5%91%BD%E4%BB%A4%E3%82%BB%E3%83%83%E3%83%88(%E3%83%89%E3%83%A9%E3%83%95%E3%83%88)"/>
				<updated>2015-11-29T06:11:34Z</updated>
		
		<summary type="html">&lt;p&gt;Maintenance script: ページの作成:「== 重要な変更点(予定) ==    以降の内容でほぼ本番命令セットの仕様として決定です(問題があれば速やかに変更します)。当情報...」&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 重要な変更点(予定) ==&lt;br /&gt;
&lt;br /&gt;
以降の内容でほぼ本番命令セットの仕様として決定です(問題があれば速やかに変更します)。当情報を利用してコンパイラを開発していただけるとありがたいです。&lt;br /&gt;
&lt;br /&gt;
* レジスタ本数を64本に増強します。&lt;br /&gt;
* 即値分岐命令を追加します。&lt;br /&gt;
* 次の命令と依存関係がなければ、浮動小数点命令がパイプライン処理されるようになります。したがって、浮動小数点命令と&amp;#039;&amp;#039;&amp;#039;続く命令に依存関係がないように配置するとパフォーマンスが向上します。&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* 遅延LOAD命令を、パイプライン処理に対応させ、即時LOAD命令に改正しますが、制約上、引き続き&amp;#039;&amp;#039;&amp;#039;次の命令と依存関係がないように配置するとパフォーマンスが向上します。&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;3/7: &amp;#039;&amp;#039;&amp;#039;ALU最適化のためfunctを変更しました。&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;3/7: &amp;#039;&amp;#039;&amp;#039;GET/PUT命令について注釈を追加しました。&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;3/7: &amp;#039;&amp;#039;&amp;#039;擬似ニーモニックを修正しました。&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;3/12: &amp;#039;&amp;#039;&amp;#039;所要クロックを追加しました。&lt;br /&gt;
&lt;br /&gt;
== フォーマット ==&lt;br /&gt;
命令は、次の3種類の形式のいずれかとする。&lt;br /&gt;
&lt;br /&gt;
* 0形 : op(4) | rs(6) | rt(6) | rd(6) | 00 | fnct(8)&lt;br /&gt;
* 1形 : op(4) | rs(6) | rt(6) | oft(16)&lt;br /&gt;
* 2形 : op(4) | rs(6) | opt(6) | oft(16)&lt;br /&gt;
&lt;br /&gt;
r0はゼロレジスタ、r1はスタックポインタ、r2はヒープポインタ、r31はリンクレジスタとして使用するが、実体はすべて汎用レジスタであり、実際にはどのレジスタをリンクレジスタにすることもできるし、ゼロレジスタにゼロでない数を代入することもできる。&lt;br /&gt;
&lt;br /&gt;
アセンブリ表記(以降S表記)での指定順は、0タイプ二項演算ではop rd rs rt、同じく0タイプ一項演算ではop rd rs、0タイプシフト演算bではop rd rs shft、1タイプ演算および保存復元ではop rt rs oft、1タイプ条件分岐ではop rs rt oft、2タイプ条件分岐ではop rs opt oftの順とする(アセンブリにしたときに直感的に理解しやすい順序にしたつもり)。&lt;br /&gt;
&lt;br /&gt;
== リスト ==&lt;br /&gt;
=== op一覧 ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|op  ||C表記                        ||S表記||所要&lt;br /&gt;
|-&lt;br /&gt;
|0000||rt = rs + oft;               ||ADDI ||1&lt;br /&gt;
|-&lt;br /&gt;
|0001||rd = fnct(rs, rt);           ||-    ||-&lt;br /&gt;
|-&lt;br /&gt;
|0010||rt = *(rs + oft);            ||LOAD ||hit:2,miss:5(pipelined)&lt;br /&gt;
|-&lt;br /&gt;
|0011||*(rs + oft) = rt;            ||STORE||1&lt;br /&gt;
|-&lt;br /&gt;
|0100||if (rs == opt) pc += oft + 1;||BEI  ||true:3,false:1&lt;br /&gt;
|-&lt;br /&gt;
|0101||if (rs != opt) pc += oft + 1;||BNEI ||true:3,false:1&lt;br /&gt;
|-&lt;br /&gt;
|0110||if (rs &amp;lt; opt) pc += oft + 1; ||BLI  ||true:3,false:1&lt;br /&gt;
|-&lt;br /&gt;
|0111||if (rs &amp;gt;= opt) pc += oft + 1;||BGEI ||true:3,false:1&lt;br /&gt;
|-&lt;br /&gt;
|1000||if (rs == rt) pc += oft + 1; ||BE   ||true:3,false:1&lt;br /&gt;
|-&lt;br /&gt;
|1001||if (rs != rt) pc += oft + 1; ||BNE  ||true:3,false:1&lt;br /&gt;
|-&lt;br /&gt;
|1010||if (rs &amp;lt; rt) pc += oft + 1;  ||BL   ||true:3,false:1&lt;br /&gt;
|-&lt;br /&gt;
|1011||if (rs &amp;gt;= rt) pc += oft + 1; ||BGE  ||true:3,false:1&lt;br /&gt;
|-&lt;br /&gt;
|1100||if (rs &amp;lt; rt) pc += oft + 1;  ||FBL  ||true:3,false:1&lt;br /&gt;
|-&lt;br /&gt;
|1101||if (rs &amp;gt;= rt) pc += oft + 1; ||FBGE ||true:3,false:1&lt;br /&gt;
|-&lt;br /&gt;
|1110||rt = pc + 1, pc += oft + 1;  ||JAL  ||3&lt;br /&gt;
|-&lt;br /&gt;
|1111||pc = rs + oft;               ||JR   ||3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== fnct一覧 ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|fnct     ||C表記           ||S表記||意味            　||所要&lt;br /&gt;
|-&lt;br /&gt;
|00000000 ||rd = rs + rt;   ||ADD  ||整数加算          ||1&lt;br /&gt;
|-&lt;br /&gt;
|00010000 ||rd = rs - rt;   ||SUB  ||整数減算          ||1&lt;br /&gt;
|-&lt;br /&gt;
|001[shft]||rd = rs &amp;lt;&amp;lt; shft;||SLL  ||左算術シフト      ||1&lt;br /&gt;
|-&lt;br /&gt;
|010[shft]||rd = rs &amp;gt;&amp;gt; shft;||SRR  ||右算術シフト      ||1&lt;br /&gt;
|-&lt;br /&gt;
|01100000 ||rd = rs &amp;amp; rt;   ||AND  ||論理積            ||1&lt;br /&gt;
|-&lt;br /&gt;
|01100100 ||rd = rs | rt;   ||OR   ||論理和            ||1&lt;br /&gt;
|-&lt;br /&gt;
|01101000 ||rd = rs ^ rt;   ||XOR  ||排他的論理和      ||1&lt;br /&gt;
|-&lt;br /&gt;
|01101100 ||rd = ~rs ^ rt;  ||XNOR ||否定排他的論理和  ||1&lt;br /&gt;
|-&lt;br /&gt;
|01110000 ||rd = getc();    ||GET  ||入力              ||1&lt;br /&gt;
|-&lt;br /&gt;
|01111000 ||rd = putc(rs);  ||PUT  ||出力              ||1&lt;br /&gt;
|-&lt;br /&gt;
|10000000 ||rd = rs + rt;   ||FADD ||浮動小数点数加算  ||3(pipelined)&lt;br /&gt;
|-&lt;br /&gt;
|10010000 ||rd = rs - rt;   ||FSUB ||浮動小数点数減算  ||3(pipelined)&lt;br /&gt;
|-&lt;br /&gt;
|10100000 ||rd = rs * rt;   ||FMUL ||浮動小数点数乗算  ||3(pipelined)&lt;br /&gt;
|-&lt;br /&gt;
|11000000 ||rd = 1 / rs;    ||FINV ||浮動小数点数逆数  ||4(pipelined)&lt;br /&gt;
|-&lt;br /&gt;
|11100000 ||rd = sqrt(rs);  ||FSQRT||浮動小数点数平方根||4(pipelined)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;注意: GET/PUT命令は、EOF(-1)を返す場合があります。&amp;#039;&amp;#039;&amp;#039;これは、バッファアンダーラン・オーバーフローを意味します。&amp;#039;&amp;#039;&amp;#039;負値を返した場合は、命令を繰り返してください。&amp;#039;&amp;#039;&amp;#039;つまり、次の例のように使ってください。&lt;br /&gt;
&lt;br /&gt;
 repeat:&lt;br /&gt;
         PUT r29 r19&lt;br /&gt;
         BLI r29 0 repeat&lt;br /&gt;
&lt;br /&gt;
=== 擬似mnemonic一覧 ===&lt;br /&gt;
&lt;br /&gt;
次のニーモニックは、プロセッサは対応しないが、アセンブラが変換する。&lt;br /&gt;
&lt;br /&gt;
*NOT&lt;br /&gt;
*FDIV (非推奨)&lt;br /&gt;
*SUBI&lt;br /&gt;
*BGI&lt;br /&gt;
*BLEI&lt;br /&gt;
*BG&lt;br /&gt;
*BLE&lt;br /&gt;
*FBE&lt;br /&gt;
*FBNE&lt;br /&gt;
*FBG&lt;br /&gt;
*FBLE&lt;br /&gt;
*JUMP&lt;br /&gt;
*NOP&lt;br /&gt;
*HLT&lt;br /&gt;
&lt;br /&gt;
== スモークテスト ==&lt;br /&gt;
 ; フィボナッチ数列を求める&lt;br /&gt;
 ; r0 = ゼロレジスタ, r1 = スタックポインタ&lt;br /&gt;
 ; r2 = 引数値 n, r3 = 関数値 fib(n)&lt;br /&gt;
 	rd r2&lt;br /&gt;
 	jal fib&lt;br /&gt;
 	wr r3&lt;br /&gt;
 	srr r5 r3 8&lt;br /&gt;
 	wr r5&lt;br /&gt;
 	srr r5 r3 16&lt;br /&gt;
 	wr r5&lt;br /&gt;
 	srr r5 r3 24&lt;br /&gt;
 	wr r5&lt;br /&gt;
 hlt:	&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	be r0 r0 hlt&lt;br /&gt;
 fib:	&lt;br /&gt;
 	bl r2 3 one&lt;br /&gt;
 	addi r2 r2 -1&lt;br /&gt;
 	addi r5 r2 -1&lt;br /&gt;
 	addi r1 r1 -2&lt;br /&gt;
 	store r5 r1 0&lt;br /&gt;
 	store r31 r1 1&lt;br /&gt;
 	jal fib&lt;br /&gt;
 	load r2 r1 0&lt;br /&gt;
 	store r3 r1 0&lt;br /&gt;
 	jal fib&lt;br /&gt;
 	load r5 r1 0&lt;br /&gt;
 	load r31 r1 1&lt;br /&gt;
 	addi r1 r1 2&lt;br /&gt;
 	add r3 r3 r5&lt;br /&gt;
 	jr r31&lt;br /&gt;
 one:	&lt;br /&gt;
 	addi r3 r0 1&lt;br /&gt;
 	jr r31&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>	</entry>

	<entry>
		<id>https://is.zng.info/wiki/experiment/index.php/%E5%91%BD%E4%BB%A4%E3%82%BB%E3%83%83%E3%83%88</id>
		<title>命令セット</title>
		<link rel="alternate" type="text/html" href="https://is.zng.info/wiki/experiment/index.php/%E5%91%BD%E4%BB%A4%E3%82%BB%E3%83%83%E3%83%88"/>
				<updated>2015-11-29T06:11:34Z</updated>
		
		<summary type="html">&lt;p&gt;Maintenance script: ページの作成:「== フォーマット ==  32bit固定長で、レジスタを32本とする(整数と浮動小数点数の共用)。    命令は、次の3種類の形式のいずれか...」&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== フォーマット ==&lt;br /&gt;
32bit固定長で、レジスタを32本とする(整数と浮動小数点数の共用)。&lt;br /&gt;
&lt;br /&gt;
命令は、次の3種類の形式のいずれかとする。&lt;br /&gt;
&lt;br /&gt;
* R形 : op(6) | rs(5) | rt(5) | rd(5) | shft(5) | fnct(6)&lt;br /&gt;
* I形 : op(6) | rs(5) | rt(5) | imm16(16)&lt;br /&gt;
* J形 : op(6) | rs(5) | imm21(21)&lt;br /&gt;
&lt;br /&gt;
imm16は16bit符号付整数として、imm21は21bit符号付整数として扱う。&lt;br /&gt;
&lt;br /&gt;
r0はゼロレジスタ、r1はスタックポインタ、r2はヒープポインタ、r31はリンクレジスタとして使用するが、実体はすべて汎用レジスタであり、実際にはどのレジスタをリンクレジスタにすることもできるし、ゼロレジスタにゼロでない数を代入することもできる。&lt;br /&gt;
&lt;br /&gt;
アセンブリ表記(以降S表記)での指定順は、Rタイプ二項演算ではop rd rs rt、同じくRタイプ一項演算ではop rd rs、Rタイプシフト演算ではop rd rs shft、Iタイプ演算および保存復元ではop rt rs imm、条件分岐ではop rs rt immの順とする(アセンブリにしたときに直感的に理解しやすい順序にしたつもり)。&lt;br /&gt;
&lt;br /&gt;
== リスト ==&lt;br /&gt;
=== op一覧 ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|op    ||C表記                     ||S表記||意味             ||所要&lt;br /&gt;
|-&lt;br /&gt;
|XX0000||rd = fnct(rs, rt, shft);  ||-    ||-                ||-&lt;br /&gt;
|-&lt;br /&gt;
|XX0001||rt = rs + imm16;          ||ADDI ||符号付整数加減算 ||1&lt;br /&gt;
|-&lt;br /&gt;
|XX0010||rt = *(rs + imm16);       ||LOAD ||復元(遅延あり)   ||2&lt;br /&gt;
|-&lt;br /&gt;
|XX0011||*(rs + imm16) = rt;       ||STORE||保存             ||2&lt;br /&gt;
|-&lt;br /&gt;
|XX1000||if (rs == rt) pc += imm16;||BE   ||^^^符号付整数比較||1〜3&lt;br /&gt;
|-&lt;br /&gt;
|XX1001||if (rs != rt) pc += imm16;||BNE                     ||1〜3&lt;br /&gt;
|-&lt;br /&gt;
|XX1010||if (rs &amp;lt; rt) pc += imm16; ||BL                      ||1〜3&lt;br /&gt;
|-&lt;br /&gt;
|XX1011||if (rs &amp;lt;= rt) pc += imm16;||BLE                     ||1〜3&lt;br /&gt;
|-&lt;br /&gt;
|XX1100||if (rs &amp;lt; rt) pc += imm16; ||FBL  ||^浮動小数点数比較||1〜3&lt;br /&gt;
|-&lt;br /&gt;
|XX1101||if (rs &amp;lt;= rt) pc += imm16;||FBLE                    ||1〜3&lt;br /&gt;
|-&lt;br /&gt;
|XX1110||pc = rs + imm21;          ||JR   ||Jump Register    ||1〜3&lt;br /&gt;
|-&lt;br /&gt;
|XX1111||rs = pc, pc += imm21;     ||JAL  ||Jump and Link    ||1〜3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== fnct一覧 ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|fnct  ||C表記           ||S表記 ||意味            　||所要&lt;br /&gt;
|-&lt;br /&gt;
|XX0000||rd = rs + rt;   ||ADD   ||整数加算          ||1&lt;br /&gt;
|-&lt;br /&gt;
|XX0001||rd = rs - rt;   ||SUB   ||整数減算          ||1&lt;br /&gt;
|-&lt;br /&gt;
|XX0010||rd = rs &amp;lt;&amp;lt; shft;||SLL   ||左算術シフト      ||1&lt;br /&gt;
|-&lt;br /&gt;
|XX0011||rd = rs &amp;gt;&amp;gt; shft;||SRR   ||右算術シフト      ||1&lt;br /&gt;
|-&lt;br /&gt;
|XX0100||rd = rs &amp;amp; rt;   ||AND   ||論理積            ||1&lt;br /&gt;
|-&lt;br /&gt;
|XX0101||rd = rs | rt;   ||OR    ||論理和            ||1&lt;br /&gt;
|-&lt;br /&gt;
|XX0110||rd = rs ^ rt;   ||XOR   ||排他的論理和      ||1&lt;br /&gt;
|-&lt;br /&gt;
|XX0111||rd = ~rs ^ rt;  ||XNOR  ||否定排他的論理和  ||1&lt;br /&gt;
|-&lt;br /&gt;
|XX1000||rd = rs + rt;   ||FADD  ||浮動小数点数加算  ||2&lt;br /&gt;
|-&lt;br /&gt;
|XX1001||rd = rs - rt;   ||FSUB  ||浮動小数点数減算  ||2&lt;br /&gt;
|-&lt;br /&gt;
|XX1010||rd = rs * rt;   ||FMUL  ||浮動小数点数乗算  ||2&lt;br /&gt;
|-&lt;br /&gt;
|XX1100||rd = 1 / rs;    ||FINV  ||浮動小数点数逆数  ||3&lt;br /&gt;
|-&lt;br /&gt;
|XX1101||rd = sqrt(rs);  ||FSQRT ||浮動小数点数平方根||3&lt;br /&gt;
|-&lt;br /&gt;
|XX1110||rd = getc();    ||RD    ||入力              ||8〜∞&lt;br /&gt;
|-&lt;br /&gt;
|XX1111||rd = putc(rs);  ||WR    ||出力              ||8〜∞&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 擬似mnemonic一覧 ===&lt;br /&gt;
&lt;br /&gt;
次のニーモニックは、プロセッサは対応しないが、アセンブラが変換する。&lt;br /&gt;
&lt;br /&gt;
*NOT&lt;br /&gt;
*FDIV&lt;br /&gt;
*SUBI&lt;br /&gt;
*BG&lt;br /&gt;
*BGE&lt;br /&gt;
*FBE&lt;br /&gt;
*FBNE&lt;br /&gt;
*FBG&lt;br /&gt;
*FBGE&lt;br /&gt;
*JUMP&lt;br /&gt;
*NOP&lt;br /&gt;
*HLT&lt;br /&gt;
&lt;br /&gt;
== スモークテスト ==&lt;br /&gt;
 ; フィボナッチ数列を求める&lt;br /&gt;
 ; r0 = ゼロレジスタ, r1 = スタックポインタ&lt;br /&gt;
 ; r2 = 引数値 n, r3 = 関数値 fib(n), r4 = 定数値 3&lt;br /&gt;
 	rd r2&lt;br /&gt;
 	addi r4 r0 3&lt;br /&gt;
 	jal fib&lt;br /&gt;
 	wr r3&lt;br /&gt;
 	srr r5 r3 8&lt;br /&gt;
 	wr r5&lt;br /&gt;
 	srr r5 r3 16&lt;br /&gt;
 	wr r5&lt;br /&gt;
 	srr r5 r3 24&lt;br /&gt;
 	wr r5&lt;br /&gt;
 hlt:	&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	add r3 r3 r0&lt;br /&gt;
 	be r0 r0 hlt&lt;br /&gt;
 fib:	&lt;br /&gt;
 	bl r2 r4 one&lt;br /&gt;
 	addi r2 r2 -1&lt;br /&gt;
 	addi r5 r2 -1&lt;br /&gt;
 	addi r1 r1 -2&lt;br /&gt;
 	store r5 r1 0&lt;br /&gt;
 	store r31 r1 1&lt;br /&gt;
 	jal fib&lt;br /&gt;
 	load r2 r1 0&lt;br /&gt;
 	store r3 r1 0&lt;br /&gt;
 	jal fib&lt;br /&gt;
 	load r5 r1 0&lt;br /&gt;
 	load r31 r1 1&lt;br /&gt;
 	addi r1 r1 2&lt;br /&gt;
 	add r3 r3 r5&lt;br /&gt;
 	jr r31&lt;br /&gt;
 one:	&lt;br /&gt;
 	addi r3 r0 1&lt;br /&gt;
 	jr r31&lt;br /&gt;
&lt;br /&gt;
== 12/29 ==&lt;br /&gt;
現状をマージ。ライブラリに任せた命令をすべて除外。&lt;br /&gt;
&lt;br /&gt;
== 11/12 by 高山 ==&lt;br /&gt;
今更ですがアセンブリ表記のレジスタ指定の順番をちょっと変えてみました。&lt;br /&gt;
&lt;br /&gt;
== 11/5 ==&lt;br /&gt;
アドレス指定無条件分岐はPC相対アドレス指定とし、targetは符号付とすることにした。&lt;br /&gt;
&lt;br /&gt;
== 10/31 ==&lt;br /&gt;
自分で考えるのが面倒なので、とりあえず去年の優勝チームのプロトタイプ[[http://fujitake.dip.jp/firexhl/wiki/|Firexhl]]の命令セットをパクってみようかと。&lt;br /&gt;
不要なものや不足しているものがあると思うので、随時変更していきます。&lt;br /&gt;
&lt;br /&gt;
一応ある程度細かいところまで勝手に決めてみた。&lt;br /&gt;
命令は削れそうなものはできるだけ削った。特に整数と浮動小数のレジスタの扱いを区別しないことにしたのでFLOAD, FSTORE, FRD, FWRなどの命令がなくなった。&lt;br /&gt;
あとCMOVcondもなくても大丈夫と思い削った。&lt;br /&gt;
浮動小数比較はFBcondがあればいらないかなと思ったので削除。&lt;br /&gt;
&lt;br /&gt;
あと整数の乗算と除算は実装するかどうか判らないが一応入れておいた。&lt;br /&gt;
&lt;br /&gt;
とりあえずこれでシミュレータ作ってみます。&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>	</entry>

	<entry>
		<id>https://is.zng.info/wiki/experiment/index.php/%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA</id>
		<title>ライブラリ</title>
		<link rel="alternate" type="text/html" href="https://is.zng.info/wiki/experiment/index.php/%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA"/>
				<updated>2015-11-29T06:11:34Z</updated>
		
		<summary type="html">&lt;p&gt;Maintenance script: ページの作成:「==  3/13 新sincos for compiler2 ==  compiler2に対応しました。しかしfadd/fsubが今のところCのプログラムと異なる結果を返すので、不正確...」&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==  3/13 新sincos for compiler2 ==&lt;br /&gt;
compiler2に対応しました。しかしfadd/fsubが今のところCのプログラムと異なる結果を返すので、不正確な画像が出力されます。&lt;br /&gt;
&lt;br /&gt;
[[media:ライブラリ-&amp;quot;assembler.20060313.zip&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
（注：デバッグ用にアセンブラやシミュレータを若干書き換えてあります。）&lt;br /&gt;
----&lt;br /&gt;
と思ったのですが、Cで書いた関数をそのままシミュレータ内で使っても不正確な画像が生成されました。なんでだろ？&lt;br /&gt;
&lt;br /&gt;
===  Comment by ひらの ===&lt;br /&gt;
&lt;br /&gt;
結局旧バージョンのままでいきます。精度まわりは、自分が確かめる余裕もないので、高山氏を信じます。&lt;br /&gt;
&lt;br /&gt;
== 12/30 多項式近似の係数 ==&lt;br /&gt;
今更ですが、テイラー展開とチェビシェフ補間の両方で計算するサンプルです。掛け算の回数は両者で同じですが引数が0.6くらいまでだとテイラー展開の方が精度が良くて、それより大きくなるとチェビシェフ補間の方が精度が良くなります。&lt;br /&gt;
&lt;br /&gt;
[[media:ライブラリ-&amp;quot;sincos.c&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
=== Comment by ひらの ===&lt;br /&gt;
わかりやすくまとめてみた&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|引数 ||CORDIC誤差 ||Taylor展開誤差 ||Chebyshev補間誤差 ||許容誤差&lt;br /&gt;
|-&lt;br /&gt;
|0.000000 ||2.329762e-08 ||0.000000e+00 ||4.577872e-06 ||1.175494e-38&lt;br /&gt;
|-&lt;br /&gt;
|0.049087 ||-1.862645e-08 ||0.000000e+00 ||-3.729016e-06 ||1.871783e-07&lt;br /&gt;
|-&lt;br /&gt;
|0.098175 ||0.000000e+00 ||0.000000e+00 ||-4.053116e-06 ||3.739057e-07&lt;br /&gt;
|-&lt;br /&gt;
|0.147262 ||-4.470348e-08 ||0.000000e+00 ||-1.043081e-06 ||5.597323e-07&lt;br /&gt;
|-&lt;br /&gt;
|0.196350 ||1.490116e-08 ||0.000000e+00 ||2.264977e-06 ||7.442105e-07&lt;br /&gt;
|-&lt;br /&gt;
|0.245437 ||-5.960464e-08 ||0.000000e+00 ||4.231930e-06 ||9.268958e-07&lt;br /&gt;
|-&lt;br /&gt;
|0.294524 ||0.000000e+00 ||5.960464e-08 ||4.321337e-06 ||1.107348e-06&lt;br /&gt;
|-&lt;br /&gt;
|0.343612 ||0.000000e+00 ||1.192093e-07 ||2.652407e-06 ||1.285133e-06&lt;br /&gt;
|-&lt;br /&gt;
|0.392699 ||0.000000e+00 ||2.682209e-07 ||0.000000e+00 ||1.459821e-06&lt;br /&gt;
|-&lt;br /&gt;
|0.441786 ||0.000000e+00 ||6.556511e-07 ||-2.592802e-06 ||1.630993e-06&lt;br /&gt;
|-&lt;br /&gt;
|0.490874 ||2.980232e-08 ||1.370907e-06 ||-4.202127e-06 ||1.798236e-06&lt;br /&gt;
|-&lt;br /&gt;
|0.539961 ||0.000000e+00 ||2.622604e-06 ||-4.172325e-06 ||1.961146e-06&lt;br /&gt;
|-&lt;br /&gt;
|0.589049 ||-1.192093e-07 ||4.827976e-06 ||-2.205372e-06 ||2.119332e-06&lt;br /&gt;
|-&lt;br /&gt;
|0.638136 ||-1.788139e-07 ||8.523464e-06 ||1.072884e-06 ||2.272412e-06&lt;br /&gt;
|-&lt;br /&gt;
|0.687223 ||-1.192093e-07 ||1.424551e-05 ||3.874302e-06 ||2.420018e-06&lt;br /&gt;
|-&lt;br /&gt;
|0.736311 ||-1.788139e-07 ||2.306700e-05 ||3.516674e-06 ||2.561794e-06&lt;br /&gt;
|-&lt;br /&gt;
|0.785398 ||0.000000e+00 ||3.623962e-05 ||-4.351139e-06 ||2.697398e-06&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Chebyshev補完は全区間に渡り均等な誤差になっており、凄いが、ちょっと精度が足らないか。Chebyshev補完の区間を[0,1/4π]でなく[1/8π,1/4π]に縮めるか、次数を上げるかしないと駄目なんだろうか。&lt;br /&gt;
&lt;br /&gt;
== ソース(12/22) ==&lt;br /&gt;
[[media:ライブラリ-&amp;quot;cordic.051222_3.zip&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
== 12/22 ==&lt;br /&gt;
2πを引く部分を改良し、バグを取りました。&lt;br /&gt;
&lt;br /&gt;
== 12/21 三角関数 ==&lt;br /&gt;
CORDICというアルゴリズムを用いてsin,cos,atanをとりあえずは実装してみますた。&lt;br /&gt;
&lt;br /&gt;
誤差評価が後回しになってしまった・・・っていうかどうやってテストしたらいいかわかりませぬ。&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>	</entry>

	<entry>
		<id>https://is.zng.info/wiki/experiment/index.php/%E3%83%A1%E3%83%A2</id>
		<title>メモ</title>
		<link rel="alternate" type="text/html" href="https://is.zng.info/wiki/experiment/index.php/%E3%83%A1%E3%83%A2"/>
				<updated>2015-11-29T06:11:34Z</updated>
		
		<summary type="html">&lt;p&gt;Maintenance script: ページの作成:「例によってFirexhlに習ってメモページなんてものを作ってみますた。全体的な連絡やメモ、独り...」&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;例によって[[http://fujitake.dip.jp/firexhl/wiki/|Firexhl]]に習ってメモページなんてものを作ってみますた。全体的な連絡やメモ、独り言などに使えたらいいかと。要らんかも知れないですが。&lt;br /&gt;
&lt;br /&gt;
== 10/26 ==&lt;br /&gt;
=== 独り言 by 高山 ===&lt;br /&gt;
とりあえずアーキテクチャ（レジスタの数、命令形式など）をもう少しちゃんと決めたら、シミュレータを作り始めようと思います。&lt;br /&gt;
&lt;br /&gt;
ところでシミュレータというのは、バイナリデータを読んで内部でしかるべき処理を行い、標準入出力でI/Oするプログラムってことでいいんですよね？&lt;br /&gt;
&lt;br /&gt;
=== 独り言 by 平野 ===&lt;br /&gt;
それでいいかとは思いますが、機械語そのままよりアセンブリ言語のデータを読んでシミュレーションするほうがデバッグに有利かもしれませんので一応考えてみてください。その辺は、シミュレータをどの言語で記述するかにもよってくるかと思いますので、お任せ(丸投げ)します。Cだとバイナリデータのほうがやっぱり楽かな？ OCamlだとどうか？&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>	</entry>

	<entry>
		<id>https://is.zng.info/wiki/experiment/index.php/%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E5%91%BD%E4%BB%A4%E3%82%BB%E3%83%83%E3%83%88</id>
		<title>マイクロ命令セット</title>
		<link rel="alternate" type="text/html" href="https://is.zng.info/wiki/experiment/index.php/%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E5%91%BD%E4%BB%A4%E3%82%BB%E3%83%83%E3%83%88"/>
				<updated>2015-11-29T06:11:34Z</updated>
		
		<summary type="html">&lt;p&gt;Maintenance script: ページの作成:「Controller Moduleにおいて、命令の解釈と依存関係の解析を実行しマイクロ命令に変換します。    == マイクロ命令セット ==  === Contr...」&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Controller Moduleにおいて、命令の解釈と依存関係の解析を実行しマイクロ命令に変換します。&lt;br /&gt;
&lt;br /&gt;
== マイクロ命令セット ==&lt;br /&gt;
=== Controller Module ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|信号||幅||用途&lt;br /&gt;
|-&lt;br /&gt;
|E   ||1 ||Enable&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Fetcher Module ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|信号||幅||用途&lt;br /&gt;
|-&lt;br /&gt;
|FE  ||1 ||Fetch Enable&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Accumulator Module ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|信号||幅||用途&lt;br /&gt;
|-&lt;br /&gt;
|RE  ||1 ||Read Enable&lt;br /&gt;
|-&lt;br /&gt;
|RAX ||6 ||Read Address X &lt;br /&gt;
|-&lt;br /&gt;
|RAY ||6 ||Read Address Y&lt;br /&gt;
|-&lt;br /&gt;
|WE  ||1 ||Write Enable&lt;br /&gt;
|-&lt;br /&gt;
|WA  ||6 ||Write Address&lt;br /&gt;
|-&lt;br /&gt;
|WS0 ||1 ||Write Select 0 (Bypass)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Loader Module ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|信号||幅||用途&lt;br /&gt;
|-&lt;br /&gt;
|LV  ||1 ||Load Valid&lt;br /&gt;
|-&lt;br /&gt;
|TE  ||1 ||Store Enable&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Comparator Module ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|信号||幅||用途&lt;br /&gt;
|-&lt;br /&gt;
|CND ||3 ||Condition&lt;br /&gt;
|-&lt;br /&gt;
|OPTD||6 ||Opponent Data&lt;br /&gt;
|-&lt;br /&gt;
|OPTS||1 ||Opponent Select&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Calculator Module ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|信号||幅||用途&lt;br /&gt;
|-&lt;br /&gt;
|FNCT||3 ||Function&lt;br /&gt;
|-&lt;br /&gt;
|OFTD||16||Offset Data&lt;br /&gt;
|-&lt;br /&gt;
|OFTS||1 ||Offset Select&lt;br /&gt;
|-&lt;br /&gt;
|CNTS||1 ||Count Select&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>	</entry>

	<entry>
		<id>https://is.zng.info/wiki/experiment/index.php/%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5_2x</id>
		<title>プロセッサ 2x</title>
		<link rel="alternate" type="text/html" href="https://is.zng.info/wiki/experiment/index.php/%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5_2x"/>
				<updated>2015-11-29T06:11:34Z</updated>
		
		<summary type="html">&lt;p&gt;Maintenance script: ページの作成:「== なんでもセミナー発表資料 (10/13) ==    media:プロセッサ_2x-20061013.ppt    &amp;#039;&amp;#039;&amp;#039;注記:&amp;#039;&amp;#039;&amp;#039;    *Microsoft PowerPoint 2003  *http://www.microsoft.co...」&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== なんでもセミナー発表資料 (10/13) ==&lt;br /&gt;
&lt;br /&gt;
[[media:プロセッサ_2x-20061013.ppt]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;注記:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
*Microsoft PowerPoint 2003&lt;br /&gt;
*[[http://www.microsoft.com/downloads/details.aspx?familyid=428D5727-43AB-4F24-90B7-A94784AF71A4&amp;amp;displaylang=ja|Microsoft PowerPoint Viewer 2003]]&lt;br /&gt;
*Microsoft PowerPoint 2007 beta 2&lt;br /&gt;
で動作します。&lt;br /&gt;
&lt;br /&gt;
*OpenOffice.org Impress 2.0.4&lt;br /&gt;
では&amp;#039;&amp;#039;&amp;#039;誤動作します&amp;#039;&amp;#039;&amp;#039;。プロセッサ係はいずれにせよWindowsを使う羽目になるので、これに関しては問題ないでしょう:-)&lt;br /&gt;
&lt;br /&gt;
== 不安定動作の謎 (3/16) ==&lt;br /&gt;
&lt;br /&gt;
タイミング制約をすべて満たしているのにかかわらず、不安定動作に悩まされていた件で、「Virtex-II ユーザガイド」の「表 2-36 : 出力電源とグランドのペアに対して同時に切り替え可能な出力の最大数」を超えたためであるという伊東氏による仮説についてコメント。&lt;br /&gt;
&lt;br /&gt;
確かに、おそらく全ての班で、20本あるAAへの出力に「LVCMOS25_12_slow」や「LVCMOS25_12_fast」を使っていたと思われる。うちの班でも「LVCMOS25_12_slow」を使っていた。&lt;br /&gt;
&lt;br /&gt;
仮説の通りとすると、内部グランドの電位が外部グランドの電位とずれて、IOAへの入力が多少乱れていたわけだが、可能性はある。&lt;br /&gt;
&lt;br /&gt;
まあ、来年以降に、不安定動作の謎解きは託されるんだろうが、解ければ、100MHz超も十分可能になってくると思う。&lt;br /&gt;
&lt;br /&gt;
== 久しぶりにWindowsをシャットダウンする。(3/13) ==&lt;br /&gt;
&lt;br /&gt;
家に戻ったときも基本的にModelsimを走らせたままだったので、かなり負荷をかけて連続稼動させていた。よくがんばってくれたPentium Mに多謝。&lt;br /&gt;
&lt;br /&gt;
== 公開(3/13) ==&lt;br /&gt;
&lt;br /&gt;
まだいくらか加筆しますが、忘れないうちに公開します。&lt;br /&gt;
&lt;br /&gt;
== Rivision 39(3/13) ==&lt;br /&gt;
&lt;br /&gt;
[[media:プロセッサ_2x-20060313.zip]]&lt;br /&gt;
&lt;br /&gt;
== やべ形式を変えるのを忘れていた(3/13) ==&lt;br /&gt;
&lt;br /&gt;
うっかりテキスト(P3)形式でコンテストに出場してしまったが、&lt;br /&gt;
バイナリ(P6)形式だと 25.186s だった罠。ワロス。&lt;br /&gt;
0.8s近く損をしたわけだが、文字通り、後の祭り。&lt;br /&gt;
&lt;br /&gt;
=== 続・備忘録(3/14) ===&lt;br /&gt;
&lt;br /&gt;
一応、P6形式だと13.1億命令だったということを付け加えておく。&lt;br /&gt;
&lt;br /&gt;
デバッグはずっとP3形式でやっていった。&lt;br /&gt;
RS-232Cのバグにすぐ気付けるので。&lt;br /&gt;
&lt;br /&gt;
 CALC  :              171703541  ADD   :               43576646&lt;br /&gt;
 ADDI  :              321901579  SUB   :                 292351&lt;br /&gt;
 LOAD  :              487866655  SLL0  :                  30123&lt;br /&gt;
 STORE :               85034329  SLL1  :                      0&lt;br /&gt;
 BEI   :               21754436  SLL2  :                    324&lt;br /&gt;
 BNEI  :               93018824  SLL3  :                      0&lt;br /&gt;
 BLI   :                1950423  SLL4  :               12546067&lt;br /&gt;
 BGEI  :                 938519  SLL5  :                 342383&lt;br /&gt;
 BE    :               28197411  SLL6  :                    324&lt;br /&gt;
 BNE   :               14898388  SLL7  :                      1&lt;br /&gt;
 BL    :                  58036  SRR0  :                  49320&lt;br /&gt;
 BGE   :                  98630  SRR1  :                      0&lt;br /&gt;
 FBL   :                 287774  SRR2  :                      0&lt;br /&gt;
 FBLE  :               49777324  SRR3  :                      0&lt;br /&gt;
 JAL   :               18575123  SRR4  :                      0&lt;br /&gt;
 JR    :               18575123  SRR5  :                 136623&lt;br /&gt;
                                 SRR6  :                      0&lt;br /&gt;
                                 SRR7  :                      0&lt;br /&gt;
                                 AND   :               25982741&lt;br /&gt;
                                 OR    :                      0&lt;br /&gt;
                                 XOR   :                   9829&lt;br /&gt;
                                 XNOR  :                1926809&lt;br /&gt;
                                 GET   :                   1300&lt;br /&gt;
                                 PUT   :                  49168&lt;br /&gt;
                                 FADD  :               60228833&lt;br /&gt;
                                 FSUB  :               54728662&lt;br /&gt;
                                 FMUL  :              119403804&lt;br /&gt;
                                 FINV  :                 398845&lt;br /&gt;
                                 FSQRT :                2197426&lt;br /&gt;
 &lt;br /&gt;
 TOTAL :             1314636115&lt;br /&gt;
 FERR  :               41725703&lt;br /&gt;
 PFERR :                3805534&lt;br /&gt;
 LERR  :               76009552&lt;br /&gt;
&lt;br /&gt;
== 西川さんが寿司に招待してくれていますが(3/13) ==&lt;br /&gt;
&lt;br /&gt;
いつがいいか教えてくだしあ &amp;gt; 班員の皆様&lt;br /&gt;
&lt;br /&gt;
== お疲れ様(3/13) ==&lt;br /&gt;
&lt;br /&gt;
というか疲れがどっと出てきた。&lt;br /&gt;
&lt;br /&gt;
== 安定動作(3/12 21:11) ==&lt;br /&gt;
&lt;br /&gt;
コンパイラコードの最適化に伴い誤動作が突然頻発するようになっていたが&lt;br /&gt;
ついに安定動作するbitファイルを発見。&lt;br /&gt;
&lt;br /&gt;
26.386s&lt;br /&gt;
&lt;br /&gt;
=== 備忘録 ===&lt;br /&gt;
 CALC  :              174438386  ADD   :               43707684&lt;br /&gt;
 ADDI  :              328751476  SUB   :                 453403&lt;br /&gt;
 LOAD  :              510868095  SLL0  :                3256152&lt;br /&gt;
 STORE :               85187602  SLL1  :                      0&lt;br /&gt;
 BEI   :               21754436  SLL2  :                    324&lt;br /&gt;
 BNEI  :               93018824  SLL3  :                      0&lt;br /&gt;
 BLI   :                2056172  SLL4  :               12602664&lt;br /&gt;
 BGEI  :                1061750  SLL5  :                 342383&lt;br /&gt;
 BE    :               29765414  SLL6  :                    324&lt;br /&gt;
 BNE   :               16483104  SLL7  :                      1&lt;br /&gt;
 BL    :                1642752  SRR0  :                1634036&lt;br /&gt;
 BGE   :                1796540  SRR1  :                      0&lt;br /&gt;
 FBL   :                 287774  SRR2  :                      0&lt;br /&gt;
 FBLE  :               49777324  SRR3  :                      0&lt;br /&gt;
 JAL   :               18688317  SRR4  :                      0&lt;br /&gt;
 JR    :               18688317  SRR5  :                 136623&lt;br /&gt;
                                 SRR6  :                      0&lt;br /&gt;
                                 SRR7  :                      0&lt;br /&gt;
                                 AND   :               27567457&lt;br /&gt;
                                 OR    :                      0&lt;br /&gt;
                                 XOR   :                   9829&lt;br /&gt;
                                 XNOR  :                1926809&lt;br /&gt;
                                 GET   :                   1300&lt;br /&gt;
                                 PUT   :                 154917&lt;br /&gt;
                                 FADD  :               60228833&lt;br /&gt;
                                 FSUB  :               54728662&lt;br /&gt;
                                 FMUL  :              119403804&lt;br /&gt;
                                 FINV  :                 398845&lt;br /&gt;
                                 FSQRT :                2197426&lt;br /&gt;
 &lt;br /&gt;
 TOTAL :             1354266283&lt;br /&gt;
 FERR  :               30487998&lt;br /&gt;
 PFERR :                2844389&lt;br /&gt;
 LERR  :               76118480&lt;br /&gt;
&lt;br /&gt;
== 改訂版 sin/cos (3/12) ==&lt;br /&gt;
取り込んでみると、なぜか全部0になる？&lt;br /&gt;
&lt;br /&gt;
取り込み方を間違えたかな？&lt;br /&gt;
===  reply by 高山 ===&lt;br /&gt;
すみません、まだバグがあってちゃんと動かないみたいです。今直しています。&lt;br /&gt;
== データキャッシュ搭載 (3/12) ==&lt;br /&gt;
&lt;br /&gt;
27.530s!!!!&lt;br /&gt;
&lt;br /&gt;
== 分散RAM説対ブロックRAM説終焉せず (3/11) ==&lt;br /&gt;
ぉーん&lt;br /&gt;
&lt;br /&gt;
ブロックRAMから分散RAMに変えると、より安定するという推計がでるんだが、なぜか実機だと不安定になるので256個可能な状態に戻す。&lt;br /&gt;
&lt;br /&gt;
== 分散RAM説対ブロックRAM説終焉す (3/11) ==&lt;br /&gt;
64個でさえ使い切れていないということなので、レジスタを分散RAMで実現し64個で決め打ってしまいます。&lt;br /&gt;
&lt;br /&gt;
== 100MHz動作 (3/11) ==&lt;br /&gt;
40秒&lt;br /&gt;
&lt;br /&gt;
== 75MHz動作 (3/11) ==&lt;br /&gt;
53秒&lt;br /&gt;
&lt;br /&gt;
== 祝完全動作 (3/11) ==&lt;br /&gt;
&lt;br /&gt;
結局のところ、現在のソースコードだと、ISE7でコンパイルするとバグり、ISE6でコンパイルするとバグらないようだ。なんだこの野郎。&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|コンパイラバージョン ||コンパイルオプション ||命令数 ||実行時間&lt;br /&gt;
|-&lt;br /&gt;
|旧                   ||なし                 ||60億   ||50MHz 230秒&lt;br /&gt;
|-&lt;br /&gt;
|旧                   ||-inline 50           ||42億   ||50MHz 158秒&lt;br /&gt;
|-&lt;br /&gt;
|新                   ||-inline 10000        ||15億   ||50MHz 79秒&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
さてチューニングを続けます。準備工事がとっくに済んでいるデータキャッシュをようやく載せるとか。&lt;br /&gt;
&lt;br /&gt;
== デバッグその11 (3/11) ==&lt;br /&gt;
&lt;br /&gt;
最新シミュレータの画像とdiffを取ったら出なくなった。古いシミュレータの画像とdiffを取っていた罠。&lt;br /&gt;
&lt;br /&gt;
== お (3/11) ==&lt;br /&gt;
&lt;br /&gt;
なんか動いた。まだdiffが出ている。&lt;br /&gt;
&lt;br /&gt;
== デバッグその10 (3/11) ==&lt;br /&gt;
&lt;br /&gt;
旧ライブラリにバッファオーバーフローの対処をしてみる。&lt;br /&gt;
&lt;br /&gt;
== あ (3/11) ==&lt;br /&gt;
&lt;br /&gt;
RS-232Cまわりがおかしい。&lt;br /&gt;
&lt;br /&gt;
== デバッグその9 (3/10) ==&lt;br /&gt;
&lt;br /&gt;
Modelsimで動いたので、実機で動かしたがうまく動かない。激しくやばい。眠い。&lt;br /&gt;
&lt;br /&gt;
== デバッグその8 (3/10) ==&lt;br /&gt;
&lt;br /&gt;
fsqrt / finvのテーブルを間違えていた。&lt;br /&gt;
&lt;br /&gt;
== デバッグその7 (3/10) ==&lt;br /&gt;
&lt;br /&gt;
fsqrtの指数部計算を間違えていた。&lt;br /&gt;
&lt;br /&gt;
== デバッグその6 (3/10) ==&lt;br /&gt;
&lt;br /&gt;
レイトレの実行途中で、とあるfmulの中位ビットが1ずれた。仮数部計算の繰り上がりを一部考え忘れていた。&lt;br /&gt;
&lt;br /&gt;
== デバッグその5 (3/10) ==&lt;br /&gt;
&lt;br /&gt;
レイトレの実行途中で、とあるfmulの最下位ビットが1ずれた。と思ったら、プロセッサでなく、シミュレータのFPUに問題があった。&lt;br /&gt;
&lt;br /&gt;
== デバッグその4 (3/10) ==&lt;br /&gt;
&lt;br /&gt;
引数がa&amp;lt;bのfaddのシフト量が間違っていた。レイトレの実行途中、cos関数の中で問題が起こったので何が問題なのか調べるのに苦労した。&lt;br /&gt;
&lt;br /&gt;
== デバッグその3 (3/10) ==&lt;br /&gt;
&lt;br /&gt;
引数が0のfmulが非正規化数を返していた。レイトレの実行途中、cos関数の中で問題が起こったので何が問題なのか調べるのに苦労した。&lt;br /&gt;
&lt;br /&gt;
== デバッグその2 (3/10) ==&lt;br /&gt;
&lt;br /&gt;
subがaddになっていた。レイトレの実行途中、div関数の中で問題が起こったので何が問題なのか調べるのに苦労した。&lt;br /&gt;
&lt;br /&gt;
== デバッグその1 (3/9) ==&lt;br /&gt;
&lt;br /&gt;
基盤に問題がありcserver だと RS-232C のオプションが DTR_CONTROL_ENABLE かつ DTR_CONTROL_ENABLE となっているため動かない。とりあえず DTR_CONTROL_DISABLE かつ DTR_CONTROL_DISABLE としておいて凌ぐしかないな。&lt;br /&gt;
&lt;br /&gt;
==  全機能搭載完了(なくても動くデータキャッシュは除く) (3/9) ==&lt;br /&gt;
* デバッグ &amp;lt;= Todo&lt;br /&gt;
&lt;br /&gt;
==  Rivision 31 (3/8) ==&lt;br /&gt;
Rivision 26より久しぶりのバックアップ。&lt;br /&gt;
&lt;br /&gt;
[[media:プロセッサ_2x-20060308.zip]]&lt;br /&gt;
&lt;br /&gt;
* プロセッサ2xは、キャッシュ、RS-232Cコンポーネントなど大幅に機能を加えた。&lt;br /&gt;
* シミュレータは、高山氏による分岐系命令の不具合修正を取り込んでいる(はず)。さらにアセンブラ・シミュレータにfunctの変更を施した。[[シミュレータ|sincos]]は、まだ取り込んでいない。&lt;br /&gt;
* 最新版の[[コンパイラ|コンパイラ2x]]は、含んでいない。(含んでいるのは少し旧版)&lt;br /&gt;
&lt;br /&gt;
== あと5日 (3/8) ==&lt;br /&gt;
* 現在、レジスタの256個化は (ムダかも知れないが) 対応できてしまいそう。&lt;br /&gt;
* 現在、100MHzは (たまたまかもしれないが) 実行できている。&lt;br /&gt;
&lt;br /&gt;
== TODO (3/8) ==&lt;br /&gt;
* fdiv, fsqrtの2x化 &amp;lt;= Doing&lt;br /&gt;
* デバッグ&lt;br /&gt;
&lt;br /&gt;
== TODO (3/6) ==&lt;br /&gt;
基本的に既に作ったコンポーネントの調整と修正だが。間に合うんだか。&lt;br /&gt;
* accumulatorの同期化 &amp;lt;= Doing&lt;br /&gt;
* communicatorのコンポーネント化&lt;br /&gt;
* fdiv, fsqrtの2x化&lt;br /&gt;
* デバッグ&lt;br /&gt;
&lt;br /&gt;
== Processor [1.5x](3/5) ==&lt;br /&gt;
&lt;br /&gt;
インストラクションキャッシュを載せるとfib 38が100MHzで動かなくなった。ありふれた事象に思われたが、しかし…。&lt;br /&gt;
&lt;br /&gt;
当初、ある意味、単なる部品である、SRAMやBlock RAMの制御に問題があると考えていた。だが、以降数日にわたって、さまざまなテストを試みたが、より自明な回路でさえ不具合を起こしており、同期回路の「命」であるクロックの生成、すなわちDCMの制御がうまくいっていないと考えざるをえない状況にある。&lt;br /&gt;
&lt;br /&gt;
恐らく、インストラクションキャッシュを載せたことにより、DCMに負荷がかかった・DCMの配線が変わったためとしか思えないが、この大問題を、現状の漏れの乏しい技術力で、残り僅かな日数に、解決するのは不可能であり、このまま拘ったところでFPGAと心中する羽目になるだけであるので、当面安定動作する75MHzに日和る。&lt;br /&gt;
&lt;br /&gt;
コードネームがあれだが、ベストエフォート100MHz、実測75MHzという釈明をしておく(何がだ)。&lt;br /&gt;
&lt;br /&gt;
== Revision 26 (2/25) ==&lt;br /&gt;
&lt;br /&gt;
新プロセッサ機能追加、新アセンブラ、シミュレータ不具合修正。&lt;br /&gt;
&lt;br /&gt;
[[media:プロセッサ_2x-20060225.zip]]&lt;br /&gt;
&lt;br /&gt;
*アセンブラに関してですが、309行のsubiのところで$_[2]と$_[1]を逆に、417行で(/^([^:]+):/)を(/^([^:#]+):/)にすべきではないでしょうか。 by 高山&lt;br /&gt;
&lt;br /&gt;
== ブランチ考(2/24) ==&lt;br /&gt;
&lt;br /&gt;
それなりに巨大な演算ルーチンである、fmul, faddを加えた(ただし未検査)が、全く関係なく比較演算がクリティカルパスになっている。このままだと、分岐が3クロックとなるのは、致し方ないんだろうかねえ。執念で2クロックに持ち込むか、3クロックにする代わり、できた余裕で、レジスタを256個にするとか考えないといけない。本当に余裕があるのかかなり謎だが。&lt;br /&gt;
&lt;br /&gt;
== 警告削り(2/24) ==&lt;br /&gt;
&lt;br /&gt;
仮に記していた部分をほとんど埋めて、XSTの警告をかなり消したが、まだ微妙に残っている。&lt;br /&gt;
&lt;br /&gt;
*WARNING:Xst:646 - Signal &amp;lt;FRCDLX&amp;lt;35:24&amp;gt;&amp;gt; is assigned but never used.&lt;br /&gt;
*WARNING:Xst:646 - Signal &amp;lt;FRCDLX&amp;lt;10:0&amp;gt;&amp;gt; is assigned but never used.&lt;br /&gt;
*WARNING:Xst:646 - Signal &amp;lt;FRCDLY&amp;lt;35:24&amp;gt;&amp;gt; is assigned but never used.&lt;br /&gt;
*WARNING:Xst:646 - Signal &amp;lt;FRCDLY&amp;lt;10:0&amp;gt;&amp;gt; is assigned but never used.&lt;br /&gt;
*WARNING:Xst:646 - Signal &amp;lt;FRCDH&amp;lt;35:24&amp;gt;&amp;gt; is assigned but never used.&lt;br /&gt;
&lt;br /&gt;
という、先に述べた板挟みによる警告と、&lt;br /&gt;
&lt;br /&gt;
*WARNING:Xst:1772 - You have explicitly defined initial contents for this RAM, which are currently ignored when the RAM is implemented with LUT resources, leading to incorrect circuit behavior. Changing the RAM description so that it is read synchronously will allow implementation on block RAM resources for which we provide full initial contents support.&lt;br /&gt;
&lt;br /&gt;
という、謎警告。てか、初期内容など定義していないんだがNE。&lt;br /&gt;
&lt;br /&gt;
ちなみに、FRCDLYは、自分がつけた信号名だが、FRaCtion Data Low of Y(Yの端数部下位)の略である。やはり、VHDLには、暗号的信号名が似合う。&lt;br /&gt;
&lt;br /&gt;
== 警告板挟み(2/24) ==&lt;br /&gt;
&lt;br /&gt;
ポートマップにて未使用のシグナルのエレメントをopenにして、ISEでWarningを出ないようにすると、ModelsimでWarning(やError)が出る。どっちつかずで後味が悪い。&lt;br /&gt;
&lt;br /&gt;
== fadd,fmul移植(2/23) ==&lt;br /&gt;
&lt;br /&gt;
プロセッサ [1x]のfadd,fmulを移植・改良。思ったより楽だった。3クロックに余裕で収まったよう。&lt;br /&gt;
&lt;br /&gt;
== RS-232C書き込み動作(2/22) ==&lt;br /&gt;
&lt;br /&gt;
読み込みは256kbpsで動くが、書き込みは128kbpsでしかきちんと動かない。ビットが化ける。デバイスマネージャの設定だと128kbpsしか選べないし、USBシリアル変換ケーブルの性能限界か。&lt;br /&gt;
&lt;br /&gt;
== RS-232C読み込み動作(2/21) ==&lt;br /&gt;
&lt;br /&gt;
プロセッサ [2x]と別の実験用プロジェクトを作ってやってみる。あっさり動いた。&lt;br /&gt;
&lt;br /&gt;
うちの班で利用を避けたNECの罠的ICは、115.2kbpsまでしか動かないし、115.2kbpsで動かすにも、通常のデューティー費比だとオーバークロックしないといけないので、やはり罠的らしい。&lt;br /&gt;
&lt;br /&gt;
== 実機上でフィボナッチ動作(2/20) ==&lt;br /&gt;
&lt;br /&gt;
手元にfib 38の計算時間が約15秒のと、約17秒のがある。17秒のは不安定な気もしたが、チューニングしたところ安定したようだ。とりあえず約17秒のを元にRS-232C機能を加えてみたい。&lt;br /&gt;
&lt;br /&gt;
== Revision 23 (2/18) ==&lt;br /&gt;
&lt;br /&gt;
「バックアップしていないときにハードディスクが壊れる」というマーフィーの法則にしたがってバックアップ。これでハードディスクが壊れることなどないであろうw&lt;br /&gt;
&lt;br /&gt;
[[media:プロセッサ_2x-20060218.zip]]&lt;br /&gt;
&lt;br /&gt;
[[命令セット(ドラフト)]]に対応した新アセンブラ・シミュレータ(ただし未マージ)・および旧コンパイラを含んでいます。&lt;br /&gt;
&lt;br /&gt;
==  再びModelsim上でフィボナッチ動作(2/18) ==&lt;br /&gt;
&lt;br /&gt;
通信回路・浮動小数点演算回路を載せるために制御回路のクリティカルパスを大分削った。というか、キャッシュを一部省いてIPCを落とした。FPUとRS-232Cを積んでいない状態だと、115MHz程度である。&lt;br /&gt;
&lt;br /&gt;
とりあえず大学へ向かってRS-232Cに取り掛かります。&lt;br /&gt;
&lt;br /&gt;
== 一進一退(2/17) ==&lt;br /&gt;
&lt;br /&gt;
IOAがUのまま変わらなねー、と思ったらZの代入文がないせいだった。&lt;br /&gt;
せめてXのまま変わらない、とかだったらすぐわかったんだが。&lt;br /&gt;
遅遅として進まぬ。&lt;br /&gt;
&lt;br /&gt;
== Meadow 3.00-dev of 2006-02-12(2/15) ==&lt;br /&gt;
&lt;br /&gt;
動作が不安定な気がしたので一応更新したが、依然として不安定な気が。1月下旬あたりに変なパッチが当たったりしているんだろうか。まあ安定版を使えという話もあるが、もうずっと開発版を使っているので、今更戻るのもなんだな。&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;2/16追記:&amp;#039;&amp;#039;&amp;#039; ハングアップしたようになった場合、メニューバーから何らかの項目を選択すると復帰するようだ。&lt;br /&gt;
&lt;br /&gt;
== 「フェッチ汎用キャッシュ」か「ブランチ専用キャッシュ」か(2/15) ==&lt;br /&gt;
=== フェッチ汎用キャッシュ ===&lt;br /&gt;
&lt;br /&gt;
命令領域を65536ワードに制限すれば、まあ間違いなく間に合う。単体だと遅いが、プリフェッチ機能をつけるなどすると、かなり速くできる可能性を持っている。ただしプリフェッチ機能のためにややこしい回路設計が要るようになりそうである。&lt;br /&gt;
&lt;br /&gt;
=== ブランチ専用キャッシュ ===&lt;br /&gt;
&lt;br /&gt;
CPUの動作周波数とSRAMの動作周波数とは同じであるから、帯域をブランチ・ロード・ストア命令に横取りされなければ、フェッチ自体にキャッシュなど要らない。ブランチ・ロード命令にキャッシュを作ると、帯域を横取りしてくるのは、ほとんどストア命令だけになる。ストア命令は、ブランチ・ロード命令と比べて僅かしかないはずなので、大丈夫なはず、というのが基本的な方針である。&lt;br /&gt;
&lt;br /&gt;
単体でそこそこの速度が出るので、命令領域を制限せずに済むと思われる。&lt;br /&gt;
&lt;br /&gt;
== 間に合うんだろうか(2/12) ==&lt;br /&gt;
&lt;br /&gt;
間に合うんだろうか。&lt;br /&gt;
&lt;br /&gt;
間に合うんだろうか。&lt;br /&gt;
&lt;br /&gt;
== 続・キャッシュ性能推定(2/11) ==&lt;br /&gt;
&lt;br /&gt;
=== ブランチミス ===&lt;br /&gt;
&lt;br /&gt;
なんか風呂の中で「ブランチ専用キャッシュ」なる香具師を思いついたので一応実験してみる。。。&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|Seq  ||Way ||base  ||contest &lt;br /&gt;
|-&lt;br /&gt;
|512  ||1   ||1.13% ||1.08%&lt;br /&gt;
|-&lt;br /&gt;
|1024 ||1   ||0.60% ||0.67%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
設計が多少ややこしくなるが、クリティカルパスの解消が可能か。。。決め手になりうるかどうか。。。&lt;br /&gt;
&lt;br /&gt;
なお、&amp;quot;プリフェッチキャッシュ&amp;quot;と同じく、コードの最適化がなされると倍程度外れる気がするので、多少差し引いて考えたほうがいい。。。&lt;br /&gt;
&lt;br /&gt;
眠い。。。&lt;br /&gt;
&lt;br /&gt;
==  続・プリフェッチ考(2/6) ==&lt;br /&gt;
&lt;br /&gt;
なんか拘っていると間に合わない気がしてきたので、レイトレ動いてからに先送りするかねぇ・・・。&lt;br /&gt;
&lt;br /&gt;
==  プリフェッチ考(2/6) ==&lt;br /&gt;
&lt;br /&gt;
無茶苦茶ややこしいのでまとめ。&lt;br /&gt;
&lt;br /&gt;
* [required]Miss信号が来ていると、抽象プリフェッチバッファにデータを溜めていく。&lt;br /&gt;
* [required]バッファが溜まっていると、データとVaild信号を出す。&lt;br /&gt;
* [required]Select信号が来るとバッファを捨ててアドレスを決めなおす。&lt;br /&gt;
* [required]Disable信号が来ると、抽象的に言って、止まる。&lt;br /&gt;
* [optional]バッファが溜まっていないときにDisable信号が来ると、止まらず、溜め続ける。Miss信号の如何にかかわらない。&lt;br /&gt;
&lt;br /&gt;
Miss信号だけが1クロック遅れてやってくるのが非常に厄介。&lt;br /&gt;
なお後々Loaderの機能を付加するのでもっとややこしくなる罠。&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;3/16追記: &amp;#039;&amp;#039;&amp;#039;のちにより洗練された形となった。当時考えたほどややこしくならずにできた。&lt;br /&gt;
&lt;br /&gt;
==  Modelsim上でフィボナッチ動作(2/5) ==&lt;br /&gt;
&lt;br /&gt;
なお、現在のアーキテクチャによるfib 38の推定所要時間は、8.99sとなる。&lt;br /&gt;
&lt;br /&gt;
== 独り言(2/5) ==&lt;br /&gt;
いやなぜってさぁー、君ら、はい、レイトレなんて知ってるぅー？100KBって形をしているよねぇーレイトレって。&amp;lt;br /&amp;gt;&lt;br /&gt;
例えばよぉーおい、このレイトレのこの関数からキャッシュ何本引けますかぁーって言われたら何本引けるぅー？&amp;lt;br /&amp;gt;&lt;br /&gt;
おぉーん、あいっ、みんな見ろ見ろー、いいかーあいっ、いっぽーん、ねぇー、あーい、ぇ、それからぁー、あ、&amp;lt;br /&amp;gt;&lt;br /&gt;
にほーん、あーい、それからぁさーんぼーん、あぁーい、キャッシュはさんぼーん、コード数えてみ。&amp;lt;br /&amp;gt;&lt;br /&gt;
いっこぉ、にこぉ、さんこよんこぉ。あらあら、四個三本だ。こういう黄色いみたいなキャッシュ引きのことをぉ、&amp;lt;br /&amp;gt;&lt;br /&gt;
キャッシュミスって言うんだよぉー。いぃかぁー？それからぁ、こんな風になったらぁ、いぃかぁ？&amp;lt;br /&amp;gt;&lt;br /&gt;
これ二次キャッシュミスって言うんだよぉー。おーん。階層が合計三つ（ドン）以上になるとぉー、&amp;lt;br /&amp;gt;&lt;br /&gt;
もう、この式は成り立たない。キャッシュの本数とコードの個数は等しくならない！んんー？&amp;lt;br /&amp;gt;&lt;br /&gt;
だからこの解法じゃ解けなぁーい！でも安心してぇ。フィボナッチで出てくるようなぁ、キャッシュの本数問題、&amp;lt;br /&amp;gt;&lt;br /&gt;
そっから何本引けますか問題！いつも、この式が成り立つぅ、キャッシュとコードが一対一対応するぅ、&amp;lt;br /&amp;gt;&lt;br /&gt;
キャッシュが引けるようなベーシックな問題しか出されないからぁ！安心して君達はぁ！&amp;lt;br /&amp;gt;&lt;br /&gt;
ｔを数えたらいいんだよぉぅ。ただな、この解法を覚えたからといって、全てのキャッシュの本数が&amp;lt;br /&amp;gt;&lt;br /&gt;
数えられるようになったなどと思うな。所詮、手際よく解けるように作られたフィボナッチという&amp;lt;br /&amp;gt;&lt;br /&gt;
箱庭の中でしかぁー、いっ、生きていけない解答に過ぎないんだ。いぃかぁー？&amp;lt;br /&amp;gt;&lt;br /&gt;
だから受かるためだってそれでいいんだよ。ぉーん。ぃぃかー？&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 水玉潰し(2/4) ==&lt;br /&gt;
&lt;br /&gt;
って確定ゲームかと思っていたのだが、&lt;br /&gt;
&lt;br /&gt;
 0 4 5&lt;br /&gt;
 1 4 4&lt;br /&gt;
 0 1 0&lt;br /&gt;
&lt;br /&gt;
の結果が、&lt;br /&gt;
&lt;br /&gt;
 0 0 0&lt;br /&gt;
 2 0 0&lt;br /&gt;
 0 3 0&lt;br /&gt;
&lt;br /&gt;
になるのか、&lt;br /&gt;
&lt;br /&gt;
 0 0 0&lt;br /&gt;
 3 0 0&lt;br /&gt;
 0 2 0&lt;br /&gt;
&lt;br /&gt;
になるのかって不定なのかな。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== キャッシュ性能測定(1/28, 1/29) ==&lt;br /&gt;
&lt;br /&gt;
=== フェッチミス ===&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|Word ||Way ||base  ||contest &lt;br /&gt;
|-&lt;br /&gt;
|1024 ||1   ||47.39%||40.68%&lt;br /&gt;
|-&lt;br /&gt;
|1024 ||2   ||36.36%&lt;br /&gt;
|-&lt;br /&gt;
|2048 ||1   ||24.91%||22.65%&lt;br /&gt;
|-&lt;br /&gt;
|2048 ||2   ||17.54%&lt;br /&gt;
|-&lt;br /&gt;
|4096 ||1   ||9.18% ||5.98%&lt;br /&gt;
|-&lt;br /&gt;
|4096 ||2   ||4.78% ||3.99%&lt;br /&gt;
|-&lt;br /&gt;
|8192 ||1   ||3.73% ||1.68%&lt;br /&gt;
|-&lt;br /&gt;
|8192C||1   ||0.73% ||1.41%&lt;br /&gt;
|-&lt;br /&gt;
|8192 ||2   ||0.12% ||0.02%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
だいたい1%のミスが0.5秒のロスぐらいになるのだろうか(プロセッサが頑張って100MHzを出し、コンパイラが頑張って1.5GInstを出すとの妄想のもとでの概算)。&lt;br /&gt;
&lt;br /&gt;
=== プリフェッチミス ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|Word ||Way ||base  ||contest &lt;br /&gt;
|-&lt;br /&gt;
|1024 ||1   ||5.54% ||4.58%&lt;br /&gt;
|-&lt;br /&gt;
|1024 ||2   ||3.75% &lt;br /&gt;
|-&lt;br /&gt;
|2048 ||1   ||3.10% ||2.63%&lt;br /&gt;
|-&lt;br /&gt;
|2048 ||2   ||1.87% &lt;br /&gt;
|-&lt;br /&gt;
|4096 ||1   ||1.31% ||0.84%&lt;br /&gt;
|-&lt;br /&gt;
|4096 ||2   ||0.53% ||0.47%&lt;br /&gt;
|-&lt;br /&gt;
|8192 ||1   ||0.55% ||0.22%&lt;br /&gt;
|-&lt;br /&gt;
|8192C||1   ||0.14% ||0.16%&lt;br /&gt;
|-&lt;br /&gt;
|8192 ||2   ||0.01% ||0.00%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
FetchにPrefetch機能を加えてみた。極めてよく当たっている。が、今後コードの最適化が進むと当たりにくくなる可能性があるので、多少差し引いて考えたほうがいい。&lt;br /&gt;
&lt;br /&gt;
=== ロードミス ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|Word ||Way ||base  ||contest &lt;br /&gt;
|-&lt;br /&gt;
|1024 ||1   ||8.08% ||9.08%&lt;br /&gt;
|-&lt;br /&gt;
|1024 ||2   ||      &lt;br /&gt;
|-&lt;br /&gt;
|2048 ||1   ||7.29% ||6.29%&lt;br /&gt;
|-&lt;br /&gt;
|2048 ||2   ||      &lt;br /&gt;
|-&lt;br /&gt;
|4096 ||1   ||5.73% ||5.19%&lt;br /&gt;
|-&lt;br /&gt;
|4096 ||2   ||5.94% ||4.82%&lt;br /&gt;
|-&lt;br /&gt;
|8192C||1   ||3.98% ||9.18%&lt;br /&gt;
|-&lt;br /&gt;
|8192 ||1   ||2.91% ||4.63%&lt;br /&gt;
|-&lt;br /&gt;
|8192 ||2   ||2.50% ||4.41%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Way数は、2 Wayを考えていたが、ほとんど無意味のようである、良くなるどころかむしろ悪かったりするなど、驚きである。またWord数は、8K Wordを考えていたが、同様にほとんど無意味らしい。あまり工夫をしても仕方がなさそうなので、資源はFetch側に回したほうがよさげである。&lt;br /&gt;
&lt;br /&gt;
だいたい1%のミスが0.1秒のロスぐらいになるのだろうか。Fetch Missが問答無用でパイプラインをストールさせるのに対し、Load Missは依存関係によるので、はっきりとはわからないが。&lt;br /&gt;
&lt;br /&gt;
== 試験効果(1/28) ==&lt;br /&gt;
&lt;br /&gt;
試験が迫ってくると、作業が止まる気がしていた。&lt;br /&gt;
&lt;br /&gt;
しかし、現実逃避により、作業が普段よりもはかどるという可能性もある気がしてきた。&lt;br /&gt;
&lt;br /&gt;
== S.I.D.(1/28) ==&lt;br /&gt;
んｆ&lt;br /&gt;
&lt;br /&gt;
== レジスタ考(1/27) ==&lt;br /&gt;
&lt;br /&gt;
命令の長さと命令キャッシュの大きさの問題により、64個としておきます。&lt;br /&gt;
&lt;br /&gt;
というか数があると依存関係判定にかかる時間が延びるんだよな。&lt;br /&gt;
&lt;br /&gt;
== パイプライン考(1/24) ==&lt;br /&gt;
&lt;br /&gt;
==決めたといいつつ何度も変えてすいません(実際かなり迷ってるんですよ)。&lt;br /&gt;
レジスタに、巨大な容量をもつ&amp;quot;Block SelectRAM&amp;quot;を使うのに落ち着きそうです。&amp;#039;&amp;#039;&amp;#039;したがって、レジスタを、64個どころか、256個にできる可能性が非常にあります。&amp;#039;&amp;#039;&amp;#039;==&lt;br /&gt;
&lt;br /&gt;
現在のところ、パイプラインを、&lt;br /&gt;
&lt;br /&gt;
# 命令解釈 / 依存関係解析&lt;br /&gt;
# 分岐実行 / ALU演算実行 / FPU演算実行(1)&lt;br /&gt;
# FPU演算実行(2)&lt;br /&gt;
# FPU演算実行(3)&lt;br /&gt;
# FPU演算実行(4)&lt;br /&gt;
&lt;br /&gt;
の5段にしようかなと妄想中である。&lt;br /&gt;
&lt;br /&gt;
== 本番向けプロセッサコードネーム(1/24) ==&lt;br /&gt;
&lt;br /&gt;
とりあえず&lt;br /&gt;
&lt;br /&gt;
Processor [2x]&lt;br /&gt;
&lt;br /&gt;
にでもしようかと。一昨年、昨年の動作周波数は50MHzどまりなので、今年は何が何でも100MHzを目指そうという意気込みを一応表してみる。&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>	</entry>

	<entry>
		<id>https://is.zng.info/wiki/experiment/index.php/%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5</id>
		<title>プロセッサ</title>
		<link rel="alternate" type="text/html" href="https://is.zng.info/wiki/experiment/index.php/%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5"/>
				<updated>2015-11-29T06:11:34Z</updated>
		
		<summary type="html">&lt;p&gt;Maintenance script: ページの作成:「== 命令実行数(1/19) ==  {| class=wikitable  |命令  ||命令数  |-  |ADDI  ||1.08G (1,085,744,581)  |-  |LOAD  ||1.48G (1,483,879,478)  |-  |STORE ||0.91G (906,507...」&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 命令実行数(1/19) ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|命令  ||命令数&lt;br /&gt;
|-&lt;br /&gt;
|ADDI  ||1.08G (1,085,744,581)&lt;br /&gt;
|-&lt;br /&gt;
|LOAD  ||1.48G (1,483,879,478)&lt;br /&gt;
|-&lt;br /&gt;
|STORE ||0.91G (906,507,176)&lt;br /&gt;
|-&lt;br /&gt;
|BE    ||0.00G (2,844,897)&lt;br /&gt;
|-&lt;br /&gt;
|BNE   ||0.22G (219,303,503)&lt;br /&gt;
|-&lt;br /&gt;
|BL    ||0.00G (4,529,133)&lt;br /&gt;
|-&lt;br /&gt;
|BLE   ||0.00G (4,637,002)&lt;br /&gt;
|-&lt;br /&gt;
|FBL   ||0.00G (458,378)&lt;br /&gt;
|-&lt;br /&gt;
|FBLE  ||0.05G (49,806,643)&lt;br /&gt;
|-&lt;br /&gt;
|JR    ||0.40G (402,071,764)&lt;br /&gt;
|-&lt;br /&gt;
|JAL   ||0.32G (319,600,847)&lt;br /&gt;
|-&lt;br /&gt;
|ADD   ||0.42G (422,709,176)&lt;br /&gt;
|-&lt;br /&gt;
|SUB   ||0.00G (2,993,400)&lt;br /&gt;
|-&lt;br /&gt;
|SLL   ||0.14G (139,808,215)&lt;br /&gt;
|-&lt;br /&gt;
|SRR   ||0.03G (27,755,586)&lt;br /&gt;
|-&lt;br /&gt;
|AND   ||0.00G (4,266,022)&lt;br /&gt;
|-&lt;br /&gt;
|OR    ||0.00G (0)&lt;br /&gt;
|-&lt;br /&gt;
|XOR   ||0.03G (28,076,134)&lt;br /&gt;
|-&lt;br /&gt;
|XNOR  ||0.00G (6,419)&lt;br /&gt;
|-&lt;br /&gt;
|FADD  ||0.06G (60,243,705)&lt;br /&gt;
|-&lt;br /&gt;
|FSUB  ||0.06G (57,413,099)&lt;br /&gt;
|-&lt;br /&gt;
|FMUL  ||0.12G (119,571,653)&lt;br /&gt;
|-&lt;br /&gt;
|FDIV  ||0.00G (1,516,985)&lt;br /&gt;
|-&lt;br /&gt;
|FSQRT ||0.00G (2,197,885)&lt;br /&gt;
|-&lt;br /&gt;
|RD    ||0.00G (1,300)&lt;br /&gt;
|-&lt;br /&gt;
|WR    ||0.00G (154,917)&lt;br /&gt;
|-&lt;br /&gt;
|MOV   ||1.06G (1,056,161,640)&lt;br /&gt;
|-&lt;br /&gt;
|NOP   ||1.26G (1,260,320,465)&lt;br /&gt;
|-&lt;br /&gt;
|計    ||7.66G (7,662,580,003)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* MOVは、ADDIから、即値がゼロのものを取り分けたもの。&lt;br /&gt;
* NOPは、アセンブラが加えたもの。&lt;br /&gt;
&lt;br /&gt;
== 50Mz 236.731s動作(1/18) ==&lt;br /&gt;
&lt;br /&gt;
しました。よかった。&lt;br /&gt;
&lt;br /&gt;
== 不安定さの元凶(1/18) ==&lt;br /&gt;
&lt;br /&gt;
見返すと、今回の問題では、1週間も嵌っているようだ。鬱になる。試行錯誤の結果、どうやらIOAのOUTのタイミングに原因があると睨んでいる。だとするとfibがなぜ動いていたか謎だが、現象からしてそうとしか考えられない。明日、というかもう今日だがDCM二段重ね(DLL用とDPS用で二段重ね)の荒業に挑戦をしてみる。&lt;br /&gt;
&lt;br /&gt;
== 30MHz 394.537s動作(1/16) ==&lt;br /&gt;
&lt;br /&gt;
しかし誓約満たしても動かないFPGAはツンツンしすぎである。&lt;br /&gt;
&lt;br /&gt;
== クロックアップしようと思ったら(1/12) ==&lt;br /&gt;
&lt;br /&gt;
逆にクロックダウンする羽目に。昨日の25MHzの画像が、ちょっと乱れていたのが判明。&lt;br /&gt;
&lt;br /&gt;
というわけで20MHz 591.781sが現在の記録。&lt;br /&gt;
&lt;br /&gt;
== キタコレ(1/11) ==&lt;br /&gt;
&lt;br /&gt;
[[file:プロセッサ-raytrace.png]]USBによる完全動作を確かめた。記録は、25MHz 443.52s。記録としては、まだまだといったところか。ソースコードは、12/29のとほぼ同じだが、クロックを25MHzに落とした。本当は50MHzで動かしたかったのだが、動かず。多分40MHzだと動くので、明日には試してみる。まあ、今日のところは、とりあえず動くのが優先であった。&lt;br /&gt;
&lt;br /&gt;
引き続き、コンテスト出場基準に至るために、RS-232Cへの対応、sin/cos /atanプリミティブの精度向上(高山氏よろしく)、アーキテクチャ改良を考えるために、各関数の実行数の把握(高山氏よろしく？)、キャッシュの研究といったあたりを、取り組んでいく。&lt;br /&gt;
&lt;br /&gt;
== revision 20: updated stable version(12/29) ==&lt;br /&gt;
&lt;br /&gt;
[[media:プロセッサ-20051229.zip]]&lt;br /&gt;
&lt;br /&gt;
== すべての測定値が計画値と一致(12/29) ==&lt;br /&gt;
さて自宅に帰ってくると出かける際に仕掛けておいたModelsimのジョブが完了していた。そこで、&lt;br /&gt;
&lt;br /&gt;
 $ diff -u simulator.log processor.log&lt;br /&gt;
 &lt;br /&gt;
 $&lt;br /&gt;
&lt;br /&gt;
== システムドライブの空き容量僅少(12/29) ==&lt;br /&gt;
突然、システムドライブの空き容量僅少との警告。どうやらModelsimがメッセージのログを起動中ずっとファイルに吐き続けていて、6GByteに達していた。たまに再起動をかけてやるか、毎回起動時に[Tools]-[Options]-[Transcript File...]でファイル名を単に空にするといいようだ。&lt;br /&gt;
&lt;br /&gt;
== アセンブラの遅延LOADに続くNOP挿入に不具合(12/29) ==&lt;br /&gt;
ロードのrsとrtが同じレジスタを指している場合に、自分自身が衝突を起こしているという解釈を行い、間違った場所にNOP挿入を行う不具合があった。&lt;br /&gt;
&lt;br /&gt;
また、連続するLOADがある際、本来NOPの省略ができ、実際省略を行っていたのだが、制御の流れによっては、(つまり連続するLOADの最後のLOADにジャンプしてきた際などは、)省略が行われるとまずいので、省略を一切行わないこととした。速いことより動くこと優先である。(ちなみに、NOP挿入回数が、1007から1667になった。)&lt;br /&gt;
&lt;br /&gt;
しかし、シミュレータでもプロセッサでもなく、アセンブラの不具合であった。アセンブリレベルでの衝突判定に、意外と罠あり。&lt;br /&gt;
&lt;br /&gt;
== Modelsim XE III/Starter(12/28) ==&lt;br /&gt;
製品版より100倍ビジーループで時間を浪費する(との噂の)評価版であるが、ISE Simulatorよりましである。&lt;br /&gt;
&lt;br /&gt;
おかげで、完全動作を確認、といいたいところであったが、むしろまた問題発覚。&lt;br /&gt;
&lt;br /&gt;
とりあえず、setup_rect_tableでconst.(2) (同関数は何回も呼ばれるが、初回だと、530401)に代入される値が、初回だと、(Modelsim上の)プロセッサが0xc2a00000、(cygwin上の)シミュレータが0xc1a00000というふうに。どちらが正しいかなど(たぶんプロセッサが誤っているが)、万毒なのでまた明日。&lt;br /&gt;
&lt;br /&gt;
== ISE Simulatorがだんまりになる件(12/28) ==&lt;br /&gt;
&lt;br /&gt;
[[http://www.origin.xilinx.co.jp/xlnx/xil_ans_printfriendly.jsp?getPagePath=20370&amp;amp;BV_SessionID=@@@@0221157914.1135770314@@@@&amp;amp;BV_EngineID=ccccaddgiimdmkecefeceihdffhdfjf.0|アンサー #20370: 7.1i ISE Simulator (ISIM) - ISE Simulator の既知の問題]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;質問 1:&amp;#039;&amp;#039;&amp;#039; デザインに対して 60 秒以上シミュレーションを実行すると、ISE が停止し、クラッシュしたように見えます。これはなぜですか。&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;回答 1:&amp;#039;&amp;#039;&amp;#039; これは、波形の保存方法に問題があるため発生します。 この問題は、ISE 8.1i の ISE Simulator で修正される予定です。 &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
うぼあ。&lt;br /&gt;
&lt;br /&gt;
== プロトタイプ完成(12/28) ==&lt;br /&gt;
ISE Simulatorで4x4のレイトレースを走らせているが、ISE Simulatorがしょぼいため、途中で固まってしまうようだ。しかし、総SRAM書き換え231,285回中少なくとも15,166回までは、アドレス、データとも、測定値が計画値通りとなっており、おそらく現在のソースコードで実機完全動作できる公算大である。&lt;br /&gt;
&lt;br /&gt;
== 続・sinの引数がDon&amp;#039;t care(12/28) ==&lt;br /&gt;
遡ること数百us、2,136,460nsに元凶を発見。別のメモリコントローラ不具合の模様。&lt;br /&gt;
&lt;br /&gt;
== sinの引数がDon&amp;#039;t care(12/28) ==&lt;br /&gt;
sinの寸前にprint_float (print_int int_of_float)を置いてみると、やはり変な挙動を示す。sinの引数がDon&amp;#039;t careになってしまい永久ループにはまっている可能性がある。&lt;br /&gt;
&lt;br /&gt;
== sinで停止(12/27) ==&lt;br /&gt;
先ほどの不具合を直したが、sin (called by tan (called by adjust_position (called by calc_dirvec)))で相当永いループにはまってしまう。ライブラリの不具合でなくプロセッサの別な不具合である予感がするが、万毒なので明日にしよう。&lt;br /&gt;
&lt;br /&gt;
== メモリコントローラ不具合(12/27) ==&lt;br /&gt;
Modelsim製品版は地底でしか使えないので、仕方なくISE Simulatorを使っているわけだが、使い勝手はいまいちである。&lt;br /&gt;
&lt;br /&gt;
しかし、load/store + fadd/fsub/fmul/finv/fsqrt/rd/wrの命令列で不正な位置に制御が移る現象を見つけた。完全動作の決め手になるか。&lt;br /&gt;
&lt;br /&gt;
== revision 15: stable version(12/16) ==&lt;br /&gt;
[[media:プロセッサ-20051216.zip]]&lt;br /&gt;
&lt;br /&gt;
== FSQRT実機動作(12/15 20:00) ==&lt;br /&gt;
しますた。&lt;br /&gt;
&lt;br /&gt;
実は、先の記事を投稿した際にFDIVにバグがあったのだが、もはや問題ない。&lt;br /&gt;
&lt;br /&gt;
さてそろそろ本気でレイトレでも動かしますかね。&lt;br /&gt;
&lt;br /&gt;
== FDIV(=FINV+FMUL)実機動作(12/15 12:00) ==&lt;br /&gt;
した模様。&lt;br /&gt;
&lt;br /&gt;
FSQRTも今日中には動く。&lt;br /&gt;
&lt;br /&gt;
なおFTOI、ITOFはプロトタイプにおけるハードウェアでの実現は見送り。ソフトウェアで実現することとする。&lt;br /&gt;
&lt;br /&gt;
== 謎事象(12/14) ==&lt;br /&gt;
次の条件を全て満たすとUSB転送において先頭1バイトのデータが消える&lt;br /&gt;
#異なるbitファイルを焼きこむ(setup.bitにcpu.bitか、cpu.bitにsetup.bit)。&lt;br /&gt;
#焼き変えたときにUSBを繋いだままにする。&lt;br /&gt;
#USB転送をバッファリングする。&lt;br /&gt;
このいずれかを避ければ大丈夫である。謎。&lt;br /&gt;
&lt;br /&gt;
== 再誤差評価メモ(12/12) ==&lt;br /&gt;
12/8のFDIV墜つというのはおそらく何かの間違いだったようで、やや改良を施した誤差評価プログラムを、16台のクラスタで三日三晩ぶん回したときの、絶対値の誤差の許容誤差に対する割合を次に示す。&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|プリミティブ||下限               ||上限&lt;br /&gt;
|-&lt;br /&gt;
|FADD        ||-99.996305%(csc003)||99.998188%(csc000)&lt;br /&gt;
|-&lt;br /&gt;
|FSUB        ||-99.998176%(csc000)||99.997377%(csc003)&lt;br /&gt;
|-&lt;br /&gt;
|FMUL        ||-99.987310%(csc001)||00.000000%(------)&lt;br /&gt;
|-&lt;br /&gt;
|FDIV        ||-90.710601%(csc002)||99.777329%(csc002)&lt;br /&gt;
|-&lt;br /&gt;
|FSQRT       ||-87.797710%(------)||77.754951%(------)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== kosak氏のメモをコピペ(12/9) ==&lt;br /&gt;
 sin x = 6.283185253x-41.34161766x^3+81.58431506x^5-75.03564774x^7&lt;br /&gt;
 cos x = 0.9999999102-19.73907713x^2+64.90806899x^4-83.02261683x^6&lt;br /&gt;
 tan x = (3.141592786x-2.230781803x^3-0.5370510434x^5-0.2262894106x^7)/&lt;br /&gt;
         (1-3.999937220x^2)&lt;br /&gt;
 arctan x = (0.9999995347x+0.6667364106x^3+0.04243594020x^5)/&lt;br /&gt;
            (1+1.000037148x^2+0.1761470730x^4)&lt;br /&gt;
&lt;br /&gt;
== FDIV弄り(12/9) ==&lt;br /&gt;
今度こそ大丈夫だと思うが。&lt;br /&gt;
&lt;br /&gt;
== FDIV墜つ(12/8) ==&lt;br /&gt;
* 0 78 060080&lt;br /&gt;
* 1 4b 17aa1b&lt;br /&gt;
という引数に対して墜ちた。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 誤差評価メモ(12/8) ==&lt;br /&gt;
昨日の誤差評価プログラムを一晩ぶん回したときの、絶対値の誤差の許容誤差に対する割合を次に示す。&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|プリミティブ ||下限    ||上限&lt;br /&gt;
|-&lt;br /&gt;
|FADD         ||-99.99% ||99.99%&lt;br /&gt;
|-&lt;br /&gt;
|FSUB         ||-99.99% ||99.99%&lt;br /&gt;
|-&lt;br /&gt;
|FMUL         ||-99.86% ||0.00%&lt;br /&gt;
|-&lt;br /&gt;
|FDIV         ||-89.66% ||99.77%&lt;br /&gt;
|-&lt;br /&gt;
|FSQRT        ||-99.58% ||97.66%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FINV, FSQRT(12/7) ==&lt;br /&gt;
*FINVは、9x10のテーブル引き&lt;br /&gt;
*FSQRTは、9x(10+19)のテーブル引き&lt;br /&gt;
&lt;br /&gt;
で、合計9x39bitとすると効率がよろしくないので、隣接する値は差分を使うことにして、9x36bitに収める(もっと詰めると35bitに収まるが、1bitは計算を省くのに使おうか謎)。デュアルポートBlock SelectRAMがポートごとに帯域幅の指定ができるのを忘れていて、うまくいかねーヨと悩んでいたが、気付いてしまったのでかなりぴったりはまったようだ。&lt;br /&gt;
&lt;br /&gt;
浮動小数点数演算は、2 ** 64通りもあるので、全通り試すのは無理で、乱数を引いてきてひたすら繰り返して基準を満たしているか調べている。とりあえず、数時間動かしたところ、誤差の許容誤差に対する割合が、FSQRTは99.578990%、FDIV(FINV+FMUL)は99.731248%となっている。FDIVのほうがかなり心配だが、まあおそらく大丈夫なのだろう。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 浮動小数点数(12/7) ==&lt;br /&gt;
FINV、FSQRTのテーブル引きに影響があるので、非正規化数をあきらめた。すなわち、浮動小数点数の扱いを次の擬似コードのように定める。&lt;br /&gt;
&lt;br /&gt;
 $e ? (-1) ** $s * ($e - 128) * (1 + $f / 2 ** -23) : $f ? undef : (-1) ** $s * 0;&lt;br /&gt;
&lt;br /&gt;
== ITOF備忘録(12/3) ==&lt;br /&gt;
intからfloatへのキャストは、ハードウェアでやると確かに超楽であり、1〜2クロックでできるであろうが、レイトレのソースにはほとんど出現しないので(シミュレータがないと本当にほどんど実行されないかどうかはわからないが)、ソフトウェアでやることも考えられるので、非正規化数を使ったレシピを。&lt;br /&gt;
&lt;br /&gt;
# 整数Aを非負か負で場合分け。ここでは非負の場合についてのみ述べるが、負の場合もほぼ同様の手順である。&lt;br /&gt;
#Aを23ビット右シフトしBとする。&lt;br /&gt;
#Bを23ビット左シフトしCとする。&lt;br /&gt;
#AとCを整数減算し、Dとする。&lt;br /&gt;
#Bに2^98を浮動小数点乗算し、Eとする。&lt;br /&gt;
#Dに2^75を浮動小数点乗算し、Fとする。&lt;br /&gt;
#EとFを浮動小数点加算し、Gとする。&lt;br /&gt;
#Gに2^75を浮動小数点乗算すると、完了。&lt;br /&gt;
&lt;br /&gt;
ざっと20クロック弱か。大変だなあ。&lt;br /&gt;
&lt;br /&gt;
== FADD, FSUB, FMUL実機動作(12/3) ==&lt;br /&gt;
結構サークルの1〜2年生をサポートするのに忙しかったが、駒場祭は儚くも過ぎ去り、再びそこそこ暇である。ここしばらく記録を取っていなかったが、FPUに取り掛かっている。途中、もはやバグなどないと思っていたレジスタファイルのコンポーネントにバグがあったせいで時間がかかっていた。&lt;br /&gt;
&lt;br /&gt;
で、本日FADD, FSUB, FMULを実装。FDIV、FSQRT、FTOI、ITOF等をソフトウェアでやるという仕様にすればレイトレが動くと思われる。まあさすがにできればハードウェアでやりたいが。というわけで、シミュレータ、コンパイラのほうの進捗状況を禿きぼんぬしたい。&lt;br /&gt;
&lt;br /&gt;
浮動小数点数は、現在のところ、IEEE形式と似て非なる形式となっており、指数部のバイアスが128である。つまり、IEEE形式と比べて指数部を1つずらした格好になっており、InfやNaNを省いている。本来Infとなるべき計算をすると、適当な非正規化数になる。&lt;br /&gt;
&lt;br /&gt;
非正規化数を入れる計算は、律儀にやっているが、非正規化数が出てくる計算は、基準を満たす程度でごまかしているので、指数部は合っているが、仮数部は間違っている。&lt;br /&gt;
&lt;br /&gt;
ちなみに現在50MHzぎりぎりになっており、頭が痛い。さらに機能追加をするとついに周波数を落とさざるをえないかもしれないので、優先度をつけて機能追加をしていきたい。噂によると、FDIVよりFSQRTのほうが頻繁に呼ばれるという話だがどうなんだろうか。&lt;br /&gt;
&lt;br /&gt;
FPUはもちろん、floatのデバッグ用プログラムとかもあくせく作ったのでまたバックアップ。[[media:プロセッサ-20051203.zip]]&lt;br /&gt;
&lt;br /&gt;
== I/O命令対応(11/23) ==&lt;br /&gt;
&lt;br /&gt;
VHDLよりPC側のプログラムに時間がかかった。cygwinだと、Ctrl+Cをしたとき、ターミナルを扱っているプロセスグループでなくプロセス単体にしかシグナルが来ないようである。&lt;br /&gt;
&lt;br /&gt;
ちなみにfib 38の精密な実行時間を測ったところ、23.454秒であった。&lt;br /&gt;
&lt;br /&gt;
文法のチェックを厳しくし(汚いhackなので綺麗にしてくれるとありがたいが)、opやfunctのバイナリを改めたアセンブラを含むプロセッサのソースを置いておく。[[media:プロセッサ-20051123.zip]]&lt;br /&gt;
&lt;br /&gt;
== やっぱり命令追加(11/22) ==&lt;br /&gt;
結局FB*を追加。I/Oを後回しにしすぎだが、あっさり動く自信などあり。&lt;br /&gt;
&lt;br /&gt;
== 命令固定(11/21) ==&lt;br /&gt;
いろいろ調整したつもりだったが、大して改良になっていないという話も(むしろ改悪という説も)。毎日のように弄ったopcodeをこれにて固定。あ、要望があればFBLEとかは加えるかもだが。環境が整ったので、明日よりIO命令の装備に着手。&lt;br /&gt;
&lt;br /&gt;
== I/O命令対応準備(11/18) ==&lt;br /&gt;
FPUやIOなど1クロックでできない命令に対応するための準備作業無事完了。途中、しょうもないところでいろいろはまって鬱。&lt;br /&gt;
&lt;br /&gt;
== フィボナッチ動作(11/16) ==&lt;br /&gt;
[[file:プロセッサ-fibonacci.jpeg]]ついに再帰でフィボナッチ数列の第38項を再帰で求めるプログラムが50MHz 24秒で動作。ちなみに学科PCだとPentium 1.7GHz 1秒ぐらいのようである。LEDが下位1バイト0x29を示しているのがわかるだろう。&lt;br /&gt;
&lt;br /&gt;
プロトタイプによるレイトレ完動、単位確定がだんだんと見えて来た気がする。次FPUに取り掛かる算段。&lt;br /&gt;
&lt;br /&gt;
さらに、完動してからのアーキテクチャについて、そろそろ考えていきたいところ。結局のところ、FPGAにおいて、Register FileやCacheがRAMであるというのが最もネックになるので、それを踏まえている必要がある。&lt;br /&gt;
&lt;br /&gt;
レジスタウィンドウもどきとか面白そうだが、それで速くなるのはスタックだけでヒープは大して速くならないだろうな。そんなこんなをいろいろシミュレーションしてみたい。&lt;br /&gt;
&lt;br /&gt;
== フィボナッチ秒読み(11/15) ==&lt;br /&gt;
中島氏とメモリのタイミングについて議論。誤った知識を正す。するとぎりぎりだと思っていたSRAMのタイミングを余裕にできた。&lt;br /&gt;
&lt;br /&gt;
そんなこんなで、スムーズに開発進行。フィボナッチの動作が秒読みに入ってきた。&lt;br /&gt;
&lt;br /&gt;
なお、条件分岐の性能向上により、無条件分岐と条件分岐でパイプラインが止まるクロック数が同じになった。無条件分岐不要論再燃だがとりあえずフィボナッチに突き進む。&lt;br /&gt;
&lt;br /&gt;
久しぶりにバックアップしておく: [[media:プロセッサ-20051115.zip]]&lt;br /&gt;
&lt;br /&gt;
== 続行(11/14夕) ==&lt;br /&gt;
とりあえず、なぜか動いているソースに戻して修正を続行。&lt;br /&gt;
&lt;br /&gt;
== 発覚(11/14もう朝) ==&lt;br /&gt;
&lt;br /&gt;
一晩かかって、わけがわかった。というかむしろ、昨日までなぜ動いていたかが謎。ご丁寧にWARNINGを吐いてくれていたのだが、昨日までなぜか動いていたためにまったく気にしようとしていなかった。見たくないものを見ないようにする姿勢があったのかもしれぬ。反省。。。また作り直し。作り直すたびに賢くなっているといいのだが。&lt;br /&gt;
&lt;br /&gt;
まあ、罠にはまればはまるほど、動いたときの感慨につながるはずである。&lt;br /&gt;
&lt;br /&gt;
== 混迷(11/14未明) ==&lt;br /&gt;
ぜんぜんだめ。&lt;br /&gt;
&lt;br /&gt;
== LOAD/STORE実験(11/12) ==&lt;br /&gt;
STOREの実験がうまくいくが、命令セットを変えようとしてつまる。&lt;br /&gt;
&lt;br /&gt;
== LOAD/STORE準備(11/11) ==&lt;br /&gt;
タイミングをつめる。何でもかんでもALUを通すといいようだ。&lt;br /&gt;
&lt;br /&gt;
== 順調(11/10) ==&lt;br /&gt;
日付が変わったころから面白いようにはかどる。昨日一昨日罠だらけだったのが嘘のようである。&lt;br /&gt;
&lt;br /&gt;
1つの関門であるところのLOAD/STORE命令も、このまま罠がなければおそらくはまもなく対応できるはず。&lt;br /&gt;
&lt;br /&gt;
ちなみに今日地下には漏れ以外誰も泊まっていない。&lt;br /&gt;
&lt;br /&gt;
== 回帰(11/9) ==&lt;br /&gt;
初めは知らなかったノウハウも溜まってきたところだったので、いい機会だと思って全体をほぼ1から作り直す。&lt;br /&gt;
&lt;br /&gt;
== 挫折(11/8) ==&lt;br /&gt;
制御回路の肥大化に伴いSRAMのタイミングが間に合わなくなり、動かなくなる。&lt;br /&gt;
&lt;br /&gt;
== 命令を整理(11/7) ==&lt;br /&gt;
== ひたすらひたすらプロトタイプアーキテクチャ(11/6) ==&lt;br /&gt;
プロトタイプアーキテクチャをひたすら作業中。&lt;br /&gt;
&lt;br /&gt;
現在の割り当てメモ。&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|ALU命令  ||000X ||XXXS ||SSSX ||TTTT ||XDDD ||DXXX ||XXFX ||FFXX&lt;br /&gt;
|-&lt;br /&gt;
|ALUI命令 ||011F ||FFXS ||SSSX ||DDDD ||MMMM ||MMMM ||MMMM ||MMMM&lt;br /&gt;
|-&lt;br /&gt;
|MMU命令  ||010X ||WXXS ||SSSX ||DDDD ||MMMM ||MMMM ||MMMM ||MMMM&lt;br /&gt;
|-&lt;br /&gt;
|分岐命令 ||1XXC ||CCXS ||SSSX ||XXXX ||MMMM ||MMMM ||MMMM ||MMMM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ひたすらプロトタイプアーキテクチャ(11/5) ==&lt;br /&gt;
プロトタイプアーキテクチャをひたすら作業中。&lt;br /&gt;
ALU命令、即値ALU命令、条件分岐命令の一部に対応。&lt;br /&gt;
&lt;br /&gt;
== プロトタイプアーキテクチャ(11/4) ==&lt;br /&gt;
プロトタイプアーキテクチャをひたすら作業中。&lt;br /&gt;
&lt;br /&gt;
== プレプロトタイプアーキテクチャ(11/1) ==&lt;br /&gt;
オペランド2で、オペレーションADD(16bit)、SUB(16bit)、ADDI(4bit)、SUBI(4bit)、B(10bit)、BZ(10bit)、BNZ(10bit)に対応。レジスタ16。遅延スロット2。演算結果をLEDに表示。&lt;br /&gt;
&lt;br /&gt;
4から1までの総和を計算し、10を表示。&lt;br /&gt;
&lt;br /&gt;
 SUB 0 0 ; 念のためr0を初期化&lt;br /&gt;
 SUB 1 1 ; 念のためr1を初期化&lt;br /&gt;
 ADDI 0 4 ; 4をr0に代入&lt;br /&gt;
 BNZ 510 ; 下の2つの命令を実行してから、同じ命令へ遷移&lt;br /&gt;
 ADD 1 0 ; r1にr0を加算してr1に代入&lt;br /&gt;
 SUBI 0 1 ; r0から1を減算してr0に代入&lt;br /&gt;
 ADDI 1 0 ; LEDにr1を表示するだけ&lt;br /&gt;
 ADDI 1 0 ; LEDにr1を表示するだけ&lt;br /&gt;
 B 508 ; 永久ループ。下の2つの命令を実行してから、2つ上の命令へ遷移&lt;br /&gt;
 ADDI 1 0 ; LEDにr1を表示するだけ&lt;br /&gt;
 ADDI 1 0 ; LEDにr1を表示するだけ&lt;br /&gt;
&lt;br /&gt;
命令はあくまでも実験用で、頻繁な変更を想定。&lt;br /&gt;
&lt;br /&gt;
== いよいよ本体に着手(10/31) ==&lt;br /&gt;
JUMP命令とNOP命令に対応&lt;br /&gt;
&lt;br /&gt;
== タイミング(10/30) ==&lt;br /&gt;
SRAMへの信号のタイミングを見直してエラーが起こる確率を0とした。&lt;br /&gt;
&lt;br /&gt;
== 技術提携(10/29) ==&lt;br /&gt;
深夜大学へ。&lt;br /&gt;
&lt;br /&gt;
中島班と技術提携。昨日のucfファイルの件を教える代わりに、DCMの件、ModelSimの件について教えてもらう。&lt;br /&gt;
&lt;br /&gt;
== SRAM(10/28) ==&lt;br /&gt;
成果があった: [[media:プロセッサ-20051028.zip]]&lt;br /&gt;
&lt;br /&gt;
USBからSRAMへのデータのセットアップ、SRAMからUSBへのデータのダンプにおおむね成功。しかし、タイミングが微妙なせいか100回に1回くらいの確率でエラーが起こっている。&lt;br /&gt;
&lt;br /&gt;
そもそも、配布されているucfファイルにミスがあった。なかなか気付かなかったので、ぜひ他班に教えないでおきたい。&lt;br /&gt;
&lt;br /&gt;
== FPGAが石に(10/27) ==&lt;br /&gt;
あぼんぬ氏FPGA破壊祭りで地底大いに湧く。&lt;br /&gt;
&lt;br /&gt;
== USB(10/21) ==&lt;br /&gt;
USBでの送受信に成功。マニュアルの参照の仕方を分かってきた。&lt;br /&gt;
&lt;br /&gt;
== LED(10/6) ==&lt;br /&gt;
LED動作に失敗。翌日scarlet氏立会いの下基盤を交換。&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>	</entry>

	<entry>
		<id>https://is.zng.info/wiki/experiment/index.php/%E3%82%B7%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%BF</id>
		<title>シミュレータ</title>
		<link rel="alternate" type="text/html" href="https://is.zng.info/wiki/experiment/index.php/%E3%82%B7%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%BF"/>
				<updated>2015-11-29T06:11:34Z</updated>
		
		<summary type="html">&lt;p&gt;Maintenance script: ページの作成:「メモ:最新のコンパイラコードは、古いバージョンのシミュレータで実行できなくなっています。これは、put命令、get命令の処...」&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;メモ:最新のコンパイラコードは、古いバージョンのシミュレータで実行できなくなっています。これは、put命令、get命令の処理が変更されたためです([[命令セット(ドラフト)|命令セット[2x]]]参照)。[[コンパイラ]]のページにある新しいバージョンのシミュレータを使用します。&lt;br /&gt;
&lt;br /&gt;
メモ:[[プロセッサ 2x|コンパイラ]]のページにあるシミュレータはさらに更新されました。更新されたシミュレータは[[プロセッサ [2x]]]のページにあります。&lt;br /&gt;
&lt;br /&gt;
== 3/6 新sincos ==&lt;br /&gt;
昨年のfirexhlで使われていた方式で実装してみました（xhl.cとsincos.s）。指数部が152を超えるあたりから誤差が発生してしまいますが、これまでの2πの倍数を引く方式よりはだいぶ精度が良いようです。&lt;br /&gt;
&lt;br /&gt;
sincos.sをテストしていたら、0x4141D16E fsub 0x40C90FDB の結果が、シミュレータでは 0x40BA9302、Cのプログラムでは 0x40BA9301となっていました。どうしたものでしょう。&lt;br /&gt;
&lt;br /&gt;
シミュレータとアセンブラを少し修正しました。&lt;br /&gt;
&lt;br /&gt;
[[media:シミュレータ-&amp;quot;assembler.060306.zip&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
== 1/22 関数呼び出しのカウント ==&lt;br /&gt;
JALからラベルに飛ぶ回数を数えてみました。以下はcontest.sldを計算させた結果です。&lt;br /&gt;
 ./a.out min-rt.bin sld/contest.bin ppm/contest.ppm&lt;br /&gt;
 Operations executed&lt;br /&gt;
 ----------------------------------------------------------------&lt;br /&gt;
 ADD      : 422544857&lt;br /&gt;
 SUB      : 2994757&lt;br /&gt;
 SLL      : 139670897&lt;br /&gt;
 SRR      : 27757726&lt;br /&gt;
 AND      : 4262640&lt;br /&gt;
 OR       : 0&lt;br /&gt;
 XOR      : 28065642&lt;br /&gt;
 NOT      : 0&lt;br /&gt;
 FADD     : 60037783&lt;br /&gt;
 FSUB     : 57195568&lt;br /&gt;
 FMUL     : 119303594&lt;br /&gt;
 FINV     : 1516934&lt;br /&gt;
 FSQRT    : 2197844&lt;br /&gt;
 RD       : 1300&lt;br /&gt;
 WR       : 154913&lt;br /&gt;
 SIN      : 0&lt;br /&gt;
 COS      : 0&lt;br /&gt;
 ATAN     : 0&lt;br /&gt;
 BR       : 0&lt;br /&gt;
 &lt;br /&gt;
 Label called from JAL&lt;br /&gt;
 ----------------------------------------------------------------&lt;br /&gt;
 rt.3079         : 1&lt;br /&gt;
 min_caml_div    : 56602&lt;br /&gt;
 min_caml_float_of_int   : 16623&lt;br /&gt;
 create_pixelline.3026   : 3&lt;br /&gt;
 create_pixel.3021       : 384&lt;br /&gt;
 min_caml_create_float_array     : 19001&lt;br /&gt;
 create_float5x3array.3019       : 1536&lt;br /&gt;
 min_caml_create_array   : 3297&lt;br /&gt;
 read_parameter.2744     : 1&lt;br /&gt;
 read_screen_settings.2725       : 1&lt;br /&gt;
 min_caml_read_float     : 212&lt;br /&gt;
 rad.2723        : 4&lt;br /&gt;
 min_caml_cos    : 1004&lt;br /&gt;
 min_caml_sin    : 5734&lt;br /&gt;
 min_caml_fneg   : 1927784&lt;br /&gt;
 read_light.2727         : 1&lt;br /&gt;
 min_caml_read_int       : 113&lt;br /&gt;
 read_all_object.2736    : 1&lt;br /&gt;
 read_nth_object.2732    : 18&lt;br /&gt;
 min_caml_fisneg         : 5006280&lt;br /&gt;
 min_caml_fiszero        : 11192350&lt;br /&gt;
 sgn.2598        : 122912&lt;br /&gt;
 min_caml_fispos         : 7854748&lt;br /&gt;
 min_caml_fsqr   : 17954371&lt;br /&gt;
 vecunit_sgn.2624        : 16386&lt;br /&gt;
 min_caml_sqrt   : 2197844&lt;br /&gt;
 read_and_network.2742   : 1&lt;br /&gt;
 read_net_item.2738      : 43&lt;br /&gt;
 read_or_network.2740    : 3&lt;br /&gt;
 write_ppm_header.2987   : 1&lt;br /&gt;
 min_caml_print_char     : 32773&lt;br /&gt;
 min_caml_print_int      : 3&lt;br /&gt;
 min_caml_print_int_pos  : 56600&lt;br /&gt;
 min_caml_mul    : 86380&lt;br /&gt;
 init_dirvecs.3062       : 1&lt;br /&gt;
 create_dirvecs.3055     : 1&lt;br /&gt;
 create_dirvec.3050      : 601&lt;br /&gt;
 create_dirvec_elements.3052     : 5&lt;br /&gt;
 calc_dirvec_rows.3046   : 1&lt;br /&gt;
 calc_dirvecs.3041       : 10&lt;br /&gt;
 calc_dirvec.3033        : 100&lt;br /&gt;
 adjust_position.3030    : 1000&lt;br /&gt;
 min_caml_atan   : 1000&lt;br /&gt;
 tan.3028        : 1000&lt;br /&gt;
 d_vec.2713      : 22730701&lt;br /&gt;
 vecset.2606     : 782214&lt;br /&gt;
 add_mod5.2603   : 16572&lt;br /&gt;
 init_dirvec_constants.3057      : 5&lt;br /&gt;
 setup_dirvec_constants.2842     : 602&lt;br /&gt;
 d_const.2715    : 15955271&lt;br /&gt;
 o_form.2654     : 23584119&lt;br /&gt;
 setup_surface_table.2833        : 1204&lt;br /&gt;
 o_param_a.2662  : 15144861&lt;br /&gt;
 o_param_b.2664  : 13092163&lt;br /&gt;
 o_param_c.2666  : 9692918&lt;br /&gt;
 setup_second_table.2836         : 5418&lt;br /&gt;
 quadratic.2767  : 3444202&lt;br /&gt;
 o_isrot.2660    : 3663074&lt;br /&gt;
 setup_rect_table.2830   : 3612&lt;br /&gt;
 o_isinvert.2658         : 13998105&lt;br /&gt;
 min_caml_xor    : 2081443&lt;br /&gt;
 fneg_cond.2600  : 206098&lt;br /&gt;
 veccpy.2616     : 167742&lt;br /&gt;
 setup_reflections.3077  : 1&lt;br /&gt;
 o_reflectiontype.2656   : 18497&lt;br /&gt;
 o_diffuse.2676  : 567663&lt;br /&gt;
 min_caml_fless  : 35627931&lt;br /&gt;
 o_param_abc.2668        : 832786&lt;br /&gt;
 veciprod.2627   : 1743576&lt;br /&gt;
 add_reflection.3064     : 1&lt;br /&gt;
 pretrace_line.3003      : 128&lt;br /&gt;
 vecbzero.2614   : 150396&lt;br /&gt;
 trace_ray.2933  : 16384&lt;br /&gt;
 p_surface_ids.2698      : 180662&lt;br /&gt;
 judge_intersection.2896         : 23755&lt;br /&gt;
 trace_or_matrix.2892    : 23755&lt;br /&gt;
 solver.2786     : 173579&lt;br /&gt;
 o_param_x.2670  : 8437945&lt;br /&gt;
 o_param_y.2672  : 8343343&lt;br /&gt;
 o_param_z.2674  : 8437945&lt;br /&gt;
 solver_rect_surface.2746        : 195262&lt;br /&gt;
 min_caml_fabs   : 25984199&lt;br /&gt;
 solve_one_or_network.2888       : 30531&lt;br /&gt;
 solve_each_element.2884         : 135676&lt;br /&gt;
 veciprod2.2630  : 629987&lt;br /&gt;
 check_all_inside.2869   : 1779616&lt;br /&gt;
 is_outside.2864         : 3133247&lt;br /&gt;
 bilinear.2772   : 74271&lt;br /&gt;
 get_nvector.2918        : 660732&lt;br /&gt;
 utexture.2921   : 660732&lt;br /&gt;
 o_texturetype.2652      : 660732&lt;br /&gt;
 o_color_red.2680        : 660732&lt;br /&gt;
 o_color_green.2682      : 660732&lt;br /&gt;
 o_color_blue.2684       : 660732&lt;br /&gt;
 p_intersection_points.2696      : 31490&lt;br /&gt;
 p_calc_diffuse.2700     : 55488&lt;br /&gt;
 vecaccum.2635   : 45411&lt;br /&gt;
 o_hilight.2678  : 18496&lt;br /&gt;
 shadow_check_one_or_matrix.2881         : 671071&lt;br /&gt;
 solver_fast.2809        : 4266685&lt;br /&gt;
 shadow_check_one_or_group.2878  : 870017&lt;br /&gt;
 shadow_check_and_group.2875     : 3270896&lt;br /&gt;
 add_light.2924  : 27884&lt;br /&gt;
 setup_startp.2847       : 37097&lt;br /&gt;
 o_param_ctbl.2692       : 12309001&lt;br /&gt;
 trace_reflections.2928  : 18496&lt;br /&gt;
 r_dvec.2719     : 18496&lt;br /&gt;
 judge_intersection_fast.2910    : 1134556&lt;br /&gt;
 trace_or_matrix_fast.2906       : 1134556&lt;br /&gt;
 solver_fast2.2827       : 11678352&lt;br /&gt;
 solve_one_or_network_fast.2902  : 1819379&lt;br /&gt;
 solve_each_element_fast.2898    : 8647162&lt;br /&gt;
 p_rgb.2694      : 32768&lt;br /&gt;
 p_set_group_id.2708     : 16384&lt;br /&gt;
 pretrace_diffuse_rays.2993      : 16384&lt;br /&gt;
 get_surface_id.2971     : 151905&lt;br /&gt;
 scan_pixel.3007         : 128&lt;br /&gt;
 neighbors_exist.2967    : 16384&lt;br /&gt;
 do_without_neighbors.2964       : 508&lt;br /&gt;
 write_rgb.2991  : 16384&lt;br /&gt;
 write_rgb_element.2989  : 49152&lt;br /&gt;
 min_caml_int_of_float   : 49152&lt;br /&gt;
 try_exploit_neighbors.2980      : 15876&lt;br /&gt;
 neighbors_are_available.2974    : 17844&lt;br /&gt;
 p_energy.2702   : 22250&lt;br /&gt;
 vecscale.2645   : 11125&lt;br /&gt;
 p_nvectors.2711         : 24119&lt;br /&gt;
 r_surface_id.2717       : 11283&lt;br /&gt;
 r_bright.2721   : 10339&lt;br /&gt;
 p_group_id.2706         : 12994&lt;br /&gt;
 trace_diffuse_rays.2947         : 17109&lt;br /&gt;
 trace_diffuse_ray.2939  : 1116060&lt;br /&gt;
 p_received_ray_20percent.2704   : 59274&lt;br /&gt;
 min_caml_floor  : 189204&lt;br /&gt;
 calc_diffuse_using_1point.2955  : 1869&lt;br /&gt;
 trace_diffuse_ray_80percent.2951        : 1869&lt;br /&gt;
 calc_diffuse_using_5points.2958         : 9256&lt;br /&gt;
 vecadd.2639     : 37024&lt;br /&gt;
環境はux101.ecc.u-tokyo.ac.jpでだいたい45分くらいかかってしまいました。&lt;br /&gt;
diffを取ったら一致しない点が多数あったので、三角関数などの精度がまだ足りないようです。&lt;br /&gt;
[[media:シミュレータ-simulator.0122.zip]]&lt;br /&gt;
&lt;br /&gt;
== 12/19 中間発表 ==&lt;br /&gt;
あまり内容がなくて申し訳ないのですが、とりあえずこんな感じでしょうか。&lt;br /&gt;
*アセンブラ&lt;br /&gt;
**Perlで記述&lt;br /&gt;
**アセンブリをhexに直してテキスト/バイナリにする&lt;br /&gt;
*シミュレータ&lt;br /&gt;
**C言語で記述&lt;br /&gt;
**hex形式の命令列を読んで実行&lt;br /&gt;
**ブレークポイントの設定、ステップ実行&lt;br /&gt;
**I/Oは今のところ標準入出力&lt;br /&gt;
**実機のFPUの動作をシミュレート（by平野氏）&lt;br /&gt;
*ライブラリ&lt;br /&gt;
**外部関数のアセンブリを書いてコンパイル後のアセンブリにコピペ&lt;br /&gt;
**floor、ftoi、itofは完成（by平野氏）&lt;br /&gt;
**三角関数はソフトウェアで実現（多項式近似、CORDIC？）&lt;br /&gt;
とりあえずCORDICというものをCで書いてみました。誤差評価がまだですが・・・&lt;br /&gt;
[[media:シミュレータ-cordic.c]]&lt;br /&gt;
&lt;br /&gt;
== 12/8 Thanks! &amp;gt; ひらの氏 ==&lt;br /&gt;
まったくその通りでした。全然気が付かなかった・・・&lt;br /&gt;
&lt;br /&gt;
あとnamasute氏に質問なんですが、create_pixellineやinit_line_elementsなどの関数の末尾呼び出しの際には、jalではなくjumpを使うべきではないでしょうか？&lt;br /&gt;
&lt;br /&gt;
===  namasute ===&lt;br /&gt;
うぐぅ、修正しますた。サンクスコ。&lt;br /&gt;
&lt;br /&gt;
== 12/7 ==&lt;br /&gt;
min-rt.mlを実行するために、いろいろと無理矢理やってみた。&lt;br /&gt;
*外部関数(miniMLRuntime.mlにあるもの)はアセンブリコードのライブラリとしてlib.sに書いた。&lt;br /&gt;
*グローバル変数については各変数が使う領域の初期のサイズを調べ、それが指すアドレスをリストにしたものをglobals.sに書いた。&lt;br /&gt;
*三角関数などの数学関数については全て命令としてシミュレータが計算するようにした。&lt;br /&gt;
*シミュレータ用に、sin, cos, atanの３つの数学関数命令、浮動小数専用の入力命令frd、デバッグ用命令br(&amp;#039;&amp;#039;br num&amp;#039;&amp;#039;でその位置で実行を一時停止し&amp;#039;&amp;#039;num&amp;#039;&amp;#039;と状態を表示)を追加した。&lt;br /&gt;
なおバイナリを生成する際はコンパイラが吐いたmin-rt.sの最後にglobals.sとlib.sをコピペするという原始的な方法をとっている。そのうちリンカみたいなかっこいいものを作りたいが。&lt;br /&gt;
&lt;br /&gt;
現在、min-rt.outを実行すると謎のセグフォで落ちてしまう。gdbで追っても原因がわからず苦戦している。誰かわかる方がいたら教えてください。&lt;br /&gt;
&lt;br /&gt;
=== review by ひらの ===&lt;br /&gt;
たぶんcalc関数の再帰のしすぎだと思った。&lt;br /&gt;
&lt;br /&gt;
for構文に修正すれば直るかと思う。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 11/5 ==&lt;br /&gt;
===  review by ひらの ===&lt;br /&gt;
とりあえず、乙です。zipファイルの中身を一見してシミュレータだけかと思ってmakeしてみるとアセンブラも出てきてちょっと驚いた。lexer使いこなしておる図。アセンブラはちょうど非常に欲しかったところだったので、ありがたい。&lt;br /&gt;
ラベル機能とか付加していくとそうもシンプルなままとはいかないだろうが。&lt;br /&gt;
&lt;br /&gt;
=== fibできた＆バグ発見 by 高山 ===&lt;br /&gt;
関数呼び出しの手続きを使ってfibを動かしました（やり方は駒場で習ったそのまんま）。途中でJUMPのバグを発見。&lt;br /&gt;
&lt;br /&gt;
== 11/4 ==&lt;br /&gt;
&lt;br /&gt;
一応アセンブラと本体らしきものができた。（遅&lt;br /&gt;
&lt;br /&gt;
まだ階乗プログラムしか試してないです。っつーかアセンブリコード考えるのがめんどい希ガス&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>	</entry>

	<entry>
		<id>https://is.zng.info/wiki/experiment/index.php/%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9</id>
		<title>コンパイラ</title>
		<link rel="alternate" type="text/html" href="https://is.zng.info/wiki/experiment/index.php/%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9"/>
				<updated>2015-11-29T06:11:34Z</updated>
		
		<summary type="html">&lt;p&gt;Maintenance script: ページの作成:「== 物(12/20, 5/19) ==  *[1x]media:コンパイラ-compiler.zip  *[2x]media:コンパイラ-compiler20060519.zip  *media:コンパイラ-min-rt.bin    == TODO...」&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 物(12/20, 5/19) ==&lt;br /&gt;
*[1x][[media:コンパイラ-compiler.zip]]&lt;br /&gt;
*[2x][[media:コンパイラ-compiler20060519.zip]]&lt;br /&gt;
*[[media:コンパイラ-min-rt.bin]]&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
*ｵﾜﾀ!&lt;br /&gt;
&lt;br /&gt;
== 最終発表 ==&lt;br /&gt;
[[media:コンパイラ-saisyuu.odp]]&lt;br /&gt;
&lt;br /&gt;
== 中間発表 ==&lt;br /&gt;
*MinCaml改造版&lt;br /&gt;
**アセンブリの変更&lt;br /&gt;
**整数の乗除算&lt;br /&gt;
**Array.create -&amp;gt; create_array&lt;br /&gt;
**とりあえず動く&lt;br /&gt;
*1から作成版&lt;br /&gt;
**globals.mlごとコンパイル&lt;br /&gt;
**最適化は秘密 (考えてないともいう)&lt;br /&gt;
**まだぽ&lt;br /&gt;
&lt;br /&gt;
== 3/22 ==&lt;br /&gt;
漏れは/usr/local/cad/jikken/2005/6/に書き込めないので&lt;br /&gt;
saisyuu.odpをうｐしといて下さい &amp;gt; 平野氏&lt;br /&gt;
&lt;br /&gt;
=== うは ===&lt;br /&gt;
菅原さんに取り急ぎ送付しておきました。&lt;br /&gt;
&lt;br /&gt;
== 3/12 ==&lt;br /&gt;
*kosak氏の助言により2000万減&lt;br /&gt;
*kosak氏のもう一つの助言を実装して2000万減&lt;br /&gt;
*グローバル変数をレジスタに載せて2000万減&lt;br /&gt;
*共通部分式除去で7000万減w&lt;br /&gt;
&lt;br /&gt;
== 3/11 ==&lt;br /&gt;
*心なしかフェッチミスを減らす最適化。&lt;br /&gt;
*コンパイルオプション変えただけで4000万命令減った罠。&lt;br /&gt;
&lt;br /&gt;
== 3/10 ==&lt;br /&gt;
nf&lt;br /&gt;
&lt;br /&gt;
[[media:コンパイラ-assembler20060310.zip]]&lt;br /&gt;
&lt;br /&gt;
== 3/3 ==&lt;br /&gt;
=== α版 ===&lt;br /&gt;
*開始地点のラベルをmin_caml_startからmainに変更&lt;br /&gt;
*スタックフレームは負の方向にのびる&lt;br /&gt;
[[media:コンパイラ-compiler20060303_2.zip]]&lt;br /&gt;
&lt;br /&gt;
== 12/20 ==&lt;br /&gt;
=== バグ取り ===&lt;br /&gt;
末尾でないときのfloat比較 &amp;lt;= で fbne を吐いていたのを fbg に修正&lt;br /&gt;
&lt;br /&gt;
== 12/18 ==&lt;br /&gt;
=== バグ取り ===&lt;br /&gt;
*レジスタ割り当てのバグ修正&lt;br /&gt;
*関数呼び出しのバグ修正&lt;br /&gt;
&lt;br /&gt;
== 12/17 ==&lt;br /&gt;
=== バグ取り ===&lt;br /&gt;
float即値のバグ修正&lt;br /&gt;
&lt;br /&gt;
== 12/16 ==&lt;br /&gt;
=== バグ取り ===&lt;br /&gt;
*addiの吐き方を修正&lt;br /&gt;
*float即値の形式を自班のものにした&lt;br /&gt;
&lt;br /&gt;
== 12/8 ==&lt;br /&gt;
=== バグ取り ===&lt;br /&gt;
末尾呼び出しでjalを吐いていたのをjumpに修正&lt;br /&gt;
&lt;br /&gt;
== 11/12 ==&lt;br /&gt;
=== バグ取り &amp;amp; 変更 ===&lt;br /&gt;
float定数テーブルを吐かなくした&lt;br /&gt;
&lt;br /&gt;
== 11/11 ==&lt;br /&gt;
=== hoge ===&lt;br /&gt;
float定数テーブルいらないじゃんorz&lt;br /&gt;
&lt;br /&gt;
=== foo by ひらの ===&lt;br /&gt;
なにゆえ？&lt;br /&gt;
&lt;br /&gt;
=== bar by namasute ===&lt;br /&gt;
float定数のビットパターンをそのままaddiでレジスタにいれればいいので。&lt;br /&gt;
&lt;br /&gt;
== 11/10 ==&lt;br /&gt;
=== ヒトリゴト ===&lt;br /&gt;
ラベルのアドレスをロードするときに&lt;br /&gt;
何気なくhi(ラベル)とかlo(ラベル)とか吐いていたが&lt;br /&gt;
immが符号付きなのを失念していた。&lt;br /&gt;
ラベルのアドレスの下から16bit目が1のときこまる。&lt;br /&gt;
どうしたものか。&lt;br /&gt;
&lt;br /&gt;
=== つぶやき 12/3 by ひらの ===&lt;br /&gt;
アセンブリがhi(ラベル)で四捨五入した上位ハーフワード、&lt;br /&gt;
lo(ラベル)で下位ハーフワードを吐けばいい話ということで、いいのかな。&lt;br /&gt;
&lt;br /&gt;
つまり、&lt;br /&gt;
 hi(0x00008000) = 0x0001&lt;br /&gt;
 lo(0x00008000) = 0x8000&lt;br /&gt;
ということです。&lt;br /&gt;
&lt;br /&gt;
== 11/7 ==&lt;br /&gt;
=== バグ取り &amp;amp; 構文追加 ===&lt;br /&gt;
整数の乗算、除算(やっつけ)。&lt;br /&gt;
&lt;br /&gt;
== 11/6 ==&lt;br /&gt;
&lt;br /&gt;
とりあえずやっつけでmin-camlを改造してみますた。&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>	</entry>

	<entry>
		<id>https://is.zng.info/wiki/experiment/index.php/%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%A9</id>
		<title>アセンブラ</title>
		<link rel="alternate" type="text/html" href="https://is.zng.info/wiki/experiment/index.php/%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%A9"/>
				<updated>2015-11-29T06:11:34Z</updated>
		
		<summary type="html">&lt;p&gt;Maintenance script: ページの作成:「アセンブラだけ別にこっちにあげときます。    最初はCでlexとyaccを使って書いてみたがラベルなどを導入するにあたってperlで...」&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;アセンブラだけ別にこっちにあげときます。&lt;br /&gt;
&lt;br /&gt;
最初はCでlexとyaccを使って書いてみたがラベルなどを導入するにあたってperlで書いた方がいくらかマシなような気がしたので書き直しました。例によって無駄に時間かかってしまった。&lt;br /&gt;
&lt;br /&gt;
== NOP挿入にかかわる不具合(12/29) ==&lt;br /&gt;
12/20の版にNOP挿入に関するいくつかの不具合がありますので、シミュレータ上で動かす分だと問題ないですが、できれば使わないでください。&lt;br /&gt;
&lt;br /&gt;
修正版は、書庫[[http://is.zng.info/hiki/restrict/?c=plugin;plugin=attach_download;p=%A5%D7%A5%ED%A5%BB%A5%C3%A5%B5;file_name=20051229.zip|20051229.zip]]&lt;br /&gt;
に含まれています。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== アセンブラ/新シミュレータ(12/20) ==&lt;br /&gt;
しょうもない不具合を修正して(orz)ついにシミュレータで完動したようです。&lt;br /&gt;
おめでとうございます。実機完動に向けてがんがりましょう(三角関数が動けばたぶん動くかなどうだろ)。&lt;br /&gt;
&lt;br /&gt;
また、ステップ実行機能をちょっと仕様を変更して復活させました。ブレークポイントを設定しておくと、それ以降がステップ実行になります。&lt;br /&gt;
&lt;br /&gt;
その他、アセンブラの-rオプションを廃止して自動判別としました。&lt;br /&gt;
&lt;br /&gt;
[[media:アセンブラ-assembler.20051220.zip]]&lt;br /&gt;
&lt;br /&gt;
== アセンブラと旧シミュレータの改造版(12/18, 12/19更新) ==&lt;br /&gt;
命令セット変更、遅延ロード検出(アセンブラ側)、ある程度のメモリ破壊検出(シミュレータ側)に対応。&lt;br /&gt;
&lt;br /&gt;
ライブラリを大幅増強。&lt;br /&gt;
&lt;br /&gt;
データ形式はhex形式でなく、bin形式としてある。&lt;br /&gt;
&lt;br /&gt;
[[media:アセンブラ-assembler.20051219.zip]]&lt;br /&gt;
&lt;br /&gt;
高山氏の最新シミュレータときちんとマージしていないので、欠けている機能あり。&lt;br /&gt;
&lt;br /&gt;
追記: Makefileはそのままだとうまくいかないので適当に置き換えてください。&lt;br /&gt;
&lt;br /&gt;
つかいかた&lt;br /&gt;
* ./assemble [-r] [-b 数字] lib.s test.s &amp;gt; test.bin&lt;br /&gt;
* ./simulate test.bin &amp;lt; base.sld&lt;br /&gt;
&lt;br /&gt;
== 物(11/12) ==&lt;br /&gt;
[[media:アセンブラ-assembler.zip]]&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
浮動小数のサンプルをちゃんと動かす&lt;br /&gt;
&lt;br /&gt;
== 11/14 by ひらの ==&lt;br /&gt;
R形式(シフト)ですが、$2でなく$r2ですね。&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>	</entry>

	</feed>