大致解释一下代码
首先定义了一个320比特大整数类型BN_320bits,用40个bytes表示
数据的表示方式是以uint64为单位大端表示, 而uint64内部小端表示
bn_sub_320做了一个大整数减法 r = r - a
为了方便借位的判断,运算时提升至__uint128_t
main函数,定义了m, u, v
其中m = 1, u = 0, v = 1
逻辑上
u = u - v
然后判断u的奇偶
u是偶数则进入route 1,只打印
u是奇数则 u = u - m
最后 v = v - u
然后打印v(为了方便我只打印了数据最低字节,其它字节都是0)
正常情况下
u = u - v 后 u = -1
然后判定奇数
u = u - m 后 u = -2
最后 v = v - u,得 v = 3
但是在开启-O3后,编译器似乎认为它确定了u - v的结果?,直接优化掉了u的奇偶判断,优化掉了变量m,优化掉了对u, v的初始化,直接调用bn_sub_320, 然后直接打印route1,再调用一次bn_sub_320, 最后直接打印1
对,是直接打印1,和v[32]无关了,直接mov立即数$1到第二参数寄存器,然后call printf的
如果把main函数的内容挪到一个f函数里,然后在main里调用f,那似乎会把u, v, m以及bn_sub_320的调用都优化掉,f()函数里就剩两个printf的打印
首先定义了一个320比特大整数类型BN_320bits,用40个bytes表示
数据的表示方式是以uint64为单位大端表示, 而uint64内部小端表示
bn_sub_320做了一个大整数减法 r = r - a
为了方便借位的判断,运算时提升至__uint128_t
main函数,定义了m, u, v
其中m = 1, u = 0, v = 1
逻辑上
u = u - v
然后判断u的奇偶
u是偶数则进入route 1,只打印
u是奇数则 u = u - m
最后 v = v - u
然后打印v(为了方便我只打印了数据最低字节,其它字节都是0)
正常情况下
u = u - v 后 u = -1
然后判定奇数
u = u - m 后 u = -2
最后 v = v - u,得 v = 3
但是在开启-O3后,编译器似乎认为它确定了u - v的结果?,直接优化掉了u的奇偶判断,优化掉了变量m,优化掉了对u, v的初始化,直接调用bn_sub_320, 然后直接打印route1,再调用一次bn_sub_320, 最后直接打印1
对,是直接打印1,和v[32]无关了,直接mov立即数$1到第二参数寄存器,然后call printf的
如果把main函数的内容挪到一个f函数里,然后在main里调用f,那似乎会把u, v, m以及bn_sub_320的调用都优化掉,f()函数里就剩两个printf的打印