Bug #4014
closed
Concatenation in left hand side expressions
Added by Andrei Tatarnikov over 11 years ago.
Updated over 8 years ago.
Assignee:
Andrei Tatarnikov
Published in build:
2.3.31
Description
Логика выражений типа M [0] :: M [1] = R [4] некорректна. Она должна означать:
M [0] = R [4];
M [1] = R [4]
Вот что написано в драфте Фредерикса:
<<<<<<<<<<<<<<<<<<<<<<
4.10 Concatenation of Values
The :: operator allows the concatenation of arbitrary expressions; it is de ned on the left side of
assignments, too (if the expressions denote memory locations only, of course). For example,
M [0] :: M [1] = R [4]
assigns the value of R [4] to the locations M [0] and M [1]. The order is the same as used in sequences
of locations, i.e., essentially unde ned.
Нужно найти решение.
- Assignee set to Andrei Tatarnikov
Andrey Tatarnikov wrote:
Логика выражений типа M [0] :: M [1] = R [4] некорректна. Она должна означать:
M [0] = R [4];
M [1] = R [4]
Запись x1::x2 = value
нужно интерпретировать следующим образом. Если суммарная разрядность x1
и x2
равна разрядности value. Часть значения записывается в x1
, а часть - в x2
. Если разрядности не совпадают, нужно начинать с младших бит, а дальше - либо обрезать, либо заполнять нулями.
Все конструкции с недоопределенной семантикой нужно документировать в руководстве по языку (нужно в wiki завести соответствующий раздел).
Сейчас так и делается, как ты написал. В модели ARM есть вот такие конструкции:
carry::ALU_OUT = GPR[src2] + src3;
Нужно подумать как их правильно интерпретировать. Левая часть заведомо больше на carry (некий флаг).
- Due date set to 04/30/2014
- Target version set to 2.0
Сейчас для присваивания используется BitVector.assign. Он копирует все данные. Если остаётся место - заполняет его нулями, если что-то не вмещается - данные обрезаются.
Вообще этот код нуждается в Review и я над ним сейчас работаю.
Тут же ещё и sign extension возможен.
- Target version changed from 2.0 to 2.1
- Subject changed from [translator] Concatenation in left hand side expressions to Concatenation in left hand side expressions
- Category set to 40
- Target version changed from 2.1 to 2.2
Has the issue been resolved?
- Status changed from New to Resolved
- % Done changed from 0 to 100
In the current implementation, both sides of an assignment expression must have the same size. Otherwise, it will cause a type error.
So, in M[0]::M[1]=R[4]
, data one half of R[4]
is copied into M[0]
and another is copied into M[1]
. If sizes of left and right sides mismatch, a translation error will occur.
- Status changed from Resolved to Closed
- Published in build set to 2.3.31
Also available in: Atom
PDF