前回長くなりすぎたので、追記分を分けておくことにした。
前回は簡易fizzbazzを逆アセンブルし、割り算の最適化に関して面白いものを見たのだった。
その続きとして、modulo
ではなく普通の割り算はどうなるんだろう、と思って以下のようなコードを書いてみた。
#include <stdint.h> int32_t div_by3(int32_t a) { return a / 3; } int32_t div_by4(int32_t a) { return a / 4; } int32_t div(int32_t a, int32_t b) { return a / b; }
逆アセンブルする。予想としては、div_by3
は先のマジックナンバーを使った方法を、div_by4
はsar
で右シフトを、div
は普通にidiv
命令を使うというものだ。
それがたとえ-O0
であったとしても。