353
/* Type promotion for addition. Sign and value preserving. Make sure these
354
* match the case statement in add_buffer() above.
356
static int bandfmt_add[10] = {
357
/* UC C US S UI I F X D DX */
358
US, S, UI, I, UI, I, F, X, D, DX
362
im__init_programs( VipsVector *vectors[IM_BANDFMT_LAST],
363
int format_table[IM_BANDFMT_LAST] )
356
im__init_program( VipsVector *vectors[IM_BANDFMT_LAST],
357
VipsBandFmt format_table[IM_BANDFMT_LAST], VipsBandFmt fmt )
367
for( fmt = 0; fmt < IM_BANDFMT_LAST; fmt++ ) {
368
int isize = im__sizeof_bandfmt[fmt];
369
int osize = im__sizeof_bandfmt[format_table[fmt]];
373
/* float and double are not handled (well) by ORC.
375
if( fmt == IM_BANDFMT_DOUBLE ||
376
fmt == IM_BANDFMT_FLOAT ||
377
fmt == IM_BANDFMT_COMPLEX ||
378
fmt == IM_BANDFMT_DPCOMPLEX )
382
vips_vector_new( "binary arith", osize );
383
vips_vector_source_name( v, "s1", isize );
384
vips_vector_source_name( v, "s2", isize );
386
vips_vector_temporary( v, "t1", osize );
387
vips_vector_temporary( v, "t2", osize );
359
int isize = im__sizeof_bandfmt[fmt];
360
int osize = im__sizeof_bandfmt[format_table[fmt]];
364
v = vips_vector_new( "binary arith", osize );
366
vips_vector_source_name( v, "s1", isize );
367
vips_vector_source_name( v, "s2", isize );
368
vips_vector_temporary( v, "t1", osize );
369
vips_vector_temporary( v, "t2", osize );
396
/* Type promotion for addition. Sign and value preserving. Make sure these
397
* match the case statement in add_buffer() above.
399
static int bandfmt_add[10] = {
400
/* UC C US S UI I F X D DX */
401
US, S, UI, I, UI, I, F, X, D, DX
412
405
build_programs( void )
422
im__init_programs( add_vectors, bandfmt_add );
424
v = add_vectors[IM_BANDFMT_UCHAR];
415
v = im__init_program( add_vectors, bandfmt_add, IM_BANDFMT_UCHAR );
425
416
vips_vector_asm2( v, "convubw", "t1", "s1" );
426
417
vips_vector_asm2( v, "convubw", "t2", "s2" );
427
418
vips_vector_asm3( v, "addw", "d1", "t1", "t2" );
429
v = add_vectors[IM_BANDFMT_CHAR];
420
v = im__init_program( add_vectors, bandfmt_add, IM_BANDFMT_CHAR );
430
421
vips_vector_asm2( v, "convsbw", "t1", "s1" );
431
422
vips_vector_asm2( v, "convsbw", "t2", "s2" );
432
423
vips_vector_asm3( v, "addw", "d1", "t1", "t2" );
434
v = add_vectors[IM_BANDFMT_USHORT];
425
v = im__init_program( add_vectors, bandfmt_add, IM_BANDFMT_USHORT );
435
426
vips_vector_asm2( v, "convuwl", "t1", "s1" );
436
427
vips_vector_asm2( v, "convuwl", "t2", "s2" );
437
428
vips_vector_asm3( v, "addl", "d1", "t1", "t2" );
439
v = add_vectors[IM_BANDFMT_SHORT];
430
v = im__init_program( add_vectors, bandfmt_add, IM_BANDFMT_SHORT );
440
431
vips_vector_asm2( v, "convswl", "t1", "s1" );
441
432
vips_vector_asm2( v, "convswl", "t2", "s2" );
442
433
vips_vector_asm3( v, "addl", "d1", "t1", "t2" );
446
437
uint/int are a little slower than C, on a c2d anyway
448
v = add_vectors[IM_BANDFMT_UINT];
449
vips_vector_asm3( v, "addl", "d1", "s1", "s2" );
451
v = add_vectors[IM_BANDFMT_INT];
452
vips_vector_asm3( v, "addl", "d1", "s1", "s2" );
439
float/double/complex are not handled well
441
v = im__init_program( add_vectors, IM_BANDFMT_UINT );
442
vips_vector_asm3( v, "addl", "d1", "s1", "s2" );
444
v = im__init_program( add_vectors, IM_BANDFMT_INT );
445
vips_vector_asm3( v, "addl", "d1", "s1", "s2" );
455
449
im__compile_programs( add_vectors );