最新の仕様(案)はここか?
http://www.open-std.org/jtc1/sc22/wg14/www/projects#9899
{C言語 K#D657/38E0}
B̅(182){あれ}{〈GNU libmicrohttpd〉}{『The Preprocessor Iceberg Meme』}{前処理系}{addsubps.c}{dpps.c}{〈Wandbox〉}{換配系}{あれ}{〈Clang〉}
.data
セクションを実行可能な環境に限定すれば、main
に代入するだけで、CPU例外等いろいろなことができて楽しいですね。
例外を発生する以外でも、例えば以下のようにすると、プログラムの戻り値として9を返すことができるようです。(
C300000009B8
はmovl $1, eax; ret
の意味)
char main[] =
"H\270q\207\320\34]\302O\23\272\310e\303\211H\367\342RP1\300\377\300\211\307H\211\3461\322\262\14\17\5XX1\300\303";
https://qiita.com/yasuo-ozu/items/ddc5d3e8e4a97eaa470c#comment-f37303875e2ecc5e194a
c99 -E
はかならずしも逆斜線に続く改行を削除しない}{原 将己「Cプリプロセッサメタプログラミングで、文字列系泥沼関数型プログラミング」}{前処理指令}{MSVCの新らしいC言語前処理系でMCPPが提供する規格準拠性確認試験を受ける}{あれ}{Microsoft「新しいMSVCプリプロセッサの概要」,『C/C++のプリプロセッサリファレンス』。2022-09-29}{〈MCPP〉}{松井 潔「規格準拠性に優れたCプリプロセッサMCPP」,『論文誌プログラミング』(情報処理学会)46巻SIG1号28–39頁。2005-01-15}{0以外の空値を含む幕令値を偽判定}https://wandbox.org/permlink/dSqO45G0O5fp8EQy
// clang --std=c11 -fasm -Wall -o addsubps.exe ./addsubps.c
#include <stdio.h>
#include <stdalign.h>
int main(void)
{
alignas(4) float
src1[4] = { 1, 2, 3, 4 },
src2[4] = { -5, -6, -7, -8 },
dst[4]
;
asm volatile(
"movdqu (%0), %%xmm0\n\t"
"movdqu (%1), %%xmm1\n\t"
"addsubps %%xmm1, %%xmm0\n\t"
"movdqu %%xmm0, (%2)\n\t"
:
: "r"(src1), "r"(src2), "r"(dst)
:
);
#define putsm128(name, size) do { \
printf("%s =", #name); \
for (int __i = 0; __i < size; __i++) { \
printf(" %g", name[__i]); \
} \
printf("\n"); \
} while (0)
putsm128(src1, 4);
putsm128(src2, 4);
putsm128(dst, 4);
}
https://wandbox.org/permlink/dSqO45G0O5fp8EQy
// clang --std=c2x -fasm -Wall -o $0.exe ./$0.c
#include <stdio.h>
#include <stdalign.h>
int main(void)
{
alignas(4) float
src1[4] = { 3.5, 2.3, 0.2, -4.3 },
src2[4] = { 2.5, -1.2, 3.6, 5.1 },
dst[4]
;
asm volatile(
"movdqu (%0), %%xmm0\n\t"
"movdqu (%1), %%xmm1\n\t"
"dpps $0b10010101, %%xmm1, %%xmm0\n\t"
"movdqu %%xmm0, (%2)\n\t"
:
: "r"(src1), "r"(src2), "r"(dst)
:
);
#define putsm128(name, size) do { \
printf("%s =", #name); \
for (int __i = 0; __i < size; __i++) { \
printf(" %g", name[__i]); \
} \
printf("\n"); \
} while (0)
putsm128(src1, 4);
putsm128(src2, 4);
putsm128(dst, 4);
}
MSVCのclang一式にはclangd.exeが同梱されているっぽい。
で,こいつを使う。
#include <stdio.h>
int main(void) {
puts("hey");
}
call v:lua.require'vim.lsp'.start(#{
\ name: 'clangd',
\ cmd: [ 'clangd.exe' ],
\ root_dir: getcwd(),
\ })
" autocmd BufEnter,CursorHold,InsertLeave <buffer> lua vim.lsp.codelens.refresh()
inoremap <C-x><C-o> <Cmd>call v:lua.require'vim.lsp'.omnifunc()<Enter>
nnoremap K <Cmd>call v:lua.require'vim.lsp.buf'.hover()<Enter>