64位代码运算循环条件逻辑还原

发布于 2022-04-19  163 次阅读


加法

基本和32位一样,可用比例因子优化 lea

减法

基本和32位一样,可用比例因子优化 lea

乘法

基本和32位一样,可用比例因子、移位进行优化,如果不能用两条命令计算,直接用imul

除法

  1. 无符号2的幂
    • x / 2^n = x >> n
  2. 有符号2的幂
    • x >= 0 时为 :x / 2^n = x >> n
    • x < 0 时为 :x / 2^n = (x + (2^n - 1)) >> n
  3. 有符号负2的幂
    • x / -2^n = -(x / 2^n)
  4. 无符号非2的幂(1)
    • x / c = x * m >> n
  5. 有符号非2的幂(1) m >= 0
    • x >= 0 时为 :x / c = x * m >> n
    • x < 0 时为 :x / c = (x * m >> n) + 1
  6. 有符号负非2的幂(1) m < 0
    • x >= 0 时为 :x / c = x * m >> n
    • x < 0 时为 :x / c = (x * m >> n) + 1
  7. 无符号非2的幂(2)
    • x / c = ((x - (x * m >> 64)) >> n1) + (x * m >> 64) >> n2
  8. 有符号非2的幂(2)
    • x >= 0 时为 :x / c = (x * m >> 64) + x >> n
    • x < 0 时为 :x / c = ((x * m >> 64) + x >> n) + 1
  9. 有符号负非2的幂(2)
    • x >= 0 时为 :x / c = (x * m >> 64) - x >> n
    • x < 0 时为 :x / c = ((x * m >> 64) - x >> n) + 1
  10. MagicNumber
    • 正数还原公式:c = 2^n / m
    • 负数还原公式:c = 2^n / (2^64 - m)
    • 正数溢出还原公式:c = 2^n / (2^64 + m)


I am very tired