Advertisement
Guest User

Untitled

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