<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Coldfire V2 EMAC help in ColdFire/68K Microcontrollers and Processors</title>
    <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/Coldfire-V2-EMAC-help/m-p/309388#M12138</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Ron,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I'm a bit rusty on this, but here is some code that should do what you want with some very minor modification.&amp;nbsp; I used it in a DSP application some years ago to do a multiply and accumulate on a MCF5213 which only has the MAC, not the eMAC.&amp;nbsp; I've not used the eMAC, but I think that the main difference is that it has has four accumulators rather than just the one on the MAC.&amp;nbsp; You might want to save the extra accumulators on the stack and you may need to rename "ACC" to refer to the accumulator that you want to use.&amp;nbsp; This code definitely worked using the CW7.1 compiler as we never migrated to CW 7.2 for the MCF5213.&amp;nbsp; This code is significantly faster than using straight C.&amp;nbsp; I hope this helps you out, Shaun.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/************************************************************************/&lt;/P&gt;&lt;P&gt;// Hardware MAC (Multiply Accumulate) - v0.00&lt;/P&gt;&lt;P&gt;// Takes 2 arrays of signed shorts, performs a multiply accumulate and returns&lt;/P&gt;&lt;P&gt;// a signed long result.&lt;/P&gt;&lt;P&gt;// 1) Speed increase of 3x over conventional code&lt;/P&gt;&lt;P&gt;// 2) Length max = 8192&lt;/P&gt;&lt;P&gt;// 3) Auto supports all 3 parameter passing settings (Std,Register,Compact)&lt;/P&gt;&lt;P&gt;// 4) Function is re-entrant, but exercise caution when doing so&lt;/P&gt;&lt;P&gt;// 5) Function has been tested under the conditions :&lt;/P&gt;&lt;P&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Project optimization at min &amp;amp; max.&lt;/P&gt;&lt;P&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Calling conventions - Std/Reg/Compact&lt;/P&gt;&lt;P&gt;// [160us for length of 1000, at 73.7328MHz sysclk]&lt;/P&gt;&lt;P&gt;/************************************************************************/&lt;/P&gt;&lt;P&gt;// All Optimization OFF for the MAC routine, to avoid unexpected conflicts&lt;/P&gt;&lt;P&gt;#pragma push&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/P&gt;&lt;P&gt;#pragma auto_inline off&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/P&gt;&lt;P&gt;#pragma optimization_level 0&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/P&gt;&lt;P&gt;#pragma optimize_for_size off&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/P&gt;&lt;P&gt;signed long Micro_MulAcc(signed short *in1,signed short *in2, unsigned short length)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; // By default, these registers are d0-d2/a0-a1 push/popped, for an ISR.&lt;/P&gt;&lt;P&gt;&amp;nbsp; // These are defined as the general scratch reg's (data/ptrs respectively)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; signed long result=0;&lt;/P&gt;&lt;P&gt;&amp;nbsp; signed long mac_save;&lt;/P&gt;&lt;P&gt;&amp;nbsp; unsigned char macsr_save;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if((length==0)||(length &amp;gt; 8192))&amp;nbsp;&amp;nbsp;&amp;nbsp; // Failsafe (also checked in asm)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; length = 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; asm&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; move.l ACC,d1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Push MAC registers&lt;/P&gt;&lt;P&gt;&amp;nbsp; move.l d1,(mac_save)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/P&gt;&lt;P&gt;&amp;nbsp; move.l MACSR,d1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/P&gt;&lt;P&gt;&amp;nbsp; move.l d1,(macsr_save)&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Retrieve parms from stack&lt;/P&gt;&lt;P&gt;&amp;nbsp; // ----------------------------&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; #if (__STDABI__==1)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // If all parms are 32bit wide&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; movea.l&amp;nbsp; (in1),a0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Get pointers to start of both data arrays&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; movea.l&amp;nbsp; (in2),a1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; move.w&amp;nbsp;&amp;nbsp; (length),d0&amp;nbsp;&amp;nbsp;&amp;nbsp; // Get length from stack as a short&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; #endif&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; #if (__REGABI__==1)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // If all parms are passed in registers&lt;/P&gt;&lt;P&gt;&amp;nbsp; #pragma unused(in1,in2,length)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Pointers already in A0 and A1&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Length already in D0&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; #endif&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; #if(__STDABI__==0)&amp;amp;&amp;amp;(__REGABI__==0) // If Parms Compact mode&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; movea.l (in1),a0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Get pointers to start of both data arrays&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; movea.l (in2),a1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; move.w&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (length),d0&amp;nbsp;&amp;nbsp;&amp;nbsp; // Get length from upper short of next stack item&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; #endif&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; andi.l&amp;nbsp;&amp;nbsp; #0x00001FFF,d0&amp;nbsp;&amp;nbsp;&amp;nbsp; // Ensure length is not more than 8192, and that upper short&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // of d0 is clear&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; // Setup MAC&lt;/P&gt;&lt;P&gt;&amp;nbsp; // ----------------------------&lt;/P&gt;&lt;P&gt;&amp;nbsp; move.l&amp;nbsp;&amp;nbsp; #0x00000080,MACSR&amp;nbsp;&amp;nbsp;&amp;nbsp; // load MACSR for Sat|signed|Integer&lt;/P&gt;&lt;P&gt;&amp;nbsp; move.l&amp;nbsp;&amp;nbsp; #0,ACC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Clear MAC accumulator&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Loop for length&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ----------------------------&lt;/P&gt;&lt;P&gt;loop:&lt;/P&gt;&lt;P&gt;&amp;nbsp; move.w (a0)+,d1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Retrieve a word from both arrays&lt;/P&gt;&lt;P&gt;&amp;nbsp; move.w (a1)+,d2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/P&gt;&lt;P&gt;&amp;nbsp; mac.w&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d1.l,d2.l&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // MAC (.l)LSbyte of both registers&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; subq.l #1,d0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Decrement counter&lt;/P&gt;&lt;P&gt;&amp;nbsp; bne.s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; loop&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Branch if not zero&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; //-------------------------------&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; move.l ACC,d0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Transfer mac accumulator to temp location&lt;/P&gt;&lt;P&gt;&amp;nbsp; move.l d0,result&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Place on stack for return value&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; move.l (mac_save),d1&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/P&gt;&lt;P&gt;&amp;nbsp; move.l d1,ACC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Pop MAC registers&lt;/P&gt;&lt;P&gt;&amp;nbsp; move.l (macsr_save),d1//&lt;/P&gt;&lt;P&gt;&amp;nbsp; move.l d1,MACSR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;#pragma pop&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Sat, 03 May 2014 08:18:57 GMT</pubDate>
    <dc:creator>yibbidy</dc:creator>
    <dc:date>2014-05-03T08:18:57Z</dc:date>
    <item>
      <title>Coldfire V2 EMAC help</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/Coldfire-V2-EMAC-help/m-p/309387#M12137</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;I am looking for some suggestions on how to use the MAC or EMAC.&lt;/P&gt;&lt;P&gt;I am using CodeWarrior 7.1 and the MCF52235.&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I am not doing any special DSP code or algorithm, just need to do a 16x16 multiple and accumulate as quickly as possible.&lt;/P&gt;&lt;P&gt;The 16 x 16 multiply and accumulate must be done 8 times spread through a function and other code.&lt;/P&gt;&lt;P&gt;I am working in C, so for example I have:&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;register int Input1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // defined as int, but value limited to 12 bits so multiply and accumulate won't overflow 32-bits.&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&gt;register int Sum;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&gt;....&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;Input1 = read A2D&lt;/P&gt;&lt;P&gt;Sum += Input1 x Input1;&lt;/P&gt;&lt;P&gt;... other code&lt;/P&gt;&lt;P&gt;Input 1 = read A2D&lt;/P&gt;&lt;P&gt;Sum += Input1 x Input1&lt;/P&gt;&lt;P&gt;... other code, etc&lt;/P&gt;&lt;P&gt;... after summing 8 times save the Sum&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Defining Input1 and Sum as registers made the assembly faster.&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&gt;Is it possible to use the MAC or EMAC staying in C?&amp;nbsp;&amp;nbsp; Are there compiler extensions for these registers?&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&gt;If I use inline assembly I don't see how to know what register the compiler chose for these values.&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&gt;This is my first experience with CodeFire and hardware multipliers.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;Thanks for the help.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 03 Apr 2014 00:22:50 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/Coldfire-V2-EMAC-help/m-p/309387#M12137</guid>
      <dc:creator>rlcoder</dc:creator>
      <dc:date>2014-04-03T00:22:50Z</dc:date>
    </item>
    <item>
      <title>Re: Coldfire V2 EMAC help</title>
      <link>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/Coldfire-V2-EMAC-help/m-p/309388#M12138</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Ron,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I'm a bit rusty on this, but here is some code that should do what you want with some very minor modification.&amp;nbsp; I used it in a DSP application some years ago to do a multiply and accumulate on a MCF5213 which only has the MAC, not the eMAC.&amp;nbsp; I've not used the eMAC, but I think that the main difference is that it has has four accumulators rather than just the one on the MAC.&amp;nbsp; You might want to save the extra accumulators on the stack and you may need to rename "ACC" to refer to the accumulator that you want to use.&amp;nbsp; This code definitely worked using the CW7.1 compiler as we never migrated to CW 7.2 for the MCF5213.&amp;nbsp; This code is significantly faster than using straight C.&amp;nbsp; I hope this helps you out, Shaun.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/************************************************************************/&lt;/P&gt;&lt;P&gt;// Hardware MAC (Multiply Accumulate) - v0.00&lt;/P&gt;&lt;P&gt;// Takes 2 arrays of signed shorts, performs a multiply accumulate and returns&lt;/P&gt;&lt;P&gt;// a signed long result.&lt;/P&gt;&lt;P&gt;// 1) Speed increase of 3x over conventional code&lt;/P&gt;&lt;P&gt;// 2) Length max = 8192&lt;/P&gt;&lt;P&gt;// 3) Auto supports all 3 parameter passing settings (Std,Register,Compact)&lt;/P&gt;&lt;P&gt;// 4) Function is re-entrant, but exercise caution when doing so&lt;/P&gt;&lt;P&gt;// 5) Function has been tested under the conditions :&lt;/P&gt;&lt;P&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Project optimization at min &amp;amp; max.&lt;/P&gt;&lt;P&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Calling conventions - Std/Reg/Compact&lt;/P&gt;&lt;P&gt;// [160us for length of 1000, at 73.7328MHz sysclk]&lt;/P&gt;&lt;P&gt;/************************************************************************/&lt;/P&gt;&lt;P&gt;// All Optimization OFF for the MAC routine, to avoid unexpected conflicts&lt;/P&gt;&lt;P&gt;#pragma push&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/P&gt;&lt;P&gt;#pragma auto_inline off&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/P&gt;&lt;P&gt;#pragma optimization_level 0&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/P&gt;&lt;P&gt;#pragma optimize_for_size off&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/P&gt;&lt;P&gt;signed long Micro_MulAcc(signed short *in1,signed short *in2, unsigned short length)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; // By default, these registers are d0-d2/a0-a1 push/popped, for an ISR.&lt;/P&gt;&lt;P&gt;&amp;nbsp; // These are defined as the general scratch reg's (data/ptrs respectively)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; signed long result=0;&lt;/P&gt;&lt;P&gt;&amp;nbsp; signed long mac_save;&lt;/P&gt;&lt;P&gt;&amp;nbsp; unsigned char macsr_save;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if((length==0)||(length &amp;gt; 8192))&amp;nbsp;&amp;nbsp;&amp;nbsp; // Failsafe (also checked in asm)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; length = 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; asm&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; move.l ACC,d1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Push MAC registers&lt;/P&gt;&lt;P&gt;&amp;nbsp; move.l d1,(mac_save)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/P&gt;&lt;P&gt;&amp;nbsp; move.l MACSR,d1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/P&gt;&lt;P&gt;&amp;nbsp; move.l d1,(macsr_save)&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // Retrieve parms from stack&lt;/P&gt;&lt;P&gt;&amp;nbsp; // ----------------------------&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; #if (__STDABI__==1)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // If all parms are 32bit wide&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; movea.l&amp;nbsp; (in1),a0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Get pointers to start of both data arrays&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; movea.l&amp;nbsp; (in2),a1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; move.w&amp;nbsp;&amp;nbsp; (length),d0&amp;nbsp;&amp;nbsp;&amp;nbsp; // Get length from stack as a short&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; #endif&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; #if (__REGABI__==1)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // If all parms are passed in registers&lt;/P&gt;&lt;P&gt;&amp;nbsp; #pragma unused(in1,in2,length)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Pointers already in A0 and A1&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Length already in D0&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; #endif&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; #if(__STDABI__==0)&amp;amp;&amp;amp;(__REGABI__==0) // If Parms Compact mode&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; movea.l (in1),a0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Get pointers to start of both data arrays&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; movea.l (in2),a1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; move.w&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (length),d0&amp;nbsp;&amp;nbsp;&amp;nbsp; // Get length from upper short of next stack item&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; #endif&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; andi.l&amp;nbsp;&amp;nbsp; #0x00001FFF,d0&amp;nbsp;&amp;nbsp;&amp;nbsp; // Ensure length is not more than 8192, and that upper short&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // of d0 is clear&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; // Setup MAC&lt;/P&gt;&lt;P&gt;&amp;nbsp; // ----------------------------&lt;/P&gt;&lt;P&gt;&amp;nbsp; move.l&amp;nbsp;&amp;nbsp; #0x00000080,MACSR&amp;nbsp;&amp;nbsp;&amp;nbsp; // load MACSR for Sat|signed|Integer&lt;/P&gt;&lt;P&gt;&amp;nbsp; move.l&amp;nbsp;&amp;nbsp; #0,ACC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Clear MAC accumulator&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Loop for length&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ----------------------------&lt;/P&gt;&lt;P&gt;loop:&lt;/P&gt;&lt;P&gt;&amp;nbsp; move.w (a0)+,d1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Retrieve a word from both arrays&lt;/P&gt;&lt;P&gt;&amp;nbsp; move.w (a1)+,d2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/P&gt;&lt;P&gt;&amp;nbsp; mac.w&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d1.l,d2.l&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // MAC (.l)LSbyte of both registers&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; subq.l #1,d0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Decrement counter&lt;/P&gt;&lt;P&gt;&amp;nbsp; bne.s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; loop&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Branch if not zero&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; //-------------------------------&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; move.l ACC,d0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Transfer mac accumulator to temp location&lt;/P&gt;&lt;P&gt;&amp;nbsp; move.l d0,result&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Place on stack for return value&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; move.l (mac_save),d1&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/P&gt;&lt;P&gt;&amp;nbsp; move.l d1,ACC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Pop MAC registers&lt;/P&gt;&lt;P&gt;&amp;nbsp; move.l (macsr_save),d1//&lt;/P&gt;&lt;P&gt;&amp;nbsp; move.l d1,MACSR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;#pragma pop&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sat, 03 May 2014 08:18:57 GMT</pubDate>
      <guid>https://community.nxp.com/t5/ColdFire-68K-Microcontrollers/Coldfire-V2-EMAC-help/m-p/309388#M12138</guid>
      <dc:creator>yibbidy</dc:creator>
      <dc:date>2014-05-03T08:18:57Z</dc:date>
    </item>
  </channel>
</rss>

