|
|
1.1 root 1: /*
2: * UAE - The Un*x Amiga Emulator
3: *
4: * Optimized blitter minterm function generator
5: *
1.1.1.2 ! root 6: * Copyright 1995,1996 Bernd Schmidt
! 7: * Copyright 1996 Alessandro Bissacco
1.1 root 8: */
9:
1.1.1.2 ! root 10: #include "sysconfig.h"
! 11: #include "sysdeps.h"
1.1 root 12:
13: #include "config.h"
1.1.1.2 ! root 14: #include "options.h"
! 15: #include "custom.h"
1.1 root 16:
1.1.1.2 ! root 17: /* Here is the minterm table used in blitter function generation */
! 18:
! 19: static unsigned char blttbl[]= {
! 20: 0x00, 0x0a, 0x2a, 0x30, 0x3a, 0x3c, 0x4a, 0x6a, 0x8a, 0x8c, 0x9a, 0xa8,
! 21: 0xaa, 0xb1, 0xca, 0xcc, 0xd8, 0xe2, 0xea, 0xf0, 0xfa, 0xfc
! 22: };
! 23:
! 24: static int bitset(int mt, int bit)
1.1 root 25: {
26: return mt & (1<<bit);
27: }
28:
1.1.1.2 ! root 29: static int generate_expr(int minterm, int print)
1.1 root 30: {
1.1.1.2 ! root 31: int result = 0;
! 32: int firstor = 1;
! 33: int bits = 0;
! 34: int i;
! 35: for(i=0; i<8; i++) {
! 36: if (bitset(minterm, i) && !bitset(bits,i)) {
! 37: int j;
! 38: int dontcare = 0;
! 39: int firstand = 1;
! 40: int bitbucket[8], bitcount;
1.1 root 41:
1.1.1.2 ! root 42: bits |= 1<<i;
! 43: bitcount = 1; bitbucket[0] = i;
! 44: for(j=1; j<8; j *= 2) {
! 45: int success = 1;
! 46: int k;
! 47: for(k=0; k < bitcount; k++) {
! 48: if (!bitset(minterm, bitbucket[k] ^ j)) {
! 49: success = 0;
1.1 root 50: }
51: }
1.1.1.2 ! root 52: if (success) {
! 53: int l;
! 54: dontcare |= j;
! 55: for(l=bitcount; l < bitcount*2; l++) {
! 56: bitbucket[l] = bitbucket[l-bitcount] ^ j;
! 57: bits |= 1 << bitbucket[l];
1.1 root 58: }
1.1.1.2 ! root 59: bitcount *= 2;
1.1 root 60: }
1.1.1.2 ! root 61: }
! 62: if (firstor) {
! 63: firstor = 0;
! 64: } else {
! 65: if (print) printf(" | ");
! 66: }
! 67: for (j=1; j<8; j *= 2) {
! 68: if (!(dontcare & j)) {
! 69: if (firstand) {
! 70: firstand = 0;
! 71: if (print) printf("(");
! 72: } else {
! 73: if (print) printf(" & ");
! 74: }
! 75: if (!(i & j))
! 76: if (print) printf("~");
! 77: if (print) printf("src%c", (j == 1 ? 'c' : j == 2 ? 'b' : 'a'));
! 78: result |= (j == 1 ? 4 : j == 2 ? 2 : 1);
1.1 root 79: }
80: }
1.1.1.2 ! root 81: if (!firstand) {
! 82: if (print) printf(")");
! 83: } else {
! 84: if (print) printf("0xFFFF");
! 85: }
1.1 root 86: }
1.1.1.2 ! root 87: }
! 88: if (firstor)
! 89: if (print) printf("0");
! 90: if (print) printf(";\n");
! 91: return result;
! 92: }
! 93:
! 94: static void generate_include(void)
! 95: {
! 96: int minterm;
! 97: printf("static __inline__ ULONG blit_func(ULONG srca, ULONG srcb, ULONG srcc, UBYTE mt)\n{\nswitch(mt){\n");
! 98: for (minterm = 0; minterm < 256; minterm++) {
! 99: printf("case 0x%x:\n", minterm);
! 100: printf("\treturn ");
! 101: generate_expr(minterm, 1);
1.1 root 102: }
103: printf("}\n");
104: printf("return 0;\n"); /* No, sir, it doesn't! */
105: printf("}\n");
1.1.1.2 ! root 106: }
! 107:
! 108: static void generate_func(void)
! 109: {
! 110: unsigned int i;
! 111: printf("#include \"sysconfig.h\"\n");
! 112: printf("#include \"sysdeps.h\"\n");
! 113: printf("#include \"config.h\"\n");
! 114: printf("#include \"options.h\"\n");
! 115: printf("#include \"custom.h\"\n");
! 116: printf("#include \"blitfunc.h\"\n\n");
! 117:
! 118: for (i = 0; i < sizeof(blttbl); i++) {
! 119: int active = generate_expr(blttbl[i],0);
! 120: int a_is_on = active & 1, b_is_on = active & 2, c_is_on = active & 4;
! 121:
! 122: printf("void blitdofast_%x(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)\n",blttbl[i]);
! 123: printf("{\n");
! 124: printf("WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;\n");
! 125: printf("int i,j;\n");
! 126:
! 127: #if FAST_BLITTER == 3
! 128: printf("if (b->hblitsize>1");
! 129: if (a_is_on) printf(" && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff");
! 130: if (b_is_on) printf(" && !b->blitbshift");
! 131: printf(") {\n");
! 132: if (a_is_on) printf("ULONG srca=((ULONG)b->bltadat<<16)|b->bltadat;\n");
! 133: if (b_is_on) printf("ULONG srcb=((ULONG)b->bltbdat<<16)|b->bltbdat;\n");
! 134: if (c_is_on) printf("ULONG srcc=((ULONG)b->bltcdat<<16)|b->bltcdat;\n");
! 135: printf("ULONG dest;\n");
! 136: printf("int count=b->hblitsize/2, oddword=b->hblitsize&1;\n");
! 137: printf("for (j=0;j<b->vblitsize;j++) {\n");
! 138: printf("\tfor(i=0;i<count;i++) {\n");
! 139: if (a_is_on) printf("\t\tif (pta) {srca=*((ULONG *)pta); pta+=2;}\n");
! 140: if (b_is_on) printf("\t\tif (ptb) {srcb=*((ULONG *)ptb); ptb+=2;}\n");
! 141: if (c_is_on) printf("\t\tif (ptc) {srcc=*((ULONG *)ptc); ptc+=2;}\n");
! 142: printf("\t\tdest=");
! 143: generate_expr(blttbl[i],1);
! 144: printf("\t\tif (dest) b->blitzero=0;\n");
! 145: printf("\t\tif (ptd) {*(ULONG *)ptd=dest; ptd+=2;}\n");
! 146: printf("\t}\n");
! 147: printf("\tif (oddword) {\n");
! 148: if (a_is_on) printf("\t\tif (pta) srca=(ULONG)(*pta++);\n");
! 149: if (b_is_on) printf("\t\tif (ptb) srcb=(ULONG)(*ptb++);\n");
! 150: if (c_is_on) printf("\t\tif (ptc) srcc=(ULONG)(*ptc++);\n");
! 151: printf("\t\tdest=");
! 152: generate_expr(blttbl[i],1);
! 153: printf("\t\tif (dest) b->blitzero=0;\n");
! 154: printf("\t\tif (ptd) *ptd++=(UWORD)dest;\n");
! 155: printf("\t}\n");
! 156: if (a_is_on) printf("\tif (pta) pta+=bltamodw;\n");
! 157: if (b_is_on) printf("\tif (ptb) ptb+=bltbmodw;\n");
! 158: if (c_is_on) printf("\tif (ptc) ptc+=bltcmodw;\n");
! 159: printf("\tif (ptd) ptd+=bltdmodw;\n");
! 160: printf("}\n");
! 161: if (a_is_on) printf("if (pta) b->bltadat=*(pta-bltamodw-1);\n"); /* Maybe not necessary, but I don't want problems */
! 162: if (b_is_on) printf("if (ptb) b->bltbdat=*(ptb-bltbmodw-1);\n");
! 163: if (c_is_on) printf("if (ptc) b->bltcdat=*(ptc-bltcmodw-1);\n");
! 164: printf("if (ptd) b->bltddat=*(ptd-bltdmodw-1);\n");
! 165:
! 166: printf("} else\n");
! 167: #endif
! 168: printf("{\n");
! 169:
! 170: printf("UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;\n");
! 171: if (a_is_on) printf("if (b->hblitsize==1) bltamask&=b->bltalwm;\n");
! 172: printf("for (j=0;j<b->vblitsize;j++) {\n");
! 173: if (a_is_on) {
! 174: printf("\tif (pta) b->bltadat=*pta++;\n");
! 175: if (b_is_on) printf("\tif (ptb) b->bltbdat=*ptb++;\n");
! 176: if (c_is_on) printf("\tif (ptc) b->bltcdat=*ptc++;\n");
! 177: printf("\tbltaold=b->bltadat & bltamask;\n");
! 178: printf("\tsrca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;\n");
! 179: if (b_is_on) printf("\tsrcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;\n");
! 180: if (c_is_on) printf("\tsrcc=b->bltcdat;\n");
! 181: printf("\tb->bltddat=");
! 182: generate_expr(blttbl[i],1);
! 183: printf("\tb->blitpreva=bltaold;\n");
! 184: if (b_is_on) printf("\tb->blitprevb=b->bltbdat;\n");
! 185: printf("\tif (b->bltddat) b->blitzero=0;\n");
! 186: printf("\tif (ptd) *ptd++=b->bltddat;\n");
! 187: }
! 188: if (a_is_on) printf("\tfor (i=2;i<b->hblitsize;i++) {\n");
! 189: else printf("\tfor (i=0;i<b->hblitsize;i++) {\n");
! 190: if (a_is_on) printf("\t\tif (pta) b->bltadat=*pta++;\n");
! 191: if (b_is_on) printf("\t\tif (ptb) b->bltbdat=*ptb++;\n");
! 192: if (c_is_on) printf("\t\tif (ptc) b->bltcdat=*ptc++;\n");
! 193: if (a_is_on) printf("\t\tsrca=(((ULONG)b->blitpreva<<16)|b->bltadat)>>b->blitashift;\n");
! 194: if (b_is_on) printf("\t\tsrcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;\n");
! 195: if (c_is_on) printf("\t\tsrcc=b->bltcdat;\n");
! 196: printf("\t\tb->bltddat=");
! 197: generate_expr(blttbl[i],1);
! 198: if (a_is_on) printf("\t\tb->blitpreva=b->bltadat;\n");
! 199: if (b_is_on) printf("\t\tb->blitprevb=b->bltbdat;\n");
! 200: printf("\t\tif (b->bltddat) b->blitzero=0;\n");
! 201: printf("\t\tif (ptd) *ptd++=b->bltddat;\n");
! 202: printf("\t}\n");
! 203: if (a_is_on) {
! 204: printf("\tif (b->hblitsize>1) {\n");
! 205: printf("\t\tif (pta) b->bltadat=*pta++;\n");
! 206: if (b_is_on) printf("\t\tif (ptb) b->bltbdat=*ptb++;\n");
! 207: if (c_is_on) printf("\t\tif (ptc) b->bltcdat=*ptc++;\n");
! 208: printf("\t\tbltaold=b->bltadat & b->bltalwm;\n");
! 209: printf("\t\tsrca=(((ULONG)b->blitpreva<<16)|bltaold)>>b->blitashift;\n");
! 210: if (b_is_on) printf("\t\tsrcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;\n");
! 211: if (c_is_on) printf("\t\tsrcc=b->bltcdat;\n");
! 212: printf("\t\tb->bltddat=");
! 213: generate_expr(blttbl[i],1);
! 214: printf("\t\tb->blitpreva=bltaold;\n");
! 215: if (b_is_on) printf("\t\tb->blitprevb=b->bltbdat;\n");
! 216: printf("\t\tif (b->bltddat) b->blitzero=0;\n");
! 217: printf("\t\tif (ptd) *ptd++=b->bltddat;\n");
! 218: printf("\t}\n");
! 219: }
! 220: if (a_is_on) printf("\tif (pta) pta+=bltamodw;\n");
! 221: if (b_is_on) printf("\tif (ptb) ptb+=bltbmodw;\n");
! 222: if (c_is_on) printf("\tif (ptc) ptc+=bltcmodw;\n");
! 223: printf("\tif (ptd) ptd+=bltdmodw;\n");
! 224: printf("}\n");
! 225: printf("}\n");
! 226: printf("}\n");
! 227:
! 228:
! 229: printf("void blitdofast_desc_%x(UWORD *pta, UWORD *ptb, UWORD *ptc, UWORD *ptd, struct bltinfo *b)\n",blttbl[i]);
! 230: printf("{\n");
! 231: printf("WORD bltamodw=b->bltamod/2,bltbmodw=b->bltbmod/2,bltcmodw=b->bltcmod/2,bltdmodw=b->bltdmod/2;\n");
! 232: printf("int i,j;\n");
! 233:
! 234: #if FAST_BLITTER == 3
! 235: printf("if (b->hblitsize>1");
! 236: if (a_is_on) printf(" && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff");
! 237: if (b_is_on) printf(" && !b->blitbshift");
! 238: printf(") {\n");
! 239: if (a_is_on) printf("ULONG srca=((ULONG)b->bltadat<<16)|b->bltadat;\n");
! 240: if (b_is_on) printf("ULONG srcb=((ULONG)b->bltbdat<<16)|b->bltbdat;\n");
! 241: if (c_is_on) printf("ULONG srcc=((ULONG)b->bltcdat<<16)|b->bltcdat;\n");
! 242: printf("ULONG dest;\n");
! 243: printf("int count=b->hblitsize/2, oddword=b->hblitsize&1;\n");
! 244: printf("for (j=0;j<b->vblitsize;j++) {\n");
! 245: printf("\tfor(i=0;i<count;i++) {\n");
! 246: if (a_is_on) printf("\t\tif (pta) {srca=*((ULONG *)(pta-1)); pta-=2;}\n");
! 247: if (b_is_on) printf("\t\tif (ptb) {srcb=*((ULONG *)(ptb-1)); ptb-=2;}\n");
! 248: if (c_is_on) printf("\t\tif (ptc) {srcc=*((ULONG *)(ptc-1)); ptc-=2;}\n");
! 249: printf("\t\tdest=");
! 250: generate_expr(blttbl[i],1);
! 251: printf("\t\tif (dest) b->blitzero=0;\n");
! 252: printf("\t\tif (ptd) {*(ULONG *)(ptd-1)=dest; ptd-=2;}\n");
! 253: printf("\t}\n");
! 254: printf("\tif (oddword) {\n");
! 255: if (a_is_on) printf("\t\tif (pta) srca=(ULONG)(*pta--);\n");
! 256: if (b_is_on) printf("\t\tif (ptb) srcb=(ULONG)(*ptb--);\n");
! 257: if (c_is_on) printf("\t\tif (ptc) srcc=(ULONG)(*ptc--);\n");
! 258: printf("\t\tdest=");
! 259: generate_expr(blttbl[i],1);
! 260: printf("\t\tif (dest) b->blitzero=0;\n");
! 261: printf("\t\tif (ptd) *ptd--=(UWORD)dest;\n");
! 262: printf("\t}\n");
! 263: if (a_is_on) printf("\tif (pta) pta-=bltamodw;\n");
! 264: if (b_is_on) printf("\tif (ptb) ptb-=bltbmodw;\n");
! 265: if (c_is_on) printf("\tif (ptc) ptc-=bltcmodw;\n");
! 266: printf("\tif (ptd) ptd-=bltdmodw;\n");
! 267: printf("}\n");
! 268: if (a_is_on) printf("if (pta) b->bltadat=*(pta-bltamodw-1);\n");
! 269: if (b_is_on) printf("if (ptb) b->bltbdat=*(ptb-bltbmodw-1);\n");
! 270: if (c_is_on) printf("if (ptc) b->bltcdat=*(ptc-bltcmodw-1);\n");
! 271: printf("if (ptd) b->bltddat=*(ptd-bltdmodw-1);\n");
! 272:
! 273: printf("} else\n");
! 274: #endif
! 275: printf("{\n");
! 276:
! 277: printf("UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;\n");
! 278: if (a_is_on) printf("if (b->hblitsize==1) bltamask&=b->bltalwm;\n");
! 279: printf("for (j=0;j<b->vblitsize;j++) {\n");
! 280: if (a_is_on) {
! 281: printf("\tif (pta) b->bltadat=*pta--;\n");
! 282: if (b_is_on) printf("\tif (ptb) b->bltbdat=*ptb--;\n");
! 283: if (c_is_on) printf("\tif (ptc) b->bltcdat=*ptc--;\n");
! 284: printf("\tbltaold=b->bltadat & bltamask;\n");
! 285: printf("\tsrca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);\n");
! 286: if (b_is_on) printf("\tsrcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);\n");
! 287: if (c_is_on) printf("\tsrcc=b->bltcdat;\n");
! 288: printf("\tb->bltddat=");
! 289: generate_expr(blttbl[i],1);
! 290: printf("\tb->blitpreva=bltaold;\n");
! 291: if (b_is_on) printf("\tb->blitprevb=b->bltbdat;\n");
! 292: printf("\tif (b->bltddat) b->blitzero=0;\n");
! 293: printf("\tif (ptd) *ptd--=b->bltddat;\n");
! 294: }
! 295: if (a_is_on) printf("\tfor (i=2;i<b->hblitsize;i++) {\n");
! 296: else printf("\tfor (i=0;i<b->hblitsize;i++) {\n");
! 297: if (a_is_on) printf("\t\tif (pta) b->bltadat=*pta--;\n");
! 298: if (b_is_on) printf("\t\tif (ptb) b->bltbdat=*ptb--;\n");
! 299: if (c_is_on) printf("\t\tif (ptc) b->bltcdat=*ptc--;\n");
! 300: if (a_is_on) printf("\t\tsrca=(((ULONG)b->bltadat<<16)|b->blitpreva)>>(16-b->blitashift);\n");
! 301: if (b_is_on) printf("\t\tsrcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);\n");
! 302: if (c_is_on) printf("\t\tsrcc=b->bltcdat;\n");
! 303: printf("\t\tb->bltddat=");
! 304: generate_expr(blttbl[i],1);
! 305: if (a_is_on) printf("\t\tb->blitpreva=b->bltadat;\n");
! 306: if (b_is_on) printf("\t\tb->blitprevb=b->bltbdat;\n");
! 307: printf("\t\tif (b->bltddat) b->blitzero=0;\n");
! 308: printf("\t\tif (ptd) *ptd--=b->bltddat;\n");
! 309: printf("\t}\n");
! 310: if (a_is_on) {
! 311: printf("\tif (b->hblitsize>1) {\n");
! 312: printf("\t\tif (pta) b->bltadat=*pta--;\n");
! 313: if (b_is_on) printf("\t\tif (ptb) b->bltbdat=*ptb--;\n");
! 314: if (c_is_on) printf("\t\tif (ptc) b->bltcdat=*ptc--;\n");
! 315: printf("\t\tbltaold=b->bltadat & b->bltalwm;\n");
! 316: printf("\t\tsrca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);\n");
! 317: if (b_is_on) printf("\t\tsrcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);\n");
! 318: if (c_is_on) printf("\t\tsrcc=b->bltcdat;\n");
! 319: printf("\t\tb->bltddat=");
! 320: generate_expr(blttbl[i],1);
! 321: printf("\t\tb->blitpreva=bltaold;\n");
! 322: if (b_is_on) printf("\t\tb->blitprevb=b->bltbdat;\n");
! 323: printf("\t\tif (b->bltddat) b->blitzero=0;\n");
! 324: printf("\t\tif (ptd) *ptd--=b->bltddat;\n");
! 325: printf("\t}\n");
! 326: }
! 327: if (a_is_on) printf("\tif (pta) pta-=bltamodw;\n");
! 328: if (b_is_on) printf("\tif (ptb) ptb-=bltbmodw;\n");
! 329: if (c_is_on) printf("\tif (ptc) ptc-=bltcmodw;\n");
! 330: printf("\tif (ptd) ptd-=bltdmodw;\n");
! 331: printf("}\n");
! 332: printf("}\n");
! 333: printf("}\n");
! 334: }
! 335: }
! 336:
! 337: static void generate_table(void)
! 338: {
! 339: unsigned int index = 0;
! 340: unsigned int i;
! 341: printf("#include \"sysconfig.h\"\n");
! 342: printf("#include \"sysdeps.h\"\n");
! 343: printf("#include \"config.h\"\n");
! 344: printf("#include \"options.h\"\n");
! 345: printf("#include \"custom.h\"\n");
! 346: printf("#include \"blitfunc.h\"\n\n");
! 347: printf("blitter_func *blitfunc_dofast[256] = {\n");
! 348: for (i = 0; i < 256; i++) {
! 349: if (index < sizeof(blttbl) && i == blttbl[index]) {
! 350: printf("blitdofast_%x",i);
! 351: index++;
! 352: }
! 353: else printf("0");
! 354: if (i < 255) printf(", ");
! 355: if ((i & 7) == 7) printf("\n");
! 356: }
! 357: printf("};\n\n");
! 358:
! 359: index = 0;
! 360: printf("blitter_func *blitfunc_dofast_desc[256] = {\n");
! 361: for (i = 0; i < 256; i++) {
! 362: if (index < sizeof(blttbl) && i == blttbl[index]) {
! 363: printf("blitdofast_desc_%x",i);
! 364: index++;
! 365: }
! 366: else printf("0");
! 367: if (i < 255) printf(", ");
! 368: if ((i & 7) == 7) printf("\n");
! 369: }
! 370: printf("};\n");
! 371: }
! 372:
! 373: static void generate_header(void)
! 374: {
! 375: unsigned int i;
! 376: for (i = 0; i < sizeof(blttbl); i++) {
! 377: printf("extern blitter_func blitdofast_%x;\n",blttbl[i]);
! 378: printf("extern blitter_func blitdofast_desc_%x;\n",blttbl[i]);
! 379: }
! 380: }
! 381:
! 382: int main(int argc, char **argv)
! 383: {
! 384: char mode = 'i';
! 385: if (argc == 2) mode = *argv[1];
! 386: switch (mode) {
! 387: case 'i': generate_include();
! 388: break;
! 389: case 'f': generate_func();
! 390: break;
! 391: case 't': generate_table();
! 392: break;
! 393: case 'h': generate_header();
! 394: break;
! 395: default: abort();
! 396: }
1.1 root 397: return 0;
398: }
1.1.1.2 ! root 399:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.