// pi_x64.s - calculates Pi using the Leibniz formula.
// Each iteration prints a closer approximation to 50 digits.
// This is not an optimal implementation and it runs forever.
//
// x86-64/SSE3 with for Linux, Intel, gnu assembler, gcc
//
// assemble: as pi_x64.s -o pi_x64.o
// link: gcc -o pi_x64 pi_x64.o
// run: ./pi_x64
// output: 3.14159264858204423376264458056539297103881835937500
// 3.14159265108366625440794450696557760238647460937500
// 3.14159265191852199450295302085578441619873046875000
// 3.14159265233600137889879988506436347961425781250000
// .... and on forever ...
.section.data.align16denom:.double1.0,3.0numer:.double4.0,-4.0add4:.double4.0,4.0zero:.double0.0,0.0msg:.string"%1.50fn".section.text.globlmain.typemain,@function.align64main:pushq%rbpmovq%rsp,%rbpmovdqa(numer),%xmm2movdqa(denom),%xmm6movdqa(add4),%xmm3movdqa%xmm2,%xmm4movdqa(zero),%xmm5movq$100000000,%r12loop:divpd%xmm6,%xmm2addpd%xmm2,%xmm5movdqa%xmm4,%xmm2addpd%xmm3,%xmm6subq$1,%r12jnzloopmovq$100000000,%r12movdqa%xmm5,%xmm0movdqa%xmm6,%xmm1haddpd%xmm0,%xmm0movq$1,%raxmovq$msg,%rdicallprintfmovdqa(add4),%xmm3jmploopmovq$0,%raxpopq%rbpret