1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Scalable Matrix Extension (SME)Advent Calendar 2024

Day 6

SME日記その5 Streaming SVE modeでCNTWを実行してみる Part 2

Posted at

前回,Stream SVE mode について調べて,Stream SVE modeでCNTWを実行してみましたが,次のような指摘を受けました.

これコンパイラーが関数境界で自動的にsmstopを挿入してるんじゃないの。逆アセンブル結果を確認するべきだと思う

なるほど!

SMEシリーズ

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を実行できるようになるということでした.

それにしても,アセンブリコードで見たときに,インライン展開されているように見えたのはなんだったのだろうか?これだとアセンブリコードの出力も信用できない...

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?