Advertisement
Guest User

Untitled

a guest
Mar 24th, 2019
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
LLVM 3.78 KB | None | 0 0
  1. ;Литеральные константы
  2. @abcString = constant [27 x i8] c"Vvedite parametri A, B, C\0A\00"
  3. @aString = constant [5 x i8] c"A = \00"
  4. @bString = constant [5 x i8] c"B = \00"
  5. @cString = constant [5 x i8] c"C = \00"
  6. @doubleString = constant [4 x i8] c"%lf\00"
  7. @zeroValueString = constant [41 x i8] c"Oshibka: parameter ne mojet bit raven 0\0A\00"
  8. @yString = constant [24 x i8] c"f(%lf, %lf, %lf) = %lf\0A\00"
  9.  
  10. ;Объявление функций ввода-вывода printf, scanf
  11. declare i32 @printf(i8*, ...)
  12. declare i32 @scanf(i8*, ...)
  13.  
  14. ;Ввод вещественного числа
  15. ;%string - приглашение ко вводу числа
  16. ;Возвращает считанное значение
  17. define double @readDouble([5 x i8]* %string)
  18. {
  19. %stringPtr = getelementptr [5 x i8], [5 x i8]* %string, i32 0, i32 0
  20. call i32 (i8*, ...) @printf(i8* %stringPtr)
  21. %doubleStringPtr = getelementptr [4 x i8], [4 x i8]* @doubleString, i32 0, i32 0
  22. %valuePtr = alloca double
  23. call i32 (i8*, ...) @scanf(i8* %doubleStringPtr, double* %valuePtr)
  24. %value = load double, double* %valuePtr
  25. ret double %value
  26. }
  27.  
  28. ;Возведение числа в целую степень
  29. ;%x - число, которое необходимо возвести в степень
  30. ;%a - показатель степени
  31. ;Возвращает вещественное число в указанной степени
  32. define double @pow(double %x, i32 %a)
  33. {
  34. %isZero = icmp eq i32 %a, 0
  35. br i1 %isZero, label %returnOne, label %calculatePow
  36. calculatePow:
  37. %isNegative = icmp slt i32 %a, 0
  38. br i1 %isNegative, label %setOneDivideByX, label %setX
  39. setOneDivideByX:
  40. %1 = add i32 %a, 1
  41. %value1 = call double @pow(double %x, i32 %1)
  42. %2 = fdiv double 1.0, %x
  43. %pow1 = fmul double %value1, %2
  44. ret double %pow1
  45. setX:
  46. %3 = sub i32 %a, 1
  47. %value2 = call double @pow(double %x, i32 %3)
  48. %pow2 = fmul double %value2, %x
  49. ret double %pow2
  50. returnOne:
  51. ret double 1.0
  52. }
  53.  
  54. ;Функция 10 варианта 2 самостоятельной работы
  55. ;%a - аргумент a
  56. ;%b - аргумент b
  57. ;%c - аргумент c
  58. ;Возвращает вычисленное значение функции
  59. define double @y(double %a, double %b, double %c)
  60. {
  61. %1 = call double @pow(double %a, i32 3)
  62. %2 = call double @pow(double %b, i32 6)
  63. %3 = fmul double %1, %2
  64. %4 = fmul double %3, 3.0
  65. %5 = call double @pow(double %a, i32 2)
  66. %6 = call double @pow(double %c, i32 4)
  67. %7 = fmul double %5, %6
  68. %8 = fmul double %7, 17.0
  69. %9 = fsub double %4, %8
  70.  
  71. %10 = call double @pow(double %a, i32 2)
  72. %11 = fmul double %10, 3.0
  73. %12 = call double @pow(double %b, i32 2)
  74. %13 = fmul double %12, 7.0
  75. %14 = fadd double %11, %13
  76.  
  77. %15 = fdiv double %9, %14
  78.  
  79. %16 = call double @pow(double %a, i32 2)
  80. %17 = call double @pow(double %b, i32 2)
  81. %18 = fmul double %16, %17
  82. %19 = fmul double %18, 8.0
  83. %20 = fadd double %19, 10.0
  84.  
  85. %21 = call double @pow(double %b, i32 4)
  86. %22 = fmul double %21, 12.0
  87. %23 = call double @pow(double %c, i32 2)
  88. %24 = fmul double %23, 3.0
  89. %25 = fsub double %22, %24
  90.  
  91. %26 = fdiv double %20, %25
  92.  
  93. %27 = fadd double %15, %26
  94.  
  95. ret double %27
  96. }
  97.  
  98. ;Точка входа в программу: ввод аргументов, вычисление и вывод значения функции
  99. define void @main()
  100. {
  101. %abcStringPtr = getelementptr [27 x i8], [27 x i8]* @abcString, i32 0, i32 0
  102. call i32 (i8*, ...) @printf(i8* %abcStringPtr)
  103. %a = call double @readDouble([5 x i8]* @aString)
  104. %b = call double @readDouble([5 x i8]* @bString)
  105. %c = call double @readDouble([5 x i8]* @cString)
  106. %yStringPtr = getelementptr [24 x i8], [24 x i8]* @yString, i32 0, i32 0
  107. %y = call double @y(double %a, double %b, double %c)
  108. call i32 (i8*, ...) @printf(i8* %yStringPtr, double %a, double %b, double %c, double %y)
  109. ret void
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement