68Kは、割り込みの際に特権スタックに書かれるデータが世代毎に異なり、スーパーバイザを含めたソフトウェア互換性は維持できていません。これは単純に設計思想で、スーパーバイザは世代毎に移植して、ユーザプログラムは互換、ということで考えていたのだと思います。一方、80386ではリアルモードで8086と全く同じシステムソフトウェアを使うことが可能です。 同じように、キャッシュについても、68030では命令キャッシュに乗っているデータを書き換えた場合、当然キャッシュに乗っているデータを実行してしまい、一部の自己書き換えを用いるプログラムではキャッシュを利用できません。i486もキャッシュを実装していますが、こちらは自己書き換えコードをサポートする設計になっています (Shoemaker, Ken: The i486 microprocessor integrated cache and bus interface [doi.org])。
> Fourth internal data bus is placed inside of ALU to be used for not only the 8bit operation, > but also digit operation, bit operation, rotate operation, and the shift operation with very small number of transistor.
そりゃあれですよ (スコア:2)
直接的には、それだけバイナリ互換が重要だったからなんだけれども
386のアーキテクチャ設計が非常に優秀だったからってのがあるでしょう。
で、ARMがx86を殺すかどうかなんとも言えないと思うけどな。
Re:そりゃあれですよ (スコア:0)
386が優秀ではないとは言わないが、i686で採用した内部RISCによって延命できたと思うよ。
別の見方をすると、CPUシリーズで異なるuOPを吸収しているのがx86じゃないかな。
生物界でも、優秀な種が生き残っているというわけでもなく、柔軟性があったからという例は多い。
私はi386より68Kの方が優秀だったと思う。
Re:そりゃあれですよ (スコア:2)
> 私はi386より68Kの方が優秀だったと思う。
i386比でなら68kは善戦していますが、最短命令が1ワード(2バイト)と言うのは、i386の最短命令長1バイトと比べてメモリ貧乏だった当時はコード密度の点で厳しかったです。
また、i386は自力で仮想記憶をサポートしていますが、68kは68010に外部MMUを追加しなければ仮想記憶をサポートできなかったり、命令セットが32bit化けを最初から想定しているなど掲げた理想は高かったのに比べて実装が追いついていない面もありました。
アーキレベルの残念な点は
・CLR命令でRMWバスサイクル発生させる( MOVEQ #0, DST で十分)
・相対ジャンプのオフセットが何故バイト?奇数だとアドレスエラーになるのでワードで指定すれば倍の範囲にジャンプできた
・直交性のあるアーキを標榜する割にデータレジスタとアドレスレジスタが別
などなど、それほど良いプロセッサかどうかは疑問。
結局、i386と競ったというのが伝説の原因?
Re:そりゃあれですよ (スコア:2)
68Kは、割り込みの際に特権スタックに書かれるデータが世代毎に異なり、スーパーバイザを含めたソフトウェア互換性は維持できていません。これは単純に設計思想で、スーパーバイザは世代毎に移植して、ユーザプログラムは互換、ということで考えていたのだと思います。一方、80386ではリアルモードで8086と全く同じシステムソフトウェアを使うことが可能です。
同じように、キャッシュについても、68030では命令キャッシュに乗っているデータを書き換えた場合、当然キャッシュに乗っているデータを実行してしまい、一部の自己書き換えを用いるプログラムではキャッシュを利用できません。i486もキャッシュを実装していますが、こちらは自己書き換えコードをサポートする設計になっています (Shoemaker, Ken: The i486 microprocessor integrated cache and bus interface [doi.org])。
このように、偏執的なまでの互換性へのこだわりがPC市場で受け入れられている・要求されているのだと私は理解しています。
Re:そりゃあれですよ (スコア:2)
例外の時にスタックに積まれるデータは内部マイクロコードのダンプと言うべきもので、むき出しの内部アーキが出てしまうのですが、x86は特権レベル移行と連動してスタックポインタを自動的に切り替える事でうまくそれを隠していますね。
x86が特権モードのない8086からスタートしたのが、結果的にいい方向に作用したようにも見えます。
80386が単に速い8086として振る舞うことが容易、というのは市場戦略上の成功要因の一つですね。
Re: (スコア:0)
486でもキャッシュをパージしないとうごかないっすよ。
Re:そりゃあれですよ (スコア:1)
486の場合、「プリフェチキューが長くなった」「命令コードがプリフェッチキューに入ったあとでメモリを書き換えても、キュー内の命令コードには反映されない」ということで、自己書き換え系のコードが結構動かなくなりましたね。
Re: (スコア:0)
よっぽど不評だったのかPentiumで勝手にフラッシュしてくれるようになったね。やっぱり互換性大事。
Re: (スコア:0)
68040といえばbrain damaged MMU(NetBSD/Amiga)で有名ですが、
命令キャッシュのinvalidationは特権命令で、Kaffe VMのJITコンパイラのコメントにモトローラのバカ野郎と書かれていました
Re: (スコア:0)
> ・相対ジャンプのオフセットが何故バイト?奇数だとアドレスエラーになるのでワードで指定すれば倍の範囲にジャンプできた
PC相対アドレッシングもバイト単位でしょ
同じ加算器を使ってんのよ
> ・直交性のあるアーキを標榜する割にデータレジスタとアドレスレジスタが別
単一の大きなレジスタファイルは遅い、アドレッシングに4ビット必要になり命令のレジスタ指定フィールドが足りなくなる、分割するとバンド幅倍増->データとアドレス計算を並行に実行可能
とちゃんと考慮した上での設計になっている
x86も同じくよく練られた設計だし、教条主義的でぼくのかんがえたさいきょうのマイコンみたいなところのある68kよりもx86のほうが美しいとさえ言えるね
Re:そりゃあれですよ (スコア:2)
> PC相対アドレッシングもバイト単位でしょ
> 同じ加算器を使ってんのよ
LEAも同じ加算器使ってますよね
> 単一の大きなレジスタファイルは遅い、アドレッシングに4ビット必要になり命令のレジスタ指定フィールドが足りなくなる、分割するとバンド幅倍増->データとアドレス計算を並行に実行可能とちゃんと考慮した上での設計になっている
それこそLEAを駆使したり、この特徴を活かすのが高速化の肝でした。
> x86も同じくよく練られた設計だし、教条主義的でぼくのかんがえたさいきょうのマイコンみたいなところのある68kよりもx86のほうが美しいとさえ言えるね
全面的に同意見です。
同時代のZ8000あたりと比べてもx86は、いろいろな意味で現実的な選択の積み重ねで出来てると思います(レジスタごとに性格付けがあるのは意外とコード書きやすいし)。
Re:そりゃあれですよ (スコア:3)
>(レジスタごとに性格付けがあるのは意外とコード書きやすいし)。
これ本当にそうなんですよねえ。
私も6809 -> 68000(x68k)と来て68のアセンブラが好きなんですけど
何やら制約があったほうがコードが書きやすいってのは実感したことがあります。
脱サラした後、仕事があまりなかったので、暇に任せてDOS上で86のアセンブラで
短いコードを書いて遊んでたんだけど(いわゆる常駐プログラム(死語)とかそういったもの)
意外に楽しいしサクサク書けるんで、なるほどなあと思ったですね。
レジスタが少なく性格付けされている利点ってあるんですよね。
なんで書いたこと無いけどRISCみたいに汎用レジスタが大量にあるCPUは
多分きっと書きづらいと思う。
Re:そりゃあれですよ (スコア:2)
レジスタに性格付けがあるほうが、誰が書いても同じコードを書くことになりますね。
レジスタ番長なプロセッサは、コンパイラが書きやすいってのはあると思います。
68kもSPやFPまでアドレスレジスタなので必要以上にアドレッシングモード増やす必要があったり
(スタックポインタ相対が欲しいだけなのにアドレスレジスタ相対を用意することになるとか)
Re: (スコア:0)
(スタックポインタ相対が欲しいだけなのにアドレスレジスタ相対を用意することになるとか)
という事実はない
Re:そりゃあれですよ (スコア:2)
説明が要りますね
SP=A7 なんですよ
A7でけで有効なアドレッシングモードというのはなくて
アドレスレジスタ間接
アドレスレジスタ間接ディスプレスメント付き
アドレスレジスタ間接インデックス付きディスプレスメント付き
などスタックフレームを操作していのに
SP間接etcでなく、すべからくアドレスレジスタ間接etcを用意してんですよ
(用意したはのはモトローラのプロセッサアーキテクト)
これが直行的なレジスタ・アドレッシングモードが目的化しているといわれる所以です。
Re: (スコア:0)
68kに強い影響を与えたと思われるPDP-11ではスタックポインタもプログラムカウンタも汎用レジスタで、即値もPCのポストインクリメントモードで実現したりしています
http://ja.wikipedia.org/wiki/PDP-11 [wikipedia.org]
(PCを汎用レジスタにするのはDECの特許)
当時の少ないリソースでは合理的でよくできた設計だと思いますが、スタックや命令フェッチというのは抽象度が高いものですから、こういう形で一般化してしまうと後々の最適化の余地を減じてしまうことになります
実際にA7はシステムスタックとして使い、他のレジスタをユーザース
Re: (スコア:0)
286で完成しちゃって386以降はやや無理目な拡張という印象もあります
32ビットセグメントでセグメントサイズが64KB単位になったのは、メモリマップドファイルがやりにくくなったなどの弊害があったし
当初の予定では32ビットは432の担当とはいえ、ちょっとギチギチすぎたかな
Re:そりゃあれですよ (スコア:2)
16bitセレクタ・32bitオフセットですよね。
メモリマップドファイルは妨げていなかったと思います(結局フラットモデルに落ちつくんですが)。
そうそう、セグメントレジスタをテンポラリレジスタに使っていたコードが激遅になった記憶があります。
Re: (スコア:0)
386になってセグメントのリミット値が20ビットに拡張され、リミット値の単位を1バイトまたは4Kバイトに指定できるようになりました
16MB越えのセグメントが必要であれば4KB単位にするしかないので、L4の人たちがぼやいていました
64KBというのは間違いです
すみません
Re:そりゃあれですよ (スコア:2)
Re: (スコア:0)
ここでいうメモリマップドファイルとはmmapのようにサイズを指定するものではなくて、
ディスクリプタ経由で書き込むと勝手にファイル(セグメント)が伸びるようなものです
なので厳密に1バイト単位でセグメントサイズが欲しいのですが
68020のPMMUにもそのために1バイトページがあったりしたんですがねえ…
Re: (スコア:0)
当時、32bitも使ってバイトアドレッシングするなら、ビットアドレッシングで下位4bitは0固定が基本ってすりゃ綺麗なのにと思ったもんだな。
まあそういうのも実際あったし。
Re:そりゃあれですよ (スコア:2)
実際010までは上位8ビットはアドレスバスにでませんでしたしね。
そこでポインタの上位バイトに参照先のオブジェクトを表すコードを埋め込む(貧乏)テクニックがありました。
初期のMacintoshはまさにこれで、お陰で32bitクリーンなポインタかが32bit化で問題になったり。
Re: (スコア:0)
その反省からか、AMD64ではアドレスバスに信号が出ていないビットもすべて1で埋めておかないと例外が出るようになりましたね。
Z80あたりにはIXやIYの上半分や下半分だけにアクセスできる怪しい命令とかあったけど最近のプロセッサでは定義されていない命令は全部例外投げるようになったとか。
Re:そりゃあれですよ (スコア:2)
Z80でCレジを使ってIO命令を実行すると上位バイトにAレジの値が出るとか
286でHIMEMにアクセスできてしまうパターンが有るとか
プロセッサのERRATAなんだろうけど、後に仕様に昇格する大事な機能もあったりすますね。
Z80で正規の命令にも(8080にない)ニブル(4ビット)単位でローテートする命令があったりするのは、内部のALUが4ビット幅であったからだと聞いたことがあります(命令が増えているのに回路規模が変わらないのはマイクロコードをつかたからとも)。
Re: (スコア:0)
Z80でCレジを使ってIO命令を実行すると上位バイトにAレジの値が出るとか
アドレス上位にBレジスタの値が出ることはマニュアルにも記述があった筈。
Z80で正規の命令にも(8080にない)ニブル(4ビット)単位でローテートする命令があったりするのは、内部のALUが4ビット幅であったからだと聞いたことがあります
Z80のRRD/RLD命令って、ALU関係ないんじゃね?
Re:そりゃあれですよ (スコア:2)
>> Z80でCレジを使ってIO命令を実行すると上位バイトにAレジの値が出るとか
> アドレス上位にBレジスタの値が出ることはマニュアルにも記述があった筈。
Cレジ間接では上位アドレスにBレジで、IOポート直接指定ではAレジでした。
(「なんで両方Bレジュじゃねーんだ」と思ったおぼろげな記憶が)
> Z80のRRD/RLD命令って、ALU関係ないんじゃね?
外部から見えるALUでなく、マイクロコードで使用される内部のALUが4ビット幅だって話です。
これを2回廻して1バイトの演算をしているので、4ビット単位のシフトが少ないクロックで実行できる仕組みがあったということ。
Re: (スコア:0)
外部から見えるALUでなく、
外部からALUなんて見えんよ。
Re: (スコア:0)
http://archive.computerhistory.org/resources/text/Oral_History/Zilog_Z... [computerhistory.org]
10ページあたりをどうぞ
Re:そりゃあれですよ (スコア:2)
Re:そりゃあれですよ (スコア:2)
> differentiate Z80 logic from 8080 logic. At first I introduced the pipeline 4-bit ALU.
のあたりですね。
Re: (スコア:0)
ALUがシフト操作をするわけではない
> Fourth internal data bus is placed inside of ALU to be used for not only the 8bit operation,
> but also digit operation, bit operation, rotate operation, and the shift operation with very small number of transistor.
internal data busのほう
Re:そりゃあれですよ (スコア:2)
まさにそうです。
4bitのALUで4bitシフトしたら溢れちゃいますし;-p
Re: (スコア:0)
> Z80でCレジを使ってIO命令を実行すると上位バイトにAレジの値が出るとか
Cレジスタ間接の場合出るのはBレジスタです。
イミディエイトの場合にはAレジスタが出ます。
IX/IYレジスタの上下8bitのレジスタ2本に分けて使える機能はHD64180で正規の命令になりましたね。
Re: (スコア:0)
あれ、HD64180(Z80180)系ではIX/IYレジスタの上下8bit分割が動かないんじゃなかったっけ。
Zilog自身が32bit拡張したeZ80(Z80190)なら動いたはず。
Re: (スコア:0)
>i386は自力で仮想記憶をサポートしていますが、68kは68010に外部MMUを追加
386 が出た時って既に 020 リリースされてなかったけ?
Re: (スコア:0)
386 と 68k では世代が全然違いますし、そりゃ設計を直接比較したら 386 が優れていて当然かと。
とはいえ 386 の時代はまだ MS-DOS が主流でしたし、単なる速い 8086 としてしか使われていなかった
386 よりも 68k のほうが扱いやすい面もあったとは思いますし、元 AC 氏の言わんとしてるのも
そのあたりなのではないかと。
設計面では世代的に 68k のライバルは 8086 ~ 286 あたりだと思いますが、
そのへんと比べるなら 68k の設計は良かったんじゃないでしょうか?
Re: (スコア:0)
x86のuopはどんどん高機能化、CISC化しているわけで、RISCに比べ抽象度の高いCISCが優位性を発揮しつつあります
RISCではデータがエフェメラルかどうかわかりませんしね
コード密度の高いCISCはリオーダバッファへの圧力が低いという利点もあります
私見では68kはダメですね
あれは(結果的に)間違った方向に一般性を追求してしまった