前回,Stream SVE mode について調べて,Stream SVE modeでCNTWを実行してみましたが,次のような指摘を受けました.
これコンパイラーが関数境界で自動的にsmstopを挿入してるんじゃないの。逆アセンブル結果を確認するべきだと思う
なるほど!
SMEシリーズ
- Apple Silicon M4はM3シリーズからScalable Matrix Extension (SME)命令などが足されている
- SME日記その1: Apple Silicon M4に搭載されたScalable Matrix Extension(SME)のベクトル長(SVL)を取得する
- SME日記その2: Apple Silicon M4にはCVTW命令は備わっていない?
- SME日記その3: Apple Silicon M4にどの命令が実装されているかをsysctl hwの実行結果とドキュメントから推測する
- SME日記その4 Streaming SVE modeでCNTWを実行してみる.
clang -O2 -march=armv9-a+sme -S cntw.c
.section __TEXT,__text,regular,pure_instructions
.build_version macos, 15, 0 sdk_version 15, 1
.globl _smstart ; -- Begin function smstart
.p2align 2
_smstart: ; @smstart
.cfi_startproc
; %bb.0:
; InlineAsm Start
smstart sm
; InlineAsm End
ret
.cfi_endproc
; -- End function
.globl _smstop ; -- Begin function smstop
.p2align 2
_smstop: ; @smstop
.cfi_startproc
; %bb.0:
; InlineAsm Start
smstop sm
; InlineAsm End
ret
.cfi_endproc
; -- End function
.globl _cntw ; -- Begin function cntw
.p2align 2
_cntw: ; @cntw
.cfi_startproc
; %bb.0:
; InlineAsm Start
cntw x0
; InlineAsm End
ret
.cfi_endproc
; -- End function
.globl _main ; -- Begin function main
.p2align 2
_main: ; @main
.cfi_startproc
; %bb.0:
sub sp, sp, #32
stp x29, x30, [sp, #16] ; 16-byte Folded Spill
add x29, sp, #16
.cfi_def_cfa w29, 16
.cfi_offset w30, -8
.cfi_offset w29, -16
; InlineAsm Start
smstart sm
; InlineAsm End
; InlineAsm Start
cntw x8
; InlineAsm End
str x8, [sp]
Lloh0:
adrp x0, l_.str@PAGE
Lloh1:
add x0, x0, l_.str@PAGEOFF
bl _printf
; InlineAsm Start
smstop sm
; InlineAsm End
mov w0, #0 ; =0x0
ldp x29, x30, [sp, #16] ; 16-byte Folded Reload
add sp, sp, #32
ret
.loh AdrpAdd Lloh0, Lloh1
.cfi_endproc
; -- End function
.section __TEXT,__cstring,cstring_literals
l_.str: ; @.str
.asciz "%llu\n"
ありゃ,インライン展開されている?
ダメ押しで次のようなことをしてみました.
cntw2.c
#include <stdint.h>
#include <stdio.h>
int main()
{
uint64_t count;
asm volatile ("smstart sm\n\t"
"cntw %0\n\t"
"smstop sm"
: "=r"(count)
);
printf("%llu\n", count);
}
clang -O2 -march=armv9-a+sme -o cntw2 cntw2.c
% ./cntw2
16
今度はうまく行きました.つまり,CNTW命令自体は備わっていて,Stream SVE modeにしてはじめて,CNTWを実行できるようになるということでした.
それにしても,アセンブリコードで見たときに,インライン展開されているように見えたのはなんだったのだろうか?これだとアセンブリコードの出力も信用できない...