#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// function for checking that assembly code is computing the correct result
double quadraticRootC(double a, double b, double c)
{
return (-b
+ sqrt(b
* b
- 4 * a
* c
)) / (2 * a
); }
double quadraticRoot(double a, double b, double c)
{
double root;
asm(
"fldl %1 # a \n"
"fadd %%ST # 2a \n"
"fldl %1 # a 2a \n"
"fldl %3 # c a 2a \n"
"fmulp %%ST(1) # ac 2a \n"
"fadd %%ST # 2ac 2a \n"
"fadd %%ST # 4ac 2a \n"
"fldl %2 # b 4ac 2a \n"
"fldl %2 # b b 4ac 2a \n"
"fmulp %%ST(1) # b^2 4ac 2a \n"
"fsubp %%ST(1) # b^2-4ac 2a \n"
"fsqrt # sqrt(b^2-4ac) 2a \n"
"fldl %2 # b sqrt(b^2-4ac) 2a \n"
"fchs # -b sqrt(b^2-4ac) 2a \n"
"faddp %%ST(1) # -b+sqrt(b^2-4ac) 2a \n"
"fdivp %%ST(1) # -b+sqrt(b^2-4ac)/2a \n"
:"=t"(root)
:"m"(a), "m"(b), "m"(c)
);
return(root);
}
int main(int argc, char **argv)
{
double a, b, c;
double root, rootC;
a = 3.0;
b = -5.0;
c = 1.0;
root = quadraticRoot(a, b, c);
rootC = quadraticRootC(a, b, c);
printf("quadraticRoot(%.3f, %.3f, %.3f) = %.3f, %.3f\n", a
, b
, c
, root
, rootC
);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1hdGguaD4KCi8vIGZ1bmN0aW9uIGZvciBjaGVja2luZyB0aGF0IGFzc2VtYmx5IGNvZGUgaXMgY29tcHV0aW5nIHRoZSBjb3JyZWN0IHJlc3VsdApkb3VibGUgcXVhZHJhdGljUm9vdEMoZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgYykKewogICAgcmV0dXJuICgtYiArIHNxcnQoYiAqIGIgLSA0ICogYSAqIGMpKSAvICgyICogYSk7Cn0KCmRvdWJsZSBxdWFkcmF0aWNSb290KGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlIGMpCnsKICAgIGRvdWJsZSByb290OwoKICAgIGFzbSgKICAgICAgICAiZmxkbCAgICAgICAlMSAgICAgICAjIGEgICAgICAgICAgICAgICAgICAgXG4iCiAgICAgICAgImZhZGQgICAgICAgJSVTVCAgICAgIyAyYSAgICAgICAgICAgICAgICAgIFxuIgogICAgICAgICJmbGRsICAgICAgICUxICAgICAgICMgYSAyYSAgICAgICAgICAgICAgICBcbiIKICAgICAgICAiZmxkbCAgICAgICAlMyAgICAgICAjIGMgYSAyYSAgICAgICAgICAgICAgXG4iCiAgICAgICAgImZtdWxwICAgICAgJSVTVCgxKSAgIyBhYyAyYSAgICAgICAgICAgICAgIFxuIgogICAgICAgICJmYWRkICAgICAgICUlU1QgICAgICMgMmFjIDJhICAgICAgICAgICAgICBcbiIKICAgICAgICAiZmFkZCAgICAgICAlJVNUICAgICAjIDRhYyAyYSAgICAgICAgICAgICAgXG4iCiAgICAgICAgImZsZGwgICAgICAgJTIgICAgICAgIyBiIDRhYyAyYSAgICAgICAgICAgIFxuIgogICAgICAgICJmbGRsICAgICAgICUyICAgICAgICMgYiBiIDRhYyAyYSAgICAgICAgICBcbiIKICAgICAgICAiZm11bHAgICAgICAlJVNUKDEpICAjIGJeMiA0YWMgMmEgICAgICAgICAgXG4iCiAgICAgICAgImZzdWJwICAgICAgJSVTVCgxKSAgIyBiXjItNGFjIDJhICAgICAgICAgIFxuIgogICAgICAgICJmc3FydCAgICAgICAgICAgICAgICMgc3FydChiXjItNGFjKSAyYSAgICBcbiIKICAgICAgICAiZmxkbCAgICAgICAlMiAgICAgICAjIGIgc3FydChiXjItNGFjKSAyYSAgXG4iCiAgICAgICAgImZjaHMgICAgICAgICAgICAgICAgIyAtYiBzcXJ0KGJeMi00YWMpIDJhIFxuIgogICAgICAgICJmYWRkcCAgICAgICUlU1QoMSkgICMgLWIrc3FydChiXjItNGFjKSAyYSBcbiIKICAgICAgICAiZmRpdnAgICAgICAlJVNUKDEpICAjIC1iK3NxcnQoYl4yLTRhYykvMmEgXG4iCiAgICAgICAgOiI9dCIocm9vdCkKICAgICAgICA6Im0iKGEpLCAibSIoYiksICJtIihjKQogICAgICAgICk7CiAgICByZXR1cm4ocm9vdCk7Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewogICAgZG91YmxlICBhLCBiLCBjOwogICAgZG91YmxlICByb290LCByb290QzsKCiAgICBhID0gMy4wOwogICAgYiA9IC01LjA7CiAgICBjID0gMS4wOwogICAgcm9vdCA9IHF1YWRyYXRpY1Jvb3QoYSwgYiwgYyk7CiAgICByb290QyA9IHF1YWRyYXRpY1Jvb3RDKGEsIGIsIGMpOwoKICAgIHByaW50ZigicXVhZHJhdGljUm9vdCglLjNmLCAlLjNmLCAlLjNmKSA9ICUuM2YsICUuM2ZcbiIsIGEsIGIsIGMsIHJvb3QsIHJvb3RDKTsKCiAgICByZXR1cm4gMDsKfQo=