+#define FIXUPREL( CODE, KNOWN_OFFSET, CHECKVAL, NEWVAL )\
+do { \
+ GLuint subst = 0x10101010 + CHECKVAL; \
+ \
+ if (DONT_KNOW_OFFSETS) { \
+ while (*(int *)(CODE+offset) != subst) offset++; \
+ *(int *)(CODE+offset) = (int)(NEWVAL) - ((int)(CODE)+offset) - 4; \
+ if (0) fprintf(stderr, "%s/%d: offset %d, new value: 0x%x\n", __FILE__, __LINE__, offset, (int)(NEWVAL) - ((int)(CODE)+offset) - 4); \
+ offset += 4; \
+ } \
+ else { \
+ int *icode = (int *)(CODE+KNOWN_OFFSET); \
+ assert (*icode == subst); \
+ *icode = (int)(NEWVAL) - (int)(icode) - 4; \
+ } \
+} while (0)
+
+
+
/* Build specialized versions of the immediate calls on the fly for
* the current state. Generic x86 versions.
FIXUP(dfn->code, 0, 0, (int)&tnl->vtx.vbptr);
FIXUP(dfn->code, 0, 3, (int)&tnl->vtx.counter);
FIXUP(dfn->code, 0, 3, (int)&tnl->vtx.counter);
- FIXUP(dfn->code, 0, 4, (int)¬ify);
+ FIXUPREL(dfn->code, 0, 4, (int)¬ify);
return dfn;
}
FIXUP(dfn->code, 0, 0, (int)&tnl->vtx.vbptr);
FIXUP(dfn->code, 0, 3, (int)&tnl->vtx.counter);
FIXUP(dfn->code, 0, 3, (int)&tnl->vtx.counter);
- FIXUP(dfn->code, 0, 4, (int)¬ify);
+ FIXUPREL(dfn->code, 0, 4, (int)¬ify);
return dfn;
}
FIXUP(dfn->code, 0, 0, (int)&tnl->vtx.vbptr);
FIXUP(dfn->code, 0, 3, (int)&tnl->vtx.counter);
FIXUP(dfn->code, 0, 3, (int)&tnl->vtx.counter);
- FIXUP(dfn->code, 0, 4, (int)¬ify);
+ FIXUPREL(dfn->code, 0, 4, (int)¬ify);
return dfn;
}
FIXUP(dfn->code, 0, 0, (int)&tnl->vtx.vbptr);
FIXUP(dfn->code, 0, 3, (int)&tnl->vtx.counter);
FIXUP(dfn->code, 0, 3, (int)&tnl->vtx.counter);
- FIXUP(dfn->code, 0, 4, (int)¬ify);
+ FIXUPREL(dfn->code, 0, 4, (int)¬ify);
return dfn;
}
pop %edi
dec %edx // counter--
movl %edx, SUBST(3) // 0x3 --> counter
- je .5 // if (counter != 0)
- ret // return
-.5: mov $SUBST(4), %eax // else notify()
- jmp *%eax // jmp $0x10101014 doesn't seem to work
+ .short 0x840f // if (counter == 0)
+ .long SUBST(4) // notify()
+ ret // return
GLOBL ( _x86_Vertex1fv_end )
pop %edi
dec %edx // counter--
movl %edx, SUBST(3) // save counter
- je .6 // if (counter != 0)
- ret // return
-.6: mov $SUBST(4), %eax // else notify()
- jmp *%eax // jmp $0x10101014 doesn't seem to work
+ .short 0x840f // if (counter == 0)
+ .long SUBST(4) // notify()
+ ret // return
GLOBL ( _x86_Vertex2fv_end )
.align 4
pop %edi
dec %edx // counter--
movl %edx, SUBST(3) // save counter
- je .7 // if (counter != 0)
- ret // return
-.7: mov $SUBST(4), %eax // else notify()
- jmp *%eax // jmp $0x10101014 doesn't seem to work
+ .short 0x840f // if (counter == 0)
+ .long SUBST(4) // notify()
+ ret // return
GLOBL ( _x86_Vertex3fv_end )
pop %edi
dec %edx // counter--
movl %edx, SUBST(3) // save counter
- je .6 // if (counter != 0)
- ret // return
-.8: mov $SUBST(4), %eax // else notify()
- jmp *%eax // jmp $0x10101014 doesn't seem to work
+ .short 0x840f // if (counter == 0)
+ .long SUBST(4) // notify()
+ ret // return
GLOBL ( _x86_Vertex4fv_end )