ぐだぐだ低レベルプログラミング(63) ARM64(AArch64)、フラグの観察 adds

addsEC
Joseph Halfmoon

前回はArmの64ビット命令の即値Addを眺めてみました。それだけでも4形式の命令があったのですが、前回作成した命令表には、まったく同等な加算動作を行う命令Addsが隣に並んでいます。整数加算することはAddと同じですが、副作用、フラグを立てたり下ろしたりする、ということのみが違う命令です。なお演習はスマホ上です。

“ぐだぐだ低レベルプログラミング(63) ARM64(AArch64)、フラグの観察 adds” の続きを読む

ぐだぐだ低レベルプログラミング(62) ARM64(AArch64)、Add命令その1即値

ADD_INSN
Joseph Halfmoon

Armの64ビット命令、32ビットの時と比べると条件付き実行のフィールドが無くなって「スッキリ」した印象です。しかし、RISC-Vを眺めた後でA64(AArch64)を眺めるとなんと複雑な。伝統?のシフトできるレジスタオペランドは健在。フラグ操作のON/OFFも加わって組み合わせが多いです。とても1回では見切れませぬ。

“ぐだぐだ低レベルプログラミング(62) ARM64(AArch64)、Add命令その1即値” の続きを読む

ぐだぐだ低レベルプログラミング(61) ARM64(AArch64)、gdb -tui

gdbTUI000
Joseph Halfmoon

前々回、デフォルトでインストール済であったlldb (LLVM系?のデバッガ)を使ってみましたが、アセンブラレベルの表示がちょいと思うような感じと違っておりました。gdbとほぼほぼ互換とはいいつつも違うところはあるみたいです。そこで本家gdbをインストールし、TUIモードで動作させてみました。この感じかね。

“ぐだぐだ低レベルプログラミング(61) ARM64(AArch64)、gdb -tui” の続きを読む

ぐだぐだ低レベルプログラミング(60) ARM64(AArch64)、レジスタ一覧描いてみた

RegsAllEC
Joseph Halfmoon

前回スマホ上でアセンブラとデバッガを動かし、ARM64(AArch64)のレジスタなど眺めてみました。ARM64はARM32と大分様子が違うので主要なレジスタだけでも一覧しておくべしと図を作り始めてハマリました。調べて図を描いているだけで時間がたちます。レジスタ多すぎ?

“ぐだぐだ低レベルプログラミング(60) ARM64(AArch64)、レジスタ一覧描いてみた” の続きを読む

ぐだぐだ低レベルプログラミング(59) ARM64(AArch64)、スマホで lldb

ARM64_REG_EC
Joseph Halfmoon

スマホ上で clang の使用開始。「ARM64(AArch64)できるな」と気づきました。「できる」といってアセンブラです。以前Armをやったときは32ビットでした。手元のラズパイは皆32ビットOSで動かしているので、64ビットArmはできなかったのです。OS入れ替えるのはメンドイ。しかしスマホであれば64ビット。

“ぐだぐだ低レベルプログラミング(59) ARM64(AArch64)、スマホで lldb” の続きを読む

ぐだぐだ低レベルプログラミング(58) RISC-V、整数と浮動小数の変換命令

fcvt_EC
Joseph Halfmoon

今回は浮動小数と整数の間で変換を行う命令fcvtを動かしてみたいと思います。16種類もあります。オペコード空間を節約しているRISC-V的にはかなり大きな一族です。それは、単精度と倍精度の浮動小数、32ビット幅と64ビット幅の整数、符号付と無、変換の方向の組み合わせがあるからです。今回は端折って4命令だけ動かしてみます。

“ぐだぐだ低レベルプログラミング(58) RISC-V、整数と浮動小数の変換命令” の続きを読む

ぐだぐだ低レベルプログラミング(57) RISC-V、浮動小数点数のロード/ストア命令

RISC-V load/store float
Joseph Halfmoon

今回は珍しくメンドクない命令です。浮動小数のロード、ストアです。アドレスの指定は通常のロード、ストア同様に整数レジスタに12ビットのディスプレースメントを加える方式。これだけ。シンプル。RISCだもんね。

“ぐだぐだ低レベルプログラミング(57) RISC-V、浮動小数点数のロード/ストア命令” の続きを読む

ぐだぐだ低レベルプログラミング(56) RISC-V、浮動小数点数のClassify命令

fclassEC
Joseph Halfmoon

また、メンドクセー命令が出てきました。浮動小数点数のClassify命令です。無限大、デノーマル、NaNといった訳ありのモノドモを識別する命令。勿論、普通の(ノーマル)な数はノーマルと分類します。浮動小数点素人の私にはNaNの2種類あるビットパターンなど皆目見当がつかないです。

“ぐだぐだ低レベルプログラミング(56) RISC-V、浮動小数点数のClassify命令” の続きを読む

ぐだぐだ低レベルプログラミング(55) RISC-V、sign-injection命令「群」

fsgnBuild
Joseph Halfmoon

今回取り上げさせていただくのは、浮動小数点数の符号を操作するための命令「群」です。3命令「も」存在します。倹約を旨としてオペコード空間を割り当てているRISC-Vにしたら大盤振舞いにも見えましたが、例によって疑似命令という別名をみると「無いと困る」命令群でした。

“ぐだぐだ低レベルプログラミング(55) RISC-V、sign-injection命令「群」” の続きを読む

ぐだぐだ低レベルプログラミング(54) RISC-V、単精度平方根で2次元normを計算

norm
Joseph Halfmoon

加減乗除に最大/最小、比較とやってきましたが、まだ残っている「演算系の浮動小数点命令」がありました。平方根です、Square Root。平方根を計算するだけでは芸が無いので、2次元のnormも計算してみました。x86(というかx87)系のFPU命令であると「超越関数」までありますが、RISC-Vには超越関数不在です。加減乗除とアルゴリズムで後はよしなに、と。

“ぐだぐだ低レベルプログラミング(54) RISC-V、単精度平方根で2次元normを計算” の続きを読む

ぐだぐだ低レベルプログラミング(53) RISC-V、単精度浮動小数点数の比較

feq_flt_fle_EC
Joseph Halfmoon

前回は浮動小数点数の最大最小を求める命令でした。今回は、浮動小数点数の比較命令です。比較した結果として条件分岐することが多いと思います。RISC-Vには分岐フラグが存在せず、条件分岐は整数レジスタの中の値を分岐命令で判定します。このため浮動小数の比較命令の結果は整数レジスタに書き込みとなります。

“ぐだぐだ低レベルプログラミング(53) RISC-V、単精度浮動小数点数の比較” の続きを読む

ぐだぐだ低レベルプログラミング(52) RISC-V、浮動小数のmin/max

VNCtransfer
Joseph Halfmoon

RISC-Vは、RISCの中でもシンプルで「絞り込んだ」命令セットでありますが、浮動小数点数を扱う命令結構多いんじゃないかい。まあ面倒くさいものを扱うので、いたしかたないか。RISC-Vのせいではないですな。前回は積和演算命令でしたが今回は最大、最小求める命令です。

“ぐだぐだ低レベルプログラミング(52) RISC-V、浮動小数のmin/max” の続きを読む

ぐだぐだ低レベルプログラミング(51) RISC-V、浮動小数積和演算、4種あるノダ

maixFlash
Joseph Halfmoon

今回は前回と以下同文でラクチンなどと呟いていたら、前回コードにしょうもないバグ発見。天網恢恢疎にして漏らさず、違うか。お詫びして前回分をさきほど修正させていただきました。今回は前回一種しかやらなかった積和演算命令、実は全部で4種もあったという話であります。

“ぐだぐだ低レベルプログラミング(51) RISC-V、浮動小数積和演算、4種あるノダ” の続きを読む

ぐだぐだ低レベルプログラミング(50) RISC-V、浮動小数積和演算、速さだけでないノダ

fmadd_fmul_EC
Joseph Halfmoon

前回、浮動小数点の加減算をやりました。その前に例外を「味わう」ために浮動小数点の除算をやっています。そこで今回は必然の乗算です。ただ掛け算が出来たと喜んでも芸がありませぬ。RISC-Vには、普通の掛け算命令だけでなく、積和演算命令もあります。信号処理(積分)などするときはこちらの方が「普通」。今回はこの2つを比べてみる、と。

“ぐだぐだ低レベルプログラミング(50) RISC-V、浮動小数積和演算、速さだけでないノダ” の続きを読む