Страница 1 из 1
Пытаемся починить сборку 64-разрядной платформы из 32-разрядной
Добавлено: 21.10.20 22:59
БудДен
Говорят, она не работала.
Выяснилось, что проблема с литералами множеств, когда результатом выражения диапазона является множество SET64 (или просто SET на 64-разрядной платформе). Где данная операция должна быть определено, я не знаю. В одном месте заменил на костыль.
А вот место, где предположительно чего-то не хватает, LisIntermedateBackend.Mod
Код: Выделить всё
PROCEDURE EvaluateBinaryExpression(x: SyntaxTree.BinaryExpression; VAR result: Operand);
Список недоделок:
- LisIntermediateBackend sfTypeSET - явно не хватает ещё как минимум одного типа - и ниже по течению. Хотя надо разобраться, может быть там битность сразу есть?
- Заполняется мусором глобальная переменная.
- Вряд ли правильно устроены операции над множествами (напр, сложение).
Re: Пытаемся починить сборку 64-разрядной платформы из 32-разрядной
Добавлено: 21.10.20 23:21
БудДен
FoxAMDBackend ... GetSystem - создаём "систему", к-рая в т.ч. определяет размер множества , да и вообще, разрядность платформы.
Re: Пытаемся починить сборку 64-разрядной платформы из 32-разрядной
Добавлено: 21.10.20 23:34
БудДен
LisIntermediateBackend...EvaluateSet
setType - это максимальное для данной платформы множество.
Код: Выделить всё
temp := SetFromRange(expression(SyntaxTree.RangeExpression));
ASSERT(IntermediateCode.TypeEquals(setType, temp.type));
Наличие ASSERT побуждает верить, что при создании множества из диапазона оно всегда имеет размер, соответствующий платформе (и равный размеру адреса).
Re: Пытаемся починить сборку 64-разрядной платформы из 32-разрядной
Добавлено: 21.10.20 23:37
БудДен
Так, похоже, до меня дошло. Раз все промежуточные значения при вычислении типов "множество" имеют тип, специфичный для платформы, то вычисления с SET64 на 32-разрядной платформе должны выполняться очень криво. В т.ч. вычисления с литералами множеств типа SET64. Надо проверить.
Re: Пытаемся починить сборку 64-разрядной платформы из 32-разрядной
Добавлено: 21.10.20 23:40
БудДен
Да, вот как оно "работает":
Код: Выделить всё
MODULE Proba;
PROCEDURE Do*;
BEGIN
IF {0..63} = {0..31} THEN
HALT(100)
ELSE
HALT(200) END END Do
Данный код возвращает ошибку 100.
Re: Пытаемся починить сборку 64-разрядной платформы из 32-разрядной
Добавлено: 21.10.20 23:42
БудДен
Как починить? Один из вариантов состоит в том, чтобы множество всегда имело тип SET64. Поскольку операции с числами 64 разрядов вроде бы должны работать в 32-разрядной версии, а множества - это слегка замаскированные числа, вроде всё должно сработать. Правда, ценой потери эффективности, т.к. все вычисления над множествами станут жирнее.
Очевидно, что сейчас пора спать, а этим надо заняться уже в другой раз.
Но какие есть ещё варианты? Видимо, второй вариант - в том, чтобы смотреть на типы операндов и более аккуратно вычислять размер множества. Если множество является литералом, то ему может повезти и оно будет менее, чем 64-битным. А вот если оно порождается выражением диапазона из чисел, то оно может быть только 64-битным.
Очевидно, при присвоении широкого множества узкому нужно проверять, что все выкидываемые биты - нулевые. Как-то так.
Re: Пытаемся починить сборку 64-разрядной платформы из 32-разрядной
Добавлено: 22.10.20 21:24
Лис [Вежливый]
А где ты вообще взял 32-разрядную платформу? Они же все устарели уже́...
Сегодня пользователи этим вопросом не заморачиваются по той простой причине, что все современные сборки ПК, как правило, комплектуются 64-разрядными процессорами.
https://tavalik.ru/32-ili-64-razryadnyj-processor/
«начиная с первого 64-разрядного процессора AMD Athlon 64, представленного
в 2003 году»
Re: Пытаемся починить сборку 64-разрядной платформы из 32-разрядной
Добавлено: 22.10.20 22:52
БудДен
A2 в основном применяется во встроенных системах, там они не устарели.
Re: Пытаемся починить сборку 64-разрядной платформы из 32-разрядной
Добавлено: 25.10.20 00:28
БудДен
Код: Выделить всё
IntermediateCode.GetType(module.system, module.system.setTypeA)
Похоже, что вот так преобразуются типы фронтенда в типы промежуточного бекенда.
Re: Пытаемся починить сборку 64-разрядной платформы из 32-разрядной
Добавлено: 25.10.20 00:29
БудДен
Код: Выделить всё
|Scanner.Minus:
Evaluate(x.left, operand);
InitOperand(result,ModeValue);
Reuse1a(result.op,operand.op,dest);
type := x.left.type.resolved;
IF type IS SyntaxTree.SetType THEN
Emit(Not(position,result.op,operand.op));
ELSIF (type IS SyntaxTree.ComplexType) THEN
Reuse1(result.tag,operand.tag);
Emit(Neg(position,result.op,operand.op)); (* real part *)
Emit(Neg(position,result.tag,operand.tag)) (* imaginary part *)
ELSIF (type IS SyntaxTree.NumberType) OR (type IS SyntaxTree.SizeType) OR (type IS SyntaxTree.AddressType) THEN
Emit(Neg(position,result.op,operand.op));
ELSE HALT(200)
END;
ReleaseOperand(operand);
Re: Пытаемся починить сборку 64-разрядной платформы из 32-разрядной
Добавлено: 25.10.20 01:47
БудДен
Несмотря на определённый прогресс в обработке 64-разрядных множеств в компиляторе, генерируемый "объектный" файл стал каким-то другим. Вероятно, что где-то в него вставляются "литералы" множеств, и, поскольку их размер изменился, что-то в формате "поехало". Поэтому в целом пока ничего не работает.
Re: Пытаемся починить сборку 64-разрядной платформы из 32-разрядной
Добавлено: 27.10.20 03:55
БудДен
Вроде заработали IN и INCL для 64-разрядных множеств, но литералы множеств по-прежнему не работают.
Причём теперь сломались и для остальных разрядностей .
Поскольку литералы множеств реализованы, как можно догадаться, через литералы множеств,
получается некий порочный круг. Один раз как-то получилось, что всё работало но
пересборка не удалась и это состояние теперь не получается воспроизвести.
Глиссада, по которой на него нужно заходить, утрачена. Теперь надо подумать...
Ночью во сне само как-нибудь подумается.
Re: Пытаемся починить сборку 64-разрядной платформы из 32-разрядной
Добавлено: 28.10.20 15:20
БудДен
При добавлении s64 + s32 или s64 + s8 старшие биты множества s64 обнуляются. И дело здесь именно в сложении с множеством другой разрядности. Значит, надо копать (и допиливать) реализацию сложения.
Re: Пытаемся починить сборку 64-разрядной платформы из 32-разрядной
Добавлено: 28.10.20 15:24
БудДен
Похоже, что при сложении множества приводятся к 32-разрядному...
Re: Пытаемся починить сборку 64-разрядной платформы из 32-разрядной
Добавлено: 28.10.20 23:32
БудДен
И это были не глисты, а сделал это я. Потому что я сказал, что множества совместимы по присваиванию в обе стороны, в результате чего больший тип стал приводиться к меньшему. Разобраться в очередной раз помог "разврат мозга".
Теперь тест проходит, но передача параметра {1} в процедуру, ожидающую SET32, не компилируется. Это надо исправлять, т.к. без этого ЯОС не соберётся (даже компилятор Лис не соберётся).
Re: Пытаемся починить сборку 64-разрядной платформы из 32-разрядной
Добавлено: 29.10.20 00:38
БудДен
Код: Выделить всё
DoNoConstSetExpr:
codeOffset = 0000088AH
0000088AH 55 PUSH EBP
0000088BH 89 E5 MOV EBP, ESP
0000088DH 6A 00 PUSH 0
0000088FH 31 C0 XOR EAX, EAX
00000891H 50 PUSH EAX
00000892H 50 PUSH EAX
00000893H 50 PUSH EAX
00000894H C7 45 FC 1C C9 53 14 MOV -4[EBP], 341035292
0000089BH BF 00 00 00 00 MOV EDI, 0
000008A0H BE 00 00 00 00 MOV ESI, 0
000008A5H 56 PUSH ESI
000008A6H 57 PUSH EDI
000008A7H 6A 01 PUSH 1
000008A9H 55 PUSH EBP
000008AAH E8 83 00 00 00 CALL 131 (00000932H)
000008AFH 83 C4 08 ADD ESP, 8
000008B2H 89 C3 MOV EBX, EAX
000008B4H 5F POP EDI
000008B5H 5E POP ESI
000008B6H 89 DA MOV EDX, EBX
000008B8H 31 C9 XOR ECX, ECX
;;; Проверка на диапазон элемента множества, к-рый мы хотим добавить (он в EDX, а что с ECX - я не понял).
000008BAH 81 F9 00 00 00 00 CMP ECX, 0
000008C0H 0F 82 11 00 00 00 JB 17 (000008D7H)
000008C6H 77 0C JNBE 12 (000008D4H)
000008C8H 81 FA 3F 00 00 00 CMP EDX, 63
000008CEH 0F 86 03 00 00 00 JBE 3 (000008D7H)
000008D4H 6A 0B PUSH 11
000008D6H CC INT 3
;;; проверка прошла
000008D7H 56 PUSH ESI
000008D8H 57 PUSH EDI
000008D9H 6A 00 PUSH 0
000008DBH 6A 01 PUSH 1
000008DDH 51 PUSH ECX
000008DEH 52 PUSH EDX
000008DFH E8 90 5A EC EB CALL -336831856 (EBEC6374H) ; LSH, но похоже, что опять впихнул туда 64-разрядное число вместо 32-разрядного
; видимо, в этом и ошибка...
000008E4H 83 C4 10 ADD ESP, 16
000008E7H 92 XCHG EAX, EDX
000008E8H 89 C1 MOV ECX, EAX
000008EAH 5F POP EDI
000008EBH 5E POP ESI
000008ECH 09 D7 OR EDI, EDX
000008EEH 09 CE OR ESI, ECX
000008F0H 89 7D F4 MOV -12[EBP], EDI
000008F3H 89 75 F8 MOV -8[EBP], ESI
000008F6H 81 7D F8 00 00 00 00 CMP -8[EBP], 0
000008FDH 75 0D JNZ 13 (0000090CH)
000008FFH 81 7D F4 02 00 00 00 CMP -12[EBP], 2
00000906H 0F 84 03 00 00 00 JZ 3 (0000090FH)
0000090CH 6A 08 PUSH 8
0000090EH CC INT 3
0000090FH 89 EC MOV ESP, EBP
00000911H 5D POP EBP
00000912H C3 RET
Re: Пытаемся починить сборку 64-разрядной платформы из 32-разрядной
Добавлено: 29.10.20 01:25
БудДен
Теперь лис способен пересобрать сам себя, но релиз пересобрать он не может. И похоже, что работа с конструкторами множеств вида {неКонстанта1..неКонстанта2} ещё не завершена.
Re: Пытаемся починить сборку 64-разрядной платформы из 32-разрядной
Добавлено: 06.11.20 18:48
БудДен
А кстати, чтобы тема завершилась на хорошей ноте - всё починилось, часть тестов падает, однако сами операционки новым компилятором запускаются - Win32, Win64, Linux64, BIOS32. Поставленная задача решена.