Multiply operation for xtensa (lx6/esp32) lazarus / 77-Embedded ---------------------------------------------------------------------- irfanbagus · 2020-08-07 15:58 I try this code Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i function TestSmallInt(A,B: SmallInt): SmallInt;begin  Result:= SmallInt(5)+A*B;end; and i get this assembly code Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i # [90] begin        entry   a1,64        mov             a10,a2# Var A located in register a10        mov             a11,a3# Var B located in register a11# Var B located in register a11# Var A located in register a10# [91] Result:= SmallInt(5)+A*B;        call8   fpc_mul_longint        addi    a2,a10,5        sext    a2,a2,15# Var $result located in register a2# [92] end;        sext    a2,a2,15      retw i have almost zero knowledge in this xtensa cpu. Is there any reason why fpc does not generate MUL* instruction, instead calling multiply helper function?  missing native MUL instruction perhaps? ---------------------------------------------------------------------- ccrause · 2020-08-07 19:02 Quote from: irfanbagus on August 07, 2020, 05:58:57 pm... i have almost zero knowledge in this xtensa cpu. Is there any reason why fpc does not generate MUL* instruction, instead calling multiply helper function?  missing native MUL instruction perhaps? The both ESP32 and ESP8266 have hardware MULL and MUL16 type instructions.  The necessary code to generate the CPU specific instructions hasn't been implemented yet [1] - this target is relatively new so not much time has been invested yet into optimizing the generated code. Edit: [1] Not quite true, there is actually some code that can generate a hardware MULL instruction, but it is disabled by default (probably because it lacks error checking). ---------------------------------------------------------------------- irfanbagus · 2020-08-08 01:16 Quote from: ccrause on August 07, 2020, 09:02:01 pm... Edit: [1] Not quite true, there is actually some code that can generate a hardware MULL instruction, but it is disabled by default (probably because it lacks error checking). is this what you mean (see my attachment) ? ---------------------------------------------------------------------- ccrause · 2020-08-08 07:21 Yes.  Since the MUL instructions are optional, I would rather follow the m68k example and declare a capability in cpuinfo.pas and check if this capability exists for the selected subarch. taddnode.use_mul_helper can be overridden to perform this check.  See attached patch. Note that the generated code does not check for overflow, this still needs to be implemented.  Test example: Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i program test; procedure vTaskDelay(xTicksToDelay: uint32); external; var  a, b, c: uint32; begin  for a := $FFFF to $7FFFFF do    for b := $FFF0 to $7FFFFF do    begin      c := a * b;      writeln(a, ' x ', b, ' = ', c);      vTaskDelay(100);    end;  repeat until false;end.  Code: ASM  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i # [12] c := a * b;        l32r    a2,.Lj13        l32i    a3,a2,0        l32r    a2,.Lj14        l32i    a2,a2,0        mull    a2,a2,a3        l32r  a3,.Lj15        s32i    a2,a3,0.Ll5: And the output with overflow checking enabled: Code: Text  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i 65535 x 65535 = 429483622565535 x 65536 = 429490176065535 x 65537 = 429496729565535 x 65538 = 6553465535 x 65539 = 13106965535 x 65540 = 196604