From eea5ca4078823230ff3a20cb1f7ec1cd541d2713 Mon Sep 17 00:00:00 2001 From: Yann Herklotz Date: Tue, 11 Aug 2020 18:21:49 +0200 Subject: Add benchmark changes --- benchmarks/CHStone/adpcm/adpcm.c | 1337 ++++++++++++++++++----------------- benchmarks/CHStone/aes/aes.c | 749 +++++++++++++++++++- benchmarks/CHStone/gsm/gsm.c | 523 ++++++++++++-- benchmarks/CHStone/mips/mips.c | 469 +++++++----- benchmarks/CHStone/sha/sha_driver.c | 1313 +++++++++++++++++++++++++++++++++- benchmarks/dhrystone/Makefile | 8 - benchmarks/dhrystone/dhry.h | 422 ----------- benchmarks/dhrystone/dhry_1.c | 383 ---------- benchmarks/dhrystone/dhry_2.c | 191 ----- 9 files changed, 3466 insertions(+), 1929 deletions(-) delete mode 100644 benchmarks/dhrystone/Makefile delete mode 100644 benchmarks/dhrystone/dhry.h delete mode 100644 benchmarks/dhrystone/dhry_1.c delete mode 100644 benchmarks/dhrystone/dhry_2.c (limited to 'benchmarks') diff --git a/benchmarks/CHStone/adpcm/adpcm.c b/benchmarks/CHStone/adpcm/adpcm.c index 613b1bd..bcdc6dd 100755 --- a/benchmarks/CHStone/adpcm/adpcm.c +++ b/benchmarks/CHStone/adpcm/adpcm.c @@ -1,21 +1,21 @@ /* -+--------------------------------------------------------------------------+ -| CHStone : a suite of benchmark programs for C-based High-Level Synthesis | -| ======================================================================== | -| | -| * Collected and Modified : Y. Hara, H. Tomiyama, S. Honda, | -| H. Takada and K. Ishii | -| Nagoya University, Japan | -| | -| * Remark : | -| 1. This source code is modified to unify the formats of the benchmark | -| programs in CHStone. | -| 2. Test vectors are added for CHStone. | -| 3. If "main_result" is 0 at the end of the program, the program is | -| correctly executed. | -| 4. Please follow the copyright of each benchmark program. | -+--------------------------------------------------------------------------+ -*/ + +--------------------------------------------------------------------------+ + | CHStone : a suite of benchmark programs for C-based High-Level Synthesis | + | ======================================================================== | + | | + | * Collected and Modified : Y. Hara, H. Tomiyama, S. Honda, | + | H. Takada and K. Ishii | + | Nagoya University, Japan | + | | + | * Remark : | + | 1. This source code is modified to unify the formats of the benchmark | + | programs in CHStone. | + | 2. Test vectors are added for CHStone. | + | 3. If "main_result" is 0 at the end of the program, the program is | + | correctly executed. | + | 4. Please follow the copyright of each benchmark program. | + +--------------------------------------------------------------------------+ + */ /*************************************************************************/ /* */ /* SNU-RT Benchmark Suite for Worst Case Timing Analysis */ @@ -62,7 +62,9 @@ /* */ /* */ /*************************************************************************/ -#include + +#define SIZE 100 +#define IN_END 100 int encode (int, int); void decode (int); @@ -77,162 +79,12 @@ int uppol1 (int al1, int apl2, int plt, int plt1); int logsch (int ih, int nbh); void reset (); -/* G722 C code */ - -/* variables for transimit quadrature mirror filter here */ -int tqmf[24]; - -/* QMF filter coefficients: -scaled by a factor of 4 compared to G722 CCITT recomendation */ -const int h[24] = { - 12, -44, -44, 212, 48, -624, 128, 1448, - -840, -3220, 3804, 15504, 15504, 3804, -3220, -840, - 1448, 128, -624, 48, 212, -44, -44, 12 -}; - -int xl, xh; - -/* variables for receive quadrature mirror filter here */ -int accumc[11], accumd[11]; - -/* outputs of decode() */ -int xout1, xout2; - -int xs, xd; - -/* variables for encoder (hi and lo) here */ - -int il, szl, spl, sl, el; - -const int qq4_code4_table[16] = { - 0, -20456, -12896, -8968, -6288, -4240, -2584, -1200, - 20456, 12896, 8968, 6288, 4240, 2584, 1200, 0 -}; - - -const int qq6_code6_table[64] = { - -136, -136, -136, -136, -24808, -21904, -19008, -16704, - -14984, -13512, -12280, -11192, -10232, -9360, -8576, -7856, - -7192, -6576, -6000, -5456, -4944, -4464, -4008, -3576, - -3168, -2776, -2400, -2032, -1688, -1360, -1040, -728, - 24808, 21904, 19008, 16704, 14984, 13512, 12280, 11192, - 10232, 9360, 8576, 7856, 7192, 6576, 6000, 5456, - 4944, 4464, 4008, 3576, 3168, 2776, 2400, 2032, - 1688, 1360, 1040, 728, 432, 136, -432, -136 -}; - -int delay_bpl[6]; - -int delay_dltx[6]; - -const int wl_code_table[16] = { - -60, 3042, 1198, 538, 334, 172, 58, -30, - 3042, 1198, 538, 334, 172, 58, -30, -60 -}; - -const int ilb_table[32] = { - 2048, 2093, 2139, 2186, 2233, 2282, 2332, 2383, - 2435, 2489, 2543, 2599, 2656, 2714, 2774, 2834, - 2896, 2960, 3025, 3091, 3158, 3228, 3298, 3371, - 3444, 3520, 3597, 3676, 3756, 3838, 3922, 4008 -}; - -int nbl; /* delay line */ -int al1, al2; -int plt, plt1, plt2; -int dlt; -int rlt, rlt1, rlt2; - -/* decision levels - pre-multiplied by 8, 0 to indicate end */ -const int decis_levl[30] = { - 280, 576, 880, 1200, 1520, 1864, 2208, 2584, - 2960, 3376, 3784, 4240, 4696, 5200, 5712, 6288, - 6864, 7520, 8184, 8968, 9752, 10712, 11664, 12896, - 14120, 15840, 17560, 20456, 23352, 32767 -}; - -int detl; - -/* quantization table 31 long to make quantl look-up easier, -last entry is for mil=30 case when wd is max */ -const int quant26bt_pos[31] = { - 61, 60, 59, 58, 57, 56, 55, 54, - 53, 52, 51, 50, 49, 48, 47, 46, - 45, 44, 43, 42, 41, 40, 39, 38, - 37, 36, 35, 34, 33, 32, 32 -}; - -/* quantization table 31 long to make quantl look-up easier, -last entry is for mil=30 case when wd is max */ -const int quant26bt_neg[31] = { - 63, 62, 31, 30, 29, 28, 27, 26, - 25, 24, 23, 22, 21, 20, 19, 18, - 17, 16, 15, 14, 13, 12, 11, 10, - 9, 8, 7, 6, 5, 4, 4 -}; - - -int deth; -int sh; /* this comes from adaptive predictor */ -int eh; - -const int qq2_code2_table[4] = { - -7408, -1616, 7408, 1616 -}; - -const int wh_code_table[4] = { - 798, -214, 798, -214 -}; - - -int dh, ih; -int nbh, szh; -int sph, ph, yh, rh; - -int delay_dhx[6]; - -int delay_bph[6]; - -int ah1, ah2; -int ph1, ph2; -int rh1, rh2; - -/* variables for decoder here */ -int ilr, rl; -int dec_deth, dec_detl, dec_dlt; - -int dec_del_bpl[6]; - -int dec_del_dltx[6]; - -int dec_plt, dec_plt1, dec_plt2; -int dec_szl, dec_spl, dec_sl; -int dec_rlt1, dec_rlt2, dec_rlt; -int dec_al1, dec_al2; -int dl; -int dec_nbl, dec_dh, dec_nbh; - -/* variables used in filtez */ -int dec_del_bph[6]; - -int dec_del_dhx[6]; - -int dec_szh; -/* variables used in filtep */ -int dec_rh1, dec_rh2; -int dec_ah1, dec_ah2; -int dec_ph, dec_sph; - -int dec_sh; - -int dec_ph1, dec_ph2; - /* G722 encode function two ints in, one 8 bit output */ /* put input samples in xin1 = first value, xin2 = second value */ /* returns il and ih stored together */ -int + int abs (int n) { int m; @@ -244,347 +96,17 @@ abs (int n) return m; } -int -encode (int xin1, int xin2) -{ - int i; - const int *h_ptr; - int *tqmf_ptr, *tqmf_ptr1; - long int xa, xb; - int decis; - -/* transmit quadrature mirror filters implemented here */ - h_ptr = h; - tqmf_ptr = tqmf; - xa = (long) (*tqmf_ptr++) * (*h_ptr++); - xb = (long) (*tqmf_ptr++) * (*h_ptr++); -/* main multiply accumulate loop for samples and coefficients */ - for (i = 0; i < 10; i++) - { - xa += (long) (*tqmf_ptr++) * (*h_ptr++); - xb += (long) (*tqmf_ptr++) * (*h_ptr++); - } -/* final mult/accumulate */ - xa += (long) (*tqmf_ptr++) * (*h_ptr++); - xb += (long) (*tqmf_ptr) * (*h_ptr++); - -/* update delay line tqmf */ - tqmf_ptr1 = tqmf_ptr - 2; - for (i = 0; i < 22; i++) - *tqmf_ptr-- = *tqmf_ptr1--; - *tqmf_ptr-- = xin1; - *tqmf_ptr = xin2; - -/* scale outputs */ - xl = (xa + xb) >> 15; - xh = (xa - xb) >> 15; - -/* end of quadrature mirror filter code */ - -/* starting with lower sub band encoder */ - -/* filtez - compute predictor output section - zero section */ - szl = filtez (delay_bpl, delay_dltx); - -/* filtep - compute predictor output signal (pole section) */ - spl = filtep (rlt1, al1, rlt2, al2); - -/* compute the predictor output value in the lower sub_band encoder */ - sl = szl + spl; - el = xl - sl; - -/* quantl: quantize the difference signal */ - il = quantl (el, detl); - -/* computes quantized difference signal */ -/* for invqbl, truncate by 2 lsbs, so mode = 3 */ - dlt = ((long) detl * qq4_code4_table[il >> 2]) >> 15; - -/* logscl: updates logarithmic quant. scale factor in low sub band */ - nbl = logscl (il, nbl); - -/* scalel: compute the quantizer scale factor in the lower sub band */ -/* calling parameters nbl and 8 (constant such that scalel can be scaleh) */ - detl = scalel (nbl, 8); - -/* parrec - simple addition to compute recontructed signal for adaptive pred */ - plt = dlt + szl; - -/* upzero: update zero section predictor coefficients (sixth order)*/ -/* calling parameters: dlt, dlt1, dlt2, ..., dlt6 from dlt */ -/* bpli (linear_buffer in which all six values are delayed */ -/* return params: updated bpli, delayed dltx */ - upzero (dlt, delay_dltx, delay_bpl); - -/* uppol2- update second predictor coefficient apl2 and delay it as al2 */ -/* calling parameters: al1, al2, plt, plt1, plt2 */ - al2 = uppol2 (al1, al2, plt, plt1, plt2); - -/* uppol1 :update first predictor coefficient apl1 and delay it as al1 */ -/* calling parameters: al1, apl2, plt, plt1 */ - al1 = uppol1 (al1, al2, plt, plt1); - -/* recons : compute recontructed signal for adaptive predictor */ - rlt = sl + dlt; - -/* done with lower sub_band encoder; now implement delays for next time*/ - rlt2 = rlt1; - rlt1 = rlt; - plt2 = plt1; - plt1 = plt; - -/* high band encode */ - - szh = filtez (delay_bph, delay_dhx); - - sph = filtep (rh1, ah1, rh2, ah2); - -/* predic: sh = sph + szh */ - sh = sph + szh; -/* subtra: eh = xh - sh */ - eh = xh - sh; - -/* quanth - quantization of difference signal for higher sub-band */ -/* quanth: in-place for speed params: eh, deth (has init. value) */ - if (eh >= 0) - { - ih = 3; /* 2,3 are pos codes */ - } - else - { - ih = 1; /* 0,1 are neg codes */ - } - decis = (564L * (long) deth) >> 12L; - if (abs (eh) > decis) - ih--; /* mih = 2 case */ - -/* compute the quantized difference signal, higher sub-band*/ - dh = ((long) deth * qq2_code2_table[ih]) >> 15L; - -/* logsch: update logarithmic quantizer scale factor in hi sub-band*/ - nbh = logsch (ih, nbh); - -/* note : scalel and scaleh use same code, different parameters */ - deth = scalel (nbh, 10); - -/* parrec - add pole predictor output to quantized diff. signal */ - ph = dh + szh; - -/* upzero: update zero section predictor coefficients (sixth order) */ -/* calling parameters: dh, dhi, bphi */ -/* return params: updated bphi, delayed dhx */ - upzero (dh, delay_dhx, delay_bph); - -/* uppol2: update second predictor coef aph2 and delay as ah2 */ -/* calling params: ah1, ah2, ph, ph1, ph2 */ - ah2 = uppol2 (ah1, ah2, ph, ph1, ph2); - -/* uppol1: update first predictor coef. aph2 and delay it as ah1 */ - ah1 = uppol1 (ah1, ah2, ph, ph1); - -/* recons for higher sub-band */ - yh = sh + dh; - -/* done with higher sub-band encoder, now Delay for next time */ - rh2 = rh1; - rh1 = yh; - ph2 = ph1; - ph1 = ph; - -/* multiplex ih and il to get signals together */ - return (il | (ih << 6)); -} - -/* decode function, result in xout1 and xout2 */ - -void -decode (int input) -{ - int i; - long int xa1, xa2; /* qmf accumulators */ - const int *h_ptr; - int *ac_ptr, *ac_ptr1, *ad_ptr, *ad_ptr1; - -/* split transmitted word from input into ilr and ih */ - ilr = input & 0x3f; - ih = input >> 6; - -/* LOWER SUB_BAND DECODER */ - -/* filtez: compute predictor output for zero section */ - dec_szl = filtez (dec_del_bpl, dec_del_dltx); - -/* filtep: compute predictor output signal for pole section */ - dec_spl = filtep (dec_rlt1, dec_al1, dec_rlt2, dec_al2); - - dec_sl = dec_spl + dec_szl; - -/* compute quantized difference signal for adaptive predic */ - dec_dlt = ((long) dec_detl * qq4_code4_table[ilr >> 2]) >> 15; - -/* compute quantized difference signal for decoder output */ - dl = ((long) dec_detl * qq6_code6_table[il]) >> 15; - - rl = dl + dec_sl; - -/* logscl: quantizer scale factor adaptation in the lower sub-band */ - dec_nbl = logscl (ilr, dec_nbl); - -/* scalel: computes quantizer scale factor in the lower sub band */ - dec_detl = scalel (dec_nbl, 8); - -/* parrec - add pole predictor output to quantized diff. signal */ -/* for partially reconstructed signal */ - dec_plt = dec_dlt + dec_szl; - -/* upzero: update zero section predictor coefficients */ - upzero (dec_dlt, dec_del_dltx, dec_del_bpl); - -/* uppol2: update second predictor coefficient apl2 and delay it as al2 */ - dec_al2 = uppol2 (dec_al1, dec_al2, dec_plt, dec_plt1, dec_plt2); - -/* uppol1: update first predictor coef. (pole setion) */ - dec_al1 = uppol1 (dec_al1, dec_al2, dec_plt, dec_plt1); - -/* recons : compute recontructed signal for adaptive predictor */ - dec_rlt = dec_sl + dec_dlt; - -/* done with lower sub band decoder, implement delays for next time */ - dec_rlt2 = dec_rlt1; - dec_rlt1 = dec_rlt; - dec_plt2 = dec_plt1; - dec_plt1 = dec_plt; - -/* HIGH SUB-BAND DECODER */ - -/* filtez: compute predictor output for zero section */ - dec_szh = filtez (dec_del_bph, dec_del_dhx); - -/* filtep: compute predictor output signal for pole section */ - dec_sph = filtep (dec_rh1, dec_ah1, dec_rh2, dec_ah2); - -/* predic:compute the predictor output value in the higher sub_band decoder */ - dec_sh = dec_sph + dec_szh; - -/* in-place compute the quantized difference signal */ - dec_dh = ((long) dec_deth * qq2_code2_table[ih]) >> 15L; - -/* logsch: update logarithmic quantizer scale factor in hi sub band */ - dec_nbh = logsch (ih, dec_nbh); - -/* scalel: compute the quantizer scale factor in the higher sub band */ - dec_deth = scalel (dec_nbh, 10); - -/* parrec: compute partially recontructed signal */ - dec_ph = dec_dh + dec_szh; - -/* upzero: update zero section predictor coefficients */ - upzero (dec_dh, dec_del_dhx, dec_del_bph); - -/* uppol2: update second predictor coefficient aph2 and delay it as ah2 */ - dec_ah2 = uppol2 (dec_ah1, dec_ah2, dec_ph, dec_ph1, dec_ph2); - -/* uppol1: update first predictor coef. (pole setion) */ - dec_ah1 = uppol1 (dec_ah1, dec_ah2, dec_ph, dec_ph1); - -/* recons : compute recontructed signal for adaptive predictor */ - rh = dec_sh + dec_dh; - -/* done with high band decode, implementing delays for next time here */ - dec_rh2 = dec_rh1; - dec_rh1 = rh; - dec_ph2 = dec_ph1; - dec_ph1 = dec_ph; - -/* end of higher sub_band decoder */ - -/* end with receive quadrature mirror filters */ - xd = rl - rh; - xs = rl + rh; - -/* receive quadrature mirror filters implemented here */ - h_ptr = h; - ac_ptr = accumc; - ad_ptr = accumd; - xa1 = (long) xd *(*h_ptr++); - xa2 = (long) xs *(*h_ptr++); -/* main multiply accumulate loop for samples and coefficients */ - for (i = 0; i < 10; i++) - { - xa1 += (long) (*ac_ptr++) * (*h_ptr++); - xa2 += (long) (*ad_ptr++) * (*h_ptr++); - } -/* final mult/accumulate */ - xa1 += (long) (*ac_ptr) * (*h_ptr++); - xa2 += (long) (*ad_ptr) * (*h_ptr++); - -/* scale by 2^14 */ - xout1 = xa1 >> 14; - xout2 = xa2 >> 14; - -/* update delay lines */ - ac_ptr1 = ac_ptr - 1; - ad_ptr1 = ad_ptr - 1; - for (i = 0; i < 10; i++) - { - *ac_ptr-- = *ac_ptr1--; - *ad_ptr-- = *ad_ptr1--; - } - *ac_ptr = xd; - *ad_ptr = xs; -} - -/* clear all storage locations */ - -void -reset () -{ - int i; - - detl = dec_detl = 32; /* reset to min scale factor */ - deth = dec_deth = 8; - nbl = al1 = al2 = plt1 = plt2 = rlt1 = rlt2 = 0; - nbh = ah1 = ah2 = ph1 = ph2 = rh1 = rh2 = 0; - dec_nbl = dec_al1 = dec_al2 = dec_plt1 = dec_plt2 = dec_rlt1 = dec_rlt2 = 0; - dec_nbh = dec_ah1 = dec_ah2 = dec_ph1 = dec_ph2 = dec_rh1 = dec_rh2 = 0; - - for (i = 0; i < 6; i++) - { - delay_dltx[i] = 0; - delay_dhx[i] = 0; - dec_del_dltx[i] = 0; - dec_del_dhx[i] = 0; - } - - for (i = 0; i < 6; i++) - { - delay_bpl[i] = 0; - delay_bph[i] = 0; - dec_del_bpl[i] = 0; - dec_del_bph[i] = 0; - } - - for (i = 0; i < 24; i++) - tqmf[i] = 0; // i<23 - - for (i = 0; i < 11; i++) - { - accumc[i] = 0; - accumd[i] = 0; - } -} - /* filtez - compute predictor output signal (zero section) */ /* input: bpl1-6 and dlt1-6, output: szl */ -int + int filtez (int *bpl, int *dlt) { int i; - long int zl; - zl = (long) (*bpl++) * (*dlt++); - for (i = 1; i < 6; i++) - zl += (long) (*bpl++) * (*dlt++); + int zl = 0; + //zl = (int) (*bpl++) * (*dlt++); + for (i = 1; i < 7; i++) + zl += (int) (*bpl++) * (*dlt++); return ((int) (zl >> 14)); /* x2 here */ } @@ -592,34 +114,61 @@ filtez (int *bpl, int *dlt) /* filtep - compute predictor output signal (pole section) */ /* input rlt1-2 and al1-2, output spl */ -int + int filtep (int rlt1, int al1, int rlt2, int al2) { - long int pl, pl2; - pl = 2 * rlt1; - pl = (long) al1 *pl; - pl2 = 2 * rlt2; - pl += (long) al2 *pl2; + int pl, pl2; + pl = rlt1 << 1 ; + pl = (int) al1 *pl; + pl2 = rlt2 << 1 ; + pl += (int) al2 *pl2; return ((int) (pl >> 15)); } /* quantl - quantize the difference signal in the lower sub-band */ -int + int quantl (int el, int detl) { + + const int decis_levl[30] = { + 280, 576, 880, 1200, 1520, 1864, 2208, 2584, + 2960, 3376, 3784, 4240, 4696, 5200, 5712, 6288, + 6864, 7520, 8184, 8968, 9752, 10712, 11664, 12896, + 14120, 15840, 17560, 20456, 23352, 32767 + }; + /* decision levels - pre-multiplied by 8, 0 to indicate end */ + /* quantization table 31 long to make quantl look-up easier, + last entry is for mil=30 case when wd is max */ + const int quant26bt_pos[31] = { + 61, 60, 59, 58, 57, 56, 55, 54, + 53, 52, 51, 50, 49, 48, 47, 46, + 45, 44, 43, 42, 41, 40, 39, 38, + 37, 36, 35, 34, 33, 32, 32 + }; + + /* quantization table 31 long to make quantl look-up easier, + last entry is for mil=30 case when wd is max */ + const int quant26bt_neg[31] = { + 63, 62, 31, 30, 29, 28, 27, 26, + 25, 24, 23, 22, 21, 20, 19, 18, + 17, 16, 15, 14, 13, 12, 11, 10, + 9, 8, 7, 6, 5, 4, 4 + }; + + int ril, mil; - long int wd, decis; + int wd, decis; -/* abs of difference signal */ + /* abs of difference signal */ wd = abs (el); -/* determine mil based on decision levels and detl gain */ + /* determine mil based on decision levels and detl gain */ for (mil = 0; mil < 30; mil++) - { - decis = (decis_levl[mil] * (long) detl) >> 15L; - if (wd <= decis) - break; - } -/* if mil=30 then wd is less than all decision levels */ + { + decis = (decis_levl[mil] * (int) detl) >> 15L; + if (wd <= decis) + break; + } + /* if mil=30 then wd is less than all decision levels */ if (el >= 0) ril = quant26bt_pos[mil]; else @@ -630,11 +179,19 @@ quantl (int el, int detl) /* logscl - update log quantizer scale factor in lower sub-band */ /* note that nbl is passed and returned */ -int + int logscl (int il, int nbl) { - long int wd; - wd = ((long) nbl * 127L) >> 7L; /* leak factor 127/128 */ + const int wl_code_table[16] = { + -60, 3042, 1198, 538, 334, 172, 58, -30, + 3042, 1198, 538, 334, 172, 58, -30, -60 + }; + + int wd; + int tmp = nbl; + int val = tmp << 7; + val -= tmp; + wd = (val) >> 7L; /* leak factor 127/128 */ nbl = (int) wd + wl_code_table[il >> 2]; if (nbl < 0) nbl = 0; @@ -645,10 +202,17 @@ logscl (int il, int nbl) /* scalel: compute quantizer scale factor in lower or upper sub-band*/ -int + int scalel (int nbl, int shift_constant) { + const int ilb_table[32] = { + 2048, 2093, 2139, 2186, 2233, 2282, 2332, 2383, + 2435, 2489, 2543, 2599, 2656, 2714, 2774, 2834, + 2896, 2960, 3025, 3091, 3158, 3228, 3298, 3371, + 3444, 3520, 3597, 3676, 3756, 3838, 3922, 4008 + }; int wd1, wd2, wd3; + wd1 = (nbl >> 6) & 31; wd2 = nbl >> 11; wd3 = ilb_table[wd1] >> (shift_constant + 1 - wd2); @@ -658,31 +222,37 @@ scalel (int nbl, int shift_constant) /* upzero - inputs: dlt, dlti[0-5], bli[0-5], outputs: updated bli[0-5] */ /* also implements delay of bli and update of dlti from dlt */ -void + void upzero (int dlt, int *dlti, int *bli) { int i, wd2, wd3; -/*if dlt is zero, then no sum into bli */ + /*if dlt is zero, then no sum into bli */ if (dlt == 0) + { + for (i = 0; i < 6; i++) { - for (i = 0; i < 6; i++) - { - bli[i] = (int) ((255L * bli[i]) >> 8L); /* leak factor of 255/256 */ - } + int tmp = bli[i]; + int val = tmp << 8; + val -= tmp; + bli[i] = (int) (val) >> 8L; /* leak factor of 255/256 */ } + } else + { + for (i = 0; i < 6; i++) { - for (i = 0; i < 6; i++) - { - if ((long) dlt * dlti[i] >= 0) - wd2 = 128; - else - wd2 = -128; - wd3 = (int) ((255L * bli[i]) >> 8L); /* leak factor of 255/256 */ - bli[i] = wd2 + wd3; - } + if ((int) dlt * dlti[i] >= 0) + wd2 = 128; + else + wd2 = -128; + int tmp = bli[i]; + int val = tmp << 8; + val -= tmp; + wd3 = (int) (val) >> 8L; /* leak factor of 255/256 */ + bli[i] = wd2 + wd3; } -/* implement delay line for dlt */ + } + /* implement delay line for dlt */ dlti[5] = dlti[4]; dlti[4] = dlti[3]; dlti[3] = dlti[2]; @@ -694,26 +264,29 @@ upzero (int dlt, int *dlti, int *bli) /* uppol2 - update second predictor coefficient (pole section) */ /* inputs: al1, al2, plt, plt1, plt2. outputs: apl2 */ -int + int uppol2 (int al1, int al2, int plt, int plt1, int plt2) { - long int wd2, wd4; + int wd2, wd4; int apl2; - wd2 = 4L * (long) al1; - if ((long) plt * plt1 >= 0L) + wd2 = (int) al1 << 2; + if ((int) plt * plt1 >= 0L) wd2 = -wd2; /* check same sign */ wd2 = wd2 >> 7; /* gain of 1/128 */ - if ((long) plt * plt2 >= 0L) - { - wd4 = wd2 + 128; /* same sign case */ - } + if ((int) plt * plt2 >= 0L) + { + wd4 = wd2 + 128; /* same sign case */ + } else - { - wd4 = wd2 - 128; - } - apl2 = wd4 + (127L * (long) al2 >> 7L); /* leak factor of 127/128 */ - -/* apl2 is limited to +-.75 */ + { + wd4 = wd2 - 128; + } + int tmp = al2; + int val = tmp << 7; + val -= tmp; + apl2 = wd4 + (val >> 7L); /* leak factor of 127/128 */ + + /* apl2 is limited to +-.75 */ if (apl2 > 12288) apl2 = 12288; if (apl2 < -12288) @@ -724,21 +297,24 @@ uppol2 (int al1, int al2, int plt, int plt1, int plt2) /* uppol1 - update first predictor coefficient (pole section) */ /* inputs: al1, apl2, plt, plt1. outputs: apl1 */ -int + int uppol1 (int al1, int apl2, int plt, int plt1) { - long int wd2; + int wd2; int wd3, apl1; - wd2 = ((long) al1 * 255L) >> 8L; /* leak factor of 255/256 */ - if ((long) plt * plt1 >= 0L) - { - apl1 = (int) wd2 + 192; /* same sign case */ - } + int tmp = al1; + int val = tmp << 8; + val -= tmp; + wd2 = (val) >> 8L; /* leak factor of 255/256 */ + if ((int) plt * plt1 >= 0L) + { + apl1 = (int) wd2 + 192; /* same sign case */ + } else - { - apl1 = (int) wd2 - 192; - } -/* note: wd3= .9375-.75 is always positive */ + { + apl1 = (int) wd2 - 192; + } + /* note: wd3= .9375-.75 is always positive */ wd3 = 15360 - apl2; /* limit value */ if (apl1 > wd3) apl1 = wd3; @@ -750,11 +326,18 @@ uppol1 (int al1, int apl2, int plt, int plt1) /* logsch - update log quantizer scale factor in higher sub-band */ /* note that nbh is passed and returned */ -int + int logsch (int ih, int nbh) { int wd; - wd = ((long) nbh * 127L) >> 7L; /* leak factor 127/128 */ + const int wh_code_table[4] = { + 798, -214, 798, -214 + }; + + int tmp = nbh; + int val = tmp << 7; + val -= tmp; + wd = (val) >> 7L; /* leak factor 127/128 */ nbh = wd + wh_code_table[ih]; if (nbh < 0) nbh = 0; @@ -764,119 +347,549 @@ logsch (int ih, int nbh) } /* -+--------------------------------------------------------------------------+ -| * Test Vectors (added for CHStone) | -| test_data : input data | -| test_compressed : expected output data for "encode" | -| test_result : expected output data for "decode" | -+--------------------------------------------------------------------------+ -*/ + +--------------------------------------------------------------------------+ + | * Test Vectors (added for CHStone) | + | test_data : input data | + | test_compressed : expected output data for "encode" | + | test_result : expected output data for "decode" | + +--------------------------------------------------------------------------+ + */ + +/* G722 C code */ -#define SIZE 100 -#define IN_END 100 -const int test_data[SIZE] = { - 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x43, 0x43, 0x43, - 0x43, 0x43, 0x43, 0x43, 0x42, - 0x42, 0x42, 0x42, 0x42, 0x42, - 0x41, 0x41, 0x41, 0x41, 0x41, - 0x40, 0x40, 0x40, 0x40, 0x40, - 0x40, 0x40, 0x40, 0x3f, 0x3f, - 0x3f, 0x3f, 0x3f, 0x3e, 0x3e, - 0x3e, 0x3e, 0x3e, 0x3e, 0x3d, - 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, - 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, - 0x3c, 0x3c, 0x3c, 0x3c, 0x3b, - 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, - 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, - 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, - 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, - 0x3b, 0x3b, 0x3c, 0x3c, 0x3c, - 0x3c, 0x3c, 0x3c, 0x3c, 0x3c -}; -int compressed[SIZE], result[SIZE]; -const int test_compressed[SIZE] = { - 0xfd, 0xde, 0x77, 0xba, 0xf2, - 0x90, 0x20, 0xa0, 0xec, 0xed, - 0xef, 0xf1, 0xf3, 0xf4, 0xf5, - 0xf5, 0xf5, 0xf5, 0xf6, 0xf6, - 0xf6, 0xf7, 0xf8, 0xf7, 0xf8, - 0xf7, 0xf9, 0xf8, 0xf7, 0xf9, - 0xf8, 0xf8, 0xf6, 0xf8, 0xf8, - 0xf7, 0xf9, 0xf9, 0xf9, 0xf8, - 0xf7, 0xfa, 0xf8, 0xf8, 0xf7, - 0xfb, 0xfa, 0xf9, 0xf8, 0xf8 -}; -const int test_result[SIZE] = { - 0, 0xffffffff, 0xffffffff, 0, 0, - 0xffffffff, 0, 0, 0xffffffff, 0xffffffff, - 0, 0, 0x1, 0x1, 0, - 0xfffffffe, 0xffffffff, 0xfffffffe, 0, 0xfffffffc, - 0x1, 0x1, 0x1, 0xfffffffb, 0x2, - 0x2, 0x3, 0xb, 0x14, 0x14, - 0x16, 0x18, 0x20, 0x21, 0x26, - 0x27, 0x2e, 0x2f, 0x33, 0x32, - 0x35, 0x33, 0x36, 0x34, 0x37, - 0x34, 0x37, 0x35, 0x38, 0x36, - 0x39, 0x38, 0x3b, 0x3a, 0x3f, - 0x3f, 0x40, 0x3a, 0x3d, 0x3e, - 0x41, 0x3c, 0x3e, 0x3f, 0x42, - 0x3e, 0x3b, 0x37, 0x3b, 0x3e, - 0x41, 0x3b, 0x3b, 0x3a, 0x3b, - 0x36, 0x39, 0x3b, 0x3f, 0x3c, - 0x3b, 0x37, 0x3b, 0x3d, 0x41, - 0x3d, 0x3e, 0x3c, 0x3e, 0x3b, - 0x3a, 0x37, 0x3b, 0x3e, 0x41, - 0x3c, 0x3b, 0x39, 0x3a, 0x36 -}; - -void -adpcm_main () + void +adpcm_main (const int test_data[SIZE], int compressed[SIZE], int result[SIZE]) { + /* variables for transimit quadrature mirror filter here */ + int tqmf[24]; + + /* QMF filter coefficients: + scaled by a factor of 4 compared to G722 CCITT recomendation */ + const int h[24] = { + 12, -44, -44, 212, 48, -624, 128, 1448, + -840, -3220, 3804, 15504, 15504, 3804, -3220, -840, + 1448, 128, -624, 48, 212, -44, -44, 12 + }; + + + /* variables for receive quadrature mirror filter here */ + int accumc[11], accumd[11]; + + const int qq2_code2_table[4] = { + -7408, -1616, 7408, 1616 + }; + + const int qq4_code4_table[16] = { + 0, -20456, -12896, -8968, -6288, -4240, -2584, -1200, + 20456, 12896, 8968, 6288, 4240, 2584, 1200, 0 + }; + const int qq6_code6_table[64] = { + -136, -136, -136, -136, -24808, -21904, -19008, -16704, + -14984, -13512, -12280, -11192, -10232, -9360, -8576, -7856, + -7192, -6576, -6000, -5456, -4944, -4464, -4008, -3576, + -3168, -2776, -2400, -2032, -1688, -1360, -1040, -728, + 24808, 21904, 19008, 16704, 14984, 13512, 12280, 11192, + 10232, 9360, 8576, 7856, 7192, 6576, 6000, 5456, + 4944, 4464, 4008, 3576, 3168, 2776, 2400, 2032, + 1688, 1360, 1040, 728, 432, 136, -432, -136 + }; + + + int delay_dhx[6]; + + int delay_bph[6]; + + int dec_del_bpl[6]; + + int dec_del_dltx[6]; + + /* variables used in filtez */ + int dec_del_bph[6]; + + int dec_del_dhx[6]; + + int delay_bpl[6]; + + int delay_dltx[6]; + /* outputs of decode() */ + int xout1, xout2; + + int xs, xd; + + /* variables for encoder (hi and lo) here */ + + int il, szl, spl, sl, el; + + + int nbl; /* delay line */ + int al1, al2; + int plt, plt1, plt2; + int dlt; + int rlt, rlt1, rlt2; + + int detl; + + int deth; + int sh; /* this comes from adaptive predictor */ + int eh; + + int ah1, ah2; + int ph1, ph2; + int rh1, rh2; + + int dh, ih; + int nbh, szh; + int sph, ph, yh, rh; + + /* variables for decoder here */ + int ilr, rl; + int dec_deth, dec_detl, dec_dlt; + int dec_plt, dec_plt1, dec_plt2; + int dec_szl, dec_spl, dec_sl; + int dec_rlt1, dec_rlt2, dec_rlt; + int dec_al1, dec_al2; + int dl; + int dec_nbl, dec_dh, dec_nbh; + + int dec_szh; + /* variables used in filtep */ + int dec_rh1, dec_rh2; + int dec_ah1, dec_ah2; + int dec_ph, dec_sph; + + int dec_sh; + + int dec_ph1, dec_ph2; int i, j; -/* reset, initialize required memory */ - reset (); + /* reset, initialize required memory */ - j = 10; + detl = dec_detl = 32; /* reset to min scale factor */ + deth = dec_deth = 8; + nbl = al1 = al2 = plt1 = plt2 = rlt1 = rlt2 = 0; + nbh = ah1 = ah2 = ph1 = ph2 = rh1 = rh2 = 0; + dec_nbl = dec_al1 = dec_al2 = dec_plt1 = dec_plt2 = dec_rlt1 = dec_rlt2 = 0; + dec_nbh = dec_ah1 = dec_ah2 = dec_ph1 = dec_ph2 = dec_rh1 = dec_rh2 = 0; + + for (i = 0; i < 6; i++) + { + delay_dltx[i] = 0; + delay_dhx[i] = 0; + dec_del_dltx[i] = 0; + dec_del_dhx[i] = 0; + } + + for (i = 0; i < 6; i++) + { + delay_bpl[i] = 0; + delay_bph[i] = 0; + dec_del_bpl[i] = 0; + dec_del_bph[i] = 0; + } + + for (i = 0; i < 24; i++) + tqmf[i] = 0; // i<23 + + for (i = 0; i < 11; i++) + { + accumc[i] = 0; + accumd[i] = 0; + } for (i = 0; i < IN_END; i += 2) + { + int xin1 = test_data[i + 0]; + int xin2 = test_data[i + 1]; + const int *h_ptr; + int *tqmf_ptr, *tqmf_ptr1; + int xa = 0, xb = 0; + int decis; + + /* transmit quadrature mirror filters implemented here */ + h_ptr = h; + tqmf_ptr = tqmf; + /* main multiply accumulate loop for samples and coefficients */ + for (int j = 0; j < 12; j++) + { + int opA1, opB1; + int opA2, opB2; + if(j==11){ + opA1 = (*tqmf_ptr++); + opB1 = (*h_ptr++); + opA2 = (*tqmf_ptr); + opB2 = (*h_ptr++); + } + else{ + opA1 = (*tqmf_ptr++); + opB1 = (*h_ptr++); + opA2 = (*tqmf_ptr++); + opB2 = (*h_ptr++); + } + xa += (int) opA1 * opB1; + xb += (int) opA2 * opB2; + } + + /* update delay line tqmf */ + tqmf_ptr1 = tqmf_ptr - 2; + for (int j = 0; j < 22; j++) + *tqmf_ptr-- = *tqmf_ptr1--; + *tqmf_ptr-- = xin1; + *tqmf_ptr = xin2; + + /* scale outputs */ + int xl = (xa + xb) >> 15; + int xh = (xa - xb) >> 15; + + /* end of quadrature mirror filter code */ + + /* starting with lower sub band encoder */ + + /* filtez - compute predictor output section - zero section */ + szl = filtez (delay_bpl, delay_dltx); + + /* filtep - compute predictor output signal (pole section) */ + spl = filtep (rlt1, al1, rlt2, al2); + + /* compute the predictor output value in the lower sub_band encoder */ + sl = szl + spl; + el = xl - sl; + + /* quantl: quantize the difference signal */ + il = quantl (el, detl); + + /* computes quantized difference signal */ + /* for invqbl, truncate by 2 lsbs, so mode = 3 */ + dlt = ((int) detl * qq4_code4_table[il >> 2]) >> 15; + + /* logscl: updates logarithmic quant. scale factor in low sub band */ + nbl = logscl (il, nbl); + + /* scalel: compute the quantizer scale factor in the lower sub band */ + /* calling parameters nbl and 8 (constant such that scalel can be scaleh) */ + detl = scalel (nbl, 8); + + /* parrec - simple addition to compute recontructed signal for adaptive pred */ + plt = dlt + szl; + + /* upzero: update zero section predictor coefficients (sixth order)*/ + /* calling parameters: dlt, dlt1, dlt2, ..., dlt6 from dlt */ + /* bpli (linear_buffer in which all six values are delayed */ + /* return params: updated bpli, delayed dltx */ + upzero (dlt, delay_dltx, delay_bpl); + + /* uppol2- update second predictor coefficient apl2 and delay it as al2 */ + /* calling parameters: al1, al2, plt, plt1, plt2 */ + al2 = uppol2 (al1, al2, plt, plt1, plt2); + + /* uppol1 :update first predictor coefficient apl1 and delay it as al1 */ + /* calling parameters: al1, apl2, plt, plt1 */ + al1 = uppol1 (al1, al2, plt, plt1); + + /* recons : compute recontructed signal for adaptive predictor */ + rlt = sl + dlt; + + /* done with lower sub_band encoder; now implement delays for next time*/ + rlt2 = rlt1; + rlt1 = rlt; + plt2 = plt1; + plt1 = plt; + + /* high band encode */ + + szh = filtez (delay_bph, delay_dhx); + + sph = filtep (rh1, ah1, rh2, ah2); + + /* predic: sh = sph + szh */ + sh = sph + szh; + /* subtra: eh = xh - sh */ + eh = xh - sh; + + /* quanth - quantization of difference signal for higher sub-band */ + /* quanth: in-place for speed params: eh, deth (has init. value) */ + if (eh >= 0) + { + ih = 3; /* 2,3 are pos codes */ + } + else { - compressed[i / 2] = encode (test_data[i], test_data[i + 1]); + ih = 1; /* 0,1 are neg codes */ } + decis = (564L * (int) deth) >> 12L; + if (abs (eh) > decis) + ih--; /* mih = 2 case */ + + /* compute the quantized difference signal, higher sub-band*/ + dh = ((int) deth * qq2_code2_table[ih]) >> 15L; + + /* logsch: update logarithmic quantizer scale factor in hi sub-band*/ + nbh = logsch (ih, nbh); + + /* note : scalel and scaleh use same code, different parameters */ + deth = scalel (nbh, 10); + + /* parrec - add pole predictor output to quantized diff. signal */ + ph = dh + szh; + + /* upzero: update zero section predictor coefficients (sixth order) */ + /* calling parameters: dh, dhi, bphi */ + /* return params: updated bphi, delayed dhx */ + upzero (dh, delay_dhx, delay_bph); + + /* uppol2: update second predictor coef aph2 and delay as ah2 */ + /* calling params: ah1, ah2, ph, ph1, ph2 */ + ah2 = uppol2 (ah1, ah2, ph, ph1, ph2); + + /* uppol1: update first predictor coef. aph2 and delay it as ah1 */ + ah1 = uppol1 (ah1, ah2, ph, ph1); + + /* recons for higher sub-band */ + yh = sh + dh; + + /* done with higher sub-band encoder, now Delay for next time */ + rh2 = rh1; + rh1 = yh; + ph2 = ph1; + ph1 = ph; + + /* multiplex ih and il to get signals together */ + compressed[i/2] = (il | (ih << 6)); + } for (i = 0; i < IN_END; i += 2) + { + int input = compressed[i / 2]; + + int xa1, xa2; /* qmf accumulators */ + const int *h_ptr; + int *ac_ptr, *ac_ptr1, *ad_ptr, *ad_ptr1; + + /* split transmitted word from input into ilr and ih */ + ilr = input & 0x3f; + ih = input >> 6; + + /* LOWER SUB_BAND DECODER */ + + /* filtez: compute predictor output for zero section */ + dec_szl = filtez (dec_del_bpl, dec_del_dltx); + + /* filtep: compute predictor output signal for pole section */ + dec_spl = filtep (dec_rlt1, dec_al1, dec_rlt2, dec_al2); + + dec_sl = dec_spl + dec_szl; + + /* compute quantized difference signal for adaptive predic */ + dec_dlt = ((int) dec_detl * qq4_code4_table[ilr >> 2]) >> 15; + + /* compute quantized difference signal for decoder output */ + dl = ((int) dec_detl * qq6_code6_table[il]) >> 15; + + rl = dl + dec_sl; + + /* logscl: quantizer scale factor adaptation in the lower sub-band */ + dec_nbl = logscl (ilr, dec_nbl); + + /* scalel: computes quantizer scale factor in the lower sub band */ + dec_detl = scalel (dec_nbl, 8); + + /* parrec - add pole predictor output to quantized diff. signal */ + /* for partially reconstructed signal */ + dec_plt = dec_dlt + dec_szl; + + /* upzero: update zero section predictor coefficients */ + upzero (dec_dlt, dec_del_dltx, dec_del_bpl); + + /* uppol2: update second predictor coefficient apl2 and delay it as al2 */ + dec_al2 = uppol2 (dec_al1, dec_al2, dec_plt, dec_plt1, dec_plt2); + + /* uppol1: update first predictor coef. (pole setion) */ + dec_al1 = uppol1 (dec_al1, dec_al2, dec_plt, dec_plt1); + + /* recons : compute recontructed signal for adaptive predictor */ + dec_rlt = dec_sl + dec_dlt; + + /* done with lower sub band decoder, implement delays for next time */ + dec_rlt2 = dec_rlt1; + dec_rlt1 = dec_rlt; + dec_plt2 = dec_plt1; + dec_plt1 = dec_plt; + + /* HIGH SUB-BAND DECODER */ + + /* filtez: compute predictor output for zero section */ + dec_szh = filtez (dec_del_bph, dec_del_dhx); + + /* filtep: compute predictor output signal for pole section */ + dec_sph = filtep (dec_rh1, dec_ah1, dec_rh2, dec_ah2); + + /* predic:compute the predictor output value in the higher sub_band decoder */ + dec_sh = dec_sph + dec_szh; + + /* in-place compute the quantized difference signal */ + dec_dh = ((int) dec_deth * qq2_code2_table[ih]) >> 15L; + + /* logsch: update logarithmic quantizer scale factor in hi sub band */ + dec_nbh = logsch (ih, dec_nbh); + + /* scalel: compute the quantizer scale factor in the higher sub band */ + dec_deth = scalel (dec_nbh, 10); + + /* parrec: compute partially recontructed signal */ + dec_ph = dec_dh + dec_szh; + + /* upzero: update zero section predictor coefficients */ + upzero (dec_dh, dec_del_dhx, dec_del_bph); + + /* uppol2: update second predictor coefficient aph2 and delay it as ah2 */ + dec_ah2 = uppol2 (dec_ah1, dec_ah2, dec_ph, dec_ph1, dec_ph2); + + /* uppol1: update first predictor coef. (pole setion) */ + dec_ah1 = uppol1 (dec_ah1, dec_ah2, dec_ph, dec_ph1); + + /* recons : compute recontructed signal for adaptive predictor */ + rh = dec_sh + dec_dh; + + /* done with high band decode, implementing delays for next time here */ + dec_rh2 = dec_rh1; + dec_rh1 = rh; + dec_ph2 = dec_ph1; + dec_ph1 = dec_ph; + + /* end of higher sub_band decoder */ + + /* end with receive quadrature mirror filters */ + xd = rl - rh; + xs = rl + rh; + + /* receive quadrature mirror filters implemented here */ + h_ptr = h; + ac_ptr = accumc; + ad_ptr = accumd; + /* main multiply accumulate loop for samples and coefficients */ + for (int j = 0; j < 12; j++) + { + int opA1, opB1; + int opA2, opB2; + if(i==0){ + opA1 = xd; + opB1 = (*h_ptr++); + opA2 = xs; + opB2 = (*h_ptr++); + } + else if(i==11){ + opA1 = (*ac_ptr++); + opB1 = (*h_ptr++); + opA2 = (*ad_ptr++); + opB2 = (*h_ptr++); + } + else{ + opA1 = (*ac_ptr); + opB1 = (*h_ptr++); + opA2 = (*ad_ptr); + opB2 = (*h_ptr++); + } + xa1 += (int) opA1 * opB1; + xa2 += (int) opA2 * opB2; + } + + /* scale by 2^14 */ + xout1 = xa1 >> 14; + xout2 = xa2 >> 14; + + /* update delay lines */ + ac_ptr1 = ac_ptr - 1; + ad_ptr1 = ad_ptr - 1; + for (j = 0; j < 10; j++) { - decode (compressed[i / 2]); - result[i] = xout1; - result[i + 1] = xout2; + *ac_ptr-- = *ac_ptr1--; + *ad_ptr-- = *ad_ptr1--; } + *ac_ptr = xd; + *ad_ptr = xs; + result[i] = xout1; + result[i + 1] = xout2; + } } -int + int main () { int i; int main_result; - main_result = 0; - adpcm_main (); - for (i = 0; i < IN_END / 2; i++) - { - if (compressed[i] != test_compressed[i]) - { - main_result += 1; - } - } - for (i = 0; i < IN_END; i++) - { - if (result[i] != test_result[i]) - { - main_result += 1; - } - } - printf ("%d\n", main_result); - return main_result; + const int test_data[SIZE] = { + 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x43, 0x43, 0x43, + 0x43, 0x43, 0x43, 0x43, 0x42, + 0x42, 0x42, 0x42, 0x42, 0x42, + 0x41, 0x41, 0x41, 0x41, 0x41, + 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x3f, 0x3f, + 0x3f, 0x3f, 0x3f, 0x3e, 0x3e, + 0x3e, 0x3e, 0x3e, 0x3e, 0x3d, + 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, + 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, + 0x3c, 0x3c, 0x3c, 0x3c, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3c, 0x3c, 0x3c, + 0x3c, 0x3c, 0x3c, 0x3c, 0x3c + }; + int compressed[SIZE], result[SIZE]; + const int test_compressed[SIZE] = { + 0xfd, 0xde, 0x77, 0xba, 0xf2, + 0x90, 0x20, 0xa0, 0xec, 0xed, + 0xef, 0xf1, 0xf3, 0xf4, 0xf5, + 0xf5, 0xf5, 0xf5, 0xf6, 0xf6, + 0xf6, 0xf7, 0xf8, 0xf7, 0xf8, + 0xf7, 0xf9, 0xf8, 0xf7, 0xf9, + 0xf8, 0xf8, 0xf6, 0xf8, 0xf8, + 0xf7, 0xf9, 0xf9, 0xf9, 0xf8, + 0xf7, 0xfa, 0xf8, 0xf8, 0xf7, + 0xfb, 0xfa, 0xf9, 0xf8, 0xf8 + }; + const int test_result[SIZE] = { + 0, 0xffffffff, 0xffffffff, 0, 0, + 0xffffffff, 0, 0, 0xffffffff, 0xffffffff, + 0, 0, 0x1, 0x1, 0, + 0xfffffffe, 0xffffffff, 0xfffffffe, 0, 0xfffffffc, + 0x1, 0x1, 0x1, 0xfffffffb, 0x2, + 0x2, 0x3, 0xb, 0x14, 0x14, + 0x16, 0x18, 0x20, 0x21, 0x26, + 0x27, 0x2e, 0x2f, 0x33, 0x32, + 0x35, 0x33, 0x36, 0x34, 0x37, + 0x34, 0x37, 0x35, 0x38, 0x36, + 0x39, 0x38, 0x3b, 0x3a, 0x3f, + 0x3f, 0x40, 0x3a, 0x3d, 0x3e, + 0x41, 0x3c, 0x3e, 0x3f, 0x42, + 0x3e, 0x3b, 0x37, 0x3b, 0x3e, + 0x41, 0x3b, 0x3b, 0x3a, 0x3b, + 0x36, 0x39, 0x3b, 0x3f, 0x3c, + 0x3b, 0x37, 0x3b, 0x3d, 0x41, + 0x3d, 0x3e, 0x3c, 0x3e, 0x3b, + 0x3a, 0x37, 0x3b, 0x3e, 0x41, + 0x3c, 0x3b, 0x39, 0x3a, 0x36 + }; + + main_result = 0; + adpcm_main (test_data,compressed,result); + for (i = 0; i < IN_END / 2; i++) + { + if (compressed[i] != test_compressed[i]) + { + main_result += 1; + } + }/* + for (i = 0; i < IN_END; i++) + { + if (result[i] != test_result[i]) + { + main_result += 1; } + }*/ + return main_result; +} diff --git a/benchmarks/CHStone/aes/aes.c b/benchmarks/CHStone/aes/aes.c index a0cdf2d..efbb5d8 100755 --- a/benchmarks/CHStone/aes/aes.c +++ b/benchmarks/CHStone/aes/aes.c @@ -62,17 +62,707 @@ #include -int main_result; +int +SubByte (int in, const int Sbox[16][16]) +{ + return Sbox[(in / 16)][(in % 16)]; +} + + +/* **************** key expand ************************ */ +int +KeySchedule (int type, int key[32], int word[4][120], const int Sbox[16][16]) +{ + int nk, nb, round_val; + int i, j, temp[4]; + const int Rcon0[30] = { + 0x01, 0x02, 0x04, 0x08, + 0x10, 0x20, 0x40, 0x80, + 0x1b, 0x36, 0x6c, 0xd8, + 0xab, 0x4d, 0x9a, 0x2f, + 0x5e, 0xbc, 0x63, 0xc6, + 0x97, 0x35, 0x6a, 0xd4, + 0xb3, 0x7d, 0xfa, 0xef, + 0xc5, 0x91, + }; + + + switch (type) + { + case 128128: + nk = 4; + nb = 4; + round_val = 10; + break; + case 128192: + nk = 4; + nb = 6; + round_val = 12; + break; + case 128256: + nk = 4; + nb = 8; + round_val = 14; + break; + case 192128: + nk = 6; + nb = 4; + round_val = 12; + break; + case 192192: + nk = 6; + nb = 6; + round_val = 12; + break; + case 192256: + nk = 6; + nb = 8; + round_val = 14; + break; + case 256128: + nk = 8; + nb = 4; + round_val = 14; + break; + case 256192: + nk = 8; + nb = 6; + round_val = 14; + break; + case 256256: + nk = 8; + nb = 8; + round_val = 14; + break; + default: + return -1; + } + for (j = 0; j < nk; ++j) + for (i = 0; i < 4; ++i) +/* 0 word */ + word[i][j] = key[i + j * 4]; + +/* expanded key is generated */ + for (j = nk; j < nb * (round_val + 1); ++j) + { + +/* RotByte */ + if ((j % nk) == 0) + { + temp[0] = SubByte (word[1][j - 1], Sbox) ^ Rcon0[(j / nk) - 1]; + temp[1] = SubByte (word[2][j - 1], Sbox); + temp[2] = SubByte (word[3][j - 1], Sbox); + temp[3] = SubByte (word[0][j - 1], Sbox); + } + if ((j % nk) != 0) + { + temp[0] = word[0][j - 1]; + temp[1] = word[1][j - 1]; + temp[2] = word[2][j - 1]; + temp[3] = word[3][j - 1]; + } + if (nk > 6 && j % nk == 4) + for (i = 0; i < 4; ++i) + temp[i] = SubByte (temp[i], Sbox); + for (i = 0; i < 4; ++i) + word[i][j] = word[i][j - nk] ^ temp[i]; + } + return 0; +} + +/* ********* ByteSub & ShiftRow ********* */ +void +ByteSub_ShiftRow (int statemt[32], int nb, const int Sbox[16][16]) +{ + int temp; + + switch (nb) + { + case 4: + temp = Sbox[statemt[1] >> 4][statemt[1] & 0xf]; + statemt[1] = Sbox[statemt[5] >> 4][statemt[5] & 0xf]; + statemt[5] = Sbox[statemt[9] >> 4][statemt[9] & 0xf]; + statemt[9] = Sbox[statemt[13] >> 4][statemt[13] & 0xf]; + statemt[13] = temp; + + temp = Sbox[statemt[2] >> 4][statemt[2] & 0xf]; + statemt[2] = Sbox[statemt[10] >> 4][statemt[10] & 0xf]; + statemt[10] = temp; + temp = Sbox[statemt[6] >> 4][statemt[6] & 0xf]; + statemt[6] = Sbox[statemt[14] >> 4][statemt[14] & 0xf]; + statemt[14] = temp; + + temp = Sbox[statemt[3] >> 4][statemt[3] & 0xf]; + statemt[3] = Sbox[statemt[15] >> 4][statemt[15] & 0xf]; + statemt[15] = Sbox[statemt[11] >> 4][statemt[11] & 0xf]; + statemt[11] = Sbox[statemt[7] >> 4][statemt[7] & 0xf]; + statemt[7] = temp; + + statemt[0] = Sbox[statemt[0] >> 4][statemt[0] & 0xf]; + statemt[4] = Sbox[statemt[4] >> 4][statemt[4] & 0xf]; + statemt[8] = Sbox[statemt[8] >> 4][statemt[8] & 0xf]; + statemt[12] = Sbox[statemt[12] >> 4][statemt[12] & 0xf]; + break; + case 6: + temp = Sbox[statemt[1] >> 4][statemt[1] & 0xf]; + statemt[1] = Sbox[statemt[5] >> 4][statemt[5] & 0xf]; + statemt[5] = Sbox[statemt[9] >> 4][statemt[9] & 0xf]; + statemt[9] = Sbox[statemt[13] >> 4][statemt[13] & 0xf]; + statemt[13] = Sbox[statemt[17] >> 4][statemt[17] & 0xf]; + statemt[17] = Sbox[statemt[21] >> 4][statemt[21] & 0xf]; + statemt[21] = temp; + + temp = Sbox[statemt[2] >> 4][statemt[2] & 0xf]; + statemt[2] = Sbox[statemt[10] >> 4][statemt[10] & 0xf]; + statemt[10] = Sbox[statemt[18] >> 4][statemt[18] & 0xf]; + statemt[18] = temp; + temp = Sbox[statemt[6] >> 4][statemt[6] & 0xf]; + statemt[6] = Sbox[statemt[14] >> 4][statemt[14] & 0xf]; + statemt[14] = Sbox[statemt[22] >> 4][statemt[22] & 0xf]; + statemt[22] = temp; + + temp = Sbox[statemt[3] >> 4][statemt[3] & 0xf]; + statemt[3] = Sbox[statemt[15] >> 4][statemt[15] & 0xf]; + statemt[15] = temp; + temp = Sbox[statemt[7] >> 4][statemt[7] & 0xf]; + statemt[7] = Sbox[statemt[19] >> 4][statemt[19] & 0xf]; + statemt[19] = temp; + temp = Sbox[statemt[11] >> 4][statemt[11] & 0xf]; + statemt[11] = Sbox[statemt[23] >> 4][statemt[23] & 0xf]; + statemt[23] = temp; + + statemt[0] = Sbox[statemt[0] >> 4][statemt[0] & 0xf]; + statemt[4] = Sbox[statemt[4] >> 4][statemt[4] & 0xf]; + statemt[8] = Sbox[statemt[8] >> 4][statemt[8] & 0xf]; + statemt[12] = Sbox[statemt[12] >> 4][statemt[12] & 0xf]; + statemt[16] = Sbox[statemt[16] >> 4][statemt[16] & 0xf]; + statemt[20] = Sbox[statemt[20] >> 4][statemt[20] & 0xf]; + break; + case 8: + temp = Sbox[statemt[1] >> 4][statemt[1] & 0xf]; + statemt[1] = Sbox[statemt[5] >> 4][statemt[5] & 0xf]; + statemt[5] = Sbox[statemt[9] >> 4][statemt[9] & 0xf]; + statemt[9] = Sbox[statemt[13] >> 4][statemt[13] & 0xf]; + statemt[13] = Sbox[statemt[17] >> 4][statemt[17] & 0xf]; + statemt[17] = Sbox[statemt[21] >> 4][statemt[21] & 0xf]; + statemt[21] = Sbox[statemt[25] >> 4][statemt[25] & 0xf]; + statemt[25] = Sbox[statemt[29] >> 4][statemt[29] & 0xf]; + statemt[29] = temp; + + temp = Sbox[statemt[2] >> 4][statemt[2] & 0xf]; + statemt[2] = Sbox[statemt[14] >> 4][statemt[14] & 0xf]; + statemt[14] = Sbox[statemt[26] >> 4][statemt[26] & 0xf]; + statemt[26] = Sbox[statemt[6] >> 4][statemt[6] & 0xf]; + statemt[6] = Sbox[statemt[18] >> 4][statemt[18] & 0xf]; + statemt[18] = Sbox[statemt[30] >> 4][statemt[30] & 0xf]; + statemt[30] = Sbox[statemt[10] >> 4][statemt[10] & 0xf]; + statemt[10] = Sbox[statemt[22] >> 4][statemt[22] & 0xf]; + statemt[22] = temp; + + temp = Sbox[statemt[3] >> 4][statemt[3] & 0xf]; + statemt[3] = Sbox[statemt[19] >> 4][statemt[19] & 0xf]; + statemt[19] = temp; + temp = Sbox[statemt[7] >> 4][statemt[7] & 0xf]; + statemt[7] = Sbox[statemt[23] >> 4][statemt[23] & 0xf]; + statemt[23] = temp; + temp = Sbox[statemt[11] >> 4][statemt[11] & 0xf]; + statemt[11] = Sbox[statemt[27] >> 4][statemt[27] & 0xf]; + statemt[27] = temp; + temp = Sbox[statemt[15] >> 4][statemt[15] & 0xf]; + statemt[15] = Sbox[statemt[31] >> 4][statemt[31] & 0xf]; + statemt[31] = temp; + + statemt[0] = Sbox[statemt[0] >> 4][statemt[0] & 0xf]; + statemt[4] = Sbox[statemt[4] >> 4][statemt[4] & 0xf]; + statemt[8] = Sbox[statemt[8] >> 4][statemt[8] & 0xf]; + statemt[12] = Sbox[statemt[12] >> 4][statemt[12] & 0xf]; + statemt[16] = Sbox[statemt[16] >> 4][statemt[16] & 0xf]; + statemt[20] = Sbox[statemt[20] >> 4][statemt[20] & 0xf]; + statemt[24] = Sbox[statemt[24] >> 4][statemt[24] & 0xf]; + statemt[28] = Sbox[statemt[28] >> 4][statemt[28] & 0xf]; + break; + } +} + +/* ********* InversShiftRow & ByteSub ********* */ +void +InversShiftRow_ByteSub (int statemt[32], int nb, const int invSbox[16][16]) +{ + int temp; + + switch (nb) + { + case 4: + temp = invSbox[statemt[13] >> 4][statemt[13] & 0xf]; + statemt[13] = invSbox[statemt[9] >> 4][statemt[9] & 0xf]; + statemt[9] = invSbox[statemt[5] >> 4][statemt[5] & 0xf]; + statemt[5] = invSbox[statemt[1] >> 4][statemt[1] & 0xf]; + statemt[1] = temp; + + temp = invSbox[statemt[14] >> 4][statemt[14] & 0xf]; + statemt[14] = invSbox[statemt[6] >> 4][statemt[6] & 0xf]; + statemt[6] = temp; + temp = invSbox[statemt[2] >> 4][statemt[2] & 0xf]; + statemt[2] = invSbox[statemt[10] >> 4][statemt[10] & 0xf]; + statemt[10] = temp; + + temp = invSbox[statemt[15] >> 4][statemt[15] & 0xf]; + statemt[15] = invSbox[statemt[3] >> 4][statemt[3] & 0xf]; + statemt[3] = invSbox[statemt[7] >> 4][statemt[7] & 0xf]; + statemt[7] = invSbox[statemt[11] >> 4][statemt[11] & 0xf]; + statemt[11] = temp; + + statemt[0] = invSbox[statemt[0] >> 4][statemt[0] & 0xf]; + statemt[4] = invSbox[statemt[4] >> 4][statemt[4] & 0xf]; + statemt[8] = invSbox[statemt[8] >> 4][statemt[8] & 0xf]; + statemt[12] = invSbox[statemt[12] >> 4][statemt[12] & 0xf]; + break; + case 6: + temp = invSbox[statemt[21] >> 4][statemt[21] & 0xf]; + statemt[21] = invSbox[statemt[17] >> 4][statemt[17] & 0xf]; + statemt[17] = invSbox[statemt[13] >> 4][statemt[13] & 0xf]; + statemt[13] = invSbox[statemt[9] >> 4][statemt[9] & 0xf]; + statemt[9] = invSbox[statemt[5] >> 4][statemt[5] & 0xf]; + statemt[5] = invSbox[statemt[1] >> 4][statemt[1] & 0xf]; + statemt[1] = temp; + + temp = invSbox[statemt[22] >> 4][statemt[22] & 0xf]; + statemt[22] = invSbox[statemt[14] >> 4][statemt[14] & 0xf]; + statemt[14] = invSbox[statemt[6] >> 4][statemt[6] & 0xf]; + statemt[6] = temp; + temp = invSbox[statemt[18] >> 4][statemt[18] & 0xf]; + statemt[18] = invSbox[statemt[10] >> 4][statemt[10] & 0xf]; + statemt[10] = invSbox[statemt[2] >> 4][statemt[2] & 0xf]; + statemt[2] = temp; + + temp = invSbox[statemt[15] >> 4][statemt[15] & 0xf]; + statemt[15] = invSbox[statemt[3] >> 4][statemt[3] & 0xf]; + statemt[3] = temp; + temp = invSbox[statemt[19] >> 4][statemt[19] & 0xf]; + statemt[19] = invSbox[statemt[7] >> 4][statemt[7] & 0xf]; + statemt[7] = temp; + temp = invSbox[statemt[23] >> 4][statemt[23] & 0xf]; + statemt[23] = invSbox[statemt[11] >> 4][statemt[11] & 0xf]; + statemt[11] = temp; + + statemt[0] = invSbox[statemt[0] >> 4][statemt[0] & 0xf]; + statemt[4] = invSbox[statemt[4] >> 4][statemt[4] & 0xf]; + statemt[8] = invSbox[statemt[8] >> 4][statemt[8] & 0xf]; + statemt[12] = invSbox[statemt[12] >> 4][statemt[12] & 0xf]; + statemt[16] = invSbox[statemt[16] >> 4][statemt[16] & 0xf]; + statemt[20] = invSbox[statemt[20] >> 4][statemt[20] & 0xf]; + break; + case 8: + temp = invSbox[statemt[29] >> 4][statemt[29] & 0xf]; + statemt[29] = invSbox[statemt[25] >> 4][statemt[25] & 0xf]; + statemt[25] = invSbox[statemt[21] >> 4][statemt[21] & 0xf]; + statemt[21] = invSbox[statemt[17] >> 4][statemt[17] & 0xf]; + statemt[17] = invSbox[statemt[13] >> 4][statemt[13] & 0xf]; + statemt[13] = invSbox[statemt[9] >> 4][statemt[9] & 0xf]; + statemt[9] = invSbox[statemt[5] >> 4][statemt[5] & 0xf]; + statemt[5] = invSbox[statemt[1] >> 4][statemt[1] & 0xf]; + statemt[1] = temp; + + temp = invSbox[statemt[30] >> 4][statemt[30] & 0xf]; + statemt[30] = invSbox[statemt[18] >> 4][statemt[18] & 0xf]; + statemt[18] = invSbox[statemt[6] >> 4][statemt[6] & 0xf]; + statemt[6] = invSbox[statemt[26] >> 4][statemt[26] & 0xf]; + statemt[26] = invSbox[statemt[14] >> 4][statemt[14] & 0xf]; + statemt[14] = invSbox[statemt[2] >> 4][statemt[2] & 0xf]; + statemt[2] = invSbox[statemt[22] >> 4][statemt[22] & 0xf]; + statemt[22] = invSbox[statemt[10] >> 4][statemt[10] & 0xf]; + statemt[10] = temp; + + temp = invSbox[statemt[31] >> 4][statemt[31] & 0xf]; + statemt[31] = invSbox[statemt[15] >> 4][statemt[15] & 0xf]; + statemt[15] = temp; + temp = invSbox[statemt[27] >> 4][statemt[27] & 0xf]; + statemt[27] = invSbox[statemt[11] >> 4][statemt[11] & 0xf]; + statemt[11] = temp; + temp = invSbox[statemt[23] >> 4][statemt[23] & 0xf]; + statemt[23] = invSbox[statemt[7] >> 4][statemt[7] & 0xf]; + statemt[7] = temp; + temp = invSbox[statemt[19] >> 4][statemt[19] & 0xf]; + statemt[19] = invSbox[statemt[3] >> 4][statemt[3] & 0xf]; + statemt[3] = temp; + + statemt[0] = invSbox[statemt[0] >> 4][statemt[0] & 0xf]; + statemt[4] = invSbox[statemt[4] >> 4][statemt[4] & 0xf]; + statemt[8] = invSbox[statemt[8] >> 4][statemt[8] & 0xf]; + statemt[12] = invSbox[statemt[12] >> 4][statemt[12] & 0xf]; + statemt[16] = invSbox[statemt[16] >> 4][statemt[16] & 0xf]; + statemt[20] = invSbox[statemt[20] >> 4][statemt[20] & 0xf]; + statemt[24] = invSbox[statemt[24] >> 4][statemt[24] & 0xf]; + statemt[28] = invSbox[statemt[28] >> 4][statemt[28] & 0xf]; + break; + } +} + +/* ******** MixColumn ********** */ +int +MixColumn_AddRoundKey (int statemt[32], int nb, int n, int word[4][120]) +{ + int ret[8 * 4], j; + register int x; + + for (j = 0; j < nb; ++j) + { + ret[j * 4] = (statemt[j * 4] << 1); + if ((ret[j * 4] >> 8) == 1) + ret[j * 4] ^= 283; + x = statemt[1 + j * 4]; + x ^= (x << 1); + if ((x >> 8) == 1) + ret[j * 4] ^= (x ^ 283); + else + ret[j * 4] ^= x; + ret[j * 4] ^= + statemt[2 + j * 4] ^ statemt[3 + j * 4] ^ word[0][j + nb * n]; + + ret[1 + j * 4] = (statemt[1 + j * 4] << 1); + if ((ret[1 + j * 4] >> 8) == 1) + ret[1 + j * 4] ^= 283; + x = statemt[2 + j * 4]; + x ^= (x << 1); + if ((x >> 8) == 1) + ret[1 + j * 4] ^= (x ^ 283); + else + ret[1 + j * 4] ^= x; + ret[1 + j * 4] ^= + statemt[3 + j * 4] ^ statemt[j * 4] ^ word[1][j + nb * n]; + + ret[2 + j * 4] = (statemt[2 + j * 4] << 1); + if ((ret[2 + j * 4] >> 8) == 1) + ret[2 + j * 4] ^= 283; + x = statemt[3 + j * 4]; + x ^= (x << 1); + if ((x >> 8) == 1) + ret[2 + j * 4] ^= (x ^ 283); + else + ret[2 + j * 4] ^= x; + ret[2 + j * 4] ^= + statemt[j * 4] ^ statemt[1 + j * 4] ^ word[2][j + nb * n]; + + ret[3 + j * 4] = (statemt[3 + j * 4] << 1); + if ((ret[3 + j * 4] >> 8) == 1) + ret[3 + j * 4] ^= 283; + x = statemt[j * 4]; + x ^= (x << 1); + if ((x >> 8) == 1) + ret[3 + j * 4] ^= (x ^ 283); + else + ret[3 + j * 4] ^= x; + ret[3 + j * 4] ^= + statemt[1 + j * 4] ^ statemt[2 + j * 4] ^ word[3][j + nb * n]; + } + for (j = 0; j < nb; ++j) + { + statemt[j * 4] = ret[j * 4]; + statemt[1 + j * 4] = ret[1 + j * 4]; + statemt[2 + j * 4] = ret[2 + j * 4]; + statemt[3 + j * 4] = ret[3 + j * 4]; + } + return 0; +} + +/* ******** InversMixColumn ********** */ +int +AddRoundKey_InversMixColumn (int statemt[32], int nb, int n, int word[4][120]) +{ + int ret[8 * 4], i, j; + register int x; + + for (j = 0; j < nb; ++j) + { + statemt[j * 4] ^= word[0][j + nb * n]; + statemt[1 + j * 4] ^= word[1][j + nb * n]; + statemt[2 + j * 4] ^= word[2][j + nb * n]; + statemt[3 + j * 4] ^= word[3][j + nb * n]; + } + for (j = 0; j < nb; ++j) + for (i = 0; i < 4; ++i) + { + x = (statemt[i + j * 4] << 1); + if ((x >> 8) == 1) + x ^= 283; + x ^= statemt[i + j * 4]; + x = (x << 1); + if ((x >> 8) == 1) + x ^= 283; + x ^= statemt[i + j * 4]; + x = (x << 1); + if ((x >> 8) == 1) + x ^= 283; + ret[i + j * 4] = x; + + x = (statemt[(i + 1) % 4 + j * 4] << 1); + if ((x >> 8) == 1) + x ^= 283; + x = (x << 1); + if ((x >> 8) == 1) + x ^= 283; + x ^= statemt[(i + 1) % 4 + j * 4]; + x = (x << 1); + if ((x >> 8) == 1) + x ^= 283; + x ^= statemt[(i + 1) % 4 + j * 4]; + ret[i + j * 4] ^= x; -#include "aes.h" -#include "aes_enc.c" -#include "aes_dec.c" -#include "aes_key.c" -#include "aes_func.c" + x = (statemt[(i + 2) % 4 + j * 4] << 1); + if ((x >> 8) == 1) + x ^= 283; + x ^= statemt[(i + 2) % 4 + j * 4]; + x = (x << 1); + if ((x >> 8) == 1) + x ^= 283; + x = (x << 1); + if ((x >> 8) == 1) + x ^= 283; + x ^= statemt[(i + 2) % 4 + j * 4]; + ret[i + j * 4] ^= x; + + x = (statemt[(i + 3) % 4 + j * 4] << 1); + if ((x >> 8) == 1) + x ^= 283; + x = (x << 1); + if ((x >> 8) == 1) + x ^= 283; + x = (x << 1); + if ((x >> 8) == 1) + x ^= 283; + x ^= statemt[(i + 3) % 4 + j * 4]; + ret[i + j * 4] ^= x; + } + for (i = 0; i < nb; ++i) + { + statemt[i * 4] = ret[i * 4]; + statemt[1 + i * 4] = ret[1 + i * 4]; + statemt[2 + i * 4] = ret[2 + i * 4]; + statemt[3 + i * 4] = ret[3 + i * 4]; + } + return 0; +} + +/* ******** AddRoundKey ********** */ +int +AddRoundKey (int statemt[32], int type, int n, int word[4][120]) +{ + int j, nb; + switch (type) + { + case 128128: + case 192128: + case 256128: + nb = 4; + break; + case 128192: + case 192192: + case 256192: + nb = 6; + break; + case 128256: + case 192256: + case 256256: + nb = 8; + break; + } + for (j = 0; j < nb; ++j) + { + statemt[j * 4] ^= word[0][j + nb * n]; + statemt[1 + j * 4] ^= word[1][j + nb * n]; + statemt[2 + j * 4] ^= word[2][j + nb * n]; + statemt[3 + j * 4] ^= word[3][j + nb * n]; + } + return 0; +} +int +encrypt (int statemt[32], int key[32], int type, int *main_result, const int Sbox[16][16]) +{ + int i; + int nb; + int round_val; + int word[4][120]; +/* ++--------------------------------------------------------------------------+ +| * Test Vector (added for CHStone) | +| out_enc_statemt : expected output data for "encrypt" | ++--------------------------------------------------------------------------+ +*/ + const int out_enc_statemt[16] = + { 0x39, 0x25, 0x84, 0x1d, 0x2, 0xdc, 0x9, 0xfb, 0xdc, 0x11, 0x85, 0x97, + 0x19, 0x6a, 0xb, 0x32 + }; + + KeySchedule (type, key, word, Sbox); + switch (type) + { + case 128128: + round_val = 0; + nb = 4; + break; + case 192128: + round_val = 2; + nb = 4; + break; + case 256128: + round_val = 4; + nb = 4; + break; + case 128192: + case 192192: + round_val = 2; + nb = 6; + break; + case 256192: + round_val = 4; + nb = 6; + break; + case 128256: + case 192256: + case 256256: + round_val = 4; + nb = 8; + break; + } + AddRoundKey (statemt, type, 0, word); + for (i = 1; i <= round_val + 9; ++i) + { + ByteSub_ShiftRow (statemt, nb, Sbox); + MixColumn_AddRoundKey (statemt, nb, i, word); + } + ByteSub_ShiftRow (statemt, nb, Sbox); + AddRoundKey (statemt, type, i, word); +/* + printf ("encrypted message \t"); + for (i = 0; i < nb * 4; ++i) + { + if (statemt[i] < 16) + printf ("0"); + printf ("%x", statemt[i]); + } +*/ + for (i = 0; i < 16; i++) + *main_result += (statemt[i] != out_enc_statemt[i]); + + return 0; +} + +int +decrypt (int statemt[32], int key[32], int type, int *main_result, const int Sbox[16][16]) +{ + int i; + int nb; + int round_val; + int word[4][120]; + const int invSbox[16][16] = { + {0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, + 0x81, 0xf3, 0xd7, 0xfb}, + {0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, + 0xc4, 0xde, 0xe9, 0xcb}, + {0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, + 0x42, 0xfa, 0xc3, 0x4e}, + {0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, + 0x6d, 0x8b, 0xd1, 0x25}, + {0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, + 0x5d, 0x65, 0xb6, 0x92}, + {0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, + 0xa7, 0x8d, 0x9d, 0x84}, + {0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, + 0xb8, 0xb3, 0x45, 0x06}, + {0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, + 0x01, 0x13, 0x8a, 0x6b}, + {0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, + 0xf0, 0xb4, 0xe6, 0x73}, + {0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, + 0x1c, 0x75, 0xdf, 0x6e}, + {0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, + 0xaa, 0x18, 0xbe, 0x1b}, + {0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, + 0x78, 0xcd, 0x5a, 0xf4}, + {0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, + 0x27, 0x80, 0xec, 0x5f}, + {0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, + 0x93, 0xc9, 0x9c, 0xef}, + {0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, + 0x83, 0x53, 0x99, 0x61}, + {0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, + 0x55, 0x21, 0x0c, 0x7d} + }; +/* ++--------------------------------------------------------------------------+ +| * Test Vector (added for CHStone) | +| out_enc_statemt : expected output data for "decrypt" | ++--------------------------------------------------------------------------+ +*/ + const int out_dec_statemt[16] = + { 0x32, 0x43, 0xf6, 0xa8, 0x88, 0x5a, 0x30, 0x8d, 0x31, 0x31, 0x98, 0xa2, + 0xe0, 0x37, 0x7, 0x34 + }; + KeySchedule (type, key, word, Sbox); + + switch (type) + { + case 128128: + round_val = 10; + nb = 4; + break; + case 128192: + case 192192: + round_val = 12; + nb = 6; + break; + case 192128: + round_val = 12; + nb = 4; + break; + case 128256: + case 192256: + round_val = 14; + nb = 8; + break; + case 256128: + round_val = 14; + nb = 4; + break; + case 256192: + round_val = 14; + nb = 6; + break; + case 256256: + round_val = 14; + nb = 8; + break; + } + + AddRoundKey (statemt, type, round_val, word); + + InversShiftRow_ByteSub (statemt, nb, invSbox); + + for (i = round_val - 1; i >= 1; --i) + { + AddRoundKey_InversMixColumn (statemt, nb, i, word); + InversShiftRow_ByteSub (statemt, nb, invSbox); + } + + AddRoundKey (statemt, type, 0, word); +/* + printf ("\ndecrypto message\t"); + for (i = 0; i < ((type % 1000) / 8); ++i) + { + if (statemt[i] < 16) + printf ("0"); + printf ("%x", statemt[i]); + } +*/ + for (i = 0; i < 16; i++) + *main_result += (statemt[i] != out_dec_statemt[i]); + + return 0; +} /* ***************** main **************************** */ int -aes_main (void) +aes_main (int *res) { /* +--------------------------------------------------------------------------+ @@ -80,6 +770,8 @@ aes_main (void) | statemt, key : input data | +--------------------------------------------------------------------------+ */ + int key[32]; + int statemt[32]; statemt[0] = 50; statemt[1] = 67; statemt[2] = 246; @@ -113,17 +805,52 @@ aes_main (void) key[13] = 207; key[14] = 79; key[15] = 60; +const int Sbox[16][16] = { + {0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, + 0xfe, 0xd7, 0xab, 0x76}, + {0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, + 0x9c, 0xa4, 0x72, 0xc0}, + {0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, + 0x71, 0xd8, 0x31, 0x15}, + {0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, + 0xeb, 0x27, 0xb2, 0x75}, + {0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, + 0x29, 0xe3, 0x2f, 0x84}, + {0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, + 0x4a, 0x4c, 0x58, 0xcf}, + {0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, + 0x50, 0x3c, 0x9f, 0xa8}, + {0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, + 0x10, 0xff, 0xf3, 0xd2}, + {0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, + 0x64, 0x5d, 0x19, 0x73}, + {0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, + 0xde, 0x5e, 0x0b, 0xdb}, + {0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, + 0x91, 0x95, 0xe4, 0x79}, + {0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, + 0x65, 0x7a, 0xae, 0x08}, + {0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, + 0x4b, 0xbd, 0x8b, 0x8a}, + {0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, + 0x86, 0xc1, 0x1d, 0x9e}, + {0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, + 0xce, 0x55, 0x28, 0xdf}, + {0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, + 0xb0, 0x54, 0xbb, 0x16} +}; - encrypt (statemt, key, 128128); - decrypt (statemt, key, 128128); + encrypt (statemt, key, 128128, res, Sbox); + decrypt (statemt, key, 128128, res, Sbox); return 0; } int main () { + int main_result; main_result = 0; - aes_main (); - printf ("\n%d\n", main_result); + aes_main (&main_result); + //printf ("\n%d\n", main_result); return main_result; } diff --git a/benchmarks/CHStone/gsm/gsm.c b/benchmarks/CHStone/gsm/gsm.c index 282437a..ff472c3 100755 --- a/benchmarks/CHStone/gsm/gsm.c +++ b/benchmarks/CHStone/gsm/gsm.c @@ -16,95 +16,514 @@ | 4. Please follow the copyright of each benchmark program. | +--------------------------------------------------------------------------+ */ -#include -#include "lpc.c" +//#include +typedef int word; /* 16 bit signed int */ +typedef long longword; /* 32 bit signed int */ +#define MIN_WORD ((-32767)-1) +#define MAX_WORD ( 32767) + +#define SASR(x, by) ((x) >> (by)) + +#define GSM_MULT_R(a, b) gsm_mult_r(a, b) +#define GSM_MULT(a, b) gsm_mult(a, b) +#define GSM_ADD(a, b) gsm_add(a, b) +#define GSM_ABS(a) gsm_abs(a) + +#define saturate(x) \ + ((x) < MIN_WORD ? MIN_WORD : (x) > MAX_WORD ? MAX_WORD: (x)) + +word +gsm_add (word a, word b) +{ + longword sum; + sum = (longword) a + (longword) b; + return saturate (sum); +} + +word +gsm_mult (word a, word b) +{ + if (a == MIN_WORD && b == MIN_WORD) + return MAX_WORD; + else + return SASR ((longword) a * (longword) b, 15); +} + +word +gsm_mult_r (word a, word b) +{ + longword prod; + if (b == MIN_WORD && a == MIN_WORD) + return MAX_WORD; + else + { + prod = (longword) a *(longword) b + 16384; + prod >>= 15; + return prod & 0xFFFF; + } +} + +word +gsm_abs (word a) +{ + return a < 0 ? (a == MIN_WORD ? MAX_WORD : -a) : a; +} + +word +gsm_norm (longword a) /* -+--------------------------------------------------------------------------+ -| * Test Vectors (added for CHStone) | -| inData : input data | -| outData, outLARc : expected output data | -+--------------------------------------------------------------------------+ -*/ + * the number of left shifts needed to normalize the 32 bit + * variable L_var1 for positive values on the interval + * + * with minimum of + * minimum of 1073741824 (01000000000000000000000000000000) and + * maximum of 2147483647 (01111111111111111111111111111111) + * + * + * and for negative values on the interval with + * minimum of -2147483648 (-10000000000000000000000000000000) and + * maximum of -1073741824 ( -1000000000000000000000000000000). + * + * in order to normalize the result, the following + * operation must be done: L_norm_var1 = L_var1 << norm( L_var1 ); + * + * (That's 'ffs', only from the left, not the right..) + */ +{ + const unsigned int bitoff[256] = { + 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + + if (a < 0) + { + if (a <= -1073741824) + return 0; + a = ~a; + } + + return a & 0xffff0000 ? + (a & 0xff000000 ? -1 + bitoff[0xFF & (a >> 24)] : + 7 + bitoff[0xFF & (a >> 16)]) + : (a & 0xff00 ? 15 + bitoff[0xFF & (a >> 8)] : 23 + bitoff[0xFF & a]); +} + +word +gsm_div (word num, word denum) +{ + longword L_num; + longword L_denum; + word div; + int k; + + L_num = num; + L_denum = denum; + div = 0; + k = 15; + /* The parameter num sometimes becomes zero. + * Although this is explicitly guarded against in 4.2.5, + * we assume that the result should then be zero as well. + */ + + if (num == 0) + return 0; + + while (k--) + { + div <<= 1; + L_num <<= 1; + + if (L_num >= L_denum) + { + L_num -= L_denum; + div++; + } + } + + return div; +} + +void +Autocorrelation (word * s /* [0..159] IN/OUT */ , + longword * L_ACF /* [0..8] OUT */ ) +/* + * The goal is to compute the array L_ACF[k]. The signal s[i] must + * be scaled in order to avoid an overflow situation. + */ +{ + register int k, i; + + word temp; + word smax; + word scalauto, n; + word *sp; + word sl; + + /* Search for the maximum. + */ + smax = 0; + for (k = 0; k <= 159; k++) + { + temp = GSM_ABS (s[k]); + if (temp > smax) + smax = temp; + } + + /* Computation of the scaling factor. + */ + if (smax == 0) + scalauto = 0; + else + scalauto = 4 - gsm_norm ((longword) smax << 16); /* sub(4,..) */ + + if (scalauto > 0 && scalauto <= 4) + { + n = scalauto; + for (k = 0; k <= 159; k++) + s[k] = GSM_MULT_R (s[k], 16384 >> (n - 1)); + } + + /* Compute the L_ACF[..]. + */ + { + sp = s; + sl = *sp; + +#define STEP(k) L_ACF[k] += ((longword)sl * sp[ -(k) ]); + +#define NEXTI sl = *++sp + for (k = 8; k >= 0; k--) + L_ACF[k] = 0; + + STEP (0); + NEXTI; + STEP (0); + STEP (1); + NEXTI; + STEP (0); + STEP (1); + STEP (2); + NEXTI; + STEP (0); + STEP (1); + STEP (2); + STEP (3); + NEXTI; + STEP (0); + STEP (1); + STEP (2); + STEP (3); + STEP (4); + NEXTI; + STEP (0); + STEP (1); + STEP (2); + STEP (3); + STEP (4); + STEP (5); + NEXTI; + STEP (0); + STEP (1); + STEP (2); + STEP (3); + STEP (4); + STEP (5); + STEP (6); + NEXTI; + STEP (0); + STEP (1); + STEP (2); + STEP (3); + STEP (4); + STEP (5); + STEP (6); + STEP (7); + + for (i = 8; i <= 159; i++) + { + + NEXTI; + + STEP (0); + STEP (1); + STEP (2); + STEP (3); + STEP (4); + STEP (5); + STEP (6); + STEP (7); + STEP (8); + } + + for (k = 8; k >= 0; k--) + L_ACF[k] <<= 1; + + } + /* Rescaling of the array s[0..159] + */ + if (scalauto > 0) + for (k = 159; k >= 0; k--) + *s++ <<= scalauto; +} + +/* 4.2.5 */ + +void +Reflection_coefficients (longword * L_ACF /* 0...8 IN */ , + register word * r /* 0...7 OUT */ ) +{ + register int i, m, n; + register word temp; + word ACF[9]; /* 0..8 */ + word P[9]; /* 0..8 */ + word K[9]; /* 2..8 */ + + /* Schur recursion with 16 bits arithmetic. + */ + + if (L_ACF[0] == 0) + { + for (i = 8; i > 0; i--) + *r++ = 0; + return; + } + + temp = gsm_norm (L_ACF[0]); + for (i = 0; i <= 8; i++) + ACF[i] = SASR (L_ACF[i] << temp, 16); + + /* Initialize array P[..] and K[..] for the recursion. + */ + + for (i = 1; i <= 7; i++) + K[i] = ACF[i]; + for (i = 0; i <= 8; i++) + P[i] = ACF[i]; + + /* Compute reflection coefficients + */ + for (n = 1; n <= 8; n++, r++) + { + + temp = P[1]; + temp = GSM_ABS (temp); + if (P[0] < temp) + { + for (i = n; i <= 8; i++) + *r++ = 0; + return; + } + + *r = gsm_div (temp, P[0]); + + if (P[1] > 0) + *r = -*r; /* r[n] = sub(0, r[n]) */ + if (n == 8) + return; + + /* Schur recursion + */ + temp = GSM_MULT_R (P[1], *r); + P[0] = GSM_ADD (P[0], temp); + + for (m = 1; m <= 8 - n; m++) + { + temp = GSM_MULT_R (K[m], *r); + P[m] = GSM_ADD (P[m + 1], temp); + + temp = GSM_MULT_R (P[m + 1], *r); + K[m] = GSM_ADD (K[m], temp); + } + } +} + +/* 4.2.6 */ + +void +Transformation_to_Log_Area_Ratios (register word * r /* 0..7 IN/OUT */ ) +/* + * The following scaling for r[..] and LAR[..] has been used: + * + * r[..] = integer( real_r[..]*32768. ); -1 <= real_r < 1. + * LAR[..] = integer( real_LAR[..] * 16384 ); + * with -1.625 <= real_LAR <= 1.625 + */ +{ + register word temp; + register int i; + + + /* Computation of the LAR[0..7] from the r[0..7] + */ + for (i = 1; i <= 8; i++, r++) + { + + temp = *r; + temp = GSM_ABS (temp); + + if (temp < 22118) + { + temp >>= 1; + } + else if (temp < 31130) + { + temp -= 11059; + } + else + { + temp -= 26112; + temp <<= 2; + } + + *r = *r < 0 ? -temp : temp; + } +} + +/* 4.2.7 */ + +void +Quantization_and_coding (register word * LAR /* [0..7] IN/OUT */ ) +{ + register word temp; + + + /* This procedure needs four tables; the following equations + * give the optimum scaling for the constants: + * + * A[0..7] = integer( real_A[0..7] * 1024 ) + * B[0..7] = integer( real_B[0..7] * 512 ) + * MAC[0..7] = maximum of the LARc[0..7] + * MIC[0..7] = minimum of the LARc[0..7] + */ + +# undef STEP +# define STEP( A, B, MAC, MIC ) \ + temp = GSM_MULT( A, *LAR ); \ + temp = GSM_ADD( temp, B ); \ + temp = GSM_ADD( temp, 256 ); \ + temp = SASR( temp, 9 ); \ + *LAR = temp>MAC ? MAC - MIC : (temp -int main_result; +/* ++--------------------------------------------------------------------------+ +| CHStone : a suite of benchmark programs for C-based High-Level Synthesis | +| ======================================================================== | +| | +| * Collected and Modified : Y. Hara, H. Tomiyama, S. Honda, | +| H. Takada and K. Ishii | +| Nagoya University, Japan | +| | +| * Remark : | +| 1. This source code is modified to unify the formats of the benchmark | +| programs in CHStone. | +| 2. Test vectors are added for CHStone. | +| 3. If "main_result" is 0 at the end of the program, the program is | +| correctly executed. | +| 4. Please follow the copyright of each benchmark program. | ++--------------------------------------------------------------------------+ +*/ +/* + * Copyright (C) 2008 + * Y. Hara, H. Tomiyama, S. Honda, H. Takada and K. Ishii + * Nagoya University, Japan + * All rights reserved. + * + * Disclaimer of Warranty + * + * These software programs are available to the user without any license fee or + * royalty on an "as is" basis. The authors disclaims any and all warranties, + * whether express, implied, or statuary, including any implied warranties or + * merchantability or of fitness for a particular purpose. In no event shall the + * copyright-holder be liable for any incidental, punitive, or consequential damages + * of any kind whatsoever arising from the use of these programs. This disclaimer + * of warranty extends to the user of these programs and user's customers, employees, + * agents, transferees, successors, and assigns. + * + */ #define R 0 #define ADDU 33 @@ -80,7 +114,6 @@ int main_result; #define SLTI 10 #define SLTIU 11 -#include "imem.h" /* +--------------------------------------------------------------------------+ | * Test Vectors (added for CHStone) | @@ -88,16 +121,65 @@ int main_result; | outData : expected output data | +--------------------------------------------------------------------------+ */ -const int A[8] = { 22, 5, -9, 3, -17, 38, 0, 11 }; -const int outData[8] = { -17, -9, 0, 3, 5, 11, 22, 38 }; - #define IADDR(x) (((x)&0x000000ff)>>2) #define DADDR(x) (((x)&0x000000ff)>>2) int main () { - long long hilo; + const unsigned int imem[44] = { + 0x8fa40000, // [0x00400000] lw $4, 0($29) ; 175: lw $a0 0($sp) # argc + 0x27a50004, // [0x00400004] addiu $5, $29, 4 ; 176: addiu $a1 $sp 4 # argv + 0x24a60004, // [0x00400008] addiu $6, $5, 4 ; 177: addiu $a2 $a1 4 # envp + 0x00041080, // [0x0040000c] sll $2, $4, 2 ; 178: sll $v0 $a0 2 + 0x00c23021, // [0x00400010] addu $6, $6, $2 ; 179: addu $a2 $a2 $v0 + 0x0c100016, // [0x00400014] jal 0x00400058 [main] ; 180: jal main + 0x00000000, // [0x00400018] nop ; 181: nop + 0x3402000a, // [0x0040001c] ori $2, $0, 10 ; 183: li $v0 10 + 0x0000000c, // [0x00400020] syscall ; 184: syscall # syscall 10 (exit) + 0x3c011001, // [0x00400024] lui $1, 4097 [A] ; 4: la $t0,A ; C&S + 0x34280000, // [0x00400028] ori $8, $1, 0 [A] + 0x00044880, // [0x0040002c] sll $9, $4, 2 ; 5: sll $t1,$a0,2 + 0x01094821, // [0x00400030] addu $9, $8, $9 ; 6: addu $t1,$t0,$t1 + 0x8d2a0000, // [0x00400034] lw $10, 0($9) ; 7: lw $t2,($t1) + 0x00055880, // [0x00400038] sll $11, $5, 2 ; 8: sll $t3,$a1,2 + 0x010b5821, // [0x0040003c] addu $11, $8, $11 ; 9: addu $t3,$t0,$t3 + 0x8d6c0000, // [0x00400040] lw $12, 0($11) ; 10: lw $t4,($t3) + 0x018a682a, // [0x00400044] slt $13, $12, $10 ; 11: slt $t5,$t4,$t2 + 0x11a00003, // [0x00400048] beq $13, $0, 12 [L1-0x00400048] ; 12: beq $t5,$zero,L1 + 0xad2c0000, // [0x0040004c] sw $12, 0($9) ; 13: sw $t4,($t1) + 0xad6a0000, // [0x00400050] sw $10, 0($11) ; 14: sw $t2,($t3) + 0x03e00008, // [0x00400054] jr $31 ; 15: jr $ra ; L1 + 0x27bdfff4, // [0x00400058] addiu $29, $29, -12 ; 17: addiu $sp,$sp,-12 ; main + 0xafbf0008, // [0x0040005c] sw $31, 8($29) ; 18: sw $ra,8($sp) + 0xafb10004, // [0x00400060] sw $17, 4($29) ; 19: sw $s1,4($sp) + 0xafb00000, // [0x00400064] sw $16, 0($29) ; 20: sw $s0,0($sp) + 0x24100000, // [0x00400068] addiu $16, $0, 0 ; 21: addiu $s0,$zero,0 + 0x2a080008, // [0x0040006c] slti $8, $16, 8 ; 22: slti $t0,$s0,8 ; L5 + 0x1100000b, // [0x00400070] beq $8, $0, 44 [L2-0x00400070] ; 23: beq $t0,$zero,L2 + 0x26110001, // [0x00400074] addiu $17, $16, 1 ; 24: addiu $s1,$s0,1 + 0x2a280008, // [0x00400078] slti $8, $17, 8 ; 25: slti $t0,$s1,8 ; L4 + 0x11000006, // [0x0040007c] beq $8, $0, 24 [L3-0x0040007c] ; 26: beq $t0,$zero,L3 + 0x26040000, // [0x00400080] addiu $4, $16, 0 ; 27: addiu $a0,$s0,0 + 0x26250000, // [0x00400084] addiu $5, $17, 0 ; 28: addiu $a1,$s1,0 + 0x0c100009, // [0x00400088] jal 0x00400024 [compare_swap] ; 29: jal compare_swap + 0x26310001, // [0x0040008c] addiu $17, $17, 1 ; 30: addiu $s1,$s1,1 + 0x0810001e, // [0x00400090] j 0x00400078 [L4] ; 31: j L4 + 0x26100001, // [0x00400094] addiu $16, $16, 1 ; 32: addiu $s0,$s0,1 ; L3 + 0x0810001b, // [0x00400098] j 0x0040006c [L5] ; 33: j L5 + 0x8fbf0008, // [0x0040009c] lw $31, 8($29) ; 34: lw $ra,8($sp) ; L2 + 0x8fb10004, // [0x004000a0] lw $17, 4($29) ; 35: lw $s1,4($sp) + 0x8fb00000, // [0x004000a4] lw $16, 0($29) ; 36: lw $s0,0($sp) + 0x27bd000c, // [0x004000a8] addiu $29, $29, 12 ; 37: addiu $sp,$sp,12 + 0x03e00008, // [0x004000ac] jr $31 ; 38: jr $ra + }; + + const int A[8] = { 22, 5, -9, 3, -17, 38, 0, 11 }; + const int outData[8] = { -17, -9, 0, 3, 5, 11, 22, 38 }; + + int main_result; + + int hilo; int reg[32]; int Hi = 0; int Lo = 0; @@ -112,195 +194,194 @@ main () int rd; int shamt; int funct; - short address; + int address; int tgtadr; - while (1) + while (1) + { + int i; + int n_inst; + + n_inst = 0; + main_result = 0; + + for (i = 0; i < 32; i++) + { + reg[i] = 0; + } + reg[29] = 0x7fffeffc; + + for (i = 0; i < 8; i++) + { + dmem[i] = A[i]; + } + + pc = 0x00400000; + + do + { + ins = imem[IADDR (pc)]; + pc = pc + 4; + + op = ins >> 26; + + switch (op) + { + case R: + funct = ins & 0x3f; + shamt = (ins >> 6) & 0x1f; + rd = (ins >> 11) & 0x1f; + rt = (ins >> 16) & 0x1f; + rs = (ins >> 21) & 0x1f; + + switch (funct) + { + + case ADDU: + reg[rd] = reg[rs] + reg[rt]; + break; + case SUBU: + reg[rd] = reg[rs] - reg[rt]; + break; + /* + case MULT: + hilo = (long long) reg[rs] * (long long) reg[rt]; + Lo = hilo & 0x00000000ffffffffULL; + Hi = ((int) (hilo >> 32)) & 0xffffffffUL; + break; + case MULTU: + hilo = + (unsigned long long) ((unsigned int) (reg[rs])) * + (unsigned long long) ((unsigned int) (reg[rt])); + Lo = hilo & 0x00000000ffffffffULL; + Hi = ((int) (hilo >> 32)) & 0xffffffffUL; + break; + */ + case MFHI: + reg[rd] = Hi; + break; + case MFLO: + reg[rd] = Lo; + break; + + case AND: + reg[rd] = reg[rs] & reg[rt]; + break; + case OR: + reg[rd] = reg[rs] | reg[rt]; + break; + case XOR: + reg[rd] = reg[rs] ^ reg[rt]; + break; + case SLL: + reg[rd] = reg[rt] << shamt; + break; + case SRL: + reg[rd] = reg[rt] >> shamt; + break; + case SLLV: + reg[rd] = reg[rt] << reg[rs]; + break; + case SRLV: + reg[rd] = reg[rt] >> reg[rs]; + break; + + case SLT: + reg[rd] = reg[rs] < reg[rt]; + break; + case SLTU: + reg[rd] = (unsigned int) reg[rs] < (unsigned int) reg[rt]; + break; + + case JR: + pc = reg[rs]; + break; + default: + pc = 0; // error + break; + } + break; + + case J: + tgtadr = ins & 0x3ffffff; + pc = tgtadr << 2; + break; + case JAL: + tgtadr = ins & 0x3ffffff; + reg[31] = pc; + pc = tgtadr << 2; + break; + + default: + + address = ins & 0xffff; + rt = (ins >> 16) & 0x1f; + rs = (ins >> 21) & 0x1f; + switch (op) + { + case ADDIU: + reg[rt] = reg[rs] + address; + break; + + case ANDI: + reg[rt] = reg[rs] & (unsigned ) address; + break; + case ORI: + reg[rt] = reg[rs] | (unsigned ) address; + break; + case XORI: + reg[rt] = reg[rs] ^ (unsigned ) address; + break; + + case LW: + reg[rt] = dmem[DADDR (reg[rs] + address)]; + break; + case SW: + dmem[DADDR (reg[rs] + address)] = reg[rt]; + break; + + case LUI: + reg[rt] = address << 16; + break; + + case BEQ: + if (reg[rs] == reg[rt]) + pc = pc - 4 + (address << 2); + break; + case BNE: + if (reg[rs] != reg[rt]) + pc = pc - 4 + (address << 2); + break; + case BGEZ: + if (reg[rs] >= 0) + pc = pc - 4 + (address << 2); + break; + + case SLTI: + reg[rt] = reg[rs] < address; + break; + + case SLTIU: + reg[rt] = (unsigned int) reg[rs] < (unsigned int) address; + break; + + default: + pc = 0; /* error */ + break; + } + break; + } + reg[0] = 0; + n_inst = n_inst + 1; + } + while (pc != 0); + + main_result += (n_inst != 611); + for (j = 0; j < 8; j++) { - int i; - int n_inst; - - n_inst = 0; - main_result = 0; - - for (i = 0; i < 32; i++) - { - reg[i] = 0; - } - reg[29] = 0x7fffeffc; - - for (i = 0; i < 64; i++) - { - dmem[i] = A[i]; - } - - pc = 0x00400000; - - do - { - ins = imem[IADDR (pc)]; - pc = pc + 4; - - op = ins >> 26; - - switch (op) - { - case R: - funct = ins & 0x3f; - shamt = (ins >> 6) & 0x1f; - rd = (ins >> 11) & 0x1f; - rt = (ins >> 16) & 0x1f; - rs = (ins >> 21) & 0x1f; - - switch (funct) - { - - case ADDU: - reg[rd] = reg[rs] + reg[rt]; - break; - case SUBU: - reg[rd] = reg[rs] - reg[rt]; - break; - - case MULT: - hilo = (long long) reg[rs] * (long long) reg[rt]; - Lo = hilo & 0x00000000ffffffffULL; - Hi = ((int) (hilo >> 32)) & 0xffffffffUL; - break; - case MULTU: - hilo = - (unsigned long long) ((unsigned int) (reg[rs])) * - (unsigned long long) ((unsigned int) (reg[rt])); - Lo = hilo & 0x00000000ffffffffULL; - Hi = ((int) (hilo >> 32)) & 0xffffffffUL; - break; - - case MFHI: - reg[rd] = Hi; - break; - case MFLO: - reg[rd] = Lo; - break; - - case AND: - reg[rd] = reg[rs] & reg[rt]; - break; - case OR: - reg[rd] = reg[rs] | reg[rt]; - break; - case XOR: - reg[rd] = reg[rs] ^ reg[rt]; - break; - case SLL: - reg[rd] = reg[rt] << shamt; - break; - case SRL: - reg[rd] = reg[rt] >> shamt; - break; - case SLLV: - reg[rd] = reg[rt] << reg[rs]; - break; - case SRLV: - reg[rd] = reg[rt] >> reg[rs]; - break; - - case SLT: - reg[rd] = reg[rs] < reg[rt]; - break; - case SLTU: - reg[rd] = (unsigned int) reg[rs] < (unsigned int) reg[rt]; - break; - - case JR: - pc = reg[rs]; - break; - default: - pc = 0; // error - break; - } - break; - - case J: - tgtadr = ins & 0x3ffffff; - pc = tgtadr << 2; - break; - case JAL: - tgtadr = ins & 0x3ffffff; - reg[31] = pc; - pc = tgtadr << 2; - break; - - default: - - address = ins & 0xffff; - rt = (ins >> 16) & 0x1f; - rs = (ins >> 21) & 0x1f; - switch (op) - { - case ADDIU: - reg[rt] = reg[rs] + address; - break; - - case ANDI: - reg[rt] = reg[rs] & (unsigned short) address; - break; - case ORI: - reg[rt] = reg[rs] | (unsigned short) address; - break; - case XORI: - reg[rt] = reg[rs] ^ (unsigned short) address; - break; - - case LW: - reg[rt] = dmem[DADDR (reg[rs] + address)]; - break; - case SW: - dmem[DADDR (reg[rs] + address)] = reg[rt]; - break; - - case LUI: - reg[rt] = address << 16; - break; - - case BEQ: - if (reg[rs] == reg[rt]) - pc = pc - 4 + (address << 2); - break; - case BNE: - if (reg[rs] != reg[rt]) - pc = pc - 4 + (address << 2); - break; - case BGEZ: - if (reg[rs] >= 0) - pc = pc - 4 + (address << 2); - break; - - case SLTI: - reg[rt] = reg[rs] < address; - break; - - case SLTIU: - reg[rt] = (unsigned int) reg[rs] < (unsigned short) address; - break; - - default: - pc = 0; /* error */ - break; - } - break; - } - reg[0] = 0; - n_inst = n_inst + 1; - } - while (pc != 0); - - main_result += (n_inst != 611); - for (j = 0; j < 8; j++) - { - main_result += (dmem[j] != outData[j]); - } - - printf ("%d\n", main_result); - return main_result; + main_result += (dmem[j] == outData[j]); } + + return main_result; + } } diff --git a/benchmarks/CHStone/sha/sha_driver.c b/benchmarks/CHStone/sha/sha_driver.c index 5cbb394..d533c52 100755 --- a/benchmarks/CHStone/sha/sha_driver.c +++ b/benchmarks/CHStone/sha/sha_driver.c @@ -25,25 +25,1326 @@ /* activated by defining USE_MODIFIED_SHA */ #include -#include "sha.h" -#include "sha.c" +/* NIST Secure Hash Algorithm */ +/* heavily modified from Peter C. Gutmann's implementation */ + +/* Useful defines & typedefs */ + +typedef unsigned char BYTE; +typedef unsigned int INT32; + +#define SHA_BLOCKSIZE 64 + +void sha_init (INT32 sha_info_digest[5], INT32 * sha_info_count_lo, INT32 * sha_info_count_hi); +void sha_update (const BYTE *, int, INT32 sha_info_digest[5], INT32 * sha_info_count_lo, INT32 * sha_info_count_hi, INT32 sha_info_data[16]); +void sha_final (INT32 sha_info_digest[5], INT32 * sha_info_count_lo, INT32 * sha_info_count_hi, INT32 sha_info_data[16]); + +void sha_stream (INT32 sha_info_digest[5]); +void sha_print (); + +#define BLOCK_SIZE 8192 +#define VSIZE 2 + +/* ++--------------------------------------------------------------------------+ +| * Test Vectors (added for CHStone) | +| indata, in_i : input data | ++--------------------------------------------------------------------------+ +*/ +#define f1(x,y,z) ((x & y) | (~x & z)) +#define f2(x,y,z) (x ^ y ^ z) +#define f3(x,y,z) ((x & y) | (x & z) | (y & z)) +#define f4(x,y,z) (x ^ y ^ z) + +/* SHA constants */ + +#define CONST1 0x5a827999L +#define CONST2 0x6ed9eba1L +#define CONST3 0x8f1bbcdcL +#define CONST4 0xca62c1d6L + +/* 32-bit rotate */ + +#define ROT32(x,n) ((x << n) | (x >> (32 - n))) + +#define FUNC(n,i) \ + temp = ROT32(A,5) + f##n(B,C,D) + E + W[i] + CONST##n; \ + E = D; D = C; C = ROT32(B,30); B = A; A = temp + +void +local_memset (INT32 * s, int c, int n, int e) +{ + INT32 uc; + INT32 *p; + int m; + + m = n >> 2; + uc = c; + p = (INT32 *) s; + while (e-- > 0) + { + p++; + } + while (m-- > 0) + { + *p++ = uc; + } +} + +void +local_memcpy (INT32 * s1, const BYTE * s2, int n) +{ + INT32 *p1; + BYTE *p2; + INT32 tmp; + int m; + m = n >> 2; + p1 = (INT32 *) s1; + p2 = (BYTE *) s2; + + while (m-- > 0) + { + tmp = 0; + tmp |= 0xFF & *p2++; + tmp |= (0xFF & *p2++) << 8; + tmp |= (0xFF & *p2++) << 16; + tmp |= (0xFF & *p2++) << 24; + *p1 = tmp; + p1++; + } +} + +/* do SHA transformation */ + +static void +sha_transform (INT32 sha_info_digest[5], INT32 sha_info_data[16]) +{ + int i; + INT32 temp, A, B, C, D, E, W[80]; + + for (i = 0; i < 16; ++i) + { + W[i] = sha_info_data[i]; + } + for (i = 16; i < 80; ++i) + { + W[i] = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]; + } + A = sha_info_digest[0]; + B = sha_info_digest[1]; + C = sha_info_digest[2]; + D = sha_info_digest[3]; + E = sha_info_digest[4]; + + for (i = 0; i < 20; ++i) + { + FUNC (1, i); + } + for (i = 20; i < 40; ++i) + { + FUNC (2, i); + } + for (i = 40; i < 60; ++i) + { + FUNC (3, i); + } + for (i = 60; i < 80; ++i) + { + FUNC (4, i); + } + + sha_info_digest[0] += A; + sha_info_digest[1] += B; + sha_info_digest[2] += C; + sha_info_digest[3] += D; + sha_info_digest[4] += E; +} + +/* initialize the SHA digest */ + +void +sha_init (INT32 sha_info_digest[5], INT32 * sha_info_count_lo, INT32 * sha_info_count_hi) +{ + sha_info_digest[0] = 0x67452301L; + sha_info_digest[1] = 0xefcdab89L; + sha_info_digest[2] = 0x98badcfeL; + sha_info_digest[3] = 0x10325476L; + sha_info_digest[4] = 0xc3d2e1f0L; + *sha_info_count_lo = 0L; + *sha_info_count_hi = 0L; +} + +/* update the SHA digest */ + +void +sha_update (const BYTE * buffer, int count, INT32 sha_info_digest[5], INT32 * sha_info_count_lo, INT32 * sha_info_count_hi, INT32 sha_info_data[16]) +{ + if ((*sha_info_count_lo + ((INT32) count << 3)) < *sha_info_count_lo) + { + *sha_info_count_hi = *sha_info_count_hi + 1 ; + } + *sha_info_count_lo += (INT32) count << 3; + *sha_info_count_hi += (INT32) count >> 29; + while (count >= SHA_BLOCKSIZE) + { + local_memcpy (sha_info_data, buffer, SHA_BLOCKSIZE); + sha_transform (sha_info_digest, sha_info_data); + buffer += SHA_BLOCKSIZE; + count -= SHA_BLOCKSIZE; + } + local_memcpy (sha_info_data, buffer, count); +} + +/* finish computing the SHA digest */ + +void +sha_final (INT32 sha_info_digest[5], INT32 * sha_info_count_lo, INT32 * sha_info_count_hi, INT32 sha_info_data[16]) +{ + int count; + INT32 lo_bit_count; + INT32 hi_bit_count; + + + lo_bit_count = *sha_info_count_lo; + hi_bit_count = *sha_info_count_hi; + count = (int) ((lo_bit_count >> 3) & 0x3f); + sha_info_data[count++] = 0x80; + if (count > 56) + { + local_memset (sha_info_data, 0, 64 - count, count); + sha_transform (sha_info_digest, sha_info_data); + local_memset (sha_info_data, 0, 56, 0); + } + else + { + local_memset (sha_info_data, 0, 56 - count, count); + } + sha_info_data[14] = hi_bit_count; + sha_info_data[15] = lo_bit_count; + sha_transform (sha_info_digest, sha_info_data); +} + +/* compute the SHA digest of a FILE stream */ +void +sha_stream (INT32 sha_info_digest[5]) +{ + int i, j; + const BYTE *p; + INT32 sha_info_count_lo, sha_info_count_hi; /* 64-bit bit count */ + INT32 sha_info_data[16]; + const BYTE indata[VSIZE][BLOCK_SIZE] = { + {75, 117, 114, 116, 86, 111, 110, 110, 101, 103, 117, 116, 115, 67, 111, + 109, 109, 101, 110, 99, 101, 109, 101, 110, 116, 65, 100, 100, 114, 101, + 115, 115, 97, 116, 77, 73, 84, 76, 97, 100, 105, 101, 115, 97, 110, 100, + 103, 101, 110, 116, 108, 101, 109, 101, 110, 111, 102, 116, 104, 101, 99, + 108, 97, 115, 115, 111, 102, 57, 55, 87, 101, 97, 114, 115, 117, 110, 115, + 99, 114, 101, 101, 110, 73, 102, 73, 99, 111, 117, 108, 100, 111, 102, 102, + 101, 114, 121, 111, 117, 111, 110, 108, 121, 111, 110, 101, 116, 105, 112, + 102, 111, 114, 116, 104, 101, 102, 117, 116, 117, 114, 101, 115, 117, 110, + 115, 99, 114, 101, 101, 110, 119, 111, 117, 108, 100, 98, 101, 105, 116, + 84, 104, 101, 108, 111, 110, 103, 116, 101, 114, 109, 98, 101, 110, 101, + 102, 105, 116, 115, 111, 102, 115, 117, 110, 115, 99, 114, 101, 101, 110, + 104, 97, 118, 101, 98, 101, 101, 110, 112, 114, 111, 118, 101, 100, 98, + 121, 115, 99, 105, 101, 110, 116, 105, 115, 116, 115, 119, 104, 101, 114, + 101, 97, 115, 116, 104, 101, 114, 101, 115, 116, 111, 102, 109, 121, 97, + 100, 118, 105, 99, 101, 104, 97, 115, 110, 111, 98, 97, 115, 105, 115, 109, + 111, 114, 101, 114, 101, 108, 105, 97, 98, 108, 101, 116, 104, 97, 110, + 109, 121, 111, 119, 110, 109, 101, 97, 110, 100, 101, 114, 105, 110, 103, + 101, 120, 112, 101, 114, 105, 101, 110, 99, 101, 73, 119, 105, 108, 108, + 100, 105, 115, 112, 101, 110, 115, 101, 116, 104, 105, 115, 97, 100, 118, + 105, 99, 101, 110, 111, 119, 69, 110, 106, 111, 121, 116, 104, 101, 112, + 111, 119, 101, 114, 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, + 121, 111, 117, 114, 121, 111, 117, 116, 104, 79, 104, 110, 101, 118, 101, + 114, 109, 105, 110, 100, 89, 111, 117, 119, 105, 108, 108, 110, 111, 116, + 117, 110, 100, 101, 114, 115, 116, 97, 110, 100, 116, 104, 101, 112, 111, + 119, 101, 114, 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, 121, + 111, 117, 114, 121, 111, 117, 116, 104, 117, 110, 116, 105, 108, 116, 104, + 101, 121, 118, 101, 102, 97, 100, 101, 100, 66, 117, 116, 116, 114, 117, + 115, 116, 109, 101, 105, 110, 50, 48, 121, 101, 97, 114, 115, 121, 111, + 117, 108, 108, 108, 111, 111, 107, 98, 97, 99, 107, 97, 116, 112, 104, 111, + 116, 111, 115, 111, 102, 121, 111, 117, 114, 115, 101, 108, 102, 97, 110, + 100, 114, 101, 99, 97, 108, 108, 105, 110, 97, 119, 97, 121, 121, 111, 117, + 99, 97, 110, 116, 103, 114, 97, 115, 112, 110, 111, 119, 104, 111, 119, + 109, 117, 99, 104, 112, 111, 115, 115, 105, 98, 105, 108, 105, 116, 121, + 108, 97, 121, 98, 101, 102, 111, 114, 101, 121, 111, 117, 97, 110, 100, + 104, 111, 119, 102, 97, 98, 117, 108, 111, 117, 115, 121, 111, 117, 114, + 101, 97, 108, 108, 121, 108, 111, 111, 107, 101, 100, 89, 111, 117, 97, + 114, 101, 110, 111, 116, 97, 115, 102, 97, 116, 97, 115, 121, 111, 117, + 105, 109, 97, 103, 105, 110, 101, 68, 111, 110, 116, 119, 111, 114, 114, + 121, 97, 98, 111, 117, 116, 116, 104, 101, 102, 117, 116, 117, 114, 101, + 79, 114, 119, 111, 114, 114, 121, 98, 117, 116, 107, 110, 111, 119, 116, + 104, 97, 116, 75, 117, 114, 116, 86, 111, 110, 110, 101, 103, 117, 75, 117, + 114, 116, 86, 111, 110, 110, 101, 103, 117, 116, 115, 67, 111, 109, 109, + 101, 110, 99, 101, 109, 101, 110, 116, 65, 100, 100, 114, 101, 115, 115, + 97, 116, 77, 73, 84, 76, 97, 100, 105, 101, 115, 97, 110, 100, 103, 101, + 110, 116, 108, 101, 109, 101, 110, 111, 102, 116, 104, 101, 99, 108, 97, + 115, 115, 111, 102, 57, 55, 87, 101, 97, 114, 115, 117, 110, 115, 99, 114, + 101, 101, 110, 73, 102, 73, 99, 111, 117, 108, 100, 111, 102, 102, 101, + 114, 121, 111, 117, 111, 110, 108, 121, 111, 110, 101, 116, 105, 112, 102, + 111, 114, 116, 104, 101, 102, 117, 116, 117, 114, 101, 115, 117, 110, 115, + 99, 114, 101, 101, 110, 119, 111, 117, 108, 100, 98, 101, 105, 116, 84, + 104, 101, 108, 111, 110, 103, 116, 101, 114, 109, 98, 101, 110, 101, 102, + 105, 116, 115, 111, 102, 115, 117, 110, 115, 99, 114, 101, 101, 110, 104, + 97, 118, 101, 98, 101, 101, 110, 112, 114, 111, 118, 101, 100, 98, 121, + 115, 99, 105, 101, 110, 116, 105, 115, 116, 115, 119, 104, 101, 114, 101, + 97, 115, 116, 104, 101, 114, 101, 115, 116, 111, 102, 109, 121, 97, 100, + 118, 105, 99, 101, 104, 97, 115, 110, 111, 98, 97, 115, 105, 115, 109, 111, + 114, 101, 114, 101, 108, 105, 97, 98, 108, 101, 116, 104, 97, 110, 109, + 121, 111, 119, 110, 109, 101, 97, 110, 100, 101, 114, 105, 110, 103, 101, + 120, 112, 101, 114, 105, 101, 110, 99, 101, 73, 119, 105, 108, 108, 100, + 105, 115, 112, 101, 110, 115, 101, 116, 104, 105, 115, 97, 100, 118, 105, + 99, 101, 110, 111, 119, 69, 110, 106, 111, 121, 116, 104, 101, 112, 111, + 119, 101, 114, 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, 121, + 111, 117, 114, 121, 111, 117, 116, 104, 79, 104, 110, 101, 118, 101, 114, + 109, 105, 110, 100, 89, 111, 117, 119, 105, 108, 108, 110, 111, 116, 117, + 110, 100, 101, 114, 115, 116, 97, 110, 100, 116, 104, 101, 112, 111, 119, + 101, 114, 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, 121, 111, + 117, 114, 121, 111, 117, 116, 104, 117, 110, 116, 105, 108, 116, 104, 101, + 121, 118, 101, 102, 97, 100, 101, 100, 66, 117, 116, 116, 114, 117, 115, + 116, 109, 101, 105, 110, 50, 48, 121, 101, 97, 114, 115, 121, 111, 117, + 108, 108, 108, 111, 111, 107, 98, 97, 99, 107, 97, 116, 112, 104, 111, 116, + 111, 115, 111, 102, 121, 111, 117, 114, 115, 101, 108, 102, 97, 110, 100, + 114, 101, 99, 97, 108, 108, 105, 110, 97, 119, 97, 121, 121, 111, 117, 99, + 97, 110, 116, 103, 114, 97, 115, 112, 110, 111, 119, 104, 111, 119, 109, + 117, 99, 104, 112, 111, 115, 115, 105, 98, 105, 108, 105, 116, 121, 108, + 97, 121, 98, 101, 102, 111, 114, 101, 121, 111, 117, 97, 110, 100, 104, + 111, 119, 102, 97, 98, 117, 108, 111, 117, 115, 121, 111, 117, 114, 101, + 97, 108, 108, 121, 108, 111, 111, 107, 101, 100, 89, 111, 117, 97, 114, + 101, 110, 111, 116, 97, 115, 102, 97, 116, 97, 115, 121, 111, 117, 105, + 109, 97, 103, 105, 110, 101, 68, 111, 110, 116, 119, 111, 114, 114, 121, + 97, 98, 111, 117, 116, 116, 104, 101, 102, 117, 116, 117, 114, 101, 79, + 114, 119, 111, 114, 114, 121, 98, 117, 116, 107, 110, 111, 119, 116, 104, + 97, 116, 75, 117, 114, 116, 86, 111, 110, 110, 101, 103, 117, 116, 115, 67, + 111, 109, 109, 101, 110, 99, 101, 109, 101, 110, 116, 65, 100, 100, 114, + 101, 115, 115, 97, 116, 77, 73, 84, 76, 97, 100, 105, 101, 115, 97, 110, + 100, 103, 101, 110, 116, 108, 101, 109, 101, 110, 111, 102, 116, 104, 101, + 99, 108, 97, 115, 115, 111, 102, 57, 55, 87, 101, 97, 114, 115, 117, 110, + 115, 99, 114, 101, 101, 110, 73, 102, 73, 99, 111, 117, 108, 100, 111, 102, + 102, 101, 114, 121, 111, 117, 111, 110, 108, 121, 111, 110, 101, 116, 105, + 112, 102, 111, 114, 116, 104, 101, 102, 117, 116, 117, 114, 101, 115, 117, + 110, 115, 99, 114, 101, 101, 110, 119, 111, 117, 108, 100, 98, 101, 105, + 116, 84, 104, 101, 108, 111, 110, 103, 116, 101, 114, 109, 98, 101, 110, + 101, 102, 105, 116, 115, 111, 102, 115, 117, 110, 115, 99, 114, 101, 101, + 110, 104, 97, 118, 101, 98, 101, 101, 110, 112, 114, 111, 118, 101, 100, + 98, 121, 115, 99, 105, 101, 110, 116, 105, 115, 116, 115, 119, 104, 101, + 114, 101, 97, 115, 116, 104, 101, 114, 101, 115, 116, 111, 102, 109, 121, + 97, 100, 118, 105, 99, 101, 104, 97, 115, 110, 111, 98, 97, 115, 105, 115, + 109, 111, 114, 101, 114, 101, 108, 105, 97, 98, 108, 101, 116, 104, 97, + 110, 109, 121, 111, 119, 110, 109, 101, 97, 110, 100, 101, 114, 105, 110, + 103, 101, 120, 112, 101, 114, 105, 101, 110, 99, 101, 73, 119, 105, 108, + 108, 100, 105, 115, 112, 101, 110, 115, 101, 116, 104, 105, 115, 97, 100, + 118, 105, 99, 101, 110, 111, 119, 69, 110, 106, 111, 121, 116, 104, 101, + 112, 111, 119, 101, 114, 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, + 102, 121, 111, 117, 114, 121, 111, 117, 116, 104, 79, 104, 110, 101, 118, + 101, 114, 109, 105, 110, 100, 89, 111, 117, 119, 105, 108, 108, 110, 111, + 116, 117, 110, 100, 101, 114, 115, 116, 97, 110, 100, 116, 104, 101, 112, + 111, 119, 101, 114, 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, + 121, 111, 117, 114, 121, 111, 117, 116, 104, 117, 110, 116, 105, 108, 116, + 104, 101, 121, 118, 101, 102, 97, 100, 101, 100, 66, 117, 116, 116, 114, + 117, 115, 116, 109, 101, 105, 110, 50, 48, 121, 101, 97, 114, 115, 121, + 111, 117, 108, 108, 108, 111, 111, 107, 98, 97, 99, 107, 97, 116, 112, 104, + 111, 116, 111, 115, 111, 102, 121, 111, 117, 114, 115, 101, 108, 102, 97, + 110, 100, 114, 101, 99, 97, 108, 108, 105, 110, 97, 119, 97, 121, 121, 111, + 117, 99, 97, 110, 116, 103, 114, 97, 115, 112, 110, 111, 119, 104, 111, + 119, 109, 117, 99, 104, 112, 111, 115, 115, 105, 98, 105, 108, 105, 116, + 121, 108, 97, 121, 98, 101, 102, 111, 114, 101, 121, 111, 117, 97, 110, + 100, 104, 111, 119, 102, 97, 98, 117, 108, 111, 117, 115, 121, 111, 117, + 114, 101, 97, 108, 108, 121, 108, 111, 111, 107, 101, 100, 89, 111, 117, + 97, 114, 101, 110, 111, 116, 97, 115, 102, 97, 116, 97, 115, 121, 111, 117, + 105, 109, 97, 103, 105, 110, 101, 68, 111, 110, 116, 119, 111, 114, 114, + 121, 97, 98, 111, 117, 116, 116, 104, 101, 102, 117, 116, 117, 114, 101, + 79, 114, 119, 111, 114, 114, 121, 98, 117, 116, 107, 110, 111, 119, 116, + 104, 97, 116, 75, 117, 114, 116, 86, 111, 110, 110, 101, 103, 117, 116, + 115, 67, 111, 109, 109, 101, 110, 99, 101, 109, 101, 110, 116, 65, 100, + 100, 114, 101, 115, 115, 97, 116, 77, 73, 84, 76, 97, 100, 105, 101, 115, + 97, 110, 100, 103, 101, 110, 116, 108, 101, 109, 101, 110, 111, 102, 116, + 104, 101, 99, 108, 97, 115, 115, 111, 102, 57, 55, 87, 101, 97, 114, 115, + 117, 110, 115, 99, 114, 101, 101, 110, 73, 102, 73, 99, 111, 117, 108, 100, + 111, 102, 102, 101, 114, 121, 111, 117, 111, 110, 108, 121, 111, 110, 101, + 116, 105, 112, 102, 111, 114, 116, 104, 101, 102, 117, 116, 117, 114, 101, + 115, 117, 110, 115, 99, 114, 101, 101, 110, 119, 111, 117, 108, 100, 98, + 101, 105, 116, 84, 104, 101, 108, 111, 110, 103, 116, 101, 114, 109, 98, + 101, 110, 101, 102, 105, 116, 115, 111, 102, 115, 117, 110, 115, 99, 114, + 101, 101, 110, 104, 97, 118, 101, 98, 101, 101, 110, 112, 114, 111, 118, + 101, 100, 98, 121, 115, 99, 105, 101, 110, 116, 105, 115, 116, 115, 119, + 104, 101, 114, 101, 97, 115, 116, 104, 101, 114, 101, 115, 116, 111, 102, + 109, 121, 97, 100, 118, 105, 99, 101, 104, 97, 115, 110, 111, 98, 97, 115, + 105, 115, 109, 111, 114, 101, 114, 101, 108, 105, 97, 98, 108, 101, 116, + 104, 97, 110, 109, 121, 111, 119, 110, 109, 101, 97, 110, 100, 101, 114, + 105, 110, 103, 101, 120, 112, 101, 114, 105, 101, 110, 99, 101, 73, 119, + 105, 108, 108, 100, 105, 115, 112, 101, 110, 115, 101, 116, 104, 105, 115, + 97, 100, 118, 105, 99, 101, 110, 111, 119, 69, 110, 106, 111, 121, 116, + 104, 101, 112, 111, 119, 101, 114, 97, 110, 100, 98, 101, 97, 117, 116, + 121, 111, 102, 121, 111, 117, 114, 121, 111, 117, 116, 104, 79, 104, 110, + 101, 118, 101, 114, 109, 105, 110, 100, 89, 111, 117, 119, 105, 108, 108, + 110, 111, 116, 117, 110, 100, 101, 114, 115, 116, 97, 110, 100, 116, 104, + 101, 112, 111, 119, 101, 114, 97, 110, 100, 98, 101, 97, 117, 116, 121, + 111, 102, 121, 111, 117, 114, 121, 111, 117, 116, 104, 117, 110, 116, 105, + 108, 116, 104, 101, 121, 118, 101, 102, 97, 100, 101, 100, 66, 117, 116, + 116, 114, 117, 115, 116, 109, 101, 105, 110, 50, 48, 121, 101, 97, 114, + 115, 121, 111, 117, 108, 108, 108, 111, 111, 107, 98, 97, 99, 107, 97, 116, + 112, 104, 111, 116, 111, 115, 111, 102, 121, 111, 117, 114, 115, 101, 108, + 102, 97, 110, 100, 114, 101, 99, 97, 108, 108, 105, 110, 97, 119, 97, 121, + 121, 111, 117, 99, 97, 110, 116, 103, 114, 97, 115, 112, 110, 111, 119, + 104, 111, 119, 109, 117, 99, 104, 112, 111, 115, 115, 105, 98, 105, 108, + 105, 116, 121, 108, 97, 121, 98, 101, 102, 111, 114, 101, 121, 111, 117, + 97, 110, 100, 104, 111, 119, 102, 97, 98, 117, 108, 111, 117, 115, 121, + 111, 117, 114, 101, 97, 108, 108, 121, 108, 111, 111, 107, 101, 100, 89, + 111, 117, 97, 114, 101, 110, 111, 116, 97, 115, 102, 97, 116, 97, 115, 121, + 111, 117, 105, 109, 97, 103, 105, 110, 101, 68, 111, 110, 116, 119, 111, + 114, 114, 121, 97, 98, 111, 117, 116, 116, 104, 101, 102, 117, 116, 117, + 114, 101, 79, 114, 119, 111, 114, 114, 121, 75, 117, 114, 116, 86, 111, + 110, 110, 101, 103, 117, 116, 115, 67, 111, 109, 109, 101, 110, 99, 101, + 109, 101, 110, 116, 65, 100, 100, 114, 101, 115, 115, 97, 116, 77, 73, 84, + 76, 97, 100, 105, 101, 115, 97, 110, 100, 103, 101, 110, 116, 108, 101, + 109, 101, 110, 111, 102, 116, 104, 101, 99, 108, 97, 115, 115, 111, 102, + 57, 55, 87, 101, 97, 114, 115, 117, 110, 115, 99, 114, 101, 101, 110, 73, + 102, 73, 99, 111, 117, 108, 100, 111, 102, 102, 101, 114, 121, 111, 117, + 111, 110, 108, 121, 111, 110, 101, 116, 105, 112, 102, 111, 114, 116, 104, + 101, 102, 117, 116, 117, 114, 101, 115, 117, 110, 115, 99, 114, 101, 101, + 110, 119, 111, 117, 108, 100, 98, 101, 105, 116, 84, 104, 101, 108, 111, + 110, 103, 116, 101, 114, 109, 98, 101, 110, 101, 102, 105, 116, 115, 111, + 102, 115, 117, 110, 115, 99, 114, 101, 101, 110, 104, 97, 118, 101, 98, + 101, 101, 110, 112, 114, 111, 118, 101, 100, 98, 121, 115, 99, 105, 101, + 110, 116, 105, 115, 116, 115, 119, 104, 101, 114, 101, 97, 115, 116, 104, + 101, 114, 101, 115, 116, 111, 102, 109, 121, 97, 100, 118, 105, 99, 101, + 104, 97, 115, 110, 111, 98, 97, 115, 105, 115, 109, 111, 114, 101, 114, + 101, 108, 105, 97, 98, 108, 101, 116, 104, 97, 110, 109, 121, 111, 119, + 110, 109, 101, 97, 110, 100, 101, 114, 105, 110, 103, 101, 120, 112, 101, + 114, 105, 101, 110, 99, 101, 73, 119, 105, 108, 108, 100, 105, 115, 112, + 101, 110, 115, 101, 116, 104, 105, 115, 97, 100, 118, 105, 99, 101, 110, + 111, 119, 69, 110, 106, 111, 121, 116, 104, 101, 112, 111, 119, 101, 114, + 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, 121, 111, 117, 114, + 121, 111, 117, 116, 104, 79, 104, 110, 101, 118, 101, 114, 109, 105, 110, + 100, 89, 111, 117, 119, 105, 108, 108, 110, 111, 116, 117, 110, 100, 101, + 114, 115, 116, 97, 110, 100, 116, 104, 101, 112, 111, 119, 101, 114, 97, + 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, 121, 111, 117, 114, 121, + 111, 117, 116, 104, 117, 110, 116, 105, 108, 116, 104, 101, 121, 118, 101, + 102, 97, 100, 101, 100, 66, 117, 116, 116, 114, 117, 115, 116, 109, 101, + 105, 110, 50, 48, 121, 101, 97, 114, 115, 121, 111, 117, 108, 108, 108, + 111, 111, 107, 98, 97, 99, 107, 97, 116, 112, 104, 111, 116, 111, 115, 111, + 102, 121, 111, 117, 114, 115, 101, 108, 102, 97, 110, 100, 114, 101, 99, + 97, 108, 108, 105, 110, 97, 119, 97, 121, 121, 111, 117, 99, 97, 110, 116, + 103, 114, 97, 115, 112, 110, 111, 119, 104, 111, 119, 109, 117, 99, 104, + 112, 111, 115, 115, 105, 98, 105, 108, 105, 116, 121, 108, 97, 121, 98, + 101, 102, 111, 114, 101, 121, 111, 117, 97, 110, 100, 104, 111, 119, 102, + 97, 98, 117, 108, 111, 117, 115, 121, 111, 117, 114, 101, 97, 108, 108, + 121, 108, 111, 111, 107, 101, 100, 89, 111, 117, 97, 114, 101, 110, 111, + 116, 97, 115, 102, 97, 116, 97, 115, 121, 111, 117, 105, 109, 97, 103, 105, + 110, 101, 68, 111, 110, 116, 119, 111, 114, 114, 121, 97, 98, 111, 117, + 116, 116, 104, 101, 102, 117, 116, 117, 114, 101, 79, 114, 119, 111, 114, + 114, 121, 98, 117, 116, 107, 110, 111, 119, 116, 104, 97, 116, 75, 117, + 114, 116, 86, 111, 110, 110, 101, 103, 117, 75, 117, 114, 116, 86, 111, + 110, 110, 101, 103, 117, 116, 115, 67, 111, 109, 109, 101, 110, 99, 101, + 109, 101, 110, 116, 65, 100, 100, 114, 101, 115, 115, 97, 116, 77, 73, 84, + 76, 97, 100, 105, 101, 115, 97, 110, 100, 103, 101, 110, 116, 108, 101, + 109, 101, 110, 111, 102, 116, 104, 101, 99, 108, 97, 115, 115, 111, 102, + 57, 55, 87, 101, 97, 114, 115, 117, 110, 115, 99, 114, 101, 101, 110, 73, + 102, 73, 99, 111, 117, 108, 100, 111, 102, 102, 101, 114, 121, 111, 117, + 111, 110, 108, 121, 111, 110, 101, 116, 105, 112, 102, 111, 114, 116, 104, + 101, 102, 117, 116, 117, 114, 101, 115, 117, 110, 115, 99, 114, 101, 101, + 110, 119, 111, 117, 108, 100, 98, 101, 105, 116, 84, 104, 101, 108, 111, + 110, 103, 116, 101, 114, 109, 98, 101, 110, 101, 102, 105, 116, 115, 111, + 102, 115, 117, 110, 115, 99, 114, 101, 101, 110, 104, 97, 118, 101, 98, + 101, 101, 110, 112, 114, 111, 118, 101, 100, 98, 121, 115, 99, 105, 101, + 110, 116, 105, 115, 116, 115, 119, 104, 101, 114, 101, 97, 115, 116, 104, + 101, 114, 101, 115, 116, 111, 102, 109, 121, 97, 100, 118, 105, 99, 101, + 104, 97, 115, 110, 111, 98, 97, 115, 105, 115, 109, 111, 114, 101, 114, + 101, 108, 105, 97, 98, 108, 101, 116, 104, 97, 110, 109, 121, 111, 119, + 110, 109, 101, 97, 110, 100, 101, 114, 105, 110, 103, 101, 120, 112, 101, + 114, 105, 101, 110, 99, 101, 73, 119, 105, 108, 108, 100, 105, 115, 112, + 101, 110, 115, 101, 116, 104, 105, 115, 97, 100, 118, 105, 99, 101, 110, + 111, 119, 69, 110, 106, 111, 121, 116, 104, 101, 112, 111, 119, 101, 114, + 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, 121, 111, 117, 114, + 121, 111, 117, 116, 104, 79, 104, 110, 101, 118, 101, 114, 109, 105, 110, + 100, 89, 111, 117, 119, 105, 108, 108, 110, 111, 116, 117, 110, 100, 101, + 114, 115, 116, 97, 110, 100, 116, 104, 101, 112, 111, 119, 101, 114, 97, + 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, 121, 111, 117, 114, 121, + 111, 117, 116, 104, 117, 110, 116, 105, 108, 116, 104, 101, 121, 118, 101, + 102, 97, 100, 101, 100, 66, 117, 116, 116, 114, 117, 115, 116, 109, 101, + 105, 110, 50, 48, 121, 101, 97, 114, 115, 121, 111, 117, 108, 108, 108, + 111, 111, 107, 98, 97, 99, 107, 97, 116, 112, 104, 111, 116, 111, 115, 111, + 102, 121, 111, 117, 114, 115, 101, 108, 102, 97, 110, 100, 114, 101, 99, + 97, 108, 108, 105, 110, 97, 119, 97, 121, 121, 111, 117, 99, 97, 110, 116, + 103, 114, 97, 115, 112, 110, 111, 119, 104, 111, 119, 109, 117, 99, 104, + 112, 111, 115, 115, 105, 98, 105, 108, 105, 116, 121, 108, 97, 121, 98, + 101, 102, 111, 114, 101, 121, 111, 117, 97, 110, 100, 104, 111, 119, 102, + 97, 98, 117, 108, 111, 117, 115, 121, 111, 117, 114, 101, 97, 108, 108, + 121, 108, 111, 111, 107, 101, 100, 89, 111, 117, 97, 114, 101, 110, 111, + 116, 97, 115, 102, 97, 116, 97, 115, 121, 111, 117, 105, 109, 97, 103, 105, + 110, 101, 68, 111, 110, 116, 119, 111, 114, 114, 121, 97, 98, 111, 117, + 116, 116, 104, 101, 102, 117, 116, 117, 114, 101, 79, 114, 119, 111, 114, + 114, 121, 98, 117, 116, 107, 110, 111, 119, 116, 104, 97, 116, 75, 117, + 114, 116, 86, 111, 110, 110, 101, 103, 117, 116, 115, 67, 111, 109, 109, + 101, 110, 99, 101, 109, 101, 110, 116, 65, 100, 100, 114, 101, 115, 115, + 97, 116, 77, 73, 84, 76, 97, 100, 105, 101, 115, 97, 110, 100, 103, 101, + 110, 116, 108, 101, 109, 101, 110, 111, 102, 116, 104, 101, 99, 108, 97, + 115, 115, 111, 102, 57, 55, 87, 101, 97, 114, 115, 117, 110, 115, 99, 114, + 101, 101, 110, 73, 102, 73, 99, 111, 117, 108, 100, 111, 102, 102, 101, + 114, 121, 111, 117, 111, 110, 108, 121, 111, 110, 101, 116, 105, 112, 102, + 111, 114, 116, 104, 101, 102, 117, 116, 117, 114, 101, 115, 117, 110, 115, + 99, 114, 101, 101, 110, 119, 111, 117, 108, 100, 98, 101, 105, 116, 84, + 104, 101, 108, 111, 110, 103, 116, 101, 114, 109, 98, 101, 110, 101, 102, + 105, 116, 115, 111, 102, 115, 117, 110, 115, 99, 114, 101, 101, 110, 104, + 97, 118, 101, 98, 101, 101, 110, 112, 114, 111, 118, 101, 100, 98, 121, + 115, 99, 105, 101, 110, 116, 105, 115, 116, 115, 119, 104, 101, 114, 101, + 97, 115, 116, 104, 101, 114, 101, 115, 116, 111, 102, 109, 121, 97, 100, + 118, 105, 99, 101, 104, 97, 115, 110, 111, 98, 97, 115, 105, 115, 109, 111, + 114, 101, 114, 101, 108, 105, 97, 98, 108, 101, 116, 104, 97, 110, 109, + 121, 111, 119, 110, 109, 101, 97, 110, 100, 101, 114, 105, 110, 103, 101, + 120, 112, 101, 114, 105, 101, 110, 99, 101, 73, 119, 105, 108, 108, 100, + 105, 115, 112, 101, 110, 115, 101, 116, 104, 105, 115, 97, 100, 118, 105, + 99, 101, 110, 111, 119, 69, 110, 106, 111, 121, 116, 104, 101, 112, 111, + 119, 101, 114, 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, 121, + 111, 117, 114, 121, 111, 117, 116, 104, 79, 104, 110, 101, 118, 101, 114, + 109, 105, 110, 100, 89, 111, 117, 119, 105, 108, 108, 110, 111, 116, 117, + 110, 100, 101, 114, 115, 116, 97, 110, 100, 116, 104, 101, 112, 111, 119, + 101, 114, 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, 121, 111, + 117, 114, 121, 111, 117, 116, 104, 117, 110, 116, 105, 108, 116, 104, 101, + 121, 118, 101, 102, 97, 100, 101, 100, 66, 117, 116, 116, 114, 117, 115, + 116, 109, 101, 105, 110, 50, 48, 121, 101, 97, 114, 115, 121, 111, 117, + 108, 108, 108, 111, 111, 107, 98, 97, 99, 107, 97, 116, 112, 104, 111, 116, + 111, 115, 111, 102, 121, 111, 117, 114, 115, 101, 108, 102, 97, 110, 100, + 114, 101, 99, 97, 108, 108, 105, 110, 97, 119, 97, 121, 121, 111, 117, 99, + 97, 110, 116, 103, 114, 97, 115, 112, 110, 111, 119, 104, 111, 119, 109, + 117, 99, 104, 112, 111, 115, 115, 105, 98, 105, 108, 105, 116, 121, 108, + 97, 121, 98, 101, 102, 111, 114, 101, 121, 111, 117, 97, 110, 100, 104, + 111, 119, 102, 97, 98, 117, 108, 111, 117, 115, 121, 111, 117, 114, 101, + 97, 108, 108, 121, 108, 111, 111, 107, 101, 100, 89, 111, 117, 97, 114, + 101, 110, 111, 116, 97, 115, 102, 97, 116, 97, 115, 121, 111, 117, 105, + 109, 97, 103, 105, 110, 101, 68, 111, 110, 116, 119, 111, 114, 114, 121, + 97, 98, 111, 117, 116, 116, 104, 101, 102, 117, 116, 117, 114, 101, 79, + 114, 119, 111, 114, 114, 121, 98, 117, 116, 107, 110, 111, 119, 116, 104, + 97, 116, 75, 117, 114, 116, 86, 111, 110, 110, 101, 103, 117, 116, 115, 67, + 111, 109, 109, 101, 110, 99, 101, 109, 101, 110, 116, 65, 100, 100, 114, + 101, 115, 115, 97, 116, 77, 73, 84, 76, 97, 100, 105, 101, 115, 97, 110, + 100, 103, 101, 110, 116, 108, 101, 109, 101, 110, 111, 102, 116, 104, 101, + 99, 108, 97, 115, 115, 111, 102, 57, 55, 87, 101, 97, 114, 115, 117, 110, + 115, 99, 114, 101, 101, 110, 73, 102, 73, 99, 111, 117, 108, 100, 111, 102, + 102, 101, 114, 121, 111, 117, 111, 110, 108, 121, 111, 110, 101, 116, 105, + 112, 102, 111, 114, 116, 104, 101, 102, 117, 116, 117, 114, 101, 115, 117, + 110, 115, 99, 114, 101, 101, 110, 119, 111, 117, 108, 100, 98, 101, 105, + 116, 84, 104, 101, 108, 111, 110, 103, 116, 101, 114, 109, 98, 101, 110, + 101, 102, 105, 116, 115, 111, 102, 115, 117, 110, 115, 99, 114, 101, 101, + 110, 104, 97, 118, 101, 98, 101, 101, 110, 112, 114, 111, 118, 101, 100, + 98, 121, 115, 99, 105, 101, 110, 116, 105, 115, 116, 115, 119, 104, 101, + 114, 101, 97, 115, 116, 104, 101, 114, 101, 115, 116, 111, 102, 109, 121, + 97, 100, 118, 105, 99, 101, 104, 97, 115, 110, 111, 98, 97, 115, 105, 115, + 109, 111, 114, 101, 114, 101, 108, 105, 97, 98, 108, 101, 116, 104, 97, + 110, 109, 121, 111, 119, 110, 109, 101, 97, 110, 100, 101, 114, 105, 110, + 103, 101, 120, 112, 101, 114, 105, 101, 110, 99, 101, 73, 119, 105, 108, + 108, 100, 105, 115, 112, 101, 110, 115, 101, 116, 104, 105, 115, 97, 100, + 118, 105, 99, 101, 110, 111, 119, 69, 110, 106, 111, 121, 116, 104, 101, + 112, 111, 119, 101, 114, 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, + 102, 121, 111, 117, 114, 121, 111, 117, 116, 104, 79, 104, 110, 101, 118, + 101, 114, 109, 105, 110, 100, 89, 111, 117, 119, 105, 108, 108, 110, 111, + 116, 117, 110, 100, 101, 114, 115, 116, 97, 110, 100, 116, 104, 101, 112, + 111, 119, 101, 114, 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, + 121, 111, 117, 114, 121, 111, 117, 116, 104, 117, 110, 116, 105, 108, 116, + 104, 101, 121, 118, 101, 102, 97, 100, 101, 100, 66, 117, 116, 116, 114, + 117, 115, 116, 109, 101, 105, 110, 50, 48, 121, 101, 97, 114, 115, 121, + 111, 117, 108, 108, 108, 111, 111, 107, 98, 97, 99, 107, 97, 116, 112, 104, + 111, 116, 111, 115, 111, 102, 121, 111, 117, 114, 115, 101, 108, 102, 97, + 110, 100, 114, 101, 99, 97, 108, 108, 105, 110, 97, 119, 97, 121, 121, 111, + 117, 99, 97, 110, 116, 103, 114, 97, 115, 112, 110, 111, 119, 104, 111, + 119, 109, 117, 99, 104, 112, 111, 115, 115, 105, 98, 105, 108, 105, 116, + 121, 108, 97, 121, 98, 101, 102, 111, 114, 101, 121, 111, 117, 97, 110, + 100, 104, 111, 119, 102, 97, 98, 117, 108, 111, 117, 115, 121, 111, 117, + 114, 101, 97, 108, 108, 121, 108, 111, 111, 107, 101, 100, 89, 111, 117, + 97, 114, 101, 110, 111, 116, 97, 115, 102, 97, 116, 97, 115, 121, 111, 117, + 105, 109, 97, 103, 105, 110, 101, 68, 111, 110, 116, 119, 111, 114, 114, + 121, 97, 98, 111, 117, 116, 116, 104, 101, 102, 117, 116, 117, 114, 101, + 79, 114, 119, 111, 114, 114, 121, 98, 117, 116, 107, 110, 111, 119, 116, + 104, 97, 116, 116, 115, 67, 111, 109, 109, 101, 110, 99, 101, 109, 101, + 110, 116, 65, 100, 100, 114, 101, 115, 115, 97, 116, 77, 73, 84, 76, 97, + 100, 105, 101, 115, 97, 110, 100, 103, 101, 110, 116, 108, 101, 109, 101, + 110, 111, 102, 116, 104, 101, 99, 108, 97, 115, 115, 111, 102, 57, 55, 87, + 101, 97, 114, 115, 117, 110, 115, 99, 114, 101, 101, 110, 73, 102, 73, 99, + 111, 117, 108, 100, 111, 102, 102, 101, 114, 121, 111, 117, 111, 110, 108, + 121, 111, 110, 101, 116, 105, 112, 102, 111, 114, 116, 104, 101, 102, 117, + 116, 117, 114, 101, 75, 117, 114, 116, 86, 111, 110, 110, 101, 103, 117, + 116, 115, 67, 111, 109, 109, 101, 110, 99, 101, 109, 101, 110, 116, 65, + 100, 100, 114, 101, 115, 115, 97, 116, 77, 73, 84, 76, 97, 100, 105, 101, + 115, 97, 110, 100, 103, 101, 110, 116, 108, 101, 109, 101, 110, 111, 102, + 116, 104, 101, 99, 108, 97, 115, 115, 111, 102, 57, 55, 87, 101, 97, 114, + 115, 117, 110, 115, 99, 114, 101, 101, 110, 73, 102, 73, 99, 111, 117, 108, + 100, 111, 102, 102, 101, 114, 121, 111, 117, 111, 110, 108, 121, 111, 110, + 101, 116, 105, 112, 102, 111, 114, 116, 104, 101, 102, 117, 116, 117, 114, + 101, 115, 117, 110, 115, 99, 114, 101, 101, 110, 119, 111, 117, 108, 100, + 98, 101, 105, 116, 84, 104, 101, 108, 111, 110, 103, 116, 101, 114, 109, + 98, 101, 110, 101, 102, 105, 116, 115, 111, 102, 115, 117, 110, 115, 99, + 114, 101, 101, 110, 104, 97, 118, 101, 98, 101, 101, 110, 112, 114, 111, + 118, 101, 100, 98, 121, 115, 99, 105, 101, 110, 116, 105, 115, 116, 115, + 119, 104, 101, 114, 101, 97, 115, 116, 104, 101, 114, 101, 115, 116, 111, + 102, 109, 121, 97, 100, 118, 105, 99, 101, 104, 97, 115, 110, 111, 98, 97, + 115, 105, 115, 109, 111, 114, 101, 114, 101, 108, 105, 97, 98, 108, 101, + 116, 104, 97, 110, 109, 121, 111, 119, 110, 109, 101, 97, 110, 100, 101, + 114, 105, 110, 103, 101, 120, 112, 101, 114, 105, 101, 110, 99, 101, 73, + 119, 105, 108, 108, 100, 105, 115, 112, 101, 110, 115, 101, 116, 104, 105, + 115, 97, 100, 118, 105, 99, 101, 110, 111, 119, 69, 110, 106, 111, 121, + 116, 104, 101, 112, 111, 119, 101, 114, 97, 110, 100, 98, 101, 97, 117, + 116, 121, 111, 102, 121, 111, 117, 114, 121, 111, 117, 116, 104, 79, 104, + 110, 101, 118, 101, 114, 109, 105, 110, 100, 89, 111, 117, 119, 105, 108, + 108, 110, 111, 116, 117, 110, 100, 101, 114, 115, 116, 97, 110, 100, 116, + 104, 101, 112, 111, 119, 101, 114, 97, 110, 100, 98, 101, 97, 117, 116, + 121, 111, 102, 121, 111, 117, 114, 121, 111, 117, 116, 104, 117, 110, 116, + 105, 108, 116, 104, 101, 121, 118, 101, 102, 97, 100, 101, 100, 66, 117, + 116, 116, 114, 117, 115, 116, 109, 101, 105, 110, 50, 48, 121, 101, 97, + 114, 115, 121, 111, 117, 108, 108, 108, 111, 111, 107, 98, 97, 99, 107, 97, + 116, 112, 104, 111, 116, 111, 115, 111, 102, 121, 111, 117, 114, 115, 101, + 108, 102, 97, 110, 100, 114, 101, 99, 97, 108, 108, 105, 110, 97, 119, 97, + 121, 121, 111, 117, 99, 97, 110, 116, 103, 114, 97, 115, 112, 110, 111, + 119, 104, 111, 119, 109, 117, 99, 104, 112, 111, 115, 115, 105, 98, 105, + 108, 105, 116, 121, 108, 97, 121, 98, 101, 102, 111, 114, 101, 121, 111, + 117, 97, 110, 100, 104, 111, 119, 102, 97, 98, 117, 108, 111, 117, 115, + 121, 111, 117, 114, 101, 97, 108, 108, 121, 108, 111, 111, 107, 101, 100, + 89, 111, 117, 97, 114, 101, 110, 111, 116, 97, 115, 102, 97, 116, 97, 115, + 121, 111, 117, 105, 109, 97, 103, 105, 110, 101, 68, 111, 110, 116, 119, + 111, 114, 114, 121, 97, 98, 111, 117, 116, 116, 104, 101, 102, 117, 116, + 117, 114, 101, 79, 114, 119, 111, 114, 114, 121, 98, 117, 116, 107, 110, + 111, 119, 116, 104, 97, 116, 75, 117, 114, 116, 86, 111, 110, 110, 101, + 103, 117, 116, 115, 67, 111, 109, 109, 101, 110, 99, 101, 109, 101, 110, + 116, 65, 100, 100, 114, 101, 115, 115, 97, 116, 77, 73, 84, 76, 97, 100, + 105, 101, 115, 97, 110, 100, 103, 101, 110, 116, 108, 101, 109, 101, 110, + 111, 102, 116, 104, 101, 99, 108, 97, 115, 115, 111, 102, 57, 55, 87, 101, + 97, 114, 115, 117, 110, 115, 99, 114, 101, 101, 110, 73, 102, 73, 99, 111, + 117, 108, 100, 111, 102, 102, 101, 114, 121, 111, 117, 111, 110, 108, 121, + 111, 110, 101, 116, 105, 112, 102, 111, 114, 116, 104, 101, 102, 117, 116, + 117, 114, 101, 115, 117, 110, 115, 99, 114, 101, 101, 110, 119, 111, 117, + 108, 100, 98, 101, 105, 116, 84, 104, 101, 108, 111, 110, 103, 116, 101, + 114, 109, 98, 101, 110, 101, 102, 105, 116, 115, 111, 102, 115, 117, 110, + 115, 99, 114, 101, 101, 110, 104, 97, 118, 101, 98, 101, 101, 110, 112, + 114, 111, 118, 101, 100, 98, 121, 115, 99, 105, 101, 110, 116, 105, 115, + 116, 115, 119, 104, 101, 114, 101, 97, 115, 116, 104, 101, 114, 101, 115, + 116, 111, 102, 109, 121, 97, 100, 118, 105, 99, 101, 104, 97, 115, 110, + 111, 98, 97, 115, 105, 115, 109, 111, 114, 101, 114, 101, 108, 105, 97, 98, + 108, 101, 116, 104, 97, 110, 109, 121, 111, 119, 110, 109, 101, 97, 110, + 100, 101, 114, 105, 110, 103, 101, 120, 112, 101, 114, 105, 101, 110, 99, + 101, 73, 119, 105, 108, 108, 100, 105, 115, 112, 101, 110, 115, 101, 116, + 104, 105, 115, 97, 100, 118, 105, 99, 101, 110, 111, 119, 69, 110, 106, + 111, 121, 116, 104, 101, 112, 111, 119, 101, 114, 97, 110, 100, 98, 101, + 97, 117, 116, 121, 111, 102, 121, 111, 117, 114, 121, 111, 117, 116, 104, + 79, 104, 110, 101, 118, 101, 114, 109, 105, 110, 100, 89, 111, 117, 119, + 105, 108, 108, 110, 111, 116, 117, 110, 100, 101, 114, 115, 116, 97, 110, + 100, 116, 104, 101, 112, 111, 119, 101, 114, 97, 110, 100, 98, 101, 97, + 117, 116, 121, 111, 102, 121, 111, 117, 114, 121, 111, 117, 116, 104, 117, + 110, 116, 105, 108, 116, 104, 101, 121, 118, 101, 102, 97, 100, 101, 100, + 66, 117, 116, 116, 114, 117, 115, 116, 109, 101, 105, 110, 50, 48, 121, + 101, 97, 114, 115, 121, 111, 117, 108, 108, 108, 111, 111, 107, 98, 97, 99, + 107, 97, 116, 112, 104, 111, 116, 111, 115, 111, 102, 121, 111, 117, 114, + 115, 101, 108, 102, 97, 110, 100, 114, 101, 99, 97, 108, 108, 105, 110, 97, + 119, 97, 121, 121, 111, 117, 99, 97, 110, 116, 103, 114, 97, 115, 112, 110, + 111, 119, 104, 111, 119, 109, 117, 99, 104, 112, 111, 115, 115, 105, 98, + 105, 108, 105, 116, 121, 108, 97, 121, 98, 101, 102, 111, 114, 101, 121, + 111, 117, 97, 110, 100, 104, 111, 119, 102, 97, 98, 117, 108, 111, 117, + 115, 121, 111, 117, 114, 101, 97, 108, 108, 121, 108, 111, 111, 107, 101, + 100, 89, 111, 117, 97, 114, 101, 110, 111, 116, 97, 115, 102, 97, 116, 97, + 115, 121, 111, 117, 105, 109, 97, 103, 105, 110, 101, 68, 111, 110, 116, + 119, 111, 114, 114, 121, 97, 98, 111, 117, 116, 116, 104, 101, 102, 117, + 116, 117, 114, 101, 79, 114, 119, 111, 114, 114, 121, 98, 117, 116, 107, + 110, 111, 119, 116, 104, 97, 116, 75, 117, 114, 116, 86, 111, 110, 110, + 101, 103, 117, 116, 115, 67, 111, 109, 109, 101, 110, 99, 101, 109, 101, + 110, 116, 65, 100, 100, 114, 101, 115, 115, 97, 116, 77, 73, 84, 76, 97, + 100, 105, 101, 115, 97, 110, 100, 103, 101, 110, 116, 108, 101, 109, 101, + 110, 111, 102, 116, 104, 101, 99, 108, 97, 115, 115, 111, 102, 57, 55, 87, + 101, 97, 114, 115, 117, 110, 115, 99, 114, 101, 101, 110, 73, 102, 73, 99, + 111, 117, 108, 100, 111, 102, 102, 101, 114, 121, 111, 117, 111, 110, 108, + 121, 111, 110, 101, 116, 105, 112, 102, 111, 114, 116, 104, 101, 102, 117, + 116, 117, 114, 101, 115, 117, 110, 115, 99, 114, 101, 101, 110, 119, 111, + 117, 108, 100, 98, 101, 105, 116, 84, 104, 101, 108, 111, 110, 103, 116, + 101, 114, 109, 98, 101, 110, 101, 102, 105, 116, 115, 111, 102, 115, 117, + 110, 115, 99, 114, 101, 101, 110, 104, 97, 118, 101, 98, 101, 101, 110, + 112, 114, 111, 118, 101, 100, 98, 121, 115, 99, 105, 101, 110, 116, 105, + 115, 116, 115, 119, 104, 101, 114, 101, 97, 115, 116, 104, 101, 114, 101, + 115, 116, 111, 102, 109, 121, 97, 100, 118, 105, 99, 101, 104, 97, 115, + 110, 111, 98, 97, 115, 105, 115, 109, 111, 114, 101, 114, 101, 108, 105, + 97, 98, 108, 101, 116, 104, 97, 110, 109, 121, 111, 119, 110, 109, 101, 97, + 110, 100, 101, 114, 105, 110, 103, 101, 120, 112, 101, 114, 105, 101, 110, + 99, 101, 73, 119, 105, 108, 108, 100, 105, 115, 112, 101, 110, 115, 101, + 116, 104, 105, 115, 97, 100, 118, 105, 99, 101, 110, 111, 119, 69, 110, + 106, 111, 121, 116, 104, 101, 112, 111, 119, 101, 114, 97, 110, 100, 98, + 101, 97, 117, 116, 121, 111, 102, 121, 111, 117, 114, 121, 111, 117, 116, + 104, 79, 104, 110, 101, 118, 101, 114, 109, 105, 110, 100, 89, 111, 117, + 119, 105, 108, 108, 110, 111, 116, 117, 110, 100, 101, 114, 115, 116, 97, + 110, 100, 116, 104, 101, 112, 111, 119, 101, 114, 97, 75, 117, 114, 116, + 86, 111, 110, 110, 101, 103, 117, 116, 115, 67, 111, 109, 109, 101, 110, + 99, 101, 109, 101, 110, 116, 65, 100, 100, 114, 101, 115, 115, 97, 116, 77, + 73, 84, 76, 97, 100, 105, 101, 115, 97, 110, 100, 103, 101, 110, 116, 108, + 101, 109, 101, 110, 111, 102, 116, 104, 101, 99, 108, 97, 115, 115, 111, + 102, 57, 55, 87, 101, 97, 114, 115, 117, 110, 115, 99, 114, 101, 101, 110, + 73, 102, 73, 99, 111, 117, 108, 100, 111, 102, 102, 101, 114, 121, 111, + 117, 111, 110, 108, 121, 111, 110, 101, 116, 105, 112, 102, 111, 114, 116, + 104, 101, 102, 117, 116, 117, 114, 101, 115, 117, 110, 115, 99, 114, 101, + 101, 110, 119, 111, 117, 108, 100, 98, 101, 105, 116, 84, 104, 101, 108, + 111, 110, 103, 116, 101, 114, 109, 98, 101, 110, 101, 102, 105, 116, 115, + 111, 102, 115, 117, 110, 115, 99, 114, 101, 101, 110, 104, 97, 118, 101, + 98, 101, 101, 110, 112, 114, 111, 118, 101, 100, 98, 121, 115, 99, 105, + 101, 110, 116, 105, 115, 116, 115, 119, 104, 101, 114, 101, 97, 115, 116, + 104, 101, 114, 101, 115, 116, 111, 102, 109, 121, 97, 100, 118, 105, 99, + 101, 104, 97, 115, 110, 111, 98, 97, 115, 105, 115, 109, 111, 114, 101, + 114, 101, 108, 105, 97, 98, 108, 101, 116, 104, 97, 110, 109, 121, 111, + 119, 110, 109, 101, 97, 110, 100, 101, 114, 105, 110, 103, 101, 120, 112, + 101, 114, 105, 101, 110, 99, 101, 73, 119, 105, 108, 108, 100, 105, 115, + 112, 101, 110, 115, 101, 116, 104, 105, 115, 97, 100, 118, 105, 99, 101, + 110, 111, 119, 69, 110, 106, 111, 121, 116, 104, 101, 112, 111, 119, 101, + 114, 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, 121, 111, 117, + 114, 121, 111, 117, 116, 104, 79, 104, 110, 101, 118, 101, 114, 109, 105, + 110, 100, 89, 111, 117, 119, 105, 108, 108, 110, 111, 116, 117, 110, 100, + 101, 114, 115, 116, 97, 110, 100, 116, 104, 101, 112, 111, 119, 101, 114, + 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, 121, 111, 117, 114, + 121, 111, 117, 116, 104, 117, 110, 116, 105, 108, 116, 104, 101, 121, 118, + 101, 102, 97, 100, 101, 100, 66, 117, 116, 116, 114, 117, 115, 116, 109, + 101, 105, 110, 50, 48, 121, 101, 97, 114, 115, 121, 111, 117, 108, 108, + 108, 111, 111, 107, 98, 97, 99, 107, 97, 116, 112, 104, 111, 116, 111, 115, + 111, 102, 121, 111, 117, 114, 115, 101, 108, 102, 97, 110, 100, 114, 101, + 99, 97, 108, 108, 105, 110, 97, 119, 97, 121, 121, 111, 117, 99, 97, 110, + 116, 103, 114, 97, 115, 112, 110, 111, 119, 104, 111, 119, 109, 117, 99, + 104, 112, 111, 115, 115, 105, 98, 105, 108, 105, 116, 121, 108, 97, 121, + 98, 101, 102, 111, 114, 101, 121, 111, 117, 97, 110, 100, 104, 111, 119, + 102, 97, 98, 117, 108, 111, 117, 115, 121, 111, 117, 114, 101, 97, 108, + 108, 121, 108, 111, 111, 107, 101, 100, 89, 111, 117, 97, 114, 101, 110, + 111, 116, 97, 115, 102, 97, 116, 97, 115, 121, 111, 117, 105, 109, 97, 103, + 105, 110, 101, 68, 111, 110, 116, 119, 111, 114, 114, 121, 97, 98, 111, + 117, 116, 116, 104, 101, 102, 117, 116, 117, 114, 101, 79, 114, 119, 111, + 114, 114, 121, 98, 117, 116, 107, 110, 111, 119, 116, 104, 97, 116, 75, + 117, 114, 116, 86, 111, 110, 110, 101, 103, 117, 75, 117, 114, 116, 86, + 111, 110, 110, 101, 103, 117, 116, 115, 67, 111, 109, 109, 101, 110, 99, + 101, 109, 101, 110, 116, 65, 100, 100, 114, 101, 115, 115, 97, 116, 77, 73, + 84, 76, 97, 100, 105, 101, 115, 97, 110, 100, 103, 101, 110, 116, 108, 101, + 109, 101, 110, 111, 102, 116, 104, 101, 99, 108, 97, 115, 115, 111, 102, + 57, 55, 87, 101, 97, 114, 115, 117, 110, 115, 99, 114, 101, 101, 110, 73, + 102, 73, 99, 111, 117, 108, 100, 111, 102, 102, 101, 114, 121, 111, 117, + 111, 110, 108, 121, 111, 110, 101, 116, 105, 112, 102, 111, 114, 116, 104, + 101, 102, 117, 116, 117, 114, 101, 115, 117, 110, 115, 99, 114, 101, 101, + 110, 119, 111, 117, 108, 100, 98, 101, 105, 116, 84, 104, 101, 108, 111, + 110, 103, 116, 101, 114, 109, 98, 101, 110, 101, 102, 105, 116, 115, 111, + 102, 115, 117, 110, 115, 99, 114, 101, 101, 110, 104, 97, 118, 101, 98, + 101, 101, 110, 112, 114, 111, 118, 101, 100, 98, 121, 115, 99, 105, 101, + 110, 116, 105, 115, 116, 115, 119, 104, 101, 114, 101, 97, 115, 116, 104, + 101, 114, 101, 115, 116, 111, 102, 109, 121, 97, 100, 118, 105, 99, 101, + 104, 97, 115, 110, 111, 98, 97, 115, 105, 115, 109, 111, 114, 101, 114, + 101, 108, 105, 97, 98, 108, 101, 116, 104, 97, 110, 109, 121, 111, 119, + 110, 109, 101, 97, 110, 100, 101, 114, 105, 110, 103, 101, 120, 112, 101, + 114, 105, 101, 110, 99, 101, 73, 119, 105, 108, 108, 100, 105, 115, 112, + 101, 110, 115, 101, 116, 104, 105, 115, 97, 100, 118, 105, 99, 101, 110, + 111, 119, 69, 110, 106, 111, 121, 116, 104, 101, 112, 111, 119, 101, 114, + 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, 121, 111, 117, 114, + 121, 111, 117, 116, 104, 79, 104, 110, 101, 118, 101, 114, 109, 105, 110, + 100, 89, 111, 117, 119, 105, 108, 108, 110, 111, 116, 117, 110, 100, 101, + 114, 115, 116, 97, 110, 100, 116, 104, 101, 112, 111, 119, 101, 114, 97, + 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, 121, 111, 117, 114, 121, + 111, 117, 116, 104, 117, 110, 116, 105, 108, 116, 104, 101, 121, 118, 101, + 102, 97, 100, 101, 100, 66, 117, 116, 116, 114, 117, 115, 116, 109, 101, + 105, 110, 50, 48, 121, 101, 97, 114, 115, 121, 111, 117, 108, 108, 108, + 111, 111, 107, 98, 97, 99, 107, 97, 116, 112, 104, 111, 116, 111, 115, 111, + 102, 121, 111, 117, 114, 115, 101, 108, 102, 97, 110, 100, 114, 101, 99, + 97, 108, 108, 105, 110, 97, 119, 97, 121, 121, 111, 117, 99, 97, 110, 116, + 103, 114, 97, 115, 112, 110, 111, 119, 104, 111, 119, 109, 117, 99, 104, + 112, 111, 115, 115, 105, 98, 105, 108, 105, 116, 121, 108, 97, 121, 98, + 101, 102, 111, 114, 101, 121, 111, 117, 97, 110, 100, 104, 111, 119, 102, + 97, 98, 117, 108, 111, 117, 115, 121, 111, 117, 114, 101, 97, 108, 108, + 121, 108, 111, 111, 107, 101, 100, 89, 111, 117, 97, 114, 101, 110, 111, + 116, 97, 115, 102, 97, 116, 97, 115, 121, 111, 117, 105, 109, 97, 103, 105, + 110, 101, 68, 111, 110, 116, 119, 111, 114, 114, 121, 97, 98, 111, 117, + 116, 116, 104, 101, 102, 117, 116, 117, 114, 101, 79, 114, 119, 111, 114, + 114, 121, 98, 117, 116, 107, 110, 111, 119, 116, 104, 97, 116, 75, 117, + 114, 116, 86, 111, 110, 110, 101, 103, 117, 116, 115, 67, 111, 109, 109, + 101, 110, 99, 101, 109, 101, 110, 116, 65, 100, 100, 114, 101, 115, 115, + 97, 116, 77, 73, 84, 76, 97, 100, 105, 101, 115, 97, 110, 100, 103, 101, + 110, 116, 108, 101, 109, 101, 110, 111, 102, 116, 104, 101, 99, 108, 97, + 115, 115, 111, 102, 57, 55, 87, 101, 97, 114, 115, 117, 110, 115, 99, 114, + 101, 101, 110, 73, 102, 73, 99, 111, 117, 108, 100, 111, 102, 102, 101, + 114, 121, 111, 117, 111, 110, 108, 121, 111, 110, 101, 116, 105, 112, 102, + 111, 114, 116, 104, 101, 102, 117, 116, 117, 114, 101, 115, 117, 110, 115, + 99, 114, 101, 101, 110, 119, 111, 117, 108, 100, 98, 101, 105, 116, 84, + 104, 101, 108, 111, 110, 103, 116, 101, 114, 109, 98, 101, 110, 101, 102, + 105, 116, 115, 111, 102, 115, 117, 110, 115, 99, 114, 101, 101, 110, 104, + 97, 118, 101, 98, 101, 101, 110, 112, 114, 111, 118, 101, 100, 98, 121, + 115, 99, 105, 101, 110, 116, 105, 115, 116, 115, 119, 104, 101, 114, 101, + 97, 115, 116, 104, 101, 114, 101, 115, 116, 111, 102, 109, 121, 97, 100, + 118, 105, 99, 101, 104, 97, 115, 110, 111, 98, 97, 115, 105, 115, 109, 111, + 114, 101, 114, 101, 108, 105, 97, 98, 108, 101, 116, 104, 97, 110, 109, + 121, 111, 119, 110, 109, 101, 97, 110, 100, 101, 114, 105, 110, 103, 101, + 120, 112, 101, 114, 105, 101, 110, 99, 101, 73, 119, 105, 108, 108, 100, + 105, 115, 112, 101, 110, 115, 101, 116, 104, 105, 115, 97, 100, 118, 105, + 99, 101, 110, 111, 119, 69, 110, 106, 111, 121, 116, 104, 101, 112, 111, + 119, 101, 114, 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, 121, + 111, 117, 114, 121, 111, 117, 116, 104, 79, 104, 110, 101, 118, 101, 114, + 109, 105, 110, 100, 89, 111, 117, 119, 105, 108, 108, 110, 111, 116, 117, + 110, 100, 101, 114, 115, 116, 97, 110, 100, 116, 104, 101, 112, 111, 119, + 101, 114, 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, 121, 111, + 117, 114, 121, 111, 117}, + {116, 104, 117, 110, 116, 105, 108, 116, 104, 101, 121, 118, 101, 102, 97, + 100, 101, 100, 66, 117, 116, 116, 114, 117, 115, 116, 109, 101, 105, 110, + 50, 48, 121, 101, 97, 114, 115, 121, 111, 117, 108, 108, 108, 111, 111, + 107, 98, 97, 99, 107, 97, 116, 112, 104, 111, 116, 111, 115, 111, 102, 121, + 111, 117, 114, 115, 101, 108, 102, 97, 110, 100, 114, 101, 99, 97, 108, + 108, 105, 110, 97, 119, 97, 121, 121, 111, 117, 99, 97, 110, 116, 103, 114, + 97, 115, 112, 110, 111, 119, 104, 111, 119, 109, 117, 99, 104, 112, 111, + 115, 115, 105, 98, 105, 108, 105, 116, 121, 108, 97, 121, 98, 101, 102, + 111, 114, 101, 121, 111, 117, 97, 110, 100, 104, 111, 119, 102, 97, 98, + 117, 108, 111, 117, 115, 121, 111, 117, 114, 101, 97, 108, 108, 121, 108, + 111, 111, 107, 101, 100, 89, 111, 117, 97, 114, 101, 110, 111, 116, 97, + 115, 102, 97, 116, 97, 115, 121, 111, 117, 105, 109, 97, 103, 105, 110, + 101, 68, 111, 110, 116, 119, 111, 114, 114, 121, 97, 98, 111, 117, 116, + 116, 104, 101, 102, 117, 116, 117, 114, 101, 79, 114, 119, 111, 114, 114, + 121, 98, 117, 116, 107, 110, 111, 119, 116, 104, 97, 116, 75, 117, 114, + 116, 86, 111, 110, 110, 101, 103, 117, 116, 115, 67, 111, 109, 109, 101, + 110, 99, 101, 109, 101, 110, 116, 65, 100, 100, 114, 101, 115, 115, 97, + 116, 77, 73, 84, 76, 97, 100, 105, 101, 115, 97, 110, 100, 103, 101, 110, + 116, 108, 101, 109, 101, 110, 111, 102, 116, 104, 101, 99, 108, 97, 115, + 115, 111, 102, 57, 55, 87, 101, 97, 114, 115, 117, 110, 115, 99, 114, 101, + 101, 110, 73, 102, 73, 99, 111, 117, 108, 100, 111, 102, 102, 101, 114, + 121, 111, 117, 111, 110, 108, 121, 111, 110, 101, 116, 105, 112, 102, 111, + 114, 116, 104, 101, 102, 117, 116, 117, 114, 101, 115, 117, 110, 115, 99, + 114, 101, 101, 110, 119, 111, 117, 108, 100, 98, 101, 105, 116, 84, 104, + 101, 108, 111, 110, 103, 116, 101, 114, 109, 98, 101, 110, 101, 102, 105, + 116, 115, 111, 102, 115, 117, 110, 115, 99, 114, 101, 101, 110, 104, 97, + 118, 101, 98, 101, 101, 110, 112, 114, 111, 118, 101, 100, 98, 121, 115, + 99, 105, 101, 110, 116, 105, 115, 116, 115, 119, 104, 101, 114, 101, 97, + 115, 116, 104, 101, 114, 101, 115, 116, 111, 102, 109, 121, 97, 100, 118, + 105, 99, 101, 104, 97, 115, 110, 111, 98, 97, 115, 105, 115, 109, 111, 114, + 101, 114, 101, 108, 105, 97, 98, 108, 101, 116, 104, 97, 110, 109, 121, + 111, 119, 110, 109, 101, 97, 110, 100, 101, 114, 105, 110, 103, 101, 120, + 112, 101, 114, 105, 101, 110, 99, 101, 73, 119, 105, 108, 108, 100, 105, + 115, 112, 101, 110, 115, 101, 116, 104, 105, 115, 97, 100, 118, 105, 99, + 101, 110, 111, 119, 69, 110, 106, 111, 121, 116, 104, 101, 112, 111, 119, + 101, 114, 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, 121, 111, + 117, 114, 121, 111, 117, 116, 104, 79, 104, 110, 101, 118, 101, 114, 109, + 105, 110, 100, 89, 111, 117, 119, 105, 108, 108, 110, 111, 116, 117, 110, + 100, 101, 114, 115, 116, 97, 110, 100, 116, 104, 101, 112, 111, 119, 101, + 114, 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, 121, 111, 117, + 114, 121, 111, 117, 116, 104, 117, 110, 116, 105, 108, 116, 104, 101, 121, + 118, 101, 102, 97, 100, 101, 100, 66, 117, 116, 116, 114, 117, 115, 116, + 109, 101, 105, 110, 50, 48, 121, 101, 97, 114, 115, 121, 111, 117, 108, + 108, 108, 111, 111, 107, 98, 97, 99, 107, 97, 116, 112, 104, 111, 116, 111, + 115, 111, 102, 121, 111, 117, 114, 115, 101, 108, 102, 97, 110, 100, 114, + 101, 99, 97, 108, 108, 105, 110, 97, 119, 97, 121, 121, 111, 117, 99, 97, + 110, 116, 103, 114, 97, 115, 112, 110, 111, 119, 104, 111, 119, 109, 117, + 99, 104, 112, 111, 115, 115, 105, 98, 105, 108, 105, 116, 121, 108, 97, + 121, 98, 101, 102, 111, 114, 101, 121, 111, 117, 97, 110, 100, 104, 111, + 119, 102, 97, 98, 117, 108, 111, 117, 115, 121, 111, 117, 114, 101, 97, + 108, 108, 121, 108, 111, 111, 107, 101, 100, 89, 111, 117, 97, 114, 101, + 110, 111, 116, 97, 115, 102, 97, 116, 97, 115, 121, 111, 117, 105, 109, 97, + 103, 105, 110, 101, 68, 111, 110, 116, 119, 111, 114, 114, 121, 97, 98, + 111, 117, 116, 116, 104, 101, 102, 117, 116, 117, 114, 101, 79, 114, 119, + 111, 114, 114, 121, 98, 117, 116, 107, 110, 111, 119, 116, 104, 97, 116, + 116, 115, 67, 111, 109, 109, 101, 110, 99, 101, 109, 101, 110, 116, 65, + 100, 100, 114, 101, 115, 115, 97, 116, 77, 73, 84, 76, 97, 100, 105, 101, + 115, 97, 110, 100, 103, 101, 110, 116, 108, 101, 109, 101, 110, 111, 102, + 116, 104, 101, 99, 108, 97, 115, 115, 111, 102, 57, 55, 87, 101, 97, 114, + 115, 117, 110, 115, 99, 114, 101, 101, 110, 73, 102, 73, 99, 111, 117, 108, + 100, 111, 102, 102, 101, 114, 121, 111, 117, 111, 110, 108, 121, 111, 110, + 101, 116, 105, 112, 102, 111, 114, 116, 104, 101, 102, 117, 116, 117, 114, + 101, 75, 117, 114, 116, 86, 111, 110, 110, 101, 103, 117, 116, 115, 67, + 111, 109, 109, 101, 110, 99, 101, 109, 101, 110, 116, 65, 100, 100, 114, + 101, 115, 115, 97, 116, 77, 73, 84, 76, 97, 100, 105, 101, 115, 97, 110, + 100, 103, 101, 110, 116, 108, 101, 109, 101, 110, 111, 102, 116, 104, 101, + 99, 108, 97, 115, 115, 111, 102, 57, 55, 87, 101, 97, 114, 115, 117, 110, + 115, 99, 114, 101, 101, 110, 73, 102, 73, 99, 111, 117, 108, 100, 111, 102, + 102, 101, 114, 121, 111, 117, 111, 110, 108, 121, 111, 110, 101, 116, 105, + 112, 102, 111, 114, 116, 104, 101, 102, 117, 116, 117, 114, 101, 115, 117, + 110, 115, 99, 114, 101, 101, 110, 119, 111, 117, 108, 100, 98, 101, 105, + 116, 84, 104, 101, 108, 111, 110, 103, 116, 101, 114, 109, 98, 101, 110, + 101, 102, 105, 116, 115, 111, 102, 115, 117, 110, 115, 99, 114, 101, 101, + 110, 104, 97, 118, 101, 98, 101, 101, 110, 112, 114, 111, 118, 101, 100, + 98, 121, 115, 99, 105, 101, 110, 116, 105, 115, 116, 115, 119, 104, 101, + 114, 101, 97, 115, 116, 104, 101, 114, 101, 115, 116, 111, 102, 109, 121, + 97, 100, 118, 105, 99, 101, 104, 97, 115, 110, 111, 98, 97, 115, 105, 115, + 109, 111, 114, 101, 114, 101, 108, 105, 97, 98, 108, 101, 116, 104, 97, + 110, 109, 121, 111, 119, 110, 109, 101, 97, 110, 100, 101, 114, 105, 110, + 103, 101, 120, 112, 101, 114, 105, 101, 110, 99, 101, 73, 119, 105, 108, + 108, 100, 105, 115, 112, 101, 110, 115, 101, 116, 104, 105, 115, 97, 100, + 118, 105, 99, 101, 110, 111, 119, 69, 110, 106, 111, 121, 116, 104, 101, + 112, 111, 119, 101, 114, 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, + 102, 121, 111, 117, 114, 121, 111, 117, 116, 104, 79, 104, 110, 101, 118, + 101, 114, 109, 105, 110, 100, 89, 111, 117, 119, 105, 108, 108, 110, 111, + 116, 117, 110, 100, 101, 114, 115, 116, 97, 110, 100, 116, 104, 101, 112, + 111, 119, 101, 114, 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, + 121, 111, 117, 114, 121, 111, 117, 116, 104, 117, 110, 116, 105, 108, 116, + 104, 101, 121, 118, 101, 102, 97, 100, 101, 100, 66, 117, 116, 116, 114, + 117, 115, 116, 109, 101, 105, 110, 50, 48, 121, 101, 97, 114, 115, 121, + 111, 117, 108, 108, 108, 111, 111, 107, 98, 97, 99, 107, 97, 116, 112, 104, + 111, 116, 111, 115, 111, 102, 121, 111, 117, 114, 115, 101, 108, 102, 97, + 110, 100, 114, 101, 99, 97, 108, 108, 105, 110, 97, 119, 97, 121, 121, 111, + 117, 99, 97, 110, 116, 103, 114, 97, 115, 112, 110, 111, 119, 104, 111, + 119, 109, 117, 99, 104, 112, 111, 115, 115, 105, 98, 105, 108, 105, 116, + 121, 108, 97, 121, 98, 101, 102, 111, 114, 101, 121, 111, 117, 97, 110, + 100, 104, 111, 119, 102, 97, 98, 117, 108, 111, 117, 115, 121, 111, 117, + 114, 101, 97, 108, 108, 121, 108, 111, 111, 107, 101, 100, 89, 111, 117, + 97, 114, 101, 110, 111, 116, 97, 115, 102, 97, 116, 97, 115, 121, 111, 117, + 105, 109, 97, 103, 105, 110, 101, 68, 111, 110, 116, 119, 111, 114, 114, + 121, 97, 98, 111, 117, 116, 116, 104, 101, 102, 117, 116, 117, 114, 101, + 79, 114, 119, 111, 114, 114, 121, 98, 117, 116, 107, 110, 111, 119, 116, + 104, 97, 116, 75, 117, 114, 116, 86, 111, 110, 110, 101, 103, 117, 116, + 115, 67, 111, 109, 109, 101, 110, 99, 101, 109, 101, 110, 116, 65, 100, + 100, 114, 101, 115, 115, 97, 116, 77, 73, 84, 76, 97, 100, 105, 101, 115, + 97, 110, 100, 103, 101, 110, 116, 108, 101, 109, 101, 110, 111, 102, 116, + 104, 101, 99, 108, 97, 115, 115, 111, 102, 57, 55, 87, 101, 97, 114, 115, + 117, 110, 115, 99, 114, 101, 101, 110, 73, 102, 73, 99, 111, 117, 108, 100, + 111, 102, 102, 101, 114, 121, 111, 117, 111, 110, 108, 121, 111, 110, 101, + 116, 105, 112, 102, 111, 114, 116, 104, 101, 102, 117, 116, 117, 114, 101, + 115, 117, 110, 115, 99, 114, 101, 101, 110, 119, 111, 117, 108, 100, 98, + 101, 105, 116, 84, 104, 101, 108, 111, 110, 103, 116, 101, 114, 109, 98, + 101, 110, 101, 102, 105, 116, 115, 111, 102, 115, 117, 110, 115, 99, 114, + 101, 101, 110, 104, 97, 118, 101, 98, 101, 101, 110, 112, 114, 111, 118, + 101, 100, 98, 121, 115, 99, 105, 101, 110, 116, 105, 115, 116, 115, 119, + 104, 101, 114, 101, 97, 115, 116, 104, 101, 114, 101, 115, 116, 111, 102, + 109, 121, 97, 100, 118, 105, 99, 101, 104, 97, 115, 110, 111, 98, 97, 115, + 105, 115, 109, 111, 114, 101, 114, 101, 108, 105, 97, 98, 108, 101, 116, + 104, 97, 110, 109, 121, 111, 119, 110, 109, 101, 97, 110, 100, 101, 114, + 105, 110, 103, 101, 120, 112, 101, 114, 105, 101, 110, 99, 101, 73, 119, + 105, 108, 108, 100, 105, 115, 112, 101, 110, 115, 101, 116, 104, 105, 115, + 97, 100, 118, 105, 99, 101, 110, 111, 119, 69, 110, 106, 111, 121, 116, + 104, 101, 112, 111, 119, 101, 114, 97, 110, 100, 98, 101, 97, 117, 116, + 121, 111, 102, 121, 111, 117, 114, 121, 111, 117, 116, 104, 79, 104, 110, + 101, 118, 101, 114, 109, 105, 110, 100, 89, 111, 117, 119, 105, 108, 108, + 110, 111, 116, 117, 110, 100, 101, 114, 115, 116, 97, 110, 100, 116, 104, + 101, 112, 111, 119, 101, 114, 97, 110, 100, 98, 101, 97, 117, 116, 121, + 111, 102, 121, 111, 117, 114, 121, 111, 117, 116, 104, 117, 110, 116, 105, + 108, 116, 104, 101, 121, 118, 101, 102, 97, 100, 101, 100, 66, 117, 116, + 116, 114, 117, 115, 116, 109, 101, 105, 110, 50, 48, 121, 101, 97, 114, + 115, 121, 111, 117, 108, 108, 108, 111, 111, 107, 98, 97, 99, 107, 97, 116, + 112, 104, 111, 116, 111, 115, 111, 102, 121, 111, 117, 114, 115, 101, 108, + 102, 97, 110, 100, 114, 101, 99, 97, 108, 108, 105, 110, 97, 119, 97, 121, + 121, 111, 117, 99, 97, 110, 116, 103, 114, 97, 115, 112, 110, 111, 119, + 104, 111, 119, 109, 117, 99, 104, 112, 111, 115, 115, 105, 98, 105, 108, + 105, 116, 121, 108, 97, 121, 98, 101, 102, 111, 114, 101, 121, 111, 117, + 97, 110, 100, 104, 111, 119, 102, 97, 98, 117, 108, 111, 117, 115, 121, + 111, 117, 114, 101, 97, 108, 108, 121, 108, 111, 111, 107, 101, 100, 89, + 111, 117, 97, 114, 101, 110, 111, 116, 97, 115, 102, 97, 116, 97, 115, 121, + 111, 117, 105, 109, 97, 103, 105, 110, 101, 68, 111, 110, 116, 119, 111, + 114, 114, 121, 97, 98, 111, 117, 116, 116, 104, 101, 102, 117, 116, 117, + 114, 101, 79, 114, 119, 111, 114, 114, 121, 98, 117, 116, 107, 110, 111, + 119, 116, 104, 97, 116, 75, 117, 114, 116, 86, 111, 110, 110, 101, 103, + 117, 116, 115, 67, 111, 109, 109, 101, 110, 99, 101, 109, 101, 110, 116, + 65, 100, 100, 114, 101, 115, 115, 97, 116, 77, 73, 84, 76, 97, 100, 105, + 101, 115, 97, 110, 100, 103, 101, 110, 116, 108, 101, 109, 101, 110, 111, + 102, 116, 104, 101, 99, 108, 97, 115, 115, 111, 102, 57, 55, 87, 101, 97, + 114, 115, 117, 110, 115, 99, 114, 101, 101, 110, 73, 102, 73, 99, 111, 117, + 108, 100, 111, 102, 102, 101, 114, 121, 111, 117, 111, 110, 108, 121, 111, + 110, 101, 116, 105, 112, 102, 111, 114, 116, 104, 101, 102, 117, 116, 117, + 114, 101, 115, 117, 110, 115, 99, 114, 101, 101, 110, 119, 111, 117, 108, + 100, 98, 101, 105, 116, 84, 104, 101, 108, 111, 110, 103, 116, 101, 114, + 109, 98, 101, 110, 101, 102, 105, 116, 115, 111, 102, 115, 117, 110, 115, + 99, 114, 101, 101, 110, 104, 97, 118, 101, 98, 101, 101, 110, 112, 114, + 111, 118, 101, 100, 98, 121, 115, 99, 105, 101, 110, 116, 105, 115, 116, + 115, 119, 104, 101, 114, 101, 97, 115, 116, 104, 101, 114, 101, 115, 116, + 111, 102, 109, 121, 97, 100, 118, 105, 99, 101, 104, 97, 115, 110, 111, 98, + 97, 115, 105, 115, 109, 111, 114, 101, 114, 101, 108, 105, 97, 98, 108, + 101, 116, 104, 97, 110, 109, 121, 111, 119, 110, 109, 101, 97, 110, 100, + 101, 114, 105, 110, 103, 101, 120, 112, 101, 114, 105, 101, 110, 99, 101, + 73, 119, 105, 108, 108, 100, 105, 115, 112, 101, 110, 115, 101, 116, 104, + 105, 115, 97, 100, 118, 105, 99, 101, 110, 111, 119, 69, 110, 106, 111, + 121, 116, 104, 101, 112, 111, 119, 101, 114, 97, 110, 100, 98, 101, 97, + 117, 116, 121, 111, 102, 121, 111, 117, 114, 121, 111, 117, 116, 104, 79, + 104, 110, 101, 118, 101, 114, 109, 105, 110, 100, 89, 111, 117, 119, 105, + 108, 108, 110, 111, 116, 117, 110, 100, 101, 114, 115, 116, 97, 110, 100, + 116, 104, 101, 112, 111, 119, 101, 114, 97, 75, 117, 114, 116, 86, 111, + 110, 110, 101, 103, 117, 116, 115, 67, 111, 109, 109, 101, 110, 99, 101, + 109, 101, 110, 116, 65, 100, 100, 114, 101, 115, 115, 97, 116, 77, 73, 84, + 76, 97, 100, 105, 101, 115, 97, 110, 100, 103, 101, 110, 116, 108, 101, + 109, 101, 110, 111, 102, 116, 104, 101, 99, 108, 97, 115, 115, 111, 102, + 57, 55, 87, 101, 97, 114, 115, 117, 110, 115, 99, 114, 101, 101, 110, 73, + 102, 73, 99, 111, 117, 108, 100, 111, 102, 102, 101, 114, 121, 111, 117, + 111, 110, 108, 121, 111, 110, 101, 116, 105, 112, 102, 111, 114, 116, 104, + 101, 102, 117, 116, 117, 114, 101, 115, 117, 110, 115, 99, 114, 101, 101, + 110, 119, 111, 117, 108, 100, 98, 101, 105, 116, 84, 104, 101, 108, 111, + 110, 103, 116, 101, 114, 109, 98, 101, 110, 101, 102, 105, 116, 115, 111, + 102, 115, 117, 110, 115, 99, 114, 101, 101, 110, 104, 97, 118, 101, 98, + 101, 101, 110, 112, 114, 111, 118, 101, 100, 98, 121, 115, 99, 105, 101, + 110, 116, 105, 115, 116, 115, 119, 104, 101, 114, 101, 97, 115, 116, 104, + 101, 114, 101, 115, 116, 111, 102, 109, 121, 97, 100, 118, 105, 99, 101, + 104, 97, 115, 110, 111, 98, 97, 115, 105, 115, 109, 111, 114, 101, 114, + 101, 108, 105, 97, 98, 108, 101, 116, 104, 97, 110, 109, 121, 111, 119, + 110, 109, 101, 97, 110, 100, 101, 114, 105, 110, 103, 101, 120, 112, 101, + 114, 105, 101, 110, 99, 101, 73, 119, 105, 108, 108, 100, 105, 115, 112, + 101, 110, 115, 101, 116, 104, 105, 115, 97, 100, 118, 105, 99, 101, 110, + 111, 119, 69, 110, 106, 111, 121, 116, 104, 101, 112, 111, 119, 101, 114, + 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, 121, 111, 117, 114, + 121, 111, 117, 116, 104, 79, 104, 110, 101, 118, 101, 114, 109, 105, 110, + 100, 89, 111, 117, 119, 105, 108, 108, 110, 111, 116, 117, 110, 100, 101, + 114, 115, 116, 97, 110, 100, 116, 104, 101, 112, 111, 119, 101, 114, 97, + 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, 121, 111, 117, 114, 121, + 111, 117, 116, 104, 117, 110, 116, 105, 108, 116, 104, 101, 121, 118, 101, + 102, 97, 100, 101, 100, 66, 117, 116, 116, 114, 117, 115, 116, 109, 101, + 105, 110, 50, 48, 121, 101, 97, 114, 115, 121, 111, 117, 108, 108, 108, + 111, 111, 107, 98, 97, 99, 107, 97, 116, 112, 104, 111, 116, 111, 115, 111, + 102, 121, 111, 117, 114, 115, 101, 108, 102, 97, 110, 100, 114, 101, 99, + 97, 108, 108, 105, 110, 97, 119, 97, 121, 121, 111, 117, 99, 97, 110, 116, + 103, 114, 97, 115, 112, 110, 111, 119, 104, 111, 119, 109, 117, 99, 104, + 112, 111, 115, 115, 105, 98, 105, 108, 105, 116, 121, 108, 97, 121, 98, + 101, 102, 111, 114, 101, 121, 111, 117, 97, 110, 100, 104, 111, 119, 102, + 97, 98, 117, 108, 111, 117, 115, 121, 111, 117, 114, 101, 97, 108, 108, + 121, 108, 111, 111, 107, 101, 100, 89, 111, 117, 97, 114, 101, 110, 111, + 116, 97, 115, 102, 97, 116, 97, 115, 121, 111, 117, 105, 109, 97, 103, 105, + 110, 101, 68, 111, 110, 116, 119, 111, 114, 114, 121, 97, 98, 111, 117, + 116, 116, 104, 101, 102, 117, 116, 117, 114, 101, 79, 114, 119, 111, 114, + 114, 121, 98, 117, 116, 107, 110, 111, 119, 116, 104, 97, 116, 75, 117, + 114, 116, 86, 111, 110, 110, 101, 103, 117, 75, 117, 114, 116, 86, 111, + 110, 110, 101, 103, 117, 116, 115, 67, 111, 109, 109, 101, 110, 99, 101, + 109, 101, 110, 116, 65, 100, 100, 114, 101, 115, 115, 97, 116, 77, 73, 84, + 76, 97, 100, 105, 101, 115, 97, 110, 100, 103, 101, 110, 116, 108, 101, + 109, 101, 110, 111, 102, 116, 104, 101, 99, 108, 97, 115, 115, 111, 102, + 57, 55, 87, 101, 97, 114, 115, 117, 110, 115, 99, 114, 101, 101, 110, 73, + 102, 73, 99, 111, 117, 108, 100, 111, 102, 102, 101, 114, 121, 111, 117, + 111, 110, 108, 121, 111, 110, 101, 116, 105, 112, 102, 111, 114, 116, 104, + 101, 102, 117, 116, 117, 114, 101, 115, 117, 110, 115, 99, 114, 101, 101, + 110, 119, 111, 117, 108, 100, 98, 101, 105, 116, 84, 104, 101, 108, 111, + 110, 103, 116, 101, 114, 109, 98, 101, 110, 101, 102, 105, 116, 115, 111, + 102, 115, 117, 110, 115, 99, 114, 101, 101, 110, 104, 97, 118, 101, 98, + 101, 101, 110, 112, 114, 111, 118, 101, 100, 98, 121, 115, 99, 105, 101, + 110, 116, 105, 115, 116, 115, 119, 104, 101, 114, 101, 97, 115, 116, 104, + 101, 114, 101, 115, 116, 111, 102, 109, 121, 97, 100, 118, 105, 99, 101, + 104, 97, 115, 110, 111, 98, 97, 115, 105, 115, 109, 111, 114, 101, 114, + 101, 108, 105, 97, 98, 108, 101, 116, 104, 97, 110, 109, 121, 111, 119, + 110, 109, 101, 97, 110, 100, 101, 114, 105, 110, 103, 101, 120, 112, 101, + 114, 105, 101, 110, 99, 101, 73, 119, 105, 108, 108, 100, 105, 115, 112, + 101, 110, 115, 101, 116, 104, 105, 115, 97, 100, 118, 105, 99, 101, 110, + 111, 119, 69, 110, 106, 111, 121, 116, 104, 101, 112, 111, 119, 101, 114, + 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, 121, 111, 117, 114, + 121, 111, 117, 116, 104, 79, 104, 110, 101, 118, 101, 114, 109, 105, 110, + 100, 89, 111, 117, 119, 105, 108, 108, 110, 111, 116, 117, 110, 100, 101, + 114, 115, 116, 97, 110, 100, 116, 104, 101, 112, 111, 119, 101, 114, 97, + 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, 121, 111, 117, 114, 121, + 111, 117, 116, 104, 117, 110, 116, 105, 108, 116, 104, 101, 121, 118, 101, + 102, 97, 100, 101, 100, 66, 117, 116, 116, 114, 117, 115, 116, 109, 101, + 105, 110, 50, 48, 121, 101, 97, 114, 115, 121, 111, 117, 108, 108, 108, + 111, 111, 107, 98, 97, 99, 107, 97, 116, 112, 104, 111, 116, 111, 115, 111, + 102, 121, 111, 117, 114, 115, 101, 108, 102, 97, 110, 100, 114, 101, 99, + 97, 108, 108, 105, 110, 97, 119, 97, 121, 121, 111, 117, 99, 97, 110, 116, + 103, 114, 97, 115, 112, 110, 111, 119, 104, 111, 119, 109, 117, 99, 104, + 112, 111, 115, 115, 105, 98, 105, 108, 105, 116, 121, 108, 97, 121, 98, + 101, 102, 111, 114, 101, 121, 111, 117, 97, 110, 100, 104, 111, 119, 102, + 97, 98, 117, 108, 111, 117, 115, 121, 111, 117, 114, 101, 97, 108, 108, + 121, 108, 111, 111, 107, 101, 100, 89, 111, 117, 97, 114, 101, 110, 111, + 116, 97, 115, 102, 97, 116, 97, 115, 121, 111, 117, 105, 109, 97, 103, 105, + 110, 101, 68, 111, 110, 116, 119, 111, 114, 114, 121, 97, 98, 111, 117, + 116, 116, 104, 101, 102, 117, 116, 117, 114, 101, 79, 114, 119, 111, 114, + 114, 121, 98, 117, 116, 107, 110, 111, 119, 116, 104, 97, 116, 75, 117, + 114, 116, 86, 111, 110, 110, 101, 103, 117, 116, 115, 67, 111, 109, 109, + 101, 110, 99, 101, 109, 101, 110, 116, 65, 100, 100, 114, 101, 115, 115, + 97, 116, 77, 73, 84, 76, 97, 100, 105, 101, 115, 97, 110, 100, 103, 101, + 110, 116, 108, 101, 109, 101, 110, 111, 102, 116, 104, 101, 99, 108, 97, + 115, 115, 111, 102, 57, 55, 87, 101, 97, 114, 115, 117, 110, 115, 99, 114, + 101, 101, 110, 73, 102, 73, 99, 111, 117, 108, 100, 111, 102, 102, 101, + 114, 121, 111, 117, 111, 110, 108, 121, 111, 110, 101, 116, 105, 112, 102, + 111, 114, 116, 104, 101, 102, 117, 116, 117, 114, 101, 115, 117, 110, 115, + 99, 114, 101, 101, 110, 119, 111, 117, 108, 100, 98, 101, 105, 116, 84, + 104, 101, 108, 111, 110, 103, 116, 101, 114, 109, 98, 101, 110, 101, 102, + 105, 116, 115, 111, 102, 115, 117, 110, 115, 99, 114, 101, 101, 110, 104, + 97, 118, 101, 98, 101, 101, 110, 112, 114, 111, 118, 101, 100, 98, 121, + 115, 99, 105, 101, 110, 116, 105, 115, 116, 115, 119, 104, 101, 114, 101, + 97, 115, 116, 104, 101, 114, 101, 115, 116, 111, 102, 109, 121, 97, 100, + 118, 105, 99, 101, 104, 97, 115, 110, 111, 98, 97, 115, 105, 115, 109, 111, + 114, 101, 114, 101, 108, 105, 97, 98, 108, 101, 116, 104, 97, 110, 109, + 121, 111, 119, 110, 109, 101, 97, 110, 100, 101, 114, 105, 110, 103, 101, + 120, 112, 101, 114, 105, 101, 110, 99, 101, 73, 119, 105, 108, 108, 100, + 105, 115, 112, 101, 110, 115, 101, 116, 104, 105, 115, 97, 100, 118, 105, + 99, 101, 110, 111, 119, 69, 110, 106, 111, 121, 116, 104, 101, 112, 111, + 119, 101, 114, 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, 121, + 111, 117, 114, 121, 111, 117, 116, 104, 79, 104, 110, 101, 118, 101, 114, + 109, 105, 110, 100, 89, 111, 117, 119, 105, 108, 108, 110, 111, 116, 117, + 110, 100, 101, 114, 115, 116, 97, 110, 100, 116, 104, 101, 112, 111, 119, + 101, 114, 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, 121, 111, + 117, 114, 121, 111, 117, 116, 104, 117, 110, 116, 105, 108, 116, 104, 101, + 121, 118, 101, 102, 97, 100, 101, 100, 66, 117, 116, 116, 114, 117, 115, + 116, 109, 101, 105, 110, 50, 48, 121, 101, 97, 114, 115, 121, 111, 117, + 108, 108, 108, 111, 111, 107, 98, 97, 99, 107, 97, 116, 112, 104, 111, 116, + 111, 115, 111, 102, 121, 111, 117, 114, 115, 101, 108, 102, 97, 110, 100, + 114, 101, 99, 97, 108, 108, 105, 110, 97, 119, 97, 121, 121, 111, 117, 99, + 97, 110, 116, 103, 114, 97, 115, 112, 110, 111, 119, 104, 111, 119, 109, + 117, 99, 104, 112, 111, 115, 115, 105, 98, 105, 108, 105, 116, 121, 108, + 97, 121, 98, 101, 102, 111, 114, 101, 121, 111, 117, 97, 110, 100, 104, + 111, 119, 102, 97, 98, 117, 108, 111, 117, 115, 121, 111, 117, 114, 101, + 97, 108, 108, 121, 108, 111, 111, 107, 101, 100, 89, 111, 117, 97, 114, + 101, 110, 111, 116, 97, 115, 102, 97, 116, 97, 115, 121, 111, 117, 105, + 109, 97, 103, 105, 110, 101, 68, 111, 110, 116, 119, 111, 114, 114, 121, + 97, 98, 111, 117, 116, 116, 104, 101, 102, 117, 116, 117, 114, 101, 79, + 114, 119, 111, 114, 114, 121, 98, 117, 116, 107, 110, 111, 119, 116, 104, + 97, 116, 75, 117, 114, 116, 86, 111, 110, 110, 101, 103, 117, 116, 115, 67, + 111, 109, 109, 101, 110, 99, 101, 109, 101, 110, 116, 65, 100, 100, 114, + 101, 115, 115, 97, 116, 77, 73, 84, 76, 97, 100, 105, 101, 115, 97, 110, + 100, 103, 101, 110, 116, 108, 101, 109, 101, 110, 111, 102, 116, 104, 101, + 99, 108, 97, 115, 115, 111, 102, 57, 55, 87, 101, 97, 114, 115, 117, 110, + 115, 99, 114, 101, 101, 110, 73, 102, 73, 99, 111, 117, 108, 100, 111, 102, + 102, 101, 114, 121, 111, 117, 111, 110, 108, 121, 111, 110, 101, 116, 105, + 112, 102, 111, 114, 116, 104, 101, 102, 117, 116, 117, 114, 101, 115, 117, + 110, 115, 99, 114, 101, 101, 110, 119, 111, 117, 108, 100, 98, 101, 105, + 116, 84, 104, 101, 108, 111, 110, 103, 116, 101, 114, 109, 98, 101, 110, + 101, 102, 105, 116, 115, 111, 102, 115, 117, 110, 115, 99, 114, 101, 101, + 110, 104, 97, 118, 101, 98, 101, 101, 110, 112, 114, 111, 118, 101, 100, + 98, 121, 115, 99, 105, 101, 110, 116, 105, 115, 116, 115, 119, 104, 101, + 114, 101, 97, 115, 116, 104, 101, 114, 101, 115, 116, 111, 102, 109, 121, + 97, 100, 118, 105, 99, 101, 104, 97, 115, 110, 111, 98, 97, 115, 105, 115, + 109, 111, 114, 101, 114, 101, 108, 105, 97, 98, 108, 101, 116, 104, 97, + 110, 109, 121, 111, 119, 110, 109, 101, 97, 110, 100, 101, 114, 105, 110, + 103, 101, 120, 112, 101, 114, 105, 101, 110, 99, 101, 73, 119, 105, 108, + 108, 100, 105, 115, 112, 101, 110, 115, 101, 116, 104, 105, 115, 97, 100, + 118, 105, 99, 101, 110, 111, 119, 69, 110, 106, 111, 121, 116, 104, 101, + 112, 111, 119, 101, 114, 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, + 102, 121, 111, 117, 114, 121, 111, 117, 116, 104, 79, 104, 110, 101, 118, + 101, 114, 109, 105, 110, 100, 89, 111, 117, 119, 105, 108, 108, 110, 111, + 116, 117, 110, 100, 101, 114, 115, 116, 97, 110, 100, 116, 104, 101, 112, + 111, 119, 101, 114, 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, + 121, 111, 117, 114, 121, 111, 117, 116, 104, 117, 110, 116, 105, 108, 116, + 104, 101, 121, 118, 101, 102, 97, 100, 101, 100, 66, 117, 116, 116, 114, + 117, 115, 116, 109, 101, 105, 110, 50, 48, 121, 101, 97, 114, 115, 121, + 111, 117, 108, 108, 108, 111, 111, 107, 98, 97, 99, 107, 97, 116, 112, 104, + 111, 116, 111, 115, 111, 102, 121, 111, 117, 114, 115, 101, 108, 102, 97, + 110, 100, 114, 101, 99, 97, 108, 108, 105, 110, 97, 119, 97, 121, 121, 111, + 117, 99, 97, 110, 116, 103, 114, 97, 115, 112, 110, 111, 119, 104, 111, + 119, 109, 117, 99, 104, 112, 111, 115, 115, 105, 98, 105, 108, 105, 116, + 121, 108, 97, 121, 98, 101, 102, 111, 114, 101, 121, 111, 117, 97, 110, + 100, 104, 111, 119, 102, 97, 98, 117, 108, 111, 117, 115, 121, 111, 117, + 114, 101, 97, 108, 108, 121, 108, 111, 111, 107, 101, 100, 89, 111, 117, + 97, 114, 101, 110, 111, 116, 97, 115, 102, 97, 116, 97, 115, 121, 111, 117, + 105, 109, 97, 103, 105, 110, 101, 68, 111, 110, 116, 119, 111, 114, 114, + 121, 97, 98, 111, 117, 116, 116, 104, 101, 102, 117, 116, 117, 114, 101, + 79, 114, 119, 111, 114, 114, 121, 98, 117, 116, 107, 110, 111, 119, 116, + 104, 97, 116, 116, 115, 67, 111, 109, 109, 101, 110, 99, 101, 109, 101, + 110, 116, 65, 100, 100, 114, 101, 115, 115, 97, 116, 77, 73, 84, 76, 97, + 100, 105, 101, 115, 97, 110, 100, 103, 101, 110, 116, 108, 101, 109, 101, + 110, 111, 102, 116, 104, 101, 99, 108, 97, 115, 115, 111, 102, 57, 55, 87, + 101, 97, 114, 115, 117, 110, 115, 99, 114, 101, 101, 110, 73, 102, 73, 99, + 111, 117, 108, 100, 111, 102, 102, 101, 114, 121, 111, 117, 111, 110, 108, + 121, 111, 110, 101, 116, 105, 112, 102, 111, 114, 116, 104, 101, 102, 117, + 116, 117, 114, 101, 75, 117, 114, 116, 86, 111, 110, 110, 101, 103, 117, + 116, 115, 67, 111, 109, 109, 101, 110, 99, 101, 109, 101, 110, 116, 65, + 100, 100, 114, 101, 115, 115, 97, 116, 77, 73, 84, 76, 97, 100, 105, 101, + 115, 97, 110, 100, 103, 101, 110, 116, 108, 101, 109, 101, 110, 111, 102, + 116, 104, 101, 99, 108, 97, 115, 115, 111, 102, 57, 55, 87, 101, 97, 114, + 115, 117, 110, 115, 99, 114, 101, 101, 110, 73, 102, 73, 99, 111, 117, 108, + 100, 111, 102, 102, 101, 114, 121, 111, 117, 111, 110, 108, 121, 111, 110, + 101, 116, 105, 112, 102, 111, 114, 116, 104, 101, 102, 117, 116, 117, 114, + 101, 115, 117, 110, 115, 99, 114, 101, 101, 110, 119, 111, 117, 108, 100, + 98, 101, 105, 116, 84, 104, 101, 108, 111, 110, 103, 116, 101, 114, 109, + 98, 101, 110, 101, 102, 105, 116, 115, 111, 102, 115, 117, 110, 115, 99, + 114, 101, 101, 110, 104, 97, 118, 101, 98, 101, 101, 110, 112, 114, 111, + 118, 101, 100, 98, 121, 115, 99, 105, 101, 110, 116, 105, 115, 116, 115, + 119, 104, 101, 114, 101, 97, 115, 116, 104, 101, 114, 101, 115, 116, 111, + 102, 109, 121, 97, 100, 118, 105, 99, 101, 104, 97, 115, 110, 111, 98, 97, + 115, 105, 115, 109, 111, 114, 101, 114, 101, 108, 105, 97, 98, 108, 101, + 116, 104, 97, 110, 109, 121, 111, 119, 110, 109, 101, 97, 110, 100, 101, + 114, 105, 110, 103, 101, 120, 112, 101, 114, 105, 101, 110, 99, 101, 73, + 119, 105, 108, 108, 100, 105, 115, 112, 101, 110, 115, 101, 116, 104, 105, + 115, 97, 100, 118, 105, 99, 101, 110, 111, 119, 69, 110, 106, 111, 121, + 116, 104, 101, 112, 111, 119, 101, 114, 97, 110, 100, 98, 101, 97, 117, + 116, 121, 111, 102, 121, 111, 117, 114, 121, 111, 117, 116, 104, 79, 104, + 110, 101, 118, 101, 114, 109, 105, 110, 100, 89, 111, 117, 119, 105, 108, + 108, 110, 111, 116, 117, 110, 100, 101, 114, 115, 116, 97, 110, 100, 116, + 104, 101, 112, 111, 119, 101, 114, 97, 110, 100, 98, 101, 97, 117, 116, + 121, 111, 102, 121, 111, 117, 114, 121, 111, 117, 116, 104, 117, 110, 116, + 105, 108, 116, 104, 101, 121, 118, 101, 102, 97, 100, 101, 100, 66, 117, + 116, 116, 114, 117, 115, 116, 109, 101, 105, 110, 50, 48, 121, 101, 97, + 114, 115, 121, 111, 117, 108, 108, 108, 111, 111, 107, 98, 97, 99, 107, 97, + 116, 112, 104, 111, 116, 111, 115, 111, 102, 121, 111, 117, 114, 115, 101, + 108, 102, 97, 110, 100, 114, 101, 99, 97, 108, 108, 105, 110, 97, 119, 97, + 121, 121, 111, 117, 99, 97, 110, 116, 103, 114, 97, 115, 112, 110, 111, + 119, 104, 111, 119, 109, 117, 99, 104, 112, 111, 115, 115, 105, 98, 105, + 108, 105, 116, 121, 108, 97, 121, 98, 101, 102, 111, 114, 101, 121, 111, + 117, 97, 110, 100, 104, 111, 119, 102, 97, 98, 117, 108, 111, 117, 115, + 121, 111, 117, 114, 101, 97, 108, 108, 121, 108, 111, 111, 107, 101, 100, + 89, 111, 117, 97, 114, 101, 110, 111, 116, 97, 115, 102, 97, 116, 97, 115, + 121, 111, 117, 105, 109, 97, 103, 105, 110, 101, 68, 111, 110, 116, 119, + 111, 114, 114, 121, 97, 98, 111, 117, 116, 116, 104, 101, 102, 117, 116, + 117, 114, 101, 79, 114, 119, 111, 114, 114, 121, 98, 117, 116, 107, 110, + 111, 119, 116, 104, 97, 116, 75, 117, 114, 116, 86, 111, 110, 110, 101, + 103, 117, 116, 115, 67, 111, 109, 109, 101, 110, 99, 101, 109, 101, 110, + 116, 65, 100, 100, 114, 101, 115, 115, 97, 116, 77, 73, 84, 76, 97, 100, + 105, 101, 115, 97, 110, 100, 103, 101, 110, 116, 108, 101, 109, 101, 110, + 111, 102, 116, 104, 101, 99, 108, 97, 115, 115, 111, 102, 57, 55, 87, 101, + 97, 114, 115, 117, 110, 115, 99, 114, 101, 101, 110, 73, 102, 73, 99, 111, + 117, 108, 100, 111, 102, 102, 101, 114, 121, 111, 117, 111, 110, 108, 121, + 111, 110, 101, 116, 105, 112, 102, 111, 114, 116, 104, 101, 102, 117, 116, + 117, 114, 101, 115, 117, 110, 115, 99, 114, 101, 101, 110, 119, 111, 117, + 108, 100, 98, 101, 105, 116, 84, 104, 101, 108, 111, 110, 103, 116, 101, + 114, 109, 98, 101, 110, 101, 102, 105, 116, 115, 111, 102, 115, 117, 110, + 115, 99, 114, 101, 101, 110, 104, 97, 118, 101, 98, 101, 101, 110, 112, + 114, 111, 118, 101, 100, 98, 121, 115, 99, 105, 101, 110, 116, 105, 115, + 116, 115, 119, 104, 101, 114, 101, 97, 115, 116, 104, 101, 114, 101, 115, + 116, 111, 102, 109, 121, 97, 100, 118, 105, 99, 101, 104, 97, 115, 110, + 111, 98, 97, 115, 105, 115, 109, 111, 114, 101, 114, 101, 108, 105, 97, 98, + 108, 101, 116, 104, 97, 110, 109, 121, 111, 119, 110, 109, 101, 97, 110, + 100, 101, 114, 105, 110, 103, 101, 120, 112, 101, 114, 105, 101, 110, 99, + 101, 73, 119, 105, 108, 108, 100, 105, 115, 112, 101, 110, 115, 101, 116, + 104, 105, 115, 97, 100, 118, 105, 99, 101, 110, 111, 119, 69, 110, 106, + 111, 121, 116, 104, 101, 112, 111, 119, 101, 114, 97, 110, 100, 98, 101, + 97, 117, 116, 121, 111, 102, 121, 111, 117, 114, 121, 111, 117, 116, 104, + 79, 104, 110, 101, 118, 101, 114, 109, 105, 110, 100, 89, 111, 117, 119, + 105, 108, 108, 110, 111, 116, 117, 110, 100, 101, 114, 115, 116, 97, 110, + 100, 116, 104, 101, 112, 111, 119, 101, 114, 97, 110, 100, 98, 101, 97, + 117, 116, 121, 111, 102, 121, 111, 117, 114, 121, 111, 117, 116, 104, 117, + 110, 116, 105, 108, 116, 104, 101, 121, 118, 101, 102, 97, 100, 101, 100, + 66, 117, 116, 116, 114, 117, 115, 116, 109, 101, 105, 110, 50, 48, 121, + 101, 97, 114, 115, 121, 111, 117, 108, 108, 108, 111, 111, 107, 98, 97, 99, + 107, 97, 116, 112, 104, 111, 116, 111, 115, 111, 102, 121, 111, 117, 114, + 115, 101, 108, 102, 97, 110, 100, 114, 101, 99, 97, 108, 108, 105, 110, 97, + 119, 97, 121, 121, 111, 117, 99, 97, 110, 116, 103, 114, 97, 115, 112, 110, + 111, 119, 104, 111, 119, 109, 117, 99, 104, 112, 111, 115, 115, 105, 98, + 105, 108, 105, 116, 121, 108, 97, 121, 98, 101, 102, 111, 114, 101, 121, + 111, 117, 97, 110, 100, 104, 111, 119, 102, 97, 98, 117, 108, 111, 117, + 115, 121, 111, 117, 114, 101, 97, 108, 108, 121, 108, 111, 111, 107, 101, + 100, 89, 111, 117, 97, 114, 101, 110, 111, 116, 97, 115, 102, 97, 116, 97, + 115, 121, 111, 117, 105, 109, 97, 103, 105, 110, 101, 68, 111, 110, 116, + 119, 111, 114, 114, 121, 97, 98, 111, 117, 116, 116, 104, 101, 102, 117, + 116, 117, 114, 101, 79, 114, 119, 111, 114, 114, 121, 98, 117, 116, 107, + 110, 111, 119, 116, 104, 97, 116, 75, 117, 114, 116, 86, 111, 110, 110, + 101, 103, 117, 116, 115, 67, 111, 109, 109, 101, 110, 99, 101, 109, 101, + 110, 116, 65, 100, 100, 114, 101, 115, 115, 97, 116, 77, 73, 84, 76, 97, + 100, 105, 101, 115, 97, 110, 100, 103, 101, 110, 116, 108, 101, 109, 101, + 110, 111, 102, 116, 104, 101, 99, 108, 97, 115, 115, 111, 102, 57, 55, 87, + 101, 97, 114, 115, 117, 110, 115, 99, 114, 101, 101, 110, 73, 102, 73, 99, + 111, 117, 108, 100, 111, 102, 102, 101, 114, 121, 111, 117, 111, 110, 108, + 121, 111, 110, 101, 116, 105, 112, 102, 111, 114, 116, 104, 101, 102, 117, + 116, 117, 114, 101, 115, 117, 110, 115, 99, 114, 101, 101, 110, 119, 111, + 117, 108, 100, 98, 101, 105, 116, 84, 104, 101, 108, 111, 110, 103, 116, + 101, 114, 109, 98, 101, 110, 101, 102, 105, 116, 115, 111, 102, 115, 117, + 110, 115, 99, 114, 101, 101, 110, 104, 97, 118, 101, 98, 101, 101, 110, + 112, 114, 111, 118, 101, 100, 98, 121, 115, 99, 105, 101, 110, 116, 105, + 115, 116, 115, 119, 104, 101, 114, 101, 97, 115, 116, 104, 101, 114, 101, + 115, 116, 111, 102, 109, 121, 97, 100, 118, 105, 99, 101, 104, 97, 115, + 110, 111, 98, 97, 115, 105, 115, 109, 111, 114, 101, 114, 101, 108, 105, + 97, 98, 108, 101, 116, 104, 97, 110, 109, 121, 111, 119, 110, 109, 101, 97, + 110, 100, 101, 114, 105, 110, 103, 101, 120, 112, 101, 114, 105, 101, 110, + 99, 101, 73, 119, 105, 108, 108, 100, 105, 115, 112, 101, 110, 115, 101, + 116, 104, 105, 115, 97, 100, 118, 105, 99, 101, 110, 111, 119, 69, 110, + 106, 111, 121, 116, 104, 101, 112, 111, 119, 101, 114, 97, 110, 100, 98, + 101, 97, 117, 116, 121, 111, 102, 121, 111, 117, 114, 121, 111, 117, 116, + 104, 79, 104, 110, 101, 118, 101, 114, 109, 105, 110, 100, 89, 111, 117, + 119, 105, 108, 108, 110, 111, 116, 117, 110, 100, 101, 114, 115, 116, 97, + 110, 100, 116, 104, 101, 112, 111, 119, 101, 114, 97, 110, 100, 98, 101, + 97, 117, 116, 121, 111, 102, 121, 111, 117, 114, 121, 111, 117, 116, 104, + 117, 110, 116, 105, 108, 116, 104, 101, 121, 118, 101, 102, 97, 100, 101, + 100, 66, 117, 116, 116, 114, 117, 115, 116, 109, 101, 105, 110, 50, 48, + 121, 101, 97, 114, 115, 121, 111, 117, 108, 108, 108, 111, 111, 107, 98, + 97, 99, 107, 97, 116, 112, 104, 111, 116, 111, 115, 111, 102, 121, 111, + 117, 114, 115, 101, 108, 102, 97, 110, 100, 114, 101, 99, 97, 108, 108, + 105, 110, 97, 119, 97, 121, 121, 111, 117, 99, 97, 110, 116, 103, 114, 97, + 115, 112, 110, 111, 119, 104, 111, 119, 109, 117, 99, 104, 112, 111, 115, + 115, 105, 98, 105, 108, 105, 116, 121, 108, 97, 121, 98, 101, 102, 111, + 114, 101, 121, 111, 117, 97, 110, 100, 104, 111, 119, 102, 97, 98, 117, + 108, 111, 117, 115, 121, 111, 117, 114, 101, 97, 108, 108, 121, 108, 111, + 111, 107, 101, 100, 89, 111, 117, 97, 114, 101, 110, 111, 116, 97, 115, + 102, 97, 116, 97, 115, 121, 111, 117, 105, 109, 97, 103, 105, 110, 101, 68, + 111, 110, 116, 119, 111, 114, 114, 121, 97, 98, 111, 117, 116, 116, 104, + 101, 102, 117, 116, 117, 114, 101, 79, 114, 119, 111, 114, 114, 121, 98, + 117, 116, 107, 110, 111, 119, 116, 104, 97, 116, 115, 117, 110, 115, 99, + 114, 101, 101, 110, 119, 111, 117, 108, 100, 98, 101, 105, 116, 84, 104, + 101, 108, 111, 110, 103, 116, 101, 114, 109, 98, 101, 110, 101, 102, 105, + 116, 115, 111, 102, 115, 117, 110, 115, 99, 114, 101, 101, 110, 104, 97, + 118, 101, 98, 101, 101, 110, 112, 114, 111, 118, 101, 100, 98, 121, 115, + 99, 105, 101, 110, 116, 105, 115, 116, 115, 119, 104, 101, 114, 101, 97, + 115, 116, 104, 101, 114, 101, 115, 116, 111, 102, 109, 121, 97, 100, 118, + 105, 99, 101, 104, 97, 115, 110, 111, 98, 97, 115, 105, 115, 109, 111, 114, + 101, 114, 101, 108, 105, 97, 98, 108, 101, 116, 104, 97, 110, 109, 121, + 111, 119, 110, 109, 101, 97, 110, 100, 101, 114, 105, 110, 103, 101, 120, + 112, 101, 114, 105, 101, 110, 99, 101, 73, 119, 105, 108, 108, 100, 105, + 115, 112, 101, 110, 115, 101, 116, 104, 105, 115, 97, 100, 118, 105, 99, + 101, 110, 111, 119, 69, 110, 106, 111, 121, 116, 104, 101, 112, 111, 119, + 101, 114, 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, 121, 111, + 117, 114, 121, 111, 117, 116, 104, 79, 104, 110, 101, 118, 101, 114, 109, + 105, 110, 100, 89, 111, 117, 119, 105, 108, 108, 110, 111, 116, 117, 110, + 100, 101, 114, 115, 116, 97, 110, 100, 116, 104, 101, 112, 111, 119, 101, + 114, 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, 121, 111, 117, + 114, 121, 111, 117, 116, 104, 117, 110, 116, 105, 108, 116, 104, 101, 121, + 118, 101, 102, 97, 100, 101, 100, 66, 117, 116, 116, 114, 117, 115, 116, + 109, 101, 105, 110, 50, 48, 121, 101, 97, 114, 115, 121, 111, 117, 108, + 108, 108, 111, 111, 107, 98, 97, 99, 107, 97, 116, 112, 104, 111, 116, 111, + 115, 111, 102, 121, 111, 117, 114, 115, 101, 108, 102, 97, 110, 100, 114, + 101, 99, 97, 108, 108, 105, 110, 97, 119, 97, 121, 121, 111, 117, 99, 97, + 110, 116, 103, 114, 97, 115, 112, 110, 111, 119, 104, 111, 119, 109, 117, + 99, 104, 112, 111, 115, 115, 105, 98, 105, 108, 105, 116, 121, 108, 97, + 121, 98, 101, 102, 111, 114, 101, 121, 111, 117, 97, 110, 100, 104, 111, + 119, 102, 97, 98, 117, 108, 111, 117, 115, 121, 111, 117, 114, 101, 97, + 108, 108, 121, 108, 111, 111, 107, 101, 100, 89, 111, 117, 97, 114, 101, + 110, 111, 116, 97, 115, 102, 97, 116, 97, 115, 121, 111, 117, 105, 109, 97, + 103, 105, 110, 101, 68, 111, 110, 116, 119, 111, 114, 114, 121, 97, 98, + 111, 117, 116, 116, 104, 101, 102, 117, 116, 117, 114, 101, 79, 114, 119, + 111, 114, 114, 121, 98, 117, 116, 107, 110, 111, 119, 116, 104, 97, 116, + 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, 121, 111, 117, 114, 121, + 111, 117, 116, 104, 117, 110, 116, 105, 108, 116, 104, 101, 121, 118, 101, + 102, 97, 100, 101, 100, 66, 117, 116, 116, 114, 117, 115, 116, 109, 101, + 105, 110, 50, 48, 121, 101, 97, 114, 115, 121, 111, 117, 108, 108, 108, + 111, 111, 107, 98, 97, 99, 107, 97, 116, 112, 104, 111, 116, 111, 115, 111, + 102, 121, 111, 117, 114, 115, 101, 108, 102, 97, 110, 100, 114, 101, 99, + 97, 108, 108, 105, 110, 97, 119, 97, 121, 121, 111, 117, 99, 97, 110, 116, + 103, 114, 97, 115, 112, 110, 111, 119, 104, 111, 119, 109, 117, 99, 104, + 112, 111, 115, 115, 105, 98, 105, 108, 105, 116, 121, 108, 97, 121, 98, + 101, 102, 111, 114, 101, 121, 111, 117, 97, 110, 100, 104, 111, 119, 102, + 97, 98, 117, 108, 111, 117, 115, 121, 111, 117, 114, 101, 97, 108, 108, + 121, 108, 111, 111, 107, 101, 100, 89, 111, 117, 97, 114, 101, 110, 111, + 116, 97, 115, 102, 97, 116, 97, 115, 121, 111, 117, 105, 109, 97, 103, 105, + 110, 101, 68, 111, 110, 116, 119, 111, 114, 114, 121, 97, 98, 111, 117, + 116, 116, 104, 101, 102, 117, 116, 117, 114, 101, 79, 114, 119, 111, 114, + 114, 121, 98, 117, 116, 107, 110, 111, 119, 116, 104, 97, 116, 115, 117, + 110, 115, 99, 114, 101, 101, 110, 119, 111, 117, 108, 100, 98, 101, 105, + 116, 84, 104, 101, 108, 111, 110, 103, 116, 101, 114, 109, 98, 101, 110, + 101, 102, 105, 116, 115, 111, 102, 115, 117, 110, 115, 99, 114, 101, 101, + 110, 104, 97, 118, 101, 98, 101, 101, 110, 112, 114, 111, 118, 101, 100, + 98, 121, 115, 99, 105, 101, 110, 116, 105, 115, 116, 115, 119, 104, 101, + 114, 101, 97, 115, 116, 104, 101, 114, 101, 115, 116, 111, 102, 109, 121, + 97, 100, 118, 105, 99, 101, 104, 97, 115, 110, 111, 98, 97, 115, 105, 115, + 109, 111, 114, 101, 114, 101, 108, 105, 97, 98, 108, 101, 116, 104, 97, + 110, 109, 121, 111, 119, 110, 109, 101, 97, 110, 100, 101, 114, 105, 110, + 103, 101, 120, 112, 101, 114, 105, 101, 110, 99, 101, 73, 119, 105, 108, + 108, 100, 105, 115, 112, 101, 110, 115, 101, 116, 104, 105, 115, 97, 100, + 118, 105, 99, 101, 110, 111, 119, 69, 110, 106, 111, 121, 116, 104, 101, + 112, 111, 119, 101, 114, 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, + 102, 121, 111, 117, 114, 121, 111, 117, 116, 104, 79, 104, 110, 101, 118, + 101, 114, 109, 105, 110, 100, 89, 111, 117, 119, 105, 108, 108, 110, 111, + 116, 117, 110, 100, 101, 114, 115, 116, 97, 110, 100, 116, 104, 101, 112, + 111, 119, 101, 114, 97, 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, + 121, 111, 117, 114, 121, 111, 117, 116, 104, 117, 110, 116, 105, 108, 116, + 104, 101, 121, 118, 101, 102, 97, 100, 101, 100, 66, 117, 116, 116, 114, + 117, 115, 116, 109, 101, 105, 110, 50, 48, 121, 101, 97, 114, 115, 121, + 111, 117, 108, 108, 108, 111, 111, 107, 98, 97, 99, 107, 97, 116, 112, 104, + 111, 116, 111, 115, 111, 102, 121, 111, 117, 114, 115, 101, 108, 102, 97, + 110, 100, 114, 101, 99, 97, 108, 108, 105, 110, 97, 119, 97, 121, 121, 111, + 117, 99, 97, 110, 116, 103, 114, 97, 115, 112, 110, 111, 119, 104, 111, + 119, 109, 117, 99, 104, 112, 111, 115, 115, 105, 98, 105, 108, 105, 116, + 121, 108, 97, 121, 98, 101, 102, 111, 114, 101, 121, 111, 117, 97, 110, + 100, 104, 111, 119, 102, 97, 98, 117, 108, 111, 117, 115, 121, 111, 117, + 114, 101, 97, 108, 108, 121, 108, 111, 111, 107, 101, 100, 89, 111, 117, + 97, 114, 101, 110, 111, 116, 97, 115, 102, 97, 116, 97, 115, 121, 111, 117, + 105, 109, 97, 103, 105, 110, 101, 68, 111, 110, 116, 119, 111, 114, 114, + 121, 97, 98, 111, 117, 116, 116, 104, 101, 102, 117, 116, 117, 114, 101, + 79, 114, 119, 111, 114, 114, 121, 98, 117, 116, 107, 110, 111, 119, 116, + 104, 97, 116, 110, 100, 98, 101, 97, 117, 116, 121, 111, 102, 121, 111, + 117, 114, 121, 111, 117, 116, 104, 117, 110, 116, 105, 108, 116, 104, 101, + 121, 118, 101, 102, 97, 100, 101, 100, 66, 117, 116, 116, 114, 117, 115, + 116, 109, 101, 105, 110, 50, 48, 121, 101, 97, 114, 115, 121, 111, 117, + 108, 108, 108, 111, 111} +}; +const int in_i[VSIZE] = { 8192, 8192 }; + + sha_init(sha_info_digest, &sha_info_count_lo, &sha_info_count_hi); + for (j = 0; j < VSIZE; j++) + { + i = in_i[j]; + p = &indata[j][0]; + sha_update (p, i, sha_info_digest, &sha_info_count_lo, &sha_info_count_hi, sha_info_data); + } + sha_final (sha_info_digest, &sha_info_count_lo, &sha_info_count_hi, sha_info_data); +} /* +--------------------------------------------------------------------------+ | * Test Vector (added for CHStone) | | outData : expected output data | +--------------------------------------------------------------------------+ */ -const INT32 outData[5] = - { 0x006a5a37UL, 0x93dc9485UL, 0x2c412112UL, 0x63f7ba43UL, 0xad73f922UL }; - int main () { + const INT32 outData[5] = + { 0x006a5a37UL, 0x93dc9485UL, 0x2c412112UL, 0x63f7ba43UL, 0xad73f922UL }; + INT32 sha_info_digest[5]; /* message digest */ + int i; int main_result; main_result = 0; - sha_stream (); + sha_stream (sha_info_digest); for (i = 0; i < 5; i++) { diff --git a/benchmarks/dhrystone/Makefile b/benchmarks/dhrystone/Makefile deleted file mode 100644 index 6a10d2a..0000000 --- a/benchmarks/dhrystone/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -CC := gcc -CFLAGS := -O3 - -all: - $(CC) $(CFLAGS) -DHZ=60 dhry_1.c dhry_2.c -o dhry - -clean: - rm -f dhry diff --git a/benchmarks/dhrystone/dhry.h b/benchmarks/dhrystone/dhry.h deleted file mode 100644 index 0c46375..0000000 --- a/benchmarks/dhrystone/dhry.h +++ /dev/null @@ -1,422 +0,0 @@ -/* - **************************************************************************** - * - * "DHRYSTONE" Benchmark Program - * ----------------------------- - * - * Version: C, Version 2.1 - * - * File: dhry.h (part 1 of 3) - * - * Date: May 25, 1988 - * - * Author: Reinhold P. Weicker - * Siemens AG, AUT E 51 - * Postfach 3220 - * 8520 Erlangen - * Germany (West) - * Phone: [+49]-9131-7-20330 - * (8-17 Central European Time) - * Usenet: ..!mcsun!unido!estevax!weicker - * - * Original Version (in Ada) published in - * "Communications of the ACM" vol. 27., no. 10 (Oct. 1984), - * pp. 1013 - 1030, together with the statistics - * on which the distribution of statements etc. is based. - * - * In this C version, the following C library functions are used: - * - strcpy, strcmp (inside the measurement loop) - * - printf, scanf (outside the measurement loop) - * In addition, Berkeley UNIX system calls "times ()" or "time ()" - * are used for execution time measurement. For measurements - * on other systems, these calls have to be changed. - * - * Collection of Results: - * Reinhold Weicker (address see above) and - * - * Rick Richardson - * PC Research. Inc. - * 94 Apple Orchard Drive - * Tinton Falls, NJ 07724 - * Phone: (201) 389-8963 (9-17 EST) - * Usenet: ...!uunet!pcrat!rick - * - * Please send results to Rick Richardson and/or Reinhold Weicker. - * Complete information should be given on hardware and software used. - * Hardware information includes: Machine type, CPU, type and size - * of caches; for microprocessors: clock frequency, memory speed - * (number of wait states). - * Software information includes: Compiler (and runtime library) - * manufacturer and version, compilation switches, OS version. - * The Operating System version may give an indication about the - * compiler; Dhrystone itself performs no OS calls in the measurement loop. - * - * The complete output generated by the program should be mailed - * such that at least some checks for correctness can be made. - * - *************************************************************************** - * - * History: This version C/2.1 has been made for two reasons: - * - * 1) There is an obvious need for a common C version of - * Dhrystone, since C is at present the most popular system - * programming language for the class of processors - * (microcomputers, minicomputers) where Dhrystone is used most. - * There should be, as far as possible, only one C version of - * Dhrystone such that results can be compared without - * restrictions. In the past, the C versions distributed - * by Rick Richardson (Version 1.1) and by Reinhold Weicker - * had small (though not significant) differences. - * - * 2) As far as it is possible without changes to the Dhrystone - * statistics, optimizing compilers should be prevented from - * removing significant statements. - * - * This C version has been developed in cooperation with - * Rick Richardson (Tinton Falls, NJ), it incorporates many - * ideas from the "Version 1.1" distributed previously by - * him over the UNIX network Usenet. - * I also thank Chaim Benedelac (National Semiconductor), - * David Ditzel (SUN), Earl Killian and John Mashey (MIPS), - * Alan Smith and Rafael Saavedra-Barrera (UC at Berkeley) - * for their help with comments on earlier versions of the - * benchmark. - * - * Changes: In the initialization part, this version follows mostly - * Rick Richardson's version distributed via Usenet, not the - * version distributed earlier via floppy disk by Reinhold Weicker. - * As a concession to older compilers, names have been made - * unique within the first 8 characters. - * Inside the measurement loop, this version follows the - * version previously distributed by Reinhold Weicker. - * - * At several places in the benchmark, code has been added, - * but within the measurement loop only in branches that - * are not executed. The intention is that optimizing compilers - * should be prevented from moving code out of the measurement - * loop, or from removing code altogether. Since the statements - * that are executed within the measurement loop have NOT been - * changed, the numbers defining the "Dhrystone distribution" - * (distribution of statements, operand types and locality) - * still hold. Except for sophisticated optimizing compilers, - * execution times for this version should be the same as - * for previous versions. - * - * Since it has proven difficult to subtract the time for the - * measurement loop overhead in a correct way, the loop check - * has been made a part of the benchmark. This does have - * an impact - though a very minor one - on the distribution - * statistics which have been updated for this version. - * - * All changes within the measurement loop are described - * and discussed in the companion paper "Rationale for - * Dhrystone version 2". - * - * Because of the self-imposed limitation that the order and - * distribution of the executed statements should not be - * changed, there are still cases where optimizing compilers - * may not generate code for some statements. To a certain - * degree, this is unavoidable for small synthetic benchmarks. - * Users of the benchmark are advised to check code listings - * whether code is generated for all statements of Dhrystone. - * - * Version 2.1 is identical to version 2.0 distributed via - * the UNIX network Usenet in March 1988 except that it corrects - * some minor deficiencies that were found by users of version 2.0. - * The only change within the measurement loop is that a - * non-executed "else" part was added to the "if" statement in - * Func_3, and a non-executed "else" part removed from Proc_3. - * - *************************************************************************** - * - * Defines: The following "Defines" are possible: - * -DREG=register (default: Not defined) - * As an approximation to what an average C programmer - * might do, the "register" storage class is applied - * (if enabled by -DREG=register) - * - for local variables, if they are used (dynamically) - * five or more times - * - for parameters if they are used (dynamically) - * six or more times - * Note that an optimal "register" strategy is - * compiler-dependent, and that "register" declarations - * do not necessarily lead to faster execution. - * -DNOSTRUCTASSIGN (default: Not defined) - * Define if the C compiler does not support - * assignment of structures. - * -DNOENUMS (default: Not defined) - * Define if the C compiler does not support - * enumeration types. - * -DTIMES (default) - * -DTIME - * The "times" function of UNIX (returning process times) - * or the "time" function (returning wallclock time) - * is used for measurement. - * For single user machines, "time ()" is adequate. For - * multi-user machines where you cannot get single-user - * access, use the "times ()" function. If you have - * neither, use a stopwatch in the dead of night. - * "printf"s are provided marking the points "Start Timer" - * and "Stop Timer". DO NOT use the UNIX "time(1)" - * command, as this will measure the total time to - * run this program, which will (erroneously) include - * the time to allocate storage (malloc) and to perform - * the initialization. - * -DHZ=nnn - * In Berkeley UNIX, the function "times" returns process - * time in 1/HZ seconds, with HZ = 60 for most systems. - * CHECK YOUR SYSTEM DESCRIPTION BEFORE YOU JUST APPLY - * A VALUE. - * - *************************************************************************** - * - * Compilation model and measurement (IMPORTANT): - * - * This C version of Dhrystone consists of three files: - * - dhry.h (this file, containing global definitions and comments) - * - dhry_1.c (containing the code corresponding to Ada package Pack_1) - * - dhry_2.c (containing the code corresponding to Ada package Pack_2) - * - * The following "ground rules" apply for measurements: - * - Separate compilation - * - No procedure merging - * - Otherwise, compiler optimizations are allowed but should be indicated - * - Default results are those without register declarations - * See the companion paper "Rationale for Dhrystone Version 2" for a more - * detailed discussion of these ground rules. - * - * For 16-Bit processors (e.g. 80186, 80286), times for all compilation - * models ("small", "medium", "large" etc.) should be given if possible, - * together with a definition of these models for the compiler system used. - * - ************************************************************************** - * - * Dhrystone (C version) statistics: - * - * [Comment from the first distribution, updated for version 2. - * Note that because of language differences, the numbers are slightly - * different from the Ada version.] - * - * The following program contains statements of a high level programming - * language (here: C) in a distribution considered representative: - * - * assignments 52 (51.0 %) - * control statements 33 (32.4 %) - * procedure, function calls 17 (16.7 %) - * - * 103 statements are dynamically executed. The program is balanced with - * respect to the three aspects: - * - * - statement type - * - operand type - * - operand locality - * operand global, local, parameter, or constant. - * - * The combination of these three aspects is balanced only approximately. - * - * 1. Statement Type: - * ----------------- number - * - * V1 = V2 9 - * (incl. V1 = F(..) - * V = Constant 12 - * Assignment, 7 - * with array element - * Assignment, 6 - * with record component - * -- - * 34 34 - * - * X = Y +|-|"&&"|"|" Z 5 - * X = Y +|-|"==" Constant 6 - * X = X +|- 1 3 - * X = Y *|/ Z 2 - * X = Expression, 1 - * two operators - * X = Expression, 1 - * three operators - * -- - * 18 18 - * - * if .... 14 - * with "else" 7 - * without "else" 7 - * executed 3 - * not executed 4 - * for ... 7 | counted every time - * while ... 4 | the loop condition - * do ... while 1 | is evaluated - * switch ... 1 - * break 1 - * declaration with 1 - * initialization - * -- - * 34 34 - * - * P (...) procedure call 11 - * user procedure 10 - * library procedure 1 - * X = F (...) - * function call 6 - * user function 5 - * library function 1 - * -- - * 17 17 - * --- - * 103 - * - * The average number of parameters in procedure or function calls - * is 1.82 (not counting the function values as implicit parameters). - * - * - * 2. Operators - * ------------ - * number approximate - * percentage - * - * Arithmetic 32 50.8 - * - * + 21 33.3 - * - 7 11.1 - * * 3 4.8 - * / (int div) 1 1.6 - * - * Comparison 27 42.8 - * - * == 9 14.3 - * /= 4 6.3 - * > 1 1.6 - * < 3 4.8 - * >= 1 1.6 - * <= 9 14.3 - * - * Logic 4 6.3 - * - * && (AND-THEN) 1 1.6 - * | (OR) 1 1.6 - * ! (NOT) 2 3.2 - * - * -- ----- - * 63 100.1 - * - * - * 3. Operand Type (counted once per operand reference): - * --------------- - * number approximate - * percentage - * - * Integer 175 72.3 % - * Character 45 18.6 % - * Pointer 12 5.0 % - * String30 6 2.5 % - * Array 2 0.8 % - * Record 2 0.8 % - * --- ------- - * 242 100.0 % - * - * When there is an access path leading to the final operand (e.g. a record - * component), only the final data type on the access path is counted. - * - * - * 4. Operand Locality: - * ------------------- - * number approximate - * percentage - * - * local variable 114 47.1 % - * global variable 22 9.1 % - * parameter 45 18.6 % - * value 23 9.5 % - * reference 22 9.1 % - * function result 6 2.5 % - * constant 55 22.7 % - * --- ------- - * 242 100.0 % - * - * - * The program does not compute anything meaningful, but it is syntactically - * and semantically correct. All variables have a value assigned to them - * before they are used as a source operand. - * - * There has been no explicit effort to account for the effects of a - * cache, or to balance the use of long or short displacements for code or - * data. - * - *************************************************************************** - */ - -/* Compiler and system dependent definitions: */ - -#ifndef TIME -#define TIMES -#endif - /* Use times(2) time function unless */ - /* explicitly defined otherwise */ - -#ifdef TIMES -#include -#include - /* for "times" */ -#endif - -#define Mic_secs_Per_Second 1000000.0 - /* Berkeley UNIX C returns process times in seconds/HZ */ - -#ifdef NOSTRUCTASSIGN -#define structassign(d, s) memcpy(&(d), &(s), sizeof(d)) -#else -#define structassign(d, s) d = s -#endif - -#ifdef NOENUM -#define Ident_1 0 -#define Ident_2 1 -#define Ident_3 2 -#define Ident_4 3 -#define Ident_5 4 - typedef int Enumeration; -#else - typedef enum {Ident_1, Ident_2, Ident_3, Ident_4, Ident_5} - Enumeration; -#endif - /* for boolean and enumeration types in Ada, Pascal */ - -/* General definitions: */ - -#include -#include - /* for strcpy, strcmp */ - -#define Null 0 - /* Value of a Null pointer */ -#define true 1 -#define false 0 - -typedef int One_Thirty; -typedef int One_Fifty; -typedef char Capital_Letter; -typedef int Boolean; -typedef char Str_30 [31]; -typedef int Arr_1_Dim [50]; -typedef int Arr_2_Dim [50] [50]; - -typedef struct record - { - struct record *Ptr_Comp; - Enumeration Discr; - union { - struct { - Enumeration Enum_Comp; - int Int_Comp; - char Str_Comp [31]; - } var_1; - struct { - Enumeration E_Comp_2; - char Str_2_Comp [31]; - } var_2; - struct { - char Ch_1_Comp; - char Ch_2_Comp; - } var_3; - } variant; - } Rec_Type, *Rec_Pointer; diff --git a/benchmarks/dhrystone/dhry_1.c b/benchmarks/dhrystone/dhry_1.c deleted file mode 100644 index 19e73d7..0000000 --- a/benchmarks/dhrystone/dhry_1.c +++ /dev/null @@ -1,383 +0,0 @@ -/* - **************************************************************************** - * - * "DHRYSTONE" Benchmark Program - * ----------------------------- - * - * Version: C, Version 2.1 - * - * File: dhry_1.c (part 2 of 3) - * - * Date: May 25, 1988 - * - * Author: Reinhold P. Weicker - * - **************************************************************************** - */ - -#include "dhry.h" - -/* Global Variables: */ - -Rec_Pointer Ptr_Glob, - Next_Ptr_Glob; -int Int_Glob; -Boolean Bool_Glob; -char Ch_1_Glob, - Ch_2_Glob; -int Arr_1_Glob [50]; -int Arr_2_Glob [50] [50]; - -// extern char *malloc (); -Enumeration Func_1 (); - /* forward declaration necessary since Enumeration may not simply be int */ - -#ifndef REG - Boolean Reg = false; -#define REG - /* REG becomes defined as empty */ - /* i.e. no register variables */ -#else - Boolean Reg = true; -#endif - -/* variables for time measurement: */ - -#ifdef TIMES -struct tms time_info; -// extern int times (); - /* see library function "times" */ -#define Too_Small_Time 120 - /* Measurements should last at least about 2 seconds */ -#endif -#ifdef TIME -extern long time(); - /* see library function "time" */ -#define Too_Small_Time 2 - /* Measurements should last at least 2 seconds */ -#endif - -long Begin_Time, - End_Time, - User_Time; -float Microseconds, - Dhrystones_Per_Second; - -/* end of variables for time measurement */ - - -main () -/*****/ - - /* main program, corresponds to procedures */ - /* Main and Proc_0 in the Ada version */ -{ - One_Fifty Int_1_Loc; - REG One_Fifty Int_2_Loc; - One_Fifty Int_3_Loc; - REG char Ch_Index; - Enumeration Enum_Loc; - Str_30 Str_1_Loc; - Str_30 Str_2_Loc; - REG int Run_Index; - REG int Number_Of_Runs; - - /* Initializations */ - - Next_Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); - Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); - - Ptr_Glob->Ptr_Comp = Next_Ptr_Glob; - Ptr_Glob->Discr = Ident_1; - Ptr_Glob->variant.var_1.Enum_Comp = Ident_3; - Ptr_Glob->variant.var_1.Int_Comp = 40; - strcpy (Ptr_Glob->variant.var_1.Str_Comp, - "DHRYSTONE PROGRAM, SOME STRING"); - strcpy (Str_1_Loc, "DHRYSTONE PROGRAM, 1'ST STRING"); - - Arr_2_Glob [8][7] = 10; - /* Was missing in published program. Without this statement, */ - /* Arr_2_Glob [8][7] would have an undefined value. */ - /* Warning: With 16-Bit processors and Number_Of_Runs > 32000, */ - /* overflow may occur for this array element. */ - - printf ("\n"); - printf ("Dhrystone Benchmark, Version 2.1 (Language: C)\n"); - printf ("\n"); - if (Reg) - { - printf ("Program compiled with 'register' attribute\n"); - printf ("\n"); - } - else - { - printf ("Program compiled without 'register' attribute\n"); - printf ("\n"); - } - printf ("Please give the number of runs through the benchmark: "); - { - int n; - scanf ("%d", &n); - Number_Of_Runs = n; - } - printf ("\n"); - - printf ("Execution starts, %d runs through Dhrystone\n", Number_Of_Runs); - - /***************/ - /* Start timer */ - /***************/ - -#ifdef TIMES - times (&time_info); - Begin_Time = (long) time_info.tms_utime; -#endif -#ifdef TIME - Begin_Time = time ( (long *) 0); -#endif - - for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index) - { - - Proc_5(); - Proc_4(); - /* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */ - Int_1_Loc = 2; - Int_2_Loc = 3; - strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING"); - Enum_Loc = Ident_2; - Bool_Glob = ! Func_2 (Str_1_Loc, Str_2_Loc); - /* Bool_Glob == 1 */ - while (Int_1_Loc < Int_2_Loc) /* loop body executed once */ - { - Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc; - /* Int_3_Loc == 7 */ - Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc); - /* Int_3_Loc == 7 */ - Int_1_Loc += 1; - } /* while */ - /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ - Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc); - /* Int_Glob == 5 */ - Proc_1 (Ptr_Glob); - for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index) - /* loop body executed twice */ - { - if (Enum_Loc == Func_1 (Ch_Index, 'C')) - /* then, not executed */ - { - Proc_6 (Ident_1, &Enum_Loc); - strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING"); - Int_2_Loc = Run_Index; - Int_Glob = Run_Index; - } - } - /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ - Int_2_Loc = Int_2_Loc * Int_1_Loc; - Int_1_Loc = Int_2_Loc / Int_3_Loc; - Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc; - /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */ - Proc_2 (&Int_1_Loc); - /* Int_1_Loc == 5 */ - - } /* loop "for Run_Index" */ - - /**************/ - /* Stop timer */ - /**************/ - -#ifdef TIMES - times (&time_info); - End_Time = (long) time_info.tms_utime; -#endif -#ifdef TIME - End_Time = time ( (long *) 0); -#endif - - printf ("Execution ends\n"); - printf ("\n"); - printf ("Final values of the variables used in the benchmark:\n"); - printf ("\n"); - printf ("Int_Glob: %d\n", Int_Glob); - printf (" should be: %d\n", 5); - printf ("Bool_Glob: %d\n", Bool_Glob); - printf (" should be: %d\n", 1); - printf ("Ch_1_Glob: %c\n", Ch_1_Glob); - printf (" should be: %c\n", 'A'); - printf ("Ch_2_Glob: %c\n", Ch_2_Glob); - printf (" should be: %c\n", 'B'); - printf ("Arr_1_Glob[8]: %d\n", Arr_1_Glob[8]); - printf (" should be: %d\n", 7); - printf ("Arr_2_Glob[8][7]: %d\n", Arr_2_Glob[8][7]); - printf (" should be: Number_Of_Runs + 10\n"); - printf ("Ptr_Glob->\n"); - printf (" Ptr_Comp: %d\n", (int) Ptr_Glob->Ptr_Comp); - printf (" should be: (implementation-dependent)\n"); - printf (" Discr: %d\n", Ptr_Glob->Discr); - printf (" should be: %d\n", 0); - printf (" Enum_Comp: %d\n", Ptr_Glob->variant.var_1.Enum_Comp); - printf (" should be: %d\n", 2); - printf (" Int_Comp: %d\n", Ptr_Glob->variant.var_1.Int_Comp); - printf (" should be: %d\n", 17); - printf (" Str_Comp: %s\n", Ptr_Glob->variant.var_1.Str_Comp); - printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); - printf ("Next_Ptr_Glob->\n"); - printf (" Ptr_Comp: %d\n", (int) Next_Ptr_Glob->Ptr_Comp); - printf (" should be: (implementation-dependent), same as above\n"); - printf (" Discr: %d\n", Next_Ptr_Glob->Discr); - printf (" should be: %d\n", 0); - printf (" Enum_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Enum_Comp); - printf (" should be: %d\n", 1); - printf (" Int_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Int_Comp); - printf (" should be: %d\n", 18); - printf (" Str_Comp: %s\n", - Next_Ptr_Glob->variant.var_1.Str_Comp); - printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); - printf ("Int_1_Loc: %d\n", Int_1_Loc); - printf (" should be: %d\n", 5); - printf ("Int_2_Loc: %d\n", Int_2_Loc); - printf (" should be: %d\n", 13); - printf ("Int_3_Loc: %d\n", Int_3_Loc); - printf (" should be: %d\n", 7); - printf ("Enum_Loc: %d\n", Enum_Loc); - printf (" should be: %d\n", 1); - printf ("Str_1_Loc: %s\n", Str_1_Loc); - printf (" should be: DHRYSTONE PROGRAM, 1'ST STRING\n"); - printf ("Str_2_Loc: %s\n", Str_2_Loc); - printf (" should be: DHRYSTONE PROGRAM, 2'ND STRING\n"); - printf ("\n"); - - User_Time = End_Time - Begin_Time; - - if (User_Time < Too_Small_Time) - { - printf ("Measured time too small to obtain meaningful results\n"); - printf ("Please increase number of runs\n"); - printf ("\n"); - } - else - { -#ifdef TIME - Microseconds = (float) User_Time * Mic_secs_Per_Second - / (float) Number_Of_Runs; - Dhrystones_Per_Second = (float) Number_Of_Runs / (float) User_Time; -#else - Microseconds = (float) User_Time * Mic_secs_Per_Second - / ((float) HZ * ((float) Number_Of_Runs)); - Dhrystones_Per_Second = ((float) HZ * (float) Number_Of_Runs) - / (float) User_Time; -#endif - printf ("Microseconds for one run through Dhrystone: "); - printf ("%6.1f \n", Microseconds); - printf ("Dhrystones per Second: "); - printf ("%6.1f \n", Dhrystones_Per_Second); - printf ("\n"); - } - -} - - -Proc_1 (Ptr_Val_Par) -/******************/ - -REG Rec_Pointer Ptr_Val_Par; - /* executed once */ -{ - REG Rec_Pointer Next_Record = Ptr_Val_Par->Ptr_Comp; - /* == Ptr_Glob_Next */ - /* Local variable, initialized with Ptr_Val_Par->Ptr_Comp, */ - /* corresponds to "rename" in Ada, "with" in Pascal */ - - structassign (*Ptr_Val_Par->Ptr_Comp, *Ptr_Glob); - Ptr_Val_Par->variant.var_1.Int_Comp = 5; - Next_Record->variant.var_1.Int_Comp - = Ptr_Val_Par->variant.var_1.Int_Comp; - Next_Record->Ptr_Comp = Ptr_Val_Par->Ptr_Comp; - Proc_3 (&Next_Record->Ptr_Comp); - /* Ptr_Val_Par->Ptr_Comp->Ptr_Comp - == Ptr_Glob->Ptr_Comp */ - if (Next_Record->Discr == Ident_1) - /* then, executed */ - { - Next_Record->variant.var_1.Int_Comp = 6; - Proc_6 (Ptr_Val_Par->variant.var_1.Enum_Comp, - &Next_Record->variant.var_1.Enum_Comp); - Next_Record->Ptr_Comp = Ptr_Glob->Ptr_Comp; - Proc_7 (Next_Record->variant.var_1.Int_Comp, 10, - &Next_Record->variant.var_1.Int_Comp); - } - else /* not executed */ - structassign (*Ptr_Val_Par, *Ptr_Val_Par->Ptr_Comp); -} /* Proc_1 */ - - -Proc_2 (Int_Par_Ref) -/******************/ - /* executed once */ - /* *Int_Par_Ref == 1, becomes 4 */ - -One_Fifty *Int_Par_Ref; -{ - One_Fifty Int_Loc; - Enumeration Enum_Loc; - - Int_Loc = *Int_Par_Ref + 10; - do /* executed once */ - if (Ch_1_Glob == 'A') - /* then, executed */ - { - Int_Loc -= 1; - *Int_Par_Ref = Int_Loc - Int_Glob; - Enum_Loc = Ident_1; - } /* if */ - while (Enum_Loc != Ident_1); /* true */ -} /* Proc_2 */ - - -Proc_3 (Ptr_Ref_Par) -/******************/ - /* executed once */ - /* Ptr_Ref_Par becomes Ptr_Glob */ - -Rec_Pointer *Ptr_Ref_Par; - -{ - if (Ptr_Glob != Null) - /* then, executed */ - *Ptr_Ref_Par = Ptr_Glob->Ptr_Comp; - Proc_7 (10, Int_Glob, &Ptr_Glob->variant.var_1.Int_Comp); -} /* Proc_3 */ - - -Proc_4 () /* without parameters */ -/*******/ - /* executed once */ -{ - Boolean Bool_Loc; - - Bool_Loc = Ch_1_Glob == 'A'; - Bool_Glob = Bool_Loc | Bool_Glob; - Ch_2_Glob = 'B'; -} /* Proc_4 */ - - -Proc_5 () /* without parameters */ -/*******/ - /* executed once */ -{ - Ch_1_Glob = 'A'; - Bool_Glob = false; -} /* Proc_5 */ - - - /* Procedure for the assignment of structures, */ - /* if the C compiler doesn't support this feature */ -#ifdef NOSTRUCTASSIGN -memcpy (d, s, l) -register char *d; -register char *s; -register int l; -{ - while (l--) *d++ = *s++; -} -#endif diff --git a/benchmarks/dhrystone/dhry_2.c b/benchmarks/dhrystone/dhry_2.c deleted file mode 100644 index a7c4f50..0000000 --- a/benchmarks/dhrystone/dhry_2.c +++ /dev/null @@ -1,191 +0,0 @@ -/* - **************************************************************************** - * - * "DHRYSTONE" Benchmark Program - * ----------------------------- - * - * Version: C, Version 2.1 - * - * File: dhry_2.c (part 3 of 3) - * - * Date: May 25, 1988 - * - * Author: Reinhold P. Weicker - * - **************************************************************************** - */ - -#include "dhry.h" - -#ifndef REG -#define REG - /* REG becomes defined as empty */ - /* i.e. no register variables */ -#endif - -extern int Int_Glob; -extern char Ch_1_Glob; - - -Proc_6 (Enum_Val_Par, Enum_Ref_Par) -/*********************************/ - /* executed once */ - /* Enum_Val_Par == Ident_3, Enum_Ref_Par becomes Ident_2 */ - -Enumeration Enum_Val_Par; -Enumeration *Enum_Ref_Par; -{ - *Enum_Ref_Par = Enum_Val_Par; - if (! Func_3 (Enum_Val_Par)) - /* then, not executed */ - *Enum_Ref_Par = Ident_4; - switch (Enum_Val_Par) - { - case Ident_1: - *Enum_Ref_Par = Ident_1; - break; - case Ident_2: - if (Int_Glob > 100) - /* then */ - *Enum_Ref_Par = Ident_1; - else *Enum_Ref_Par = Ident_4; - break; - case Ident_3: /* executed */ - *Enum_Ref_Par = Ident_2; - break; - case Ident_4: break; - case Ident_5: - *Enum_Ref_Par = Ident_3; - break; - } /* switch */ -} /* Proc_6 */ - - -Proc_7 (Int_1_Par_Val, Int_2_Par_Val, Int_Par_Ref) -/**********************************************/ - /* executed three times */ - /* first call: Int_1_Par_Val == 2, Int_2_Par_Val == 3, */ - /* Int_Par_Ref becomes 7 */ - /* second call: Int_1_Par_Val == 10, Int_2_Par_Val == 5, */ - /* Int_Par_Ref becomes 17 */ - /* third call: Int_1_Par_Val == 6, Int_2_Par_Val == 10, */ - /* Int_Par_Ref becomes 18 */ -One_Fifty Int_1_Par_Val; -One_Fifty Int_2_Par_Val; -One_Fifty *Int_Par_Ref; -{ - One_Fifty Int_Loc; - - Int_Loc = Int_1_Par_Val + 2; - *Int_Par_Ref = Int_2_Par_Val + Int_Loc; -} /* Proc_7 */ - - -Proc_8 (Arr_1_Par_Ref, Arr_2_Par_Ref, Int_1_Par_Val, Int_2_Par_Val) -/*********************************************************************/ - /* executed once */ - /* Int_Par_Val_1 == 3 */ - /* Int_Par_Val_2 == 7 */ -Arr_1_Dim Arr_1_Par_Ref; -Arr_2_Dim Arr_2_Par_Ref; -int Int_1_Par_Val; -int Int_2_Par_Val; -{ - REG One_Fifty Int_Index; - REG One_Fifty Int_Loc; - - Int_Loc = Int_1_Par_Val + 5; - Arr_1_Par_Ref [Int_Loc] = Int_2_Par_Val; - Arr_1_Par_Ref [Int_Loc+1] = Arr_1_Par_Ref [Int_Loc]; - Arr_1_Par_Ref [Int_Loc+30] = Int_Loc; - for (Int_Index = Int_Loc; Int_Index <= Int_Loc+1; ++Int_Index) - Arr_2_Par_Ref [Int_Loc] [Int_Index] = Int_Loc; - Arr_2_Par_Ref [Int_Loc] [Int_Loc-1] += 1; - Arr_2_Par_Ref [Int_Loc+20] [Int_Loc] = Arr_1_Par_Ref [Int_Loc]; - Int_Glob = 5; -} /* Proc_8 */ - - -Enumeration Func_1 (Ch_1_Par_Val, Ch_2_Par_Val) -/*************************************************/ - /* executed three times */ - /* first call: Ch_1_Par_Val == 'H', Ch_2_Par_Val == 'R' */ - /* second call: Ch_1_Par_Val == 'A', Ch_2_Par_Val == 'C' */ - /* third call: Ch_1_Par_Val == 'B', Ch_2_Par_Val == 'C' */ - -Capital_Letter Ch_1_Par_Val; -Capital_Letter Ch_2_Par_Val; -{ - Capital_Letter Ch_1_Loc; - Capital_Letter Ch_2_Loc; - - Ch_1_Loc = Ch_1_Par_Val; - Ch_2_Loc = Ch_1_Loc; - if (Ch_2_Loc != Ch_2_Par_Val) - /* then, executed */ - return (Ident_1); - else /* not executed */ - { - Ch_1_Glob = Ch_1_Loc; - return (Ident_2); - } -} /* Func_1 */ - - -Boolean Func_2 (Str_1_Par_Ref, Str_2_Par_Ref) -/*************************************************/ - /* executed once */ - /* Str_1_Par_Ref == "DHRYSTONE PROGRAM, 1'ST STRING" */ - /* Str_2_Par_Ref == "DHRYSTONE PROGRAM, 2'ND STRING" */ - -Str_30 Str_1_Par_Ref; -Str_30 Str_2_Par_Ref; -{ - REG One_Thirty Int_Loc; - Capital_Letter Ch_Loc; - - Int_Loc = 2; - while (Int_Loc <= 2) /* loop body executed once */ - if (Func_1 (Str_1_Par_Ref[Int_Loc], - Str_2_Par_Ref[Int_Loc+1]) == Ident_1) - /* then, executed */ - { - Ch_Loc = 'A'; - Int_Loc += 1; - } /* if, while */ - if (Ch_Loc >= 'W' && Ch_Loc < 'Z') - /* then, not executed */ - Int_Loc = 7; - if (Ch_Loc == 'R') - /* then, not executed */ - return (true); - else /* executed */ - { - if (strcmp (Str_1_Par_Ref, Str_2_Par_Ref) > 0) - /* then, not executed */ - { - Int_Loc += 7; - Int_Glob = Int_Loc; - return (true); - } - else /* executed */ - return (false); - } /* if Ch_Loc */ -} /* Func_2 */ - - -Boolean Func_3 (Enum_Par_Val) -/***************************/ - /* executed once */ - /* Enum_Par_Val == Ident_3 */ -Enumeration Enum_Par_Val; -{ - Enumeration Enum_Loc; - - Enum_Loc = Enum_Par_Val; - if (Enum_Loc == Ident_3) - /* then, executed */ - return (true); - else /* not executed */ - return (false); -} /* Func_3 */ -- cgit