fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. // function for checking that assembly code is computing the correct result
  6. double quadraticRootC(double a, double b, double c)
  7. {
  8. return (-b + sqrt(b * b - 4 * a * c)) / (2 * a);
  9. }
  10.  
  11. double quadraticRoot(double a, double b, double c)
  12. {
  13. double root;
  14.  
  15. asm(
  16. "fldl %1 # a \n"
  17. "fadd %%ST # 2a \n"
  18. "fldl %1 # a 2a \n"
  19. "fldl %3 # c a 2a \n"
  20. "fmulp %%ST(1) # ac 2a \n"
  21. "fadd %%ST # 2ac 2a \n"
  22. "fadd %%ST # 4ac 2a \n"
  23. "fldl %2 # b 4ac 2a \n"
  24. "fldl %2 # b b 4ac 2a \n"
  25. "fmulp %%ST(1) # b^2 4ac 2a \n"
  26. "fsubp %%ST(1) # b^2-4ac 2a \n"
  27. "fsqrt # sqrt(b^2-4ac) 2a \n"
  28. "fldl %2 # b sqrt(b^2-4ac) 2a \n"
  29. "fchs # -b sqrt(b^2-4ac) 2a \n"
  30. "faddp %%ST(1) # -b+sqrt(b^2-4ac) 2a \n"
  31. "fdivp %%ST(1) # -b+sqrt(b^2-4ac)/2a \n"
  32. :"=t"(root)
  33. :"m"(a), "m"(b), "m"(c)
  34. );
  35. return(root);
  36. }
  37.  
  38. int main(int argc, char **argv)
  39. {
  40. double a, b, c;
  41. double root, rootC;
  42.  
  43. a = 3.0;
  44. b = -5.0;
  45. c = 1.0;
  46. root = quadraticRoot(a, b, c);
  47. rootC = quadraticRootC(a, b, c);
  48.  
  49. printf("quadraticRoot(%.3f, %.3f, %.3f) = %.3f, %.3f\n", a, b, c, root, rootC);
  50.  
  51. return 0;
  52. }
  53.  
Success #stdin #stdout 0s 2008KB
stdin
Standard input is empty
stdout
quadraticRoot(3.000, -5.000, 1.000) = 1.434, 1.434