1. C++ / Говнокод #7890

    +162

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    #ifdef _WIN32
    #define BEGIN_ASM
    #define END_ASM
    #define _DB(a) __asm _emit a
    #define _STR(a) a
    #else
    #define BEGIN_ASM asm (
    #define END_ASM );
    #define _DB(a) ".byte "#a";"
    #define _STR(a) a" \n\t"
    #endif
    
    #define PARAMETERS_ESP_VOID_VOID_VOID BEGIN_ASM _STR(_DB(0x8B) _DB(0x44) _DB(0x24) _DB(0x04)) _STR(_DB(0x8B) _DB(0x54) _DB(0x24) _DB(0x08)) \
     _STR(_DB(0x8B) _DB(0x4C) _DB(0x24) _DB(0x0C)) END_ASM
    #define SAVE_3_PARAMETERS BEGIN_ASM _STR(_DB(0x89) _DB(0x44) _DB(0x24) _DB(0xE4)) _STR(_DB(0x89) _DB(0x54) _DB(0x24) _DB(0xEC)) \
    _STR(_DB(0x89) _DB(0x4C) _DB(0x24) _DB(0xE8)) END_ASM
    #define LOAD_3_PARAMETERS BEGIN_ASM _STR(_DB(0x8B) _DB(0x44) _DB(0x24) _DB(0xE4)) _STR(_DB(0x8B) _DB(0x54) _DB(0x24) _DB(0xEC)) \
    _STR(_DB(0x8B) _DB(0x4C) _DB(0x24) _DB(0xE8)) END_ASM
    
    int rdtc()
    {
      _asm RDTSC
    }
    
    #pragma optimize( "gtp", on )
    #define VECTORP2DADDFPU \
    BEGIN_ASM \
     _STR(_DB(0xD9) _DB(0x00)) \
     _STR(_DB(0xD8) _DB(0x02)) \
     _STR(_DB(0xD9) _DB(0x19)) \
     _STR(_DB(0xD9) _DB(0x40) _DB(0x04)) \
     _STR(_DB(0xD8) _DB(0x42) _DB(0x04)) \
     _STR(_DB(0xD9) _DB(0x59) _DB(0x04)) \
    END_ASM
    
    void __stdcall __VectorP2DAddFPU() {
      VECTORP2DADDFPU;
    }
    
    // для даной функции компилятор сам зделает так чтобы использовались другие регистры процессора в место eax edx ecx и сохранения не понадобится
    #define Vector2DAdd(x,y,z) _asm lea eax,x _asm lea edx,y _asm lea ecx,z _asm call __VectorP2DAddFPU;
    
    void __stdcall _VectorP2DAddFPU(void *,void *,void *) {
    // сохранение в данном случае вызывается в ручную так как сам компилятор этого не зделает что приведет к не предвиденниму результату или к подению
      SAVE_3_PARAMETERS;
      PARAMETERS_ESP_VOID_VOID_VOID;
      VECTORP2DADDFPU;
      LOAD_3_PARAMETERS;
    }

    http://www.gamedev.ru/code/forum/?id=152492#m3

    >стоит ли писать велосипед, реализующий математику подобным образом?

    Запостил: CPPGovno, 18 Сентября 2011

    Комментарии (20) RSS

    • Стоит.
      Ответить
      • Сам пошутил, сам посмеялся - день прожит не зря
        Ответить
        • Это же не я вопрос задал. А автор темы. Я просто ответил.
          Ответить
          • А Вы и копипастам отвечаете, когда они спрашивают?
            Ответить
            • Копипасты спрашивают нас? Моя твоя не понимать.
              Ответить
      • Скорее лежит.
        Ответить
      • У меня встал, я нормален?
        Ответить
      • никакой это не говнокод. Автор, подучи язык и почитай книги про оптимизацию и алгоритмы для начального уровня - тогда сможешь понять для чего так сделано
        Ответить
        • Чуть ниже http://govnokod.ru/7890#comment108392 цитата автора. Там он объяснил почему это сделал. Причины не те, о которых мы подумали.
          Ответить
    • Скоро сюда весь ГД.ру перепишем.
      Ну специфика у игростроя такая, байтоёбская, что поделаешь...
      Ответить
    • Не понимаю горе оптимизаторов. Хотите оптимизацию, возьмите мощный компилятор. Хотите быть умнее компилятора, пишите модуль на асме, но не делайте это через 100500 костылей в модуле на сях.
      Ответить
    • Стоит ли говорить, что код не поддерживаемый?
      Ответить
    • Автор темы снова отжог:D
      >я вроде вкурсе этого, но тем неменее люблю факты, а пока ковырялся в асме скармливая его компилятору натыкаюсь на всякого рода противоречия, в основном они косаются не оптимизированного кода, после чего я скармливаю этот код оптимизатору, который выдает мне уже машшиный код, который я вставляю макросами без всяких директив оптимизации, после чего разница между кодом который написал я в макросе и тем который создает компилятор, неповериш, исчезает.
      Ответить

    Добавить комментарий