Pierre Ossman | 82c7f31 | 2009-03-09 13:21:27 +0000 | [diff] [blame] | 1 | /* |
| 2 | * simd/jsimd.h |
| 3 | * |
| 4 | * Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB |
| 5 | * |
| 6 | * Based on the x86 SIMD extension for IJG JPEG library, |
| 7 | * Copyright (C) 1999-2006, MIYASAKA Masaru. |
| 8 | * |
| 9 | */ |
| 10 | |
| 11 | /* Bitmask for supported acceleration methods */ |
| 12 | |
| 13 | #define JSIMD_NONE 0x00 |
Pierre Ossman | 3e0e2de | 2009-03-09 13:25:30 +0000 | [diff] [blame] | 14 | #define JSIMD_MMX 0x01 |
Pierre Ossman | 2c2e54b | 2009-03-09 13:28:10 +0000 | [diff] [blame] | 15 | #define JSIMD_3DNOW 0x02 |
Pierre Ossman | 82c7f31 | 2009-03-09 13:21:27 +0000 | [diff] [blame] | 16 | |
| 17 | /* Short forms of external names for systems with brain-damaged linkers. */ |
| 18 | |
| 19 | #ifdef NEED_SHORT_EXTERNAL_NAMES |
Pierre Ossman | 3e0e2de | 2009-03-09 13:25:30 +0000 | [diff] [blame] | 20 | #define jpeg_simd_cpu_support jSiCpuSupport |
| 21 | #define jsimd_rgb_ycc_convert_mmx jSRGBYCCM |
| 22 | #define jsimd_ycc_rgb_convert_mmx jSYCCRGBM |
| 23 | #define jsimd_h2v2_downsample_mmx jSDnH2V2M |
| 24 | #define jsimd_h2v1_downsample_mmx jSDnH2V1M |
| 25 | #define jsimd_h2v2_upsample_mmx jSUpH2V2M |
| 26 | #define jsimd_h2v1_upsample_mmx jSUpH2V1M |
| 27 | #define jsimd_h2v2_fancy_upsample_mmx jSFUpH2V2M |
| 28 | #define jsimd_h2v1_fancy_upsample_mmx jSFUpH2V1M |
| 29 | #define jsimd_h2v2_merged_upsample_mmx jSMUpH2V2M |
| 30 | #define jsimd_h2v1_merged_upsample_mmx jSMUpH2V1M |
| 31 | #define jsimd_convsamp_mmx jSConvM |
Pierre Ossman | 2c2e54b | 2009-03-09 13:28:10 +0000 | [diff] [blame] | 32 | #define jsimd_convsamp_float_3dnow jSConvF3D |
Pierre Ossman | 3e0e2de | 2009-03-09 13:25:30 +0000 | [diff] [blame] | 33 | #define jsimd_fdct_islow_mmx jSFDMIS |
| 34 | #define jsimd_fdct_ifast_mmx jSFDMIF |
Pierre Ossman | 2c2e54b | 2009-03-09 13:28:10 +0000 | [diff] [blame] | 35 | #define jsimd_fdct_float_3dnow jSFD3DF |
Pierre Ossman | 3e0e2de | 2009-03-09 13:25:30 +0000 | [diff] [blame] | 36 | #define jsimd_quantize_mmx jSQuantM |
Pierre Ossman | 2c2e54b | 2009-03-09 13:28:10 +0000 | [diff] [blame] | 37 | #define jsimd_quantize_float_3dnow jSQuantF3D |
Pierre Ossman | 3e0e2de | 2009-03-09 13:25:30 +0000 | [diff] [blame] | 38 | #define jsimd_idct_2x2_mmx jSIDM22 |
| 39 | #define jsimd_idct_4x4_mmx jSIDM44 |
| 40 | #define jsimd_idct_islow_mmx jSIDMIS |
| 41 | #define jsimd_idct_ifast_mmx jSIDMIF |
Pierre Ossman | 2c2e54b | 2009-03-09 13:28:10 +0000 | [diff] [blame] | 42 | #define jsimd_idct_float_3dnow jSID3DF |
Pierre Ossman | 82c7f31 | 2009-03-09 13:21:27 +0000 | [diff] [blame] | 43 | #endif /* NEED_SHORT_EXTERNAL_NAMES */ |
| 44 | |
| 45 | /* SIMD Ext: retrieve SIMD/CPU information */ |
| 46 | EXTERN(unsigned int) jpeg_simd_cpu_support JPP((void)); |
| 47 | |
Pierre Ossman | 3e0e2de | 2009-03-09 13:25:30 +0000 | [diff] [blame] | 48 | /* SIMD Color Space Conversion */ |
| 49 | EXTERN(void) jsimd_rgb_ycc_convert_mmx |
| 50 | JPP((JDIMENSION img_width, |
| 51 | JSAMPARRAY input_buf, JSAMPIMAGE output_buf, |
| 52 | JDIMENSION output_row, int num_rows)); |
| 53 | EXTERN(void) jsimd_ycc_rgb_convert_mmx |
| 54 | JPP((JDIMENSION out_width, |
| 55 | JSAMPIMAGE input_buf, JDIMENSION input_row, |
| 56 | JSAMPARRAY output_buf, int num_rows)); |
| 57 | |
| 58 | /* SIMD Downsample */ |
| 59 | EXTERN(void) jsimd_h2v2_downsample_mmx |
| 60 | JPP((JDIMENSION image_width, int max_v_samp_factor, |
| 61 | JDIMENSION v_samp_factor, JDIMENSION width_blocks, |
| 62 | JSAMPARRAY input_data, JSAMPARRAY output_data)); |
| 63 | EXTERN(void) jsimd_h2v1_downsample_mmx |
| 64 | JPP((JDIMENSION image_width, int max_v_samp_factor, |
| 65 | JDIMENSION v_samp_factor, JDIMENSION width_blocks, |
| 66 | JSAMPARRAY input_data, JSAMPARRAY output_data)); |
| 67 | |
| 68 | /* SIMD Upsample */ |
| 69 | EXTERN(void) jsimd_h2v2_upsample_mmx |
| 70 | JPP((int max_v_samp_factor, JDIMENSION output_width, |
| 71 | JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)); |
| 72 | EXTERN(void) jsimd_h2v1_upsample_mmx |
| 73 | JPP((int max_v_samp_factor, JDIMENSION output_width, |
| 74 | JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)); |
| 75 | |
| 76 | EXTERN(void) jsimd_h2v2_fancy_upsample_mmx |
| 77 | JPP((int max_v_samp_factor, JDIMENSION downsampled_width, |
| 78 | JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)); |
| 79 | EXTERN(void) jsimd_h2v1_fancy_upsample_mmx |
| 80 | JPP((int max_v_samp_factor, JDIMENSION downsampled_width, |
| 81 | JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)); |
| 82 | |
| 83 | EXTERN(void) jsimd_h2v2_merged_upsample_mmx |
| 84 | JPP((JDIMENSION output_width, JSAMPIMAGE input_buf, |
| 85 | JDIMENSION in_row_group_ctr, JSAMPARRAY output_buf)); |
| 86 | EXTERN(void) jsimd_h2v1_merged_upsample_mmx |
| 87 | JPP((JDIMENSION output_width, JSAMPIMAGE input_buf, |
| 88 | JDIMENSION in_row_group_ctr, JSAMPARRAY output_buf)); |
| 89 | |
| 90 | /* SIMD Sample Conversion */ |
| 91 | EXTERN(void) jsimd_convsamp_mmx JPP((JSAMPARRAY sample_data, |
| 92 | JDIMENSION start_col, |
| 93 | DCTELEM * workspace)); |
| 94 | |
Pierre Ossman | 2c2e54b | 2009-03-09 13:28:10 +0000 | [diff] [blame] | 95 | EXTERN(void) jsimd_convsamp_float_3dnow JPP((JSAMPARRAY sample_data, |
| 96 | JDIMENSION start_col, |
| 97 | FAST_FLOAT * workspace)); |
| 98 | |
Pierre Ossman | 3e0e2de | 2009-03-09 13:25:30 +0000 | [diff] [blame] | 99 | /* SIMD Forward DCT */ |
| 100 | EXTERN(void) jsimd_fdct_islow_mmx JPP((DCTELEM * data)); |
| 101 | EXTERN(void) jsimd_fdct_ifast_mmx JPP((DCTELEM * data)); |
| 102 | |
Pierre Ossman | 2c2e54b | 2009-03-09 13:28:10 +0000 | [diff] [blame] | 103 | EXTERN(void) jsimd_fdct_float_3dnow JPP((FAST_FLOAT * data)); |
| 104 | |
Pierre Ossman | 3e0e2de | 2009-03-09 13:25:30 +0000 | [diff] [blame] | 105 | /* SIMD Quantization */ |
| 106 | EXTERN(void) jsimd_quantize_mmx JPP((JCOEFPTR coef_block, |
| 107 | DCTELEM * divisors, |
| 108 | DCTELEM * workspace)); |
| 109 | |
Pierre Ossman | 2c2e54b | 2009-03-09 13:28:10 +0000 | [diff] [blame] | 110 | EXTERN(void) jsimd_quantize_float_3dnow JPP((JCOEFPTR coef_block, |
| 111 | FAST_FLOAT * divisors, |
| 112 | FAST_FLOAT * workspace)); |
| 113 | |
Pierre Ossman | 3e0e2de | 2009-03-09 13:25:30 +0000 | [diff] [blame] | 114 | /* SIMD Reduced Inverse DCT */ |
| 115 | EXTERN(void) jsimd_idct_2x2_mmx JPP((void * dct_table, |
| 116 | JCOEFPTR coef_block, |
| 117 | JSAMPARRAY output_buf, |
| 118 | JDIMENSION output_col)); |
| 119 | EXTERN(void) jsimd_idct_4x4_mmx JPP((void * dct_table, |
| 120 | JCOEFPTR coef_block, |
| 121 | JSAMPARRAY output_buf, |
| 122 | JDIMENSION output_col)); |
| 123 | |
| 124 | /* SIMD Inverse DCT */ |
| 125 | EXTERN(void) jsimd_idct_islow_mmx JPP((void * dct_table, |
| 126 | JCOEFPTR coef_block, |
| 127 | JSAMPARRAY output_buf, |
| 128 | JDIMENSION output_col)); |
| 129 | EXTERN(void) jsimd_idct_ifast_mmx JPP((void * dct_table, |
| 130 | JCOEFPTR coef_block, |
| 131 | JSAMPARRAY output_buf, |
| 132 | JDIMENSION output_col)); |
| 133 | |
Pierre Ossman | 2c2e54b | 2009-03-09 13:28:10 +0000 | [diff] [blame] | 134 | EXTERN(void) jsimd_idct_float_3dnow JPP((void * dct_table, |
| 135 | JCOEFPTR coef_block, |
| 136 | JSAMPARRAY output_buf, |
| 137 | JDIMENSION output_col)); |
| 138 | |