22007E/0 — November 1999

AMD Athlon™ Processor x86 Code Optimization

*res++ = dp; /* write transformed z */

dp = vv->x * *m++; dp += vv->y * *m++; dp += vv->z * *m++; dp += vv->w * *m++;

*res++ = dp; /* write transformed w */

++vv;

/*

next input vertex

*/

m -= 16;

/*

reset to start of

transform matrix */

}

}

Example 2 (Preferred):

typedef struct { float x,y,z,w;

} VERTEX;

typedef struct { float m[4][4];

} MATRIX;

void XForm (float *res, const float *v, const float *m, int numverts)

{

int i;

const VERTEX* vv = (VERTEX *)v; const MATRIX* mm = (MATRIX *)m; VERTEX* rr = (VERTEX *)res;

for (i = 0; i < numverts; i++) {

rr->x = vv->x*mm->m[0][0] + vv->y*mm->m[0][1] + vv->z*mm->m[0][2] + vv->w*mm->m[0][3];

rr->y = vv->x*mm->m[1][0] + vv->y*mm->m[1][1] + vv->z*mm->m[1][2] + vv->w*mm->m[1][3];

rr->z = vv->x*mm->m[2][0] + vv->y*mm->m[2][1] + vv->z*mm->m[2][2] + vv->w*mm->m[2][3];

rr->w = vv->x*mm->m[3][0] + vv->y*mm->m[3][1] + vv->z*mm->m[3][2] + vv->w*mm->m[3][3];

}

}

Use Array Style Instead of Pointer Style Code

17

Page 33
Image 33
AMD x86 manual Example 2 Preferred