220
254
/* Largest query length for which diagonal array is to be used in megablast */
221
255
#define MAX_DIAG_ARRAY 100000
223
#ifdef WORD_MODEL_MAX
258
static const Uint4 crc_table[256] = {
259
0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
260
0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
261
0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
262
0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
263
0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
264
0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
265
0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
266
0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
267
0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
268
0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
269
0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
270
0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
271
0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
272
0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
273
0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
274
0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
275
0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
276
0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
277
0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
278
0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
279
0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
280
0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
281
0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
282
0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
283
0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
284
0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
285
0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
286
0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
287
0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
288
0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
289
0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
290
0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
291
0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
292
0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
293
0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
294
0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
295
0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
296
0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
297
0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
298
0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
299
0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
300
0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
301
0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
302
0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
303
0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
304
0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
305
0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
306
0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
307
0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
308
0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
309
0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
313
#define DO1(buf) crc = crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8);
314
#define CRC_OFFSET 2128831034 /* == ~(2166136261) */
316
#define CRC32(crc, buf) crc = CRC_OFFSET; DO1(buf); DO1(buf); DO1(buf); DO1(buf); crc = ~crc;
318
#define NUC_MASK 0xfc
320
#define PACK_EXTRA_CODE(ecode,val,mask) {ecode = ((ecode<<2) & mask) | val;}
321
#define GET_NEXT_PACKED_NUCL(s,n,val) { n = (n-1)&0x03; s = s + (n&(n>>1)&0x01); val = ((*s)>>(n<<1)) & 0x00000003; }
323
/* OPTIMAL templates */
224
325
/* 1,110,110,110,110,111 - 12 of 16 */
225
326
/* 1,110,010,110,110,111 - 11 of 16 */
327
#define MASK1_OPT 0x0000003f
328
#define MASK2_OPT 0x00000f00
329
#define MASK3_OPT 0x0003c000
330
#define MASK4_12_OPT 0x00f00000
331
#define MASK4_11_OPT 0x00300000
332
#define MASK5_OPT 0xfc000000
334
#define GET_WORD_INDEX_12_16_OPT(n) (((n)&MASK1_OPT) | (((n)&MASK2_OPT)>>2) | (((n)&MASK3_OPT)>>4) | (((n)&MASK4_12_OPT)>>6) | (((n)&MASK5_OPT)>>8))
336
#define GET_WORD_INDEX_11_16_OPT(n) (((n)&MASK1_OPT) | (((n)&MASK2_OPT)>>2) | (((n)&MASK3_OPT)>>4) | (((n)&MASK4_11_OPT)>>6) | (((n)&MASK5_OPT)>>10))
226
338
/* 111,010,110,010,110,111 - 12 of 18 */
227
/* 111,010,100,110,010,111 - 11 of 18 */
228
#define MASK1 0x0000003f
229
#define MASK2 0x00000f00
230
#define MASK3 0x0003c000
231
#define MASK4_12 0x00f00000
232
#define MASK4_11 0x00300000
233
#define MASK5 0xfc000000
234
#define MASK1_18 0x00000003
235
#define MASK2_12_18 0x000000f0
236
#define MASK2_11_18 0x00000030
237
#define MASK3_12_18 0x00000c00
238
#define MASK3_11_18 0x00003c00
239
#define MASK4_12_18 0x000f0000
240
#define MASK4_11_18 0x000c0000
241
#define MASK5_18 0x00c00000
242
#define MASK6_18 0xfc000000
244
#define GET_WORD_INDEX_12_16(n) (((n)&MASK1) | (((n)&MASK2)>>2) | (((n)&MASK3)>>4) | (((n)&MASK4_12)>>6) | (((n)&MASK5)>>8))
246
#define GET_WORD_INDEX_11_16(n) (((n)&MASK1) | (((n)&MASK2)>>2) | (((n)&MASK3)>>4) | (((n)&MASK4_11)>>6) | (((n)&MASK5)>>10))
339
/* 111,010,010,110,010,111 - 11 of 18 */
340
#define MASK1_18_OPT 0x00000003
341
#define MASK2_12_18_OPT 0x000000f0
342
#define MASK2_11_18_OPT 0x00000030
343
#define MASK3_11_18_OPT 0x00003c00
344
#define MASK3_12_18_OPT 0x00000c00
345
#define MASK4_11_18_OPT 0x00030000
346
#define MASK4_12_18_OPT 0x000f0000
347
#define MASK5_18_OPT 0x00c00000
348
#define MASK6_18_OPT 0xfc000000
248
#define GET_WORD_INDEX_12_18(n) ((((n)&MASK1_18)<<4) | (((n)&MASK2_12_18)<<2) | ((n)&MASK3_12_18) | (((n)&MASK4_12_18)>>4) | (((n)&MASK5_18)>>6) | (((n)&MASK6_18)>>8))
350
#define GET_WORD_INDEX_12_18_OPT(n) ((((n)&MASK1_18_OPT)<<4) | (((n)&MASK2_12_18_OPT)<<2) | ((n)&MASK3_12_18_OPT) | (((n)&MASK4_12_18_OPT)>>4) | (((n)&MASK5_18_OPT)>>6) | (((n)&MASK6_18_OPT)>>8))
250
#define GET_WORD_INDEX_11_18(n) ((((n)&MASK1_18)<<4) | (((n)&MASK2_11_18)<<2) | (((n)&MASK3_11_18)>>2) | (((n)&MASK4_11_18)>>6) | (((n)&MASK5_18)>>8) | (((n)&MASK6_18)>>10))
251
#define GET_WORD_INDEX(n,b,c) (((~b&~c)&GET_WORD_INDEX_12_16(n)) | ((b&~c)&GET_WORD_INDEX_11_16(n)) | ((~b&c)&GET_WORD_INDEX_12_18(n)) | ((b&c)&GET_WORD_INDEX_11_18(n)))
252
#define MASK_EXTRA 0x0000000f
255
/* 1111,01011010,1111 */
256
#ifdef WORD_MODEL_MAX_INFO
257
#define MASK1 0x000000ff
258
#define MASK2 0x00000c00
259
#define MASK3 0x0003c000
260
#define MASK4 0x00300000
261
#define MASK5 0xff000000
262
#define GET_WORD_INDEX(n,b,c) (((n)&MASK1) | (((n)&MASK2)>>2) | (((n)&MASK3)>>4) | (((n)&MASK4)>>6) | (((n)&MASK5)>>8))
265
/* 110,110,111,110,110,1 */
266
#ifdef WORD_MODEL_COD_12
267
#define MASK1 0x00000003
268
#define MASK2 0x000000f0
269
#define MASK3 0x000ffc00
270
#define MASK4 0x03c00000
271
#define MASK5 0xf0000000
272
#define MASK3_11 0x00003c00
273
#define MASK4_11 0x000f0000
274
#define MASK5_11 0x03c00000
275
#define MASK6 0xf0000000
276
#define GET_WORD_INDEX_11(n) (((n)&MASK1) | (((n)&MASK2)>>2) | (((n)&MASK3_11)>>4) | (((n)&MASK4_11)>>6) | (((n)&MASK5_11)>>8) | (((n)&MASK6)>>10))
277
#define GET_WORD_INDEX_12(n) (((n)&MASK1) | (((n)&MASK2)>>2) | (((n)&MASK3)>>4) | (((n)&MASK4)>>6) | (((n)&MASK5)>>8))
278
#define GET_WORD_INDEX(n,b,c) (((~b)&GET_WORD_INDEX_12(n)) | ((b)&GET_WORD_INDEX_11(n)))
281
/* DEFAULT DEFINITIONS HERE */
352
#define GET_WORD_INDEX_11_18_OPT(n) ((((n)&MASK1_18_OPT)<<4) | (((n)&MASK2_11_18_OPT)<<2) | (((n)&MASK3_11_18_OPT)>>2) | (((n)&MASK4_11_18_OPT)>>4) | (((n)&MASK5_18_OPT)>>8) | (((n)&MASK6_18_OPT)>>10))
353
#define MASK_EXTRA_OPT 0x0000000f
354
#define GET_EXTRA_CODE_18_OPT(s) (((*(s+1))<<2) | (*(s+2))) & MASK_EXTRA_OPT
356
#define GET_EXTRA_CODE_PACKED_4_18_OPT(s) ((*(s+1))>>4)
357
#define GET_EXTRA_CODE_PACKED_18_OPT(s,b,val,ecode) {GET_NEXT_PACKED_NUCL(s,b,ecode); GET_NEXT_PACKED_NUCL(s,b,val); PACK_EXTRA_CODE(ecode, val,MASK_EXTRA_OPT);}
359
#define GET_AMBIG_CONDITION_18_OPT(s) (((*(s+1))&NUC_MASK) | ((*(s+2))&NUC_MASK))
361
/* 111,010,010,110,010,010,111 - 12 of 21 */
362
/* 111,010,010,100,010,010,111 - 11 of 21 */
363
#define MASK1_21_OPT 0x00000030
364
#define MASK2_12_21_OPT 0x00003c00
365
#define MASK2_11_21_OPT 0x00003000
366
#define MASK3_21_OPT 0x00030000
367
#define MASK4_21_OPT 0x00c00000
368
#define MASK5_21_OPT 0xfc000000
369
#define GET_WORD_INDEX_12_21_OPT(n) ((((n)&MASK1_21_OPT)<<4) | ((n)&MASK2_12_21_OPT) | (((n)&MASK3_21_OPT)>>2) | (((n)&MASK4_21_OPT)>>6) | (((n)&MASK5_21_OPT)>>8))
370
#define GET_WORD_INDEX_11_21_OPT(n) ((((n)&MASK1_21_OPT)<<4) | (((n)&MASK2_11_21_OPT)>>2) | (((n)&MASK3_21_OPT)>>4) | (((n)&MASK4_21_OPT)>>8) | (((n)&MASK5_21_OPT)>>10))
371
#define MASK_EXTRA_21_OPT 0x000000ff
372
#define GET_EXTRA_CODE_21_OPT(s) ((((*(s+1))<<6) | ((*(s+3))<<4) | ((*(s+4))<<2) | (*(s+5))) & MASK_EXTRA_21_OPT)
373
#define GET_AMBIG_CONDITION_21_OPT(s) (((*(s+1))&NUC_MASK) | ((*(s+3))&NUC_MASK) | ((*(s+4))&NUC_MASK) | ((*(s+5))&NUC_MASK))
374
#define GET_EXTRA_CODE_PACKED_4_21_OPT(s) ((((*(s+1))&0x0f)<<2)|((*(s+1))&0xc0)|((*(s+2))>>6))
375
#define GET_EXTRA_CODE_PACKED_21_OPT(s,b,val,ecode) {GET_NEXT_PACKED_NUCL(s,b,ecode); GET_NEXT_PACKED_NUCL(s,b,val); GET_NEXT_PACKED_NUCL(s,b,val); PACK_EXTRA_CODE(ecode,val,MASK_EXTRA_21_OPT); GET_NEXT_PACKED_NUCL(s,b,val); PACK_EXTRA_CODE(ecode,val,MASK_EXTRA_21_OPT); GET_NEXT_PACKED_NUCL(s,b,val); PACK_EXTRA_CODE(ecode,val,MASK_EXTRA_21_OPT);}
378
/* CODING TEMPLATES */
282
380
/* 111,110,110,110,110,1 - 12 of 16 */
283
381
/* 110,110,110,110,110,1 - 11 of 16 */
284
/* 10,110,110,110,110,110,1 - 12 of 18 */
285
/* 10,110,110,010,110,110,1 - 11 of 18 */
287
382
#define MASK1 0x00000003
288
383
#define MASK2 0x000000f0
289
384
#define MASK3 0x00003c00