ARM > Efficient C for ARM > Bools

by David Thomas on

Bools

Problem:

  • A bool passed to a function eats up a whole register by itself.
  • Passing around multiple bools becomes very wasteful.
  • There are usually 31 other spare bits which can be used.

Solution:

  • Convert multiple bools into a single unsigned int,
  • and create associated flag definitions.

This reduces register pressure and allows for convenient multiple-bool tests to be carried out with a single logical operation.

Example

typedef unsigned int bool;

bool isEnemy(bool hasLasers,
             bool hasMissiles,
             bool hasBomb,
             bool hasECM)
{
  return hasLasers   ||
         hasMissiles ||
         hasBomb     ||
         hasECM;
}
isEnemy ORR   r0,r0,r1
        ORR   r0,r0,r2
        ORRS  r0,r0,r3
        MOVNE r0,#1
        MOV   pc,lr
typedef unsigned int ShipFlags;

#define ShipFlags_HasLasers   (1u << 0)
#define ShipFlags_HasMissiles (1u << 1)
#define ShipFlags_HasBomb     (1u << 2)
#define ShipFlags_HasECM      (1u << 3)

bool isEnemy2(ShipFlags flags)
{
  ShipFlags want = ShipFlags_HasLasers   |
                   ShipFlags_HasMissiles |
                   ShipFlags_HasBomb     |
                   ShipFlags_HasECM;

  return (flags & want) != 0;
}
isEnemy2 ANDS  r0,r0,#0xf
         MOVNE r0,#1
         MOV   pc,lr