3
3
use {
4
4
crate :: { approximations:: sqrt, instruction:: MathInstruction , precise_number:: PreciseNumber } ,
5
5
borsh:: BorshDeserialize ,
6
- solana_program:: { account_info:: AccountInfo , entrypoint:: ProgramResult , msg, pubkey:: Pubkey } ,
6
+ solana_program:: {
7
+ account_info:: AccountInfo , entrypoint:: ProgramResult , log:: sol_log_compute_units, msg,
8
+ pubkey:: Pubkey ,
9
+ } ,
7
10
} ;
8
11
12
+ /// u64_multiply
13
+ #[ inline( never) ]
14
+ fn u64_multiply ( multiplicand : u64 , multiplier : u64 ) -> u64 {
15
+ multiplicand * multiplier
16
+ }
17
+
18
+ /// u64_divide
19
+ #[ inline( never) ]
20
+ fn u64_divide ( dividend : u64 , divisor : u64 ) -> u64 {
21
+ dividend / divisor
22
+ }
23
+
24
+ /// f32_multiply
25
+ #[ inline( never) ]
26
+ fn f32_multiply ( multiplicand : f32 , multiplier : f32 ) -> f32 {
27
+ multiplicand * multiplier
28
+ }
29
+
30
+ /// f32_divide
31
+ #[ inline( never) ]
32
+ fn f32_divide ( dividend : f32 , divisor : f32 ) -> f32 {
33
+ dividend / divisor
34
+ }
35
+
9
36
/// Instruction processor
10
37
pub fn process_instruction (
11
38
_program_id : & Pubkey ,
@@ -17,19 +44,25 @@ pub fn process_instruction(
17
44
MathInstruction :: PreciseSquareRoot { radicand } => {
18
45
msg ! ( "Calculating square root using PreciseNumber" ) ;
19
46
let radicand = PreciseNumber :: new ( radicand as u128 ) . unwrap ( ) ;
47
+ sol_log_compute_units ( ) ;
20
48
let result = radicand. sqrt ( ) . unwrap ( ) . to_imprecise ( ) . unwrap ( ) as u64 ;
49
+ sol_log_compute_units ( ) ;
21
50
msg ! ( "{}" , result) ;
22
51
Ok ( ( ) )
23
52
}
24
53
MathInstruction :: SquareRootU64 { radicand } => {
25
54
msg ! ( "Calculating u64 square root" ) ;
55
+ sol_log_compute_units ( ) ;
26
56
let result = sqrt ( radicand) . unwrap ( ) ;
57
+ sol_log_compute_units ( ) ;
27
58
msg ! ( "{}" , result) ;
28
59
Ok ( ( ) )
29
60
}
30
61
MathInstruction :: SquareRootU128 { radicand } => {
31
62
msg ! ( "Calculating u128 square root" ) ;
63
+ sol_log_compute_units ( ) ;
32
64
let result = sqrt ( radicand) . unwrap ( ) ;
65
+ sol_log_compute_units ( ) ;
33
66
msg ! ( "{}" , result) ;
34
67
Ok ( ( ) )
35
68
}
@@ -38,7 +71,17 @@ pub fn process_instruction(
38
71
multiplier,
39
72
} => {
40
73
msg ! ( "Calculating U64 Multiply" ) ;
41
- let result = multiplicand * multiplier;
74
+ sol_log_compute_units ( ) ;
75
+ let result = u64_multiply ( multiplicand, multiplier) ;
76
+ sol_log_compute_units ( ) ;
77
+ msg ! ( "{}" , result) ;
78
+ Ok ( ( ) )
79
+ }
80
+ MathInstruction :: U64Divide { dividend, divisor } => {
81
+ msg ! ( "Calculating U64 Divide" ) ;
82
+ sol_log_compute_units ( ) ;
83
+ let result = u64_divide ( dividend, divisor) ;
84
+ sol_log_compute_units ( ) ;
42
85
msg ! ( "{}" , result) ;
43
86
Ok ( ( ) )
44
87
}
@@ -47,13 +90,17 @@ pub fn process_instruction(
47
90
multiplier,
48
91
} => {
49
92
msg ! ( "Calculating f32 Multiply" ) ;
50
- let result = multiplicand * multiplier;
93
+ sol_log_compute_units ( ) ;
94
+ let result = f32_multiply ( multiplicand, multiplier) ;
95
+ sol_log_compute_units ( ) ;
51
96
msg ! ( "{}" , result as u64 ) ;
52
97
Ok ( ( ) )
53
98
}
54
99
MathInstruction :: F32Divide { dividend, divisor } => {
55
100
msg ! ( "Calculating f32 Divide" ) ;
56
- let result = dividend / divisor;
101
+ sol_log_compute_units ( ) ;
102
+ let result = f32_divide ( dividend, divisor) ;
103
+ sol_log_compute_units ( ) ;
57
104
msg ! ( "{}" , result as u64 ) ;
58
105
Ok ( ( ) )
59
106
}
0 commit comments