14. • DSL(ドメイン特化言語)
• C++で書きやすいDSLを開発
• DSLを用いて有限体の演算やMontgomery乗算などを実装
• LLVMのツールにより各CPU向けのアセンブリ言語を出力
LLVMのための簡易DSL
codeGen
LLVMビットコード
code written by
DSL for LLVM
x64 asm
aarch64
asm
wasm
...LLVM opt+llc
14 / 19
15. • 有限体𝔽 𝑟上の引き算
• 擬似コード sub(x, y)={ t := x - y; if (t < 0) t += r; return t; }
DSL for LLVMの例
N ; ビット長(bit) / word長
Operand x = loadN(px, N); // アドレスpxから読みxに代入
Operand y = loadN(py, N); // アドレスpyから読みyに代入
Operand v = sub(x, y); // v = x - y
Operand c;
c = trunc(lshr(v, bit - 1), 1); // c = (v>>(bit-1)) & 1
Operand p = loadN(pp, N); // アドレスppから位数pを読む
c = select(c, p, makeImm(bit, 0)); // c = c ? p : 0
Operand t = add(v, c); // t = v + c
storeN(t, pz); // アドレスpzにtを書き込む
15 / 19