{セグフォ}{C言語}(2)

{あれ K#D657/B652}

.dataセクションを実行可能な環境に限定すれば、mainに代入するだけで、CPU例外等いろいろなことができて楽しいですね。
例外を発生する以外でも、例えば以下のようにすると、プログラムの戻り値として9を返すことができるようです。

(C300000009B8movl $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

{C言語}{ADDSUBPS}{集振言語}(3)

{addsubps.c K#D657/B4A1}

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);
}
(1){あれ}
{C言語}{DPPS}{集振言語}(3)

{dpps.c K#D657/5FCB}

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);
}
(1){あれ}
{C言語}{Neovim同梱のLSP機能の使用例}{〈Clang〉}(3)

{あれ K#D657/C4B1}

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>
{C言語}

{}