История изменений
Исправление 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]})