Main Content

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: 5

For 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.