forp: change indexing to verilog-like semantics

This commit is contained in:
aiju 2018-12-06 10:56:32 +00:00
parent 023f5eca58
commit 4415dde6d3
2 changed files with 7 additions and 6 deletions

View file

@ -89,8 +89,9 @@ Expressions can be formed just as in C, however when used in an expression, all
The valid operators are listed below, in decreasing precedence. Note that logical operations treat all non-zero values as 1, whereas bitwise operators operate on all bits independently. The valid operators are listed below, in decreasing precedence. Note that logical operations treat all non-zero values as 1, whereas bitwise operators operate on all bits independently.
.TP "\w'\fL<\fR, \fL<=\fR, \fL>\fR, \fL>=\fR 'u" .TP "\w'\fL<\fR, \fL<=\fR, \fL>\fR, \fL>=\fR 'u"
\fL[]\fR \fL[]\fR
Array indexing. The syntax is \fIvar\fL[\fIidx\fL:\fIn\fR] to address \fIn\fR bits with the least-significant bit at \fIidx\fR. Array indexing. The syntax is \fIvar\fL[\fIa\fL:\fIb\fR], with \fIa\fR denoting the MSB and \fIb\fR denoting the LSB.
Omiting \fL:\fIn\fR addresses a single bit. Omiting \fL:\fIb\fR addresses a single bit.
The result is always treated as unsigned.
.TP .TP
\fL!\fR, \fL~\fR, \fL+\fR, \fL-\fR \fL!\fR, \fL~\fR, \fL+\fR, \fL-\fR
(Unary operators) Logical and bitwise "not", unary plus (no-op), arithmetic negation. Because of promotion, \fL~\fR and \fL-\fR operate beyond the width of variables. (Unary operators) Logical and bitwise "not", unary plus (no-op), arithmetic negation. Because of promotion, \fL~\fR and \fL-\fR operate beyond the width of variables.

View file

@ -251,9 +251,9 @@ opidx(Node *rn, Node *n1, Node *n2, Node *n3)
{ {
int i, j, k, s; int i, j, k, s;
j = mptoi(n2->num); k = mptoi(n2->num);
if(n3 == nil) k = j; if(n3 == nil) j = k;
else k = mptoi(n3->num); else j = mptoi(n3->num);
if(j > k){ if(j > k){
nodevars(rn, 1); nodevars(rn, 1);
return; return;
@ -492,7 +492,7 @@ convert(Node *n, uint sz)
case ASTIDX: case ASTIDX:
if(n->n2->type != ASTNUM || n->n3 != nil && n->n3->type != ASTNUM) if(n->n2->type != ASTNUM || n->n3 != nil && n->n3->type != ASTNUM)
error(n, "non-constant in indexing expression"); error(n, "non-constant in indexing expression");
convert(n->n1, (n->n3 != nil ? mptoi(n->n3->num) : mptoi(n->n2->num)) + 1); convert(n->n1, n->n3 != nil ? mptoi(n->n3->num) - mptoi(n->n2->num) + 1 : 1);
opidx(n, n->n1, n->n2, n->n3); opidx(n, n->n1, n->n2, n->n3);
break; break;
case ASTTERN: case ASTTERN: