<div dir="ltr"><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px">I have evaluated generated code size for a simple test case.  The following code is used as template where the variable type and math operator is adapted for the specific test case::  <br><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px"><br class="gmail-Apple-interchange-newline">program test;</pre><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px">var ans, x, d: byte; // or int64, etc.</pre><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px">begin</pre><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px">  x := 127;</pre><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px">  d := 1;</pre><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px">  ans := x div d;  // or shl etc.</pre><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px">end;</pre><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px"><br></pre><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px">With the standard RTL compiled for AVR the generated binary size for byte div byte is 2258 bytes of which 148 bytes is code for the algorithm (fpc_div_byte + BSRbyte), <br>296 bytes of data and 1588 bytes associated with HandleErrorAddrFrameInd to raise a divide by zero error.  Clearly the existing error handling code is very bulky <br></pre><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px">for this particular target and this simple program wouldn't fit on some of the supported controller such as attiny13 & attiny25.<br></pre><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px"><br></pre><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px">The binary size for int64 div int64 is 5214 bytes, with the same error handling overhead as above and a total of 2840 bytes of code for the actual algorithm <br>(the generic code pulls in shl, shr and fpc_div_dword).</pre><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px"><br></pre><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px">I've rewritten the routines for div and mod for both unsigned and signed operands from 8 bits to 64 bits in assembler to minimize code size.  <br>My starting point for the division algorithm was the restoring division algorithm as described in wiki and lecture notes from UCLA <br>(<a href="https://www.seas.ucla.edu/~ingrid/ee213a/lectures/division_presentV2.pdf">https://www.seas.ucla.edu/~ingrid/ee213a/lectures/division_presentV2.pdf</a>). I just want to make it clear that this code is not related to the first patch<br> I've submitted in issue 32103 which was based on an application note from Atmel.<br><br></pre><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px">With rewritten assembler routines the size of the binary for byte div byte drops to 234 bytes and the size of the fpc_div_byte routine is 26 bytes.<br></pre><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px"><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px">With rewritten assembler routines the size of the binary for int64 div smallint drops to 534 bytes and the size of the fpc_div_int64 (+fpc_div_qword) routine<br> is 120 (+176) bytes.<br></pre></pre><br></pre><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px">I've also written assembler routines to implement shl/shr for 64 bit operands.<br><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px"><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px"></pre><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px">The binary size for int64 shr smallint is 538 bytes of which 306 bytes is for the fpc_shr_int64 implementation.</pre></pre></pre><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px">Rewritten shl/shr : binary size is 300 bytes and size of fpc_shl_int64 (+fpc_shl_qword) routine is 14 (+54) bytes.<br><br><br></pre><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px">I submit for consideration a zip file containing the following files (to be extracted into rt/avr folder):<br></pre><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px">avr.inc - I've added an include directive at the end to include intmath.inc<br></pre><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px">intmath.inc - 8 - 32 bit routines<br></pre><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px">int64p.inc - 64 bit routines<br></pre><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px"><br></pre><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px">I also have a test program that runs several tests but since I use simavr to run it it is probably not so useful to most people.<br></pre><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px"><br></pre><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px">Note that the div&mod routines do not include error handling code, I can add that once a sensible embedded error handling protocol is decided on.<br></pre><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px"><br></pre><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px">Best regards,<br></pre><pre style="color:rgb(33,33,33);font-variant:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;word-spacing:0px">Christo<br></pre></div>