LINUX.ORG.RU

История изменений

Исправление uin, (текущая версия) :

Ты кодишь? Давно появлялось желание делать свой инстракшн сет?

«Мне не надо, значит никому не надо»

Ну и ещё раз — это всё красиво звучит до первого апгрейда. Новый проц — новый компилятор, с новыми багами. Нельзя просто взять уже собранную для старого процессора программу и запустить.

Это уже рутинные проблемы, которые к тому же как то решенные еще в итаниуме.

Проще железячникам, сложнее программистам

Бедные программисты, им придется писать код...

Как будто пользователи об этом просят.
Людям это очень нужно.

Еще они не просят луну, марс и квазары им и на земле хорошо, так что теперь, прекратить исследования?

Опечатка, наверное. Четыре байта, 32 бита — это далеко не Very Long. Там от 128 бит и выше.

Это размер одной инструкции, а широкие из нескольких набирают, длинна вроде варьируемая. Если я ничего не путаю то вроде как раз это и есть то что еще в итанике позволяло запускать старые приложения на новом ЦП - в инструкциях содержится инфа о том на каком конкретно устройстве делать что то, если ничего в этой части сильно не менять то не понимаю почему оно не должно работать. А если изменять, то это и интелу не поможет (да-да внутренний они могут переиначивать как захотят, но внешний легаси инстракшнсет ничего нового не позволит), поэтому это хоть и проблема но проблема рода «была у меня лошадь, небыло проблем с бензином», то есть никак с суперскалярами не связанная

Алсо: вот немножко асма на котором видно номера устройств и ноп

#define E2K_RESTORE_GREG_IN_TRAP(base, ext, numlo1, numhi1, numlo2, numhi2) \
({                                                                      \
        register u64 reg1, reg2, reg3, reg4, reg5, reg6;                \
                                                                        \
        asm (                                                           \
                "{\n"                                                   \
                "ldrd,2 [%[_base] + %[_tagged_ld_0]], %%dg" #numlo1 "\n" \
                "ldrd,5 [%[_base] + %[_tagged_ld_8]], %%dg" #numhi1 "\n" \
                "ldh,0 [%[_ext] + 0], %0\n"                             \
                "ldh,3 [%[_ext] + 2], %1\n"                             \
                "}\n"                                                   \
                "{\n"                                                   \
                "nop\n"                                                 \
                "ldrd,2 [%[_base] + %[_tagged_ld_16]], %%dg" #numlo2 "\n" \
                "ldrd,5 [%[_base] + %[_tagged_ld_24]], %%dg" #numhi2 "\n" \
                "ldh,0 [%[_ext] + 4], %2\n"                             \
                "ldh,3 [%[_ext] + 6], %3\n"                             \
                "}\n"                                                   \
                "{\n"                                                   \
                "gettagd,2 %%dg" #numlo1 ", %4\n"                       \
                "gettagd,5 %%dg" #numhi1 ", %5\n"                       \
                "}\n"                                                   \
                "{\n"                                                   \
                "gettagd,2 %%dg" #numlo2 ", %4\n"                       \
                "gettagd,5 %%dg" #numhi2 ", %5\n"                       \
                "cmpesb,1 0, %4, %%pred2\n"                             \
                "cmpesb,4 0, %5, %%pred3\n"                             \
                "}\n"                                                   \
                "{\n"                                                   \
                "cmpesb,1 0, %4, %%pred4\n"                             \
                "cmpesb,4 0, %5, %%pred5\n"                             \
                "}\n"                                                   \
                "{\n"                                                   \
                "movif,1 %%dg" #numlo1 ", %0, %%dg" #numlo1 " ? %%pred2\n" \
                "movif,4 %%dg" #numhi1 ", %1, %%dg" #numhi1 " ? %%pred3\n" \
                "}\n"                                                   \
                "{\n"                                                   \
                "movif,1 %%dg" #numlo2 ", %2, %%dg" #numlo2 " ? %%pred4\n" \
                "movif,4 %%dg" #numhi2 ", %3, %%dg" #numhi2 " ? %%pred5\n" \
                "}\n"                                                   \
                : "=&r" (reg1), "=&r" (reg2), "=&r" (reg3), "=&r" (reg4), \
                  "=&r" (reg5), "=&r" (reg6)                            \
                : [_base] "r" (base), [_ext] "r" (ext),                 \
                  [_tagged_ld_0] "i" (TAGGED_MEM_LOAD_REC_OPC),         \
                  [_tagged_ld_8] "i" (TAGGED_MEM_LOAD_REC_OPC | 8UL),   \
                  [_tagged_ld_16] "i" (TAGGED_MEM_LOAD_REC_OPC | 16UL), \
                  [_tagged_ld_24] "i" (TAGGED_MEM_LOAD_REC_OPC | 24UL)  \
                : "%g" #numlo1, "%g" #numhi1, "%g" #numlo2, "%g" #numhi2, \
                  "%pred2", "%pred3", "%pred4", "%pred5");              \
})

Исходная версия uin, :

Ты кодишь? Давно появлялось желание делать свой инстракшн сет?

«Мне не надо, значит никому не надо»

Ну и ещё раз — это всё красиво звучит до первого апгрейда. Новый проц — новый компилятор, с новыми багами. Нельзя просто взять уже собранную для старого процессора программу и запустить.

Это уже рутинные проблемы, которые к тому же как то решенные еще в итаниуме.

Проще железячникам, сложнее программистам

Бедные программисты, им придется писать код...

Как будто пользователи об этом просят.
Людям это очень нужно.

Еще они не просят луну, марс и квазары им и на земле хорошо, так что теперь, прекратить исследования?

Опечатка, наверное. Четыре байта, 32 бита — это далеко не Very Long. Там от 128 бит и выше.

Это размер одной инструкции, а широкие из нескольких набирают, длинна вроде варьируемая. Если я ничего не путаю то вроде как раз это и есть то что еще в итанике позволяло запускать старые приложения на новом ЦП - в инструкциях содержится инфа о том на каком конкретно устройстве делать что то, если ничего в этой части сильно не менять то не понимаю почему оно не должно работать. А если изменять, то это и интелу не поможет (да-да внутренний они могут переиначивать как захотят, но внешний легаси инстракшнсет ничего нового не позволит), поэтому это хоть и проблема но проблема рода «была у меня лошадь, небыло проблем с бензином», то есть никак с суперскалярами не связанная

Алсо: вот немножко асма на котором видно номера устройств и ноп

[br]#define E2K_RESTORE_GREG_IN_TRAP(base, ext, numlo1, numhi1, numlo2, numhi2) \[br]({                                                                      \[br]        register u64 reg1, reg2, reg3, reg4, reg5, reg6;                \[br]                                                                        \[br]        asm (                                                           \[br]                "{\n"                                                   \[br]                "ldrd,2 [%[_base] + %[_tagged_ld_0]], %%dg" #numlo1 "\n" \[br]                "ldrd,5 [%[_base] + %[_tagged_ld_8]], %%dg" #numhi1 "\n" \[br]                "ldh,0 [%[_ext] + 0], %0\n"                             \[br]                "ldh,3 [%[_ext] + 2], %1\n"                             \[br]                "}\n"                                                   \[br]                "{\n"                                                   \[br]                "nop\n"                                                 \[br]                "ldrd,2 [%[_base] + %[_tagged_ld_16]], %%dg" #numlo2 "\n" \[br]                "ldrd,5 [%[_base] + %[_tagged_ld_24]], %%dg" #numhi2 "\n" \[br]                "ldh,0 [%[_ext] + 4], %2\n"                             \[br]                "ldh,3 [%[_ext] + 6], %3\n"                             \[br]                "}\n"                                                   \[br]                "{\n"                                                   \[br]                "gettagd,2 %%dg" #numlo1 ", %4\n"                       \[br]                "gettagd,5 %%dg" #numhi1 ", %5\n"                       \[br]                "}\n"                                                   \[br]                "{\n"                                                   \[br]                "gettagd,2 %%dg" #numlo2 ", %4\n"                       \[br]                "gettagd,5 %%dg" #numhi2 ", %5\n"                       \[br]                "cmpesb,1 0, %4, %%pred2\n"                             \[br]                "cmpesb,4 0, %5, %%pred3\n"                             \[br]                "}\n"                                                   \[br]                "{\n"                                                   \[br]                "cmpesb,1 0, %4, %%pred4\n"                             \[br]                "cmpesb,4 0, %5, %%pred5\n"                             \[br]                "}\n"                                                   \[br]                "{\n"                                                   \[br]                "movif,1 %%dg" #numlo1 ", %0, %%dg" #numlo1 " ? %%pred2\n" \[br]                "movif,4 %%dg" #numhi1 ", %1, %%dg" #numhi1 " ? %%pred3\n" \[br]                "}\n"                                                   \[br]                "{\n"                                                   \[br]                "movif,1 %%dg" #numlo2 ", %2, %%dg" #numlo2 " ? %%pred4\n" \[br]                "movif,4 %%dg" #numhi2 ", %3, %%dg" #numhi2 " ? %%pred5\n" \[br]                "}\n"                                                   \[br]                : "=&r" (reg1), "=&r" (reg2), "=&r" (reg3), "=&r" (reg4), \[br]                  "=&r" (reg5), "=&r" (reg6)                            \[br]                : [_base] "r" (base), [_ext] "r" (ext),                 \[br]                  [_tagged_ld_0] "i" (TAGGED_MEM_LOAD_REC_OPC),         \[br]                  [_tagged_ld_8] "i" (TAGGED_MEM_LOAD_REC_OPC | 8UL),   \[br]                  [_tagged_ld_16] "i" (TAGGED_MEM_LOAD_REC_OPC | 16UL), \[br]                  [_tagged_ld_24] "i" (TAGGED_MEM_LOAD_REC_OPC | 24UL)  \[br]                : "%g" #numlo1, "%g" #numhi1, "%g" #numlo2, "%g" #numhi2, \[br]                  "%pred2", "%pred3", "%pred4", "%pred5");              \[br]})