new hlt block terminator
It is handy to express when the end of a block cannot be reached. If a hlt terminator is executed, it traps the program. We don't go the llvm way and specify execution semantics as undefined behavior.
This commit is contained in:
parent
b5da3f3d64
commit
9126afa2da
9 changed files with 30 additions and 13 deletions
|
@ -561,6 +561,9 @@ arm64_emitfn(Fn *fn, FILE *out)
|
|||
emitins(i, e);
|
||||
lbl = 1;
|
||||
switch (b->jmp.type) {
|
||||
case Jhlt:
|
||||
fprintf(e->f, "\tbrk\t#1000\n");
|
||||
break;
|
||||
case Jret0:
|
||||
s = (e->frame - e->padding) / 4;
|
||||
for (r=arm64_rclob; *r>=0; r++)
|
||||
|
|
13
arm64/isel.c
13
arm64/isel.c
|
@ -239,16 +239,11 @@ seljmp(Blk *b, Fn *fn)
|
|||
Ins *i, *ir;
|
||||
int ck, cc, use;
|
||||
|
||||
switch (b->jmp.type) {
|
||||
default:
|
||||
assert(0 && "TODO 2");
|
||||
break;
|
||||
case Jret0:
|
||||
case Jjmp:
|
||||
if (b->jmp.type == Jret0
|
||||
|| b->jmp.type == Jjmp
|
||||
|| b->jmp.type == Jhlt)
|
||||
return;
|
||||
case Jjnz:
|
||||
break;
|
||||
}
|
||||
assert(b->jmp.type == Jjnz);
|
||||
r = b->jmp.arg;
|
||||
use = -1;
|
||||
b->jmp.arg = R;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue