Avoid Multiword Operations in Generated Code
This example shows how to avoid multiword operations
in generated code by using the accumpos function
instead of simple addition in your MATLAB® algorithm. Similarly,
you can use accumneg for
subtraction.
This example requires a MATLAB Coder™ license.
Write a simple MATLAB algorithm that adds two numbers and returns the result.
function y = my_add1(a,b) y = a+b; end
Write a second MATLAB algorithm that adds two numbers
using accumpos and returns the result.
function y = my_add2(a,b) y = accumpos(a,b); %floor, wrap end
accumpos adds a and b using
the data type of a. b is cast
into the data type of a. If a is
a fi object, by default, accumpos sets
the rounding mode to 'Floor' and the overflow action
to 'Wrap'. It ignores the fimath properties
of a and b.
Compare the outputs of the two functions in MATLAB.
a = fi(1.25,1,32,5); b = fi(0.125,0,32); y1 = my_add1(a,b) y2 = my_add2(a,b)
y1 =
1.3750
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 63
FractionLength: 34
y2 =
1.3750
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 32
FractionLength: 5For the simple addition, the word length grows but using accumpos,
the word length of the result is the same as that of a.
Generate C code for the function my_add1.
First, disable use of the long long data type because
it is not usually supported by the target hardware.
hw = coder.HardwareImplementation; hw.ProdHWDeviceType = 'Generic->32-bit Embedded Processor'; hw.ProdLongLongMode = false; hw.ProdBitPerLong = 32; cfg = coder.config('lib'); cfg.HardwareImplementation = hw; codegen my_add1 -args {a,b} -report -config cfg
MATLAB Coder generates a C static library and provides a link to the code generation report.
View the generated code for the simple addition. Click
the View report link to open the code generation
report and then scroll to the code for the my_add1 function.
/* Function Declarations */ static void MultiWordAdd(const unsigned long u1[], const unsigned long u2[], unsigned long y[], int n); static void MultiWordSignedWrap(const unsigned long u1[], int n1, unsigned int n2, unsigned long y[]); static void sLong2MultiWord(long u, unsigned long y[], int n); static void sMultiWord2MultiWord(const unsigned long u1[], int n1, unsigned long y[], int n); static void sMultiWord2sMultiWordSat(const unsigned long u1[], int n1, unsigned long y[], int n); static void sMultiWordShl(const unsigned long u1[], int n1, unsigned int n2, unsigned long y[], int n); static void sMultiWordShr(const unsigned long u1[], int n1, unsigned int n2, unsigned long y[], int n); static void uLong2MultiWord(unsigned long u, unsigned long y[], int n);
The generated C code contains multiple multiword operations.
Generate C code for the function my_add2.
codegen my_add2 -args {a,b} -report -config cfg
View the generated code for the addition using accumpos.
Click the View report link to open the code generation
report and then scroll to the code for the my_add2 function.
int my_add2(int a, unsigned int b)
{
int y;
y = a + (int)(b >> 29);
/* floor, wrap */
return y;
}For this function, the generated code contains no multiword operations.