Важная информация

User Tag List

Страница 7 из 19 ПерваяПервая ... 34567891011 ... ПоследняяПоследняя
Показано с 61 по 70 из 189

Тема: Языки программирования

  1. #61

    Регистрация
    18.02.2005
    Адрес
    St. Petersburg
    Сообщений
    415
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от NovaStorm
    Писать back-end для EM почти бесперспективно. Может лучше в сторону www.cminusminus.org податься, там
    хотя бы серьёзные дядьки работают, работы конечно там будет скорее
    Если они такие серьёзные, то чего ж они изобретательством велосипедов занимаются. Этот велосипед называется PL/M и известен уже лет чуть ли не 30 как. Для Z80, кстати, должен быть и должен пускаться с лёгкостью в CP/M. Т.е. на пентагоне/скорпионе вполне реально. И документация, всё есть.

  2. #61
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #62

    Регистрация
    14.08.2006
    Адрес
    Владимир
    Сообщений
    4,581
    Спасибо Благодарностей отдано 
    64
    Спасибо Благодарностей получено 
    112
    Поблагодарили
    97 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от fk0
    "Комментарии в теле цикла замедляют его работу".
    А ты не знал? Низачот.
    Почемуто всегда считал, что макрос и inline-процедуры работают быcтрее обычного вида подпрограмм, т.к. как раз не являются подпрограммами и не требуют вызова и сопутствующих манипуляций со стеком.
    Впрочем, утверждать не берусь.


    Цитата Сообщение от fk0
    Я в принципе и сейчас бы помахал. В асме реализуются зачастую концепции недоступные в недоязычках вроде паскаля. Или C.
    Вообще-то, когда нужен 100% результат, концепции реализуются на языке блок-схем. И язык реализации в большинстве случаев принципиального значения не имеет - это лишь вопрос технологии и деталей реализации. Соответственно, в правильно спроектированных системах не возникает необходимости в спецсредствах типа ASM (ну кроме считанных time-critical мест или в случае программирования каких-то уж очень чудных микроконтроллеров).
    Про С в последних сообщениях этого треда говорилось с точки зрения переносимости кода с платформы на платформу. С этой точки зрения юзабельность АСМ стремится к нулю.

    Цитата Сообщение от fk0
    Java. Там этих страшных указателей нет. И выделение памяти абсолютно-безопасносное (пока OOM killer не отстрелит).
    Да нет, самое главное конечно не это. Самое главное -- что
    Java обучаются даже бабуины. Вся суть в этом.
    Ну да. А десят лет назад то же говорили про Basic. А еще раньше про Фортран. А еще через 20 лет будут говорить про что-то другое. Кстати, а есть ли Java-машины для Z80? Было бы интересно взглянуть...

    Цитата Сообщение от fk0
    Только Z80 супротив современных RISC цпу, даже самых мелких мелкоконтроллеров, сильно проигрывает. В том смысле, на него C с его парадигмой распределения памяти хреновенько ложится.
    А что такого особенного в распределении памяти в C?

  4. #63

    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,286
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    39 сообщений
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от fk0
    "Комментарии в теле цикла замедляют его работу".
    А ты не знал? Низачот.
    Посыпаю голову пеплом от сожженых исходников и ухожу в монастырь. Женский )))

    Цитата Сообщение от fk0
    В асме реализуются зачастую концепции недоступные в недоязычках вроде паскаля.
    Я б сказал так- в асме реализуется все, ибо это праматерия. Другое дело что вместе с полной свободой действий мы получаем полуметровый геморрой с разработкой, рефакторингом, реверс инженирингом и отладкой...

    Цитата Сообщение от fk0
    Java. Там этих страшных указателей нет. И выделение памяти абсолютно-безопасносное (пока OOM killer не отстрелит).
    Это если имеется компилятор явы (или поддержка на аппаратном уровне)

    Цитата Сообщение от fk0
    www.htsoft.com? Никто не отменял. Только Z80 супротив современных RISC цпу, даже самых мелких мелкоконтроллеров,
    сильно проигрывает. В том смысле, на него C с его парадигмой распределения памяти хреновенько ложится.
    Ну дык, сравнил зетник и арм... Я, если честно, при написании под контроллер вообще не пользуюсь функциями выделения памяти, только статически все. Если надо- беру свой минималистический менеджер памяти и не мучаюсь.

    Цитата Сообщение от fk0
    Ага, DPTR. Мне уже второй год страшно в листинги из-за этого заглядывать. Вот я и не заглядываю. В small model оно, к слову, гораздо веселее.
    не, проект только под huge тянется...

    Цитата Сообщение от fk0
    2) стиля кодирования. Он от писишного должен отличаться
    ясен хрен... неоднократно с этим сталкивался:
    xdata unsigned char* ext_dev _at_ 0xff00;
    гораздо хуже чем
    #define (*(xdata unsigned char*)0xff00) ext_dev
    хотя по логике одно и то же...

    Цитата Сообщение от fk0
    Компилятор -- повторяюсь -- hitech. Лучше для Z80 (и PIC) нет.
    приятное открытие- он берет 8051 и msp430. надо будет погонять как время будет....
    ЗЫ. А бесплатная версия имееццо? А то на сайте грят "только по талонам"...

  5. #64

    Регистрация
    17.05.2005
    Адрес
    г. Абакан
    Сообщений
    694
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вах-вах! HI-TECH C Z80/Z180 = $950 - приятная цена!

  6. #65

    Регистрация
    14.08.2006
    Адрес
    Владимир
    Сообщений
    4,581
    Спасибо Благодарностей отдано 
    64
    Спасибо Благодарностей получено 
    112
    Поблагодарили
    97 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от jdigreze
    Вах-вах! HI-TECH C Z80/Z180 = $950 - приятная цена!
    последняя из CP/M-версий - бесплатно

  7. #66

    Регистрация
    17.01.2005
    Адрес
    Belarus, Minsk
    Сообщений
    402
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А версия компилятора Hi-tech, которую выкладывал https://zx-pk.ru/showthread.php?p=53431 не подходит?
    ATW4GS / BIN2SNA / SquareMania <ТИ-3> / Ужасм+
    ATM-Turbo 512 v4.50, Commodore 64G + TAC-2, Retro-Bit Super Retro TRIO

  8. #67

    Регистрация
    14.01.2005
    Адрес
    Ekaterinburg
    Сообщений
    2,726
    Спасибо Благодарностей отдано 
    19
    Спасибо Благодарностей получено 
    148
    Поблагодарили
    91 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Aprisobal
    А версия компилятора Hi-tech, которую выкладывал https://zx-pk.ru/showthread.php?p=53431 не подходит?
    Все попытки скачать файл с RapidShare лично для меня не увенчались успехом
    Выдает:

    You have requested the file Embedded_Systems_-_Avocet_WideUI_V3.28_ANSI-C_Compiler_for_Z80.rar (3749 KB).
    This file has been downloaded 1 times already.

    ERROR: Please enable JavaScript.

    PS. Java у меня включена.
    Последний раз редактировалось caro; 19.11.2006 в 15:30.

  9. #68

    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,286
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    39 сообщений
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от caro
    А версия компилятора Hi-tech, которую выкладывал http://zx.pk.ru/showthread.php?p=53431 не подходит?
    Скачал, проверяю пока первый.
    Тестовый код (взято с codenet.ru):

    Код:
    /* ---------------------------------------------------------- *
     |                                                            |
     |   Серия тестов PC Tech Journal                             |
     |   Тест оптимизации кода Си                                 |
     |                                                            |
     |   Copyright (c) 1988 Ziff-Devis Publishing Company         |
     |                                                            |
     |   Эта  программа-тест  была  разработана  для  проверки    |
     |   методов оптимизации  кода,  применяемых  компилятором    |
     |   Си. Она  не  вырабатывает  разумные  результаты  и  не   |
     |   представляет хороший стиль программирования.             |
     |                                                            |
     * ---------------------------------------------------------- */
    
    
    //#include
    //#include
    #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                               |
     |           Цикл в этой функции должен быть заменен      |
     |           тремя присваиваниями с использованием        |
     |           константной индексации массива или машинно-  |
     |           зависимыми командами для инициализации       |
     |           блока памяти.                                |
     * ------------------------------------------------------ */
    
    void loop_unrolling( x )
         int x;
         {
             for( i = 0; i < 6; i++ )
                 ivector4[ i ] = 0;
         } /* Конец loop_unrolling */
    
    /* ----------------------------------------------------- *
     |  Функция: jump_compression                            |
     |           Эта программа полезна для демонстрации      |
     |           сжатия цепочки переходов. goto end_1 может  |
     |           быть заменен на прямой переход на beg_1.    |
     * ----------------------------------------------------- */
    
    int jump_compression( i, j, k, l, m )
    int i, j, k, l, m;
        {
    beg_1:
            if( i < j )
                if( j < k )
                    if( k < l )
                        if( l < m )
                            l += m;
                        else
                            goto end_1;
                    else
                        k += l;
                else {
                    j += k;
    end_1:
                    goto beg_1;
                }
            else
                i += j;
            return( i + j + k + l + m );
        } /* Конец jump_compression */

  10. #69

    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,286
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    39 сообщений
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ну что, прогнал HitechC по тесту, осталось весьма приятное впечатление. Некоторые вещи, конечно, хотелось бы улучшить, но все же.
    Итак, что он, собственно накрутил. Испытания проводились с учетом максимального уровня оптимизации

    0. Пролог. Весьма короткий:
    Код:
    _main:
    	push	ix
    	ld	ix,0
    	add	ix,sp
    дальше идет непосредственно код

    1. Тест на размножение констант и копий.
    Код:
    ;TEST.C: 62: j4 = 2;
    	ld	hl,02h
    	ld	(_j4),hl
    ;TEST.C: 63: if( i2 < j4 && i4 < j4 )
    ;лишняя загрузка из j4 - следствие того, что для
    ;сравнения используется функция с фиксированными
    ;позициями для параметра, но все равно- мог бы
    ;использовать de для инициализации или сделать
    ;ld d,h:ld e,l
    	ld	de,(_j4)
    	ld	hl,(_i2)
    	call	wrelop
    ;также использование jp не есть хорошо. сокращенные
    ;вычисления используются в соответствии со стандартом
    	jp	p,l4
    	ld	de,(_j4)
    	ld	hl,(_i4)
    	call	wrelop
    	jp	p,l4
    ;TEST.C: 64: i2 = 2;
    	ld	hl,02h
    	ld	(_i2),hl
    l4:
    ;TEST.C: 66: j4 = k5;
    	ld	hl,(_k5)
    	ld	(_j4),hl
    ;TEST.C: 67: if( i2 < j4 && i4 < j4 )
    ;картина полностью аналогичная
    	ld	de,(_j4)
    	ld	hl,(_i2)
    	call	wrelop
    	jp	p,l5
    	ld	de,(_j4)
    	ld	hl,(_i4)
    	call	wrelop
    ;TEST.C: 68: i5 = 3;
    	ld	hl,03h
    	jp	p,L2
    
    	ld	(_i5),hl
    l5:
    2.Свертка констант
    Код:
    ;TEST.C: 75: i3 = 1 + 2;
    ;успешно
    	ld	hl,03h
    L2:
    	ld	(_i3),hl
    ;TEST.C: 76: flt_1 = 2.4 + 6.3;
    ;аналогично
    	ld	de,(e1)
    	ld	hl,(e1+02h)
    	ld	(_flt_1),de
    	ld	(_flt_1+02h),hl
    ;TEST.C: 77: i2 = 5;
    	ld	hl,05h
    	ld	(_i2),hl
    ;TEST.C: 78: j2 = i + 0;
    ;ничего прибавлять не стал, молодец :)
    	ld	hl,(_i)
    	ld	(_j2),hl
    ;TEST.C: 79: k2 = i / 1;
    ;равно как не стал и делить, плюс не стал лишний раз
    ;делать загрузку!
    	ld	(_k2),hl
    ;TEST.C: 80: i4 = i * 1;
    ;аналогично
    	ld	(_i4),hl
    ;TEST.C: 81: i5 = i * 0;
    ;ну и умножение на ноль тоже распознал
    	ld	hl,0
    	ld	(_i5),hl
    Код:
    ;TEST.C: 94: flt_3 = 2.4 / 1.0;
    ;свернул деление
    	ld	de,(e2)
    	ld	hl,(e2+02h)
    	ld	(_flt_3),de
    	ld	(_flt_3+02h),hl
    ;TEST.C: 95: flt_4 = 1.0 + 0.0000001;
    ;свернул сложение
    	ld	de,(e3)
    	ld	hl,(e3+02h)
    	ld	(_flt_4),de
    	ld	(_flt_4+02h),hl
    ;TEST.C: 96: flt_5 = flt_6 * 0.0;
    ;а вот здесь прокосячил- наверное нет проверки на 0
    ;для констант с плавающей запятой
    	ld	hl,(e4+02h)
    	push	hl
    	ld	hl,(e4)
    	push	hl
    	ld	de,(_flt_6)
    	ld	hl,(_flt_6+02h)
    	call	flmul
    	ld	(_flt_5),de
    	ld	(_flt_5+02h),hl
    ;TEST.C: 97: flt_6 = flt_2 * flt_3;
    ;ничего интересного
    	ld	hl,(_flt_3+02h)
    	push	hl
    	ld	hl,(_flt_3)
    	push	hl
    	ld	de,(_flt_2)
    	ld	hl,(_flt_2+02h)
    	call	flmul
    	ld	(_flt_6),de
    	ld	(_flt_6+02h),hl
    2.1.Ошибка деления на ноль была успешно распознана и компилятор ничего не собирал до тех пор, пока не определил NO_ZERO_DIVIDE

    3.Лишнее присваивание
    Код:
    ;TEST.C: 103: k3 = 1;
    	ld	hl,01h
    	ld	(_k3),hl
    ;TEST.C: 104: k3 = 1;
    ;сэкономил загрузку, но выполнил лишнее присваивание
    ;в силу того, что компилятор для встроенных систем на
    ;базе микроконтроллеров, повторное присваивание (а
    ;также чтение) имеют свой смысл. Так что это не ошибка
    	ld	(_k3),hl
    4.Снижение мощности
    Код:
    ;TEST.C: 110: k2 = 4 * j5;
    ;вполне логично свернул умножение на 4
    	ld	hl,(_j5)
    	add	hl,hl
    	add	hl,hl
    	ld	(_k2),hl
    ;TEST.C: 111: for( i = 0; i <= 5; i++ )
    ;но просто отвратительно сделал цикл с изначально
    ;известными условиями- по шаблону
    	ld	hl,0
    	ld	(_i),hl
    	ld	de,06h
    	ld	hl,(_i)
    	call	wrelop
    	jp	p,l7
    l6:
    ;TEST.C: 112: ivector4[ i ] = i * 2;
    ;чуда не произошло- снижения мощности нет
    ;в принципе, для такого шаблона без регистровых
    ;переменных это и логично...
    	ld	de,_ivector4
    	ld	hl,(_i)
    	add	hl,hl
    	add	hl,de
    	ex	de,hl
    	ld	hl,(_i)
    	add	hl,hl
    	ld	a,l
    	ld	(de),a
    	inc	de
    	ld	a,h
    	ld	(de),a
    	ld	hl,(_i)
    	inc	hl
    	ld	(_i),hl
    	ld	de,06h
    	call	wrelop
    	jp	m,l6
    l7:
    5.Простой цикл
    Код:
    ;TEST.C: 118: j5 = 0;
    	ld	hl,0
    	ld	(_j5),hl
    ;TEST.C: 119: k5 = 10000;
    	ld	hl,02710h
    	ld	(_k5),hl
    l11:
    ;TEST.C: 120: do {
    ;TEST.C: 121: k5 = k5 - 1;
    ;недостатки отсутствия регистровых переменных во
    ;всей красе...
    	ld	hl,(_k5)
    	dec	hl
    	ld	(_k5),hl
    ;TEST.C: 122: j5 = j5 + 1;
    	ld	hl,(_j5)
    	inc	hl
    	ld	(_j5),hl
    ;TEST.C: 123: i5 = (k5 * 3) / (j5 * 5);
    ;хотя тут их отсутствие вполне закономерно- иначе
    ;пришлось бы мучаться со стеком
    ;достойная свертка констант умножения
    	ld	b,h
    	ld	c,l
    	add	hl,hl
    	add	hl,hl
    	add	hl,bc
    	ex	de,hl
    	ld	hl,(_k5)
    	ld	b,h
    	ld	c,l
    	add	hl,hl
    	add	hl,bc
    	call	adiv
    	ld	(_i5),hl
    ;TEST.C: 124: } while ( k5 > 0 );
    ;глупое сравнение на >=1...
    	ld	de,01h
    	ld	hl,(_k5)
    	call	wrelop
    	jp	p,l11
    6.Управление переменной индукции цикла
    Код:
    ;TEST.C: 129: for( i = 0; i < 100; i++ )
    ;та же лажа с циклом
    	ld	hl,0
    	ld	(_i),hl
    	ld	de,064h
    	call	wrelop
    	jp	p,l13
    l12:
    ;TEST.C: 130: ivector5[ i * 2 + 3 ] = 5;
    ;переменной индукции нет (не регистровая)
    ;но смещение индекса преобразовано в смещение базы
    ;массива
    	ld	hl,(_i)
    	add	hl,hl
    	add	hl,hl
    	ld	de,_ivector5+06h
    	add	hl,de
    	ld	(hl),05h
    	inc	hl
    	ld	(hl),0
    	ld	hl,(_i)
    	inc	hl
    	ld	(_i),hl
    	ld	de,064h
    	call	wrelop
    	jp	m,l12
    l13:
    7.Глубокие подвыражения
    Код:
    ;TEST.C: 136: if( i < 10 )
    	ld	de,0Ah
    	ld	hl,(_i)
    	call	wrelop
    ;TEST.C: 137: j5 = i5 + i2;
    ;весьма хитро- загрузку параметров вынесли перед
    ;переходом, а сложение после, чтобы не портить флаг
    	ld	hl,(_i5)
    	ld	de,(_i2)
    	jp	p,L1
    
    	add	hl,de
    	ld	(_j5),hl
    ;TEST.C: 138: else
    	jp	l16
    ;TEST.C: 139: k5 = i5 + i2;
    L1:
    	add	hl,de
    	ld	(_k5),hl
    l16:
    8.Генерация адреса переменной с константным индексом, размножение копий и регистров
    Код:
    ;TEST.C: 147: ivector[ 0 ] = 1;
    ;логично
    	ld	hl,01h
    	ld	(_ivector),hl
    ;TEST.C: 148: ivector[ i2 ] = 2;
    	ld	hl,(_i2)
    	add	hl,hl
    	ld	de,_ivector
    	add	hl,de
    	ld	(hl),02h
    	inc	hl
    	ld	(hl),0
    ;TEST.C: 149: ivector[ i2 ] = 2;
    ;повтор вычислений, но запоминание смещения-
    ;недостаток модели распределения регистров
    	ld	hl,(_i2)
    	add	hl,hl
    	add	hl,de
    	ld	(hl),02h
    	inc	hl
    	ld	(hl),0
    ;TEST.C: 150: ivector[ 2 ] = 3;
    ;тоже логично :)
    	ld	hl,03h
    	ld	(_ivector+04h),hl
    9.Удаление общих подвыражений
    Код:
    ;TEST.C: 157: if(( h3 + k3 ) < 0 || ( h3 + k3 ) > 5 )
    	ld	hl,(_h3)
    	ld	de,(_k3)
    	add	hl,de
    ;наконец-то вспомнили о битовых операциях...
    	bit	07h,h
    	jp	nz,u90
    ;а тут косяк- нахрена подобные вычисления?
    ;переменные ведь не volatile...
    	ld	de,06h
    	ld	hl,(_h3)
    	ld	bc,(_k3)
    	add	hl,bc
    	call	wrelop
    	jp	m,u91
    u90:
    ;TEST.C: 158: printf("Common subexpression elimination\n");
    	ld	hl,u29
    	push	hl
    	call	_printf
    	pop	bc
    ;TEST.C: 159: else {
    	jp	l18
    u91:
    ;TEST.C: 160: m3 = ( h3 + k3 ) / i3;
    ;опять вычисления с нуля
    	ld	de,(_i3)
    	ld	hl,(_h3)
    	ld	bc,(_k3)
    	add	hl,bc
    	call	adiv
    	ld	(_m3),hl
    ;TEST.C: 161: g3 = i3 + (h3 + k3);
    ;фиаско! никаких промежуточных сохранений результатов
    	ld	hl,(_i3)
    	ld	de,(_h3)
    	add	hl,de
    	ld	de,(_k3)
    	add	hl,de
    	ld	(_g3),hl
    l18:
    ;TEST.C: 162: }
    10.Вынесение инвариантного кода
    Код:
    ;TEST.C: 168: for( i4 = 0; i4 <= 2; i4++)
    ;все тот же бешеный цикл...
    	ld	hl,0
    	ld	(_i4),hl
    	ld	de,03h
    	ld	hl,(_i4)
    	call	wrelop
    	jp	p,l20
    l19:
    ;TEST.C: 169: ivector2[ i4 ] = j * k;
    ;полная Ж... вычисление j * k в каждой итерации цикла
    	ld	a,(_k)
    	ld	e,a
    	ld	d,0
    	ld	a,(_j)
    	ld	l,a
    	ld	h,d
    	call	lmul
    	ld	a,l
    	ld	hl,(_i4)
    	ld	de,_ivector2
    	add	hl,de
    	ld	(hl),a
    	ld	hl,(_i4)
    	inc	hl
    	ld	(_i4),hl
    	ld	de,03h
    	call	wrelop
    	jp	m,l19
    l20:

  11. #70

    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,286
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    39 сообщений
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    11.Вызов функции с аргументами. Определение недостижимого кода
    Код:
    ;TEST.C: 175: dead_code( 1, "This line should not be printed" );
    ;вызов типа fastcall- все что можно, через регистры
    	ld	bc,u39
    	ld	de,01h
    	call	_dead_code
    Код:
    ;TEST.C: 192: void dead_code( a, b )
    ;TEST.C: 193: int a;
    ;TEST.C: 194: char *b;
    ;TEST.C: 195: {
    _dead_code:
    ;TEST.C: 196: int idead_store;
    ;TEST.C: 198: idead_store = a;
    ;о! первое использование регистровых
    ;переменных
    ; _idead_store allocated to hl
    	ld	l,e
    	ld	h,d
    ;TEST.C: 199: if( 0 )
    ;пустышка благополучно свернута. честь и хвала!
    	ret	
    ;TEST.C: 201: }
    12.Вызов функции без аргументов. Исключение циклов
    Код:
    ;TEST.C: 181: unnecessary_loop();
    ;простенько и со вкусом :)
    	call	_unnecessary_loop
    Код:
    ;TEST.C: 211: void unnecessary_loop()
    ;TEST.C: 212: {
    _unnecessary_loop:
    ;TEST.C: 213: int x;
    ;TEST.C: 215: x = 0;
    ;еще одна регистровая переменная
    ; _x allocated to bc
    	ld	bc,0
    ;TEST.C: 216: for( i = 0; i < 5; i++ )
    ;более глубокий анализ убрал бы этот цикл нафиг...
    ;но см. примечание про повторную загрузку
    	ld	l,c
    	ld	h,b
    	ld	(_i),hl
    	ld	de,05h
    	call	wrelop
    	ret	p
    l25:
    ;TEST.C: 218: k5 = x + j5;
    ;не свернул х=0... никому не нужное сложение
    	ld	hl,(_j5)
    	add	hl,bc
    	ld	(_k5),hl
    	ld	hl,(_i)
    	inc	hl
    	ld	(_i),hl
    	ld	de,05h
    	call	wrelop
    	jp	m,l25
    ;TEST.C: 219: }
    	ret
    13. Слияние заголовков циклов
    Код:
    ;TEST.C: 228: void loop_jamming( x )
    ;TEST.C: 229: int x;
    ;TEST.C: 230: {
    _loop_jamming:
    ;пролог функции- выделение стека под локальные
    ;переменные и параметр
    	push	ix
    	ld	ix,0
    	add	ix,sp
    	push	bc
    ;_x stored from de
    	ld	(ix+-2),e
    	ld	(ix+-1),d
    ;TEST.C: 231: for( i = 0; i < 5; i++ )
    	ld	hl,0
    	ld	(_i),hl
    	ld	de,05h
    	ld	hl,(_i)
    	call	wrelop
    	jp	p,l30
    l29:
    ;TEST.C: 232: k5 = x + j5 * i;
    	ld	de,(_i)
    	ld	hl,(_j5)
    	call	amul
    	ld	e,(ix+-2)
    	ld	d,(ix+-1)
    	add	hl,de
    	ld	(_k5),hl
    	ld	hl,(_i)
    	inc	hl
    	ld	(_i),hl
    	ld	de,05h
    	call	wrelop
    	jp	m,l29
    l30:
    ;TEST.C: 233: for( i = 0; i < 5; i++ )
    ;чуда нет- слияния заголовков циклов тоже
    	ld	hl,0
    	ld	(_i),hl
    	ld	de,05h
    	ld	hl,(_i)
    	call	wrelop
    	jp	p,l28
    l32:
    ;TEST.C: 234: i5 = x * k5 * i;
    	ld	de,(_k5)
    	ld	l,(ix+-2)
    	ld	h,(ix+-1)
    	call	amul
    	ld	de,(_i)
    	call	amul
    	ld	(_i5),hl
    	ld	hl,(_i)
    	inc	hl
    	ld	(_i),hl
    	ld	de,05h
    	call	wrelop
    	jp	m,l32
    ;TEST.C: 235: }
    l28:
    14.Разворачивание циклов
    Код:
    ;TEST.C: 246: void loop_unrolling( x )
    ;TEST.C: 247: int x;
    ;TEST.C: 248: {
    _loop_unrolling:
    ;TEST.C: 249: for( i = 0; i < 6; i++ )
    ;тоже без чуда- возможно, число итераций цикла
    ;слишком велико для разворота, но опций не нашел
    	ld	hl,0
    	ld	(_i),hl
    	ld	de,06h
    	ld	hl,(_i)
    	call	wrelop
    	ret	p
    l36:
    ;TEST.C: 250: ivector4[ i ] = 0;
    	ld	hl,(_i)
    	add	hl,hl
    	ld	de,_ivector4
    	add	hl,de
    	ld	(hl),0
    	inc	hl
    	ld	(hl),0
    	ld	hl,(_i)
    	inc	hl
    	ld	(_i),hl
    	ld	de,06h
    	call	wrelop
    	jp	m,l36
    ;TEST.C: 251: }
    	ret
    15.Сжатие цепочки переходов
    Код:
    ;TEST.C: 260: int jump_compression( i, j, k, l, m )
    ;TEST.C: 261: int i, j, k, l, m;
    ;TEST.C: 262: {
    _jump_compression:
    ;монструозный пролог- много переменных на входе
    ;все равно не оптимально...
    	push	ix
    	ld	ix,0
    	add	ix,sp
    	push	bc
    	push	bc
    ;_j stored from bc
    	ld	(ix+-4),c
    	ld	(ix+-3),b
    ;_i stored from de
    	ld	(ix+-2),e
    	ld	(ix+-1),d
    l40:
    ; _l loaded to bc
    	ld	c,(ix+6)
    	ld	b,(ix+7)
    ;TEST.C: 263: beg_1:
    ;TEST.C: 264: if( i < j )
    	ld	e,(ix+-4)
    	ld	d,(ix+-3)
    	ld	l,(ix+-2)
    	ld	h,(ix+-1)
    	call	wrelop
    	jp	p,l41
    ;TEST.C: 265: if( j < k )
    	ld	e,(ix+4)
    	ld	d,(ix+5)
    	ld	l,(ix+-4)
    	ld	h,(ix+-3)
    	call	wrelop
    	jp	p,l42
    ;TEST.C: 266: if( k < l )
    	ld	e,c
    	ld	d,b
    	ld	l,(ix+4)
    	ld	h,(ix+5)
    	call	wrelop
    	jp	p,l43
    ;TEST.C: 267: if( l < m )
    	ld	e,(ix+8)
    	ld	d,(ix+9)
    	ld	l,c
    	ld	h,b
    	call	wrelop
    ;сжатия нет- помешало невесть откуда взявшееся
    ;сохранение l (bc), хотя к данному моменту оно не менялось
    	jp	p,l46
    ;TEST.C: 268: l += m;
    	ld	l,(ix+8)
    	ld	h,(ix+9)
    	add	hl,bc
    	push	hl
    	pop	bc
    ;TEST.C: 269: else
    	jp	l49
    ;TEST.C: 271: else
    l43:
    ;TEST.C: 272: k += l;
    	ld	l,(ix+4)
    	ld	h,(ix+5)
    	add	hl,bc
    	ld	(ix+4),l
    	ld	(ix+5),h
    ;TEST.C: 273: else {
    	jp	l49
    l42:
    ;TEST.C: 274: j += k;
    	ld	e,(ix+4)
    	ld	d,(ix+5)
    	ld	l,(ix+-4)
    	ld	h,(ix+-3)
    	add	hl,de
    	ld	(ix+-4),l
    	ld	(ix+-3),h
    l46:
    ;TEST.C: 275: end_1:
    ;_l stored from bc
    	ld	(ix+6),c
    	ld	(ix+7),b
    ;TEST.C: 276: goto beg_1;
    	jp	l40
    ;TEST.C: 277: }
    ;TEST.C: 278: else
    l41:
    ;TEST.C: 279: i += j;
    	ld	e,(ix+-4)
    	ld	d,(ix+-3)
    	ld	l,(ix+-2)
    	ld	h,(ix+-1)
    	add	hl,de
    	ld	(ix+-2),l
    	ld	(ix+-1),h
    l49:
    ;TEST.C: 280: return( i + j + k + l + m );
    	ld	e,(ix+8)
    	ld	d,(ix+9)
    	ld	l,(ix+-4)
    	ld	h,(ix+-3)
    	add	hl,de
    	ld	e,(ix+4)
    	ld	d,(ix+5)
    	add	hl,de
    	ld	e,c
    	ld	d,b
    	add	hl,de
    	ld	e,(ix+-2)
    	ld	d,(ix+-1)
    	add	hl,de
    ;TEST.C: 281: }
    ;эпилог- очистка стека, не рационально...
    	ld	sp,ix
    	pop	ix
    	pop	bc
    	pop	af
    	pop	af
    	pop	af
    	push	bc
    	ret
    Фух! Вроде все сделал.
    Итоговая оценка (субъективно)- 8/10. Годится для быстрой проверки идей, для создания готовых программ следует подходить с осторожностью.

    Камрады, протестите плз другие компилеры и подобным образом откомментируйте их код

Страница 7 из 19 ПерваяПервая ... 34567891011 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •