Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «ГСнСрация высококачСствСнного ΠΊΠΎΠ΄Π° для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, написанных Π½Π° БИ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 8

Автор Π€ΠΈΠ»ΠΈΠΏΠΏ Π₯ислСй

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ WATCOM C 6.0 сопСрничаСт с Microsoft C 5.0 ΠΏΠΎ стСпСни выполняСмой ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ быстрый ΠΊΠΎΠ΄ Π² тСстС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ. Π’ΠΎ, Ρ‡Ρ‚ΠΎ WATCOM тСряСт Π½Π° Π½Π΅ самых ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ†ΠΈΠΊΠ»Π°Ρ…, ΠΎΠ½ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ навСрстываСт Π² ΠΌΠ°Π»Ρ‹Ρ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°Ρ… Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. WATCOM C 6.0 Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ рСгистры, ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ обращСния ΠΊ памяти ΠΈ ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€Ρ‹ Metaware High C ΠΈ Computer Innovations C86Plus Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ Π±ΠΎΠ»Π΅Π΅-ΠΌΠ΅Π½Π΅Π΅ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, Π½ΠΎ ΠΎΡ‚ΡΡ‚ΡƒΠΏΠ°ΡŽΡ‚ Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ»Π°Π½ ΠΏΡ€ΠΈ рассмотрСнии ΡƒΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π½ΠΈΠΉ, сдСланных Π² Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ компиляторов Ρ„ΠΈΡ€ΠΌΠ°ΠΌΠΈ Datalight, Microsoft ΠΈ WATCOM.

НСт СдинствСнного производитСля, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ» Π±Ρ‹ Π½Π° Ρ€Ρ‹Π½ΠΊΠ΅ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ для компиляторов Π‘ΠΈ. ΠšΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ†ΠΈΡ Π½Π° Ρ€Ρ‹Π½ΠΊΠ΅ ΠΏΠΎΠ΄Ρ‚Π°Π»ΠΊΠΈΠ²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ ΠΊ Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΡŽ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΈ ΠΊ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½ΠΈΡŽ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π»ΡƒΡ‡ΡˆΠΈΠΌΠΈ ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΌΠΎΡ‰Π½Ρ‹ΠΌΠΈ срСдствами языка Π‘ΠΈ. Π’ Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ появлСниС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… компиляторов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ быстрый ΠΈ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ΄.

Π›Π˜Π‘Π’Π˜ΠΠ“ 1: OPTBENCH.C

/* ---------------------------------------------------------- *

Β¦ Β¦

Β¦ БСрия тСстов PC Tech Journal Β¦

Β¦ ВСст ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° Π‘ΠΈ Β¦

Β¦ Β¦

Β¦ Copyright (c) 1988 Ziff-Devis Publishing Company Β¦

Β¦ Β¦

Β¦ Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°-тСст Π±Ρ‹Π»Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π° для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Β¦

Β¦ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π°, примСняСмых компилятором Β¦

Β¦ Π‘ΠΈ. Она Π½Π΅ Π²Ρ‹Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π°Π·ΡƒΠΌΠ½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΈ Π½Π΅ Β¦

Β¦ прСдставляСт Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΡΡ‚ΠΈΠ»ΡŒ программирования. Β¦

Β¦ Β¦

* ---------------------------------------------------------- */

 

 

#include <stdio.h>

#include <string.h>

 

#define max_vector 2

#define constant5 5

 

typedef unsigned char uchar;

 

int i, j, k, l, m;

int i2, j2, k2;

int g3, h3, i3, k3, m3;

int i4, j4;

int i5, j5, k5;

 

double flt_1, flt_2, flt_3, flt_4, flt_5, flt_6;

 

int ivector[ 3 ];

uchar ivector2[ 3 ];

short ivector4[ 6 ];

int ivector5[ 100 ];

 

#ifndef NO_PROTOTYPES

void dead_code( int, char * );

void unnecessary_loop( void );

void loop_jamming( int );

void loop_unrolling( int );

int jump_compression( int, int, int, int, int );

#else

void dead_code();

void unnecessary_loop();

void loop_jamming();

void loop_unrolling();

int jump_compression();

#endif

 

int main( argc, argv ) /* optbench */

int argc;

char **argv;

{

 

/* ---------------------------- *

Β¦ Π Π°Π·ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ констант ΠΈ ΠΊΠΎΠΏΠΈΠΉ Β¦

*------------------------------*/

 

j4 = 2;

if( i2 < j4 && i4 < j4 )

i2 = 2;

 

j4 = k5;

if( i2 < j4 && i4 < j4 )

i5 = 3;

 

/* ------------------------------------------ *

Β¦ Π‘Π²Π΅Ρ€Ρ‚ΠΊΠ° констант, арифмСтичСскиС тоТдСства Β¦

Β¦ ΠΈ излишниС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ/сохранСния Β¦

* ------------------------------------------ */

 

i3 = 1 + 2;

flt_1 = 2.4 + 6.3;

i2 = 5;

j2 = i + 0;

k2 = i / 1;

i4 = i * 1;

i5 = i * 0;

 

#ifndef NO_ZERO_DIVIDE

/*

* НСкоторыС компиляторы Ρ€Π°ΡΠΏΠΎΠ·Π½Π°ΡŽΡ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ

* дСлСния Π½Π° Π½ΡƒΠ»ΡŒ ΠΈ Π½Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ΄

*/

i2 = i / 0;

flt_2 = flt_1 / 0.0;

#else

printf( "This compiler handles divide-by-zero as \

an error\n");

#endif

flt_3 = 2.4 / 1.0;

flt_4 = 1.0 + 0.0000001;

flt_5 = flt_6 * 0.0;

flt_6 = flt_2 * flt_3;

 

/* -------------------- *

Β¦ Π›ΠΈΡˆΠ½Π΅Π΅ присваиваниС Β¦

* -------------------- */

 

k3 = 1;

k3 = 1;

 

/* ------------------ *

Β¦ Π‘Π½ΠΈΠΆΠ΅Π½ΠΈΠ΅ мощности Β¦

* ------------------ */

 

k2 = 4 * j5;

for( i = 0; i <= 5; i++ )

ivector4[ i ] = i * 2;

 

 

/* ------------- *

Β¦ ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ Ρ†ΠΈΠΊΠ» Β¦

* ------------- */

 

j5 = 0;

k5 = 10000;

do {

k5 = k5 - 1;

j5 = j5 + 1;

i5 = (k5 * 3) / (j5 * constant5);

} while ( k5 > 0 );

 

/* -------------------------------------- *

Β¦ Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ½Π΄ΡƒΠΊΡ†ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π° Β¦

* -------------------------------------- */

for( i = 0; i < 100; i++ )

ivector5[ i * 2 + 3 ] = 5;

 

/* ----------------------- *

Β¦ Π“Π»ΡƒΠ±ΠΎΠΊΠΈΠ΅ подвыраТСния Β¦

* ----------------------- */

 

if( i < 10 )

j5 = i5 + i2;

else

k5 = i5 + i2;

 

/* ------------------------------------------------ *

Β¦ ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ компилятор Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ адрСс Β¦

Β¦ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ с константным индСксом, Ρ€Π°Π·ΠΌΠ½ΠΎΠΆΠ°Π΅Ρ‚ Β¦

Β¦ ΠΊΠΎΠΏΠΈΠΈ ΠΈ рСгистры Β¦

* ------------------------------------------------ */

 

ivector[ 0 ] = 1; /* гСнСрация константного адрСса */

ivector[ i2 ] = 2; /* Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ i2 Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ скопировано*/

ivector[ i2 ] = 2; /* ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ рСгистров */

ivector[ 2 ] = 3; /* гСнарация константного адрСса */

 

 

/* ----------------------------- *

Β¦ Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ‰ΠΈΡ… ΠΏΠΎΠ΄Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Β¦

* ----------------------------- */

if(( h3 + k3 ) < 0 || ( h3 + k3 ) > 5 )

printf("Common subexpression elimination\n");

else {

m3 = ( h3 + k3 ) / i3;

g3 = i3 + (h3 + k3);

 

/* -------------------------------------- *

Β¦ ВынСсСниС ΠΈΠ½Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Β¦

Β¦ (j * k) ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ вынСсСно ΠΈΠ· Ρ†ΠΈΠΊΠ»Π° Β¦

* -------------------------------------- */

 

for( i4 = 0; i4 <= max_vector; i4++)

ivector2[ i4 ] = j * k;

 

/* ----------------------------- *

Β¦ Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ Β¦

* ----------------------------- */

 

dead_code( 1, "This line should not be printed" );

 

/* ------------------------------ *

Β¦ Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Β¦

* ------------------------------ */

 

unnecessary_loop();

 

} /* ΠšΠΎΠ½Π΅Ρ† Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main */

 

 

/* ------------------------------------------------------ *

Β¦ Ѐункция: dead_code Β¦

Β¦ ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° нСдостиТимого ΠΊΠΎΠ΄Π° ΠΈ Π»ΠΈΡˆΠ½ΠΈΡ… Β¦

Β¦ присваиваний. НС Π΄ΠΎΠ»ΠΆΠ΅Π½ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠ΄. Β¦

* ------------------------------------------------------ */

 

void dead_code( a, b )

int a;

char *b;

{

int idead_store;

 

idead_store = a;

if( 0 )

printf( "%s\n", b );

} /* ΠšΠΎΠ½Π΅Ρ† dead_code */

 

 

/* ---------------------------------------------------- *

Β¦ Ѐункция: unnecessary_loop Β¦

Β¦ Π¦ΠΈΠΊΠ» Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅Π½ΡƒΠΆΠ΅Π½, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Β¦

Β¦ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ присваивания постоянно. Π’ ΠΈΠ΄Π΅Π°Π»Π΅ Β¦

Β¦ Ρ†ΠΈΠΊΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½. Β¦

* ---------------------------------------------------- */

void unnecessary_loop()

{

int x;

 

x = 0;

for( i = 0; i < 5; i++ ) /* Π¦ΠΈΠΊΠ» Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ*/

k5 = x + j5;

} /* ΠšΠΎΠ½Π΅Ρ† unnecessary_loop */

 

/* ---------------------------------------------------- *

Β¦ Ѐункция: loop_jamming Β¦

Β¦ Π”Π²Π° Ρ†ΠΈΠΊΠ»Π° Π² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ Β¦

Β¦ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ слиты Π² ΠΎΠ΄ΠΈΠ½. Β¦

* ---------------------------------------------------- */

void loop_jamming( x )

int x;

{

for( i = 0; i < 5; i++ )

k5 = x + j5 * i;

for( i = 0; i < 5; i++ )

i5 = x * k5 * i;

} /* ΠšΠΎΠ½Π΅Ρ† loop_jamming */

 

/* ------------------------------------------------------ *

Β¦ Ѐункция: loop_unrolling Β¦

Β¦ Π¦ΠΈΠΊΠ» Π² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΌΠ΅Π½Π΅Π½ Β¦

Β¦ трСмя присваиваниями с использованиСм Β¦

Β¦ константной индСксации массива ΠΈΠ»ΠΈ машинно- Β¦

Β¦ зависимыми ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Β¦

Β¦ Π±Π»ΠΎΠΊΠ° памяти. Β¦

* ------------------------------------------------------ */