diff --git a/rtl/inc/generic.inc b/rtl/inc/generic.inc index 8009aed361..aa590e5c5e 100644 --- a/rtl/inc/generic.inc +++ b/rtl/inc/generic.inc @@ -1572,19 +1572,27 @@ end; {$ifndef FPC_SYSTEM_HAS_MUL_BYTE} function fpc_mul_byte(f1,f2 : byte) : byte;[public,alias: 'FPC_MUL_BYTE']; compilerproc; var - bitpos : byte; - b : byte; + v1,v2,res: byte; begin - fpc_mul_byte := 0; - bitpos := 1; - - for b := 0 to 7 do + if f1 0 then - fpc_mul_byte := fpc_mul_byte + f1; - f1 := f1 shl 1; - bitpos := bitpos shl 1; + v1:=f1; + v2:=f2; + end + else + begin + v1:=f2; + v2:=f1; end; + res:=0; + while v1<>0 do + begin + if v1 and 1<>0 then + inc(res,v2); + v2:=v2 shl 1; + v1:=v1 shr 1; + end; + fpc_mul_byte:=res; end; function fpc_mul_byte_checkoverflow(f1,f2 : byte) : byte;[public,alias: 'FPC_MUL_BYTE_CHECKOVERFLOW']; compilerproc; @@ -1674,19 +1682,27 @@ end; {$ifndef FPC_SYSTEM_HAS_MUL_WORD} function fpc_mul_word(f1,f2 : word) : word;[public,alias: 'FPC_MUL_WORD']; compilerproc; var - bitpos : word; - b : byte; + v1,v2,res: word; begin - fpc_mul_word:=0; - bitpos:=1; - - for b:=0 to 15 do + if f10 then - fpc_mul_word:=fpc_mul_word+f1; - f1:=f1 shl 1; - bitpos:=bitpos shl 1; + v1:=f1; + v2:=f2; + end + else + begin + v1:=f2; + v2:=f1; end; + res:=0; + while v1<>0 do + begin + if ALUUInt(v1) and 1<>0 then + inc(res,v2); + v2:=v2 shl 1; + v1:=v1 shr 1; + end; + fpc_mul_word:=res; end; function fpc_mul_word_checkoverflow(f1,f2 : word) : word;[public,alias: 'FPC_MUL_WORD_CHECKOVERFLOW']; compilerproc; @@ -1777,19 +1793,27 @@ end; {$ifndef FPC_SYSTEM_HAS_MUL_DWORD} function fpc_mul_dword(f1,f2 : dword) : dword;[public,alias: 'FPC_MUL_DWORD']; compilerproc; var - bitpos : dword; - b : byte; + v1,v2,res: dword; begin - fpc_mul_dword:=0; - bitpos:=1; - - for b:=0 to 31 do + if f10 then - fpc_mul_dword:=fpc_mul_dword+f1; - f1:=f1 shl 1; - bitpos:=bitpos shl 1; + v1:=f1; + v2:=f2; + end + else + begin + v1:=f2; + v2:=f1; end; + res:=0; + while v1<>0 do + begin + if ALUUInt(v1) and 1<>0 then + inc(res,v2); + v2:=v2 shl 1; + v1:=v1 shr 1; + end; + fpc_mul_dword:=res; end; function fpc_mul_dword_checkoverflow(f1,f2 : dword) : dword;[public,alias: 'FPC_MUL_DWORD_CHECKOVERFLOW']; compilerproc;