ぐだぐだ低レベルプログラミング(161)A64 SIMD要素毎SQDMLAHはARMv8.1

Joseph Halfmoon

今回こそ「SIMDレジスタの一方の全要素に他方の一要素を共通に掛け算」する命令の練習を完了せんとしたところ、既に完了していることに気づいて愕然。お楽しみにとっておいた「符号付整数の乗算結果を2倍して積和した結果の上側半分を丸めて格納、もし溢れたらサチュレーション」は実習不可。それどころかあちこち要訂正。トホホ。

※「ぐだぐだ低レベルプログラミング」投稿順indexはこちら

※実機動作確認には以下を使用しております。

    • Raspberry Pi 4 model B、Cortex-A72コア(ARMv8-A)
    • Raspberry Pi OS (64bit) bullseye
    • gcc (Debian 10.2.1-6) 10.2.1 20210110

ARMv8もいろいろレベルがあり、Arm Cortex-A72はARMv8の中でもベーシックな(命令数の少ない)ARMv8p0です。

※A64の最新のマニュアルは以下でダウンロード可能です。

Arm Architecture Reference Manual for A-profile architecture

要訂正、あちこちね

まずお詫びして訂正いたさねばならないのは、前回のタイトルです。

旧)ぐだぐだ低レベルプログラミング(160)A64(AArach64)SIMD要素毎SQDMAL

と書いてしまいましたが、ニーモニックSQDMALは誤りです。ただしくはSQDMLALです。新タイトルが以下に。

新)ぐだぐだ低レベルプログラミング(160)A64 SIMD要素毎SQDMLAL(題訂正)

このお惚け老人の不注意のせいなのですが、まあこのカテゴリの命令の数の多さと複雑さにひきずられてしまったんだ、と言い訳しておきます。まあ、その証拠か、ご本家Arm様のマニュアル(以下の古い版を後生大事に書き込みなどしながら使わせていただいているので、新版では訂正されているかもです。)にもエラーあり。

Arm Architecture Reference Manual Armv8, for Armv8-A architecture profile
ARM DDI 0487E.a (ID070919)

ここね。DDI0487E_typo

黄色のマーカの命令を今回練習しようとしたらば、緑色のマーカ部のリンクが間違ってましたぜ。コピペのミスかね。御本家の中の人も間違うくらいこのカテゴリは似たようなお名前の命令が多数。命令多過ぎA64。

前回のSQDMLAL命令は、

符号付整数の乗算結果を2倍して倍のビット幅のレジスタに積和した結果をサチュレーション

でした。そこで今回は、

符号付整数の乗算結果を2倍して積和した結果の上側半分を丸めて格納、もし溢れたらサチュレーション

するSQDMLAH命令を中心に練習しようと考えておりました。実際にプログラムも書きました。しかし、アセンブラにかけたところが以下です。ASMerror

およよ。さきほどのArm社マニュアルをひっくり返してみてみると、小さく(ほんとに目立たぬ感じで書かれているんだ、これが。。。)

 ARMv8.1

です。毎度お断りを入れているとおり、練習に使っている Arm Cortex-A72 はARMv8.0なので、使えないのだな、これが。折角書いたプログラム(大したものじゃないけれども)は御蔵入りっす。

ほんとにグダグダだな。

ぐだぐだ低レベルプログラミング(160)A64 SIMD要素毎SQDMLAL(題訂正)へ戻る

ぐだぐだ低レベルプログラミング(162)A64(AArach64)SIMD permute へ進む