📄 igcse.c
字号:
case i_setc:
case i_seta:
case i_setnc:
case i_setbe:
case i_setl:
case i_setg:
case i_setle:
case i_setge:
// do available for this expression
if (list->available)
{
if (!isvolatile(list))
setbit(l->p_agen, list->available - 1);
clearbit(l->p_akill, list->available - 1);
}
// invalidate available for previous uses of variable
if (list->ans)
{
l1 = findans(availhash, list->ans);
while (l1)
{
clearbit(l->p_agen, (int)l1->data - 1);
setbit(l->p_akill, (int)l1->data - 1);
l1 = l1->link;
}
}
// take pointers into account for avail & reaching
if (list->ans->mode == i_ind)
{
BYTE *t4;
ptr = findPointer(list->ans);
if (ptr < pointer_count)
{
t4 = temparray4 + ptr * sourcebytes;
if (isset(t4, 0))
{
memset(l->p_akill, 0xff, avail_bytes);
memset(l->p_agen, 0, avail_bytes);
}
else
{
for (j = 1; j < source_count; j++)
{
if (isset(t4, j))
{
if (sourcearray[j])
{
SYM *sp = varsp(sourcearray[j]
->dc.left->offset);
if (sp)
{
l1 = findans(availhash, sp
->imvalue);
while (l1)
{
clearbit(l->p_agen, (int)l1
->data - 1);
setbit(l->p_akill, (int)l1
->data - 1);
gencount++;
l1 = l1->link;
}
}
if (sourcearray[j]->dc.right)
{
sp = varsp(sourcearray[j]
->dc.right->offset);
if (sp)
{
l1 = findans(availhash, sp
->imvalue);
while (l1)
{
clearbit(l->p_agen,
(int)l1->data - 1);
setbit(l->p_akill, (int)
l1->data - 1);
gencount++;
l1 = l1->link;
}
}
}
}
}
}
}
}
}
else
{
// if we changed a pointer, invalidate further uses of
// the pointer
ptr = findPointer(list->ans);
if (ptr < pointer_count)
{
SYM *sp = varsp(list->ans);
if (sp)
{
l1 = findans(availhash, sp->imind);
while (l1)
{
clearbit(l->p_agen, (int)l1->data - 1);
setbit(l->p_akill, (int)l1->data - 1);
l1 = l1->link;
}
}
}
}
// FALLTHROUGH
case i_coswitch:
case i_jc:
case i_ja:
case i_je:
case i_jnc:
case i_jbe:
case i_jne:
case i_jl:
case i_jg:
case i_jle:
case i_jge:
case i_parm:
if (list->dc.opcode == i_parm)
{
SYM *sp = varsp(list->dc.left);
if (sp && list->dc.left->mode == i_immed)
{
if (list->dc.left->mode == i_immed)
{
l1 = findans(availhash, sp->imvalue);
while (l1)
{
clearbit(l->p_agen, (int)l1->data - 1);
setbit(l->p_akill, (int)l1->data - 1);
l1 = l1->link;
}
}
}
else if (sp && list->dc.left->mode == i_direct)
{
ptr = findPointer(list->dc.left);
if (ptr < pointer_count)
{
BYTE *t4 = temparray4 + ptr * sourcebytes;
if (isset(t4, 0))
{
memset(l->p_akill, 0xff, avail_bytes);
memset(l->p_agen, 0, avail_bytes);
}
else
{
for (j = 1; j < source_count; j++)
{
if (isset(t4, j))
{
SYM *sp = varsp(sourcearray[j]
->dc.left->offset);
if (sp)
{
l1 = findans(availhash, sp
->imvalue);
while (l1)
{
clearbit(l->p_agen, (int)l1
->data - 1);
setbit(l->p_akill, (int)l1
->data - 1);
gencount++;
l1 = l1->link;
}
}
if (sourcearray[j]->dc.right)
{
sp = varsp(sourcearray[j]
->dc.right->offset);
if (sp)
{
l1 = findans(availhash, sp
->imvalue);
while (l1)
{
clearbit(l->p_agen,
(int)l1->data - 1);
setbit(l->p_akill, (int)
l1->data - 1);
gencount++;
l1 = l1->link;
}
}
}
}
}
}
}
}
}
break;
case i_gosub:
// kill globals
for (j = 0; j < avail_count; j++)
{
IMODE *s = availarray[j]->dc.left;
if (s && s->offset)
{
switch (s->offset->nodetype)
{
case en_nacon:
case en_napccon:
case en_nalabcon:
case en_labcon:
case en_absacon:
if (s->mode == i_direct)
{
l1 = findans(availhash, list->ans);
while (l1)
{
clearbit(l->p_agen, (int)l1->data - 1);
setbit(l->p_akill, (int)l1->data - 1);
l1 = l1->link;
}
}
else if (s->mode == i_ind)
{
BYTE *t4;
ptr = findPointer(list->ans);
if (ptr < pointer_count)
{
t4 = temparray4 + ptr * sourcebytes;
if (isset(t4, 0))
{
memset(l->p_akill, 0xff,
avail_bytes);
memset(l->p_agen, 0, avail_bytes);
}
else
{
for (k = 1; k < source_count; k++)
{
if (isset(t4, k))
{
SYM *sp = varsp
(sourcearray[k]
->dc.left->offset);
if (sp)
{
l1 = findans(availhash,
sp->imvalue);
while (l1)
{
clearbit(l->p_agen,
(int)l1->data -
1);
setbit(l->p_akill,
(int)l1->data -
1);
gencount++;
l1 = l1->link;
}
}
if (sourcearray[k]
->dc.right)
{
sp = varsp
(sourcearray[k]
->dc.right->offset);
if (sp)
{
l1 = findans
(availhash, sp
->imvalue);
while (l1)
{
clearbit(l
->p_agen,
(int)l1
->data - 1);
setbit(l
->p_akill,
(int)l1
->data - 1);
gencount++;
l1 = l1->link;
}
}
}
}
}
}
}
}
}
}
s = availarray[j]->dc.right;
if (s && s->offset)
{
switch (s->offset->nodetype)
{
case en_nacon:
case en_napccon:
case en_nalabcon:
case en_labcon:
case en_absacon:
if (s->mode == i_direct)
{
l1 = findans(availhash, list->ans);
while (l1)
{
clearbit(l->p_agen, (int)l1->data - 1);
setbit(l->p_akill, (int)l1->data - 1);
l1 = l1->link;
}
}
else if (s->mode == i_ind)
{
BYTE *t4;
ptr = findPointer(list->ans);
if (ptr < pointer_count)
{
t4 = temparray4 + ptr * sourcebytes;
if (isset(t4, 0))
{
memset(l->p_akill, 0xff,
avail_bytes);
memset(l->p_agen, 0, avail_bytes);
}
else
{
for (k = 1; k < source_count; k++)
{
if (isset(t4, k))
{
SYM *sp = varsp
(sourcearray[k]
->dc.left->offset);
if (sp)
{
l1 = findans(availhash,
sp->imvalue);
while (l1)
{
clearbit(l->p_agen,
(int)l1->data -
1);
setbit(l->p_akill,
(int)l1->data -
1);
gencount++;
l1 = l1->link;
}
}
if (sourcearray[k]
->dc.right)
{
sp = varsp
(sourcearray[k]
->dc.right->offset);
if (sp)
{
l1 = findans
(availhash, sp
->imvalue);
while (l1)
{
clearbit(l
->p_agen,
(int)l1
->data - 1);
setbit(l
->p_akill,
(int)l1
->data - 1);
gencount++;
l1 = l1->link;
}
}
}
}
}
}
}
}
}
}
}
}
if (!skipptr)
ptrindex(list, l, temparray4);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -