41.6 УМНОЖЕНИЕ НА КОНСТАНТУ




THIS SECTION IS UNDER CONSTRUCTION


Для некоторых значений константы вместо относительно длительной операции умножения можно выполнить набор простых операций который будет выполняться быстрее.




Умножение на степень двойки: X * 2^N = (X << N) X * (2^N+1) = (X << N) + X X * (2^N-1) = (X << N) - X


Умножение на константу: --------------------------------------------------------- операция операций --------------------------------------------------------- X * 2 = (X << 1) 1 X * 3 = (X << 1) + X 2 X * 4 = (X << 2) 1 X * 5 = (X << 2) + X 2 X * 6 = (X << 2) + (X << 1) 3 X * 7 = (X << 3) - X 2 X * 8 = (X << 3) 1 X * 9 = (X << 3) + X 2 X * 10 = (X * 5) << 1 = ((X << 2) + X) << 1 3 X * 11 = (X << 4) - (X << 2) - X 4 X * 12 = (X << 4) - (X << 2) 3 X * 13 = (X << 4) - (X << 1) - X 4 X * 14 = (X << 4) - (X << 1) 3 X * 15 = (X << 4) - X 2 X * 16 = (X << 4) 1 --------------------------------------------------------- 2 2 3 2 + 1 4 4 5 4 + 1 6 2 * 3 7 8 - 1 8 8 9 8 + 1 10 2 * 5 13 3 * 4 + 1 15 3 * 5 итд. Особенно это эффективно если в микропроцессоре есть совмещенная иниструкция SHIFT-ADD: Например: HPPA: SH1ADD, SH2ADD, SH3ADD Alpha: S4ADDL, S8ADDL 000: xor eax,eax 001: 002: add eax,eax 003: lea eax,[eax+eax*2] 004: shl eax,02H 005: lea eax,[eax+eax*4] 006: add eax,eax lea eax,[eax+eax*2] 007: lea ebx,[eax+eax*2] lea eax,[eax+ebx*2] 008: shl eax,03H 009: lea eax,[eax+eax*8] 010: add eax,eax lea eax,[eax+eax*4] 011: lea ebx,[eax+eax*2] lea eax,[ebx+eax*8] 012: shl eax,02H lea eax,[eax+eax*2] 013: lea ebx,[eax+eax*2] lea eax,[eax+ebx*4] 014: add eax,eax lea ebx,[eax+eax*2] lea eax,[eax+ebx*2] 015: lea eax,[eax+eax*2] lea eax,[eax+eax*4] 016: shl eax,04H 017: lea ebx,[eax+eax*8] lea eax,[ebx+eax*8] 018: add eax,eax lea eax,[eax+eax*8] 019: lea ebx,[eax+eax*8] lea eax,[eax+ebx*2] 020: shl eax,02H lea eax,[eax+eax*4] 021: lea ebx,[eax+eax*4] lea eax,[eax+ebx*4] 022: add eax,eax lea ebx,[eax+eax*2] lea eax,[ebx+eax*8] 023: lea ebx,[eax+eax*8] shl eax,05H sub eax,ebx 024: shl eax,03H lea eax,[eax+eax*2] 025: lea eax,[eax+eax*4] lea eax,[eax+eax*4] 026: add eax,eax lea ebx,[eax+eax*2] lea eax,[eax+ebx*4] 027: lea eax,[eax+eax*2] lea eax,[eax+eax*8] 028: lea ebx,[eax+eax*2] add eax,ebx lea eax,[eax+ebx*8] 029: lea ebx,[eax+eax*2] shl eax,05H sub eax,ebx 030: add eax,eax lea eax,[eax+eax*2] lea eax,[eax+eax*4] 031: mov ebx,eax shl eax,05H sub eax,ebx 032: shl eax,05H 033: lea ebx,+0H[eax*4] lea eax,[eax+ebx*8] 034: mov ebx,eax shl eax,05H lea eax,[eax+ebx*2] 035: lea ebx,[eax+eax*2] add eax,ebx lea eax,[ebx+eax*8] 036: shl eax,02H lea eax,[eax+eax*8] 037: lea ebx,[eax+eax*8] lea eax,[eax+ebx*4] 038: add eax,eax lea ebx,[eax+eax*8] lea eax,[eax+ebx*2] 039: lea eax,[eax+eax*2] lea ebx,[eax+eax*2] lea eax,[eax+ebx*4] 040: shl eax,03H lea eax,[eax+eax*4] 041: lea ebx,[eax+eax*4] lea eax,[eax+ebx*8] 042: add eax,eax lea ebx,[eax+eax*4] lea eax,[eax+ebx*4] 043: lea ebx,[eax+eax*2] lea eax,[eax+eax*4] lea eax,[ebx+eax*8] 044: shl eax,02H lea ebx,[eax+eax*2] lea eax,[ebx+eax*8] 045: lea eax,[eax+eax*4] lea eax,[eax+eax*8] 046: lea ebx,[eax+eax*4] add eax,ebx lea eax,[eax+ebx*8] 047: lea ebx,[eax+eax*2] lea eax,[ebx+eax*8] lea eax,[ebx+eax*4] 048: shl eax,04H lea eax,[eax+eax*2] 049: lea ebx,[eax+eax*2] add ebx,ebx lea eax,[eax+ebx*8] 050: add eax,eax lea eax,[eax+eax*4] lea eax,[eax+eax*4]


Index Prev Next