making the aliasing analisys bit smarter
This commit is contained in:
parent
bbd7e12af4
commit
be2d38a6d2
|
@ -9,7 +9,7 @@ use {
|
||||||
idfl::{self},
|
idfl::{self},
|
||||||
CtorField, Expr, FileId, Pos,
|
CtorField, Expr, FileId, Pos,
|
||||||
},
|
},
|
||||||
reg, task,
|
task,
|
||||||
ty::{self, Arg, ArrayLen, Loc, Tuple},
|
ty::{self, Arg, ArrayLen, Loc, Tuple},
|
||||||
vc::{BitSet, Vc},
|
vc::{BitSet, Vc},
|
||||||
FTask, Func, Global, Ident, Offset, OffsetIter, Reloc, Sig, StringRef, SymKey, TypeParser,
|
FTask, Func, Global, Ident, Offset, OffsetIter, Reloc, Sig, StringRef, SymKey, TypeParser,
|
||||||
|
@ -857,7 +857,7 @@ impl Nodes {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
K::Stre => {
|
K::Stre => {
|
||||||
if self[target].inputs[2] != VOID
|
if self[target].inputs[1] != VOID
|
||||||
&& self[target].inputs.len() == 4
|
&& self[target].inputs.len() == 4
|
||||||
&& self[self[target].inputs[1]].kind != Kind::Load
|
&& self[self[target].inputs[1]].kind != Kind::Load
|
||||||
&& self[self[target].inputs[3]].kind == Kind::Stre
|
&& self[self[target].inputs[3]].kind == Kind::Stre
|
||||||
|
@ -1312,6 +1312,9 @@ impl Nodes {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// self[first_store].lock_rc = u16::MAX - 1;
|
||||||
|
// self[last_store].lock_rc = u16::MAX - 1;
|
||||||
|
|
||||||
let prev_store = self[dst].inputs[3];
|
let prev_store = self[dst].inputs[3];
|
||||||
if prev_store != MEM && first_store != MEM {
|
if prev_store != MEM && first_store != MEM {
|
||||||
self.modify_input(first_store, 3, prev_store);
|
self.modify_input(first_store, 3, prev_store);
|
||||||
|
@ -1973,6 +1976,13 @@ impl<'a> Codegen<'a> {
|
||||||
.collect();
|
.collect();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn new_stack(&mut self, ty: ty::Id) -> Nid {
|
||||||
|
let stck = self.ci.nodes.new_node_nop(ty, Kind::Stck, [VOID, MEM]);
|
||||||
|
self.ci.nodes[stck].aclass = self.ci.scope.aclasses.len();
|
||||||
|
self.ci.scope.aclasses.push(AClass::new(&mut self.ci.nodes));
|
||||||
|
stck
|
||||||
|
}
|
||||||
|
|
||||||
fn store_mem(&mut self, region: Nid, ty: ty::Id, value: Nid) -> Nid {
|
fn store_mem(&mut self, region: Nid, ty: ty::Id, value: Nid) -> Nid {
|
||||||
if value == NEVER {
|
if value == NEVER {
|
||||||
return NEVER;
|
return NEVER;
|
||||||
|
@ -2029,7 +2039,11 @@ impl<'a> Codegen<'a> {
|
||||||
pub fn aclass_index(&mut self, mut region: Nid) -> usize {
|
pub fn aclass_index(&mut self, mut region: Nid) -> usize {
|
||||||
loop {
|
loop {
|
||||||
region = match self.ci.nodes[region].kind {
|
region = match self.ci.nodes[region].kind {
|
||||||
Kind::BinOp { op: TokenKind::Add | TokenKind::Sub } | Kind::Phi => {
|
Kind::BinOp { op: TokenKind::Add | TokenKind::Sub } => {
|
||||||
|
self.ci.nodes[region].inputs[1]
|
||||||
|
}
|
||||||
|
Kind::Phi => {
|
||||||
|
debug_assert_eq!(self.ci.nodes[region].inputs[2], 0);
|
||||||
self.ci.nodes[region].inputs[1]
|
self.ci.nodes[region].inputs[1]
|
||||||
}
|
}
|
||||||
_ => break self.ci.nodes[region].aclass,
|
_ => break self.ci.nodes[region].aclass,
|
||||||
|
@ -2099,8 +2113,7 @@ impl<'a> Codegen<'a> {
|
||||||
inference!(ty, ctx, self, pos, "value", "@as(<ty>, idk)");
|
inference!(ty, ctx, self, pos, "value", "@as(<ty>, idk)");
|
||||||
|
|
||||||
if matches!(ty.expand(), ty::Kind::Struct(_) | ty::Kind::Slice(_)) {
|
if matches!(ty.expand(), ty::Kind::Struct(_) | ty::Kind::Slice(_)) {
|
||||||
let stck = self.ci.nodes.new_node(ty, Kind::Stck, [VOID, MEM]);
|
Some(Value::ptr(self.new_stack(ty)).ty(ty))
|
||||||
Some(Value::ptr(stck).ty(ty))
|
|
||||||
} else {
|
} else {
|
||||||
self.report(
|
self.report(
|
||||||
pos,
|
pos,
|
||||||
|
@ -2127,7 +2140,7 @@ impl<'a> Codegen<'a> {
|
||||||
if let Some(index) = self.ci.scope.vars.iter().rposition(|v| v.id == id) =>
|
if let Some(index) = self.ci.scope.vars.iter().rposition(|v| v.id == id) =>
|
||||||
{
|
{
|
||||||
let var = &mut self.ci.scope.vars[index];
|
let var = &mut self.ci.scope.vars[index];
|
||||||
self.ci.nodes.load_loop_var(index + 1, var, &mut self.ci.loops);
|
self.ci.nodes.load_loop_var(index, var, &mut self.ci.loops);
|
||||||
|
|
||||||
Some(Value::var(index).ty(var.ty))
|
Some(Value::var(index).ty(var.ty))
|
||||||
}
|
}
|
||||||
|
@ -2290,7 +2303,7 @@ impl<'a> Codegen<'a> {
|
||||||
return Some(val);
|
return Some(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
let stack = self.ci.nodes.new_node_nop(val.ty, Kind::Stck, [VOID, MEM]);
|
let stack = self.new_stack(val.ty);
|
||||||
self.store_mem(stack, val.ty, val.id);
|
self.store_mem(stack, val.ty, val.id);
|
||||||
|
|
||||||
Some(Value::new(stack).ty(self.tys.make_ptr(val.ty)))
|
Some(Value::new(stack).ty(self.tys.make_ptr(val.ty)))
|
||||||
|
@ -2322,7 +2335,7 @@ impl<'a> Codegen<'a> {
|
||||||
let mut right = self.expr(right)?;
|
let mut right = self.expr(right)?;
|
||||||
|
|
||||||
if right.ty.loc(self.tys) == Loc::Stack {
|
if right.ty.loc(self.tys) == Loc::Stack {
|
||||||
let stck = self.ci.nodes.new_node_nop(right.ty, Kind::Stck, [VOID, MEM]);
|
let stck = self.new_stack(right.ty);
|
||||||
self.store_mem(stck, right.ty, right.id);
|
self.store_mem(stck, right.ty, right.id);
|
||||||
right.id = stck;
|
right.id = stck;
|
||||||
right.ptr = true;
|
right.ptr = true;
|
||||||
|
@ -2379,7 +2392,7 @@ impl<'a> Codegen<'a> {
|
||||||
let mut rhs = rhs?;
|
let mut rhs = rhs?;
|
||||||
self.strip_var(&mut rhs);
|
self.strip_var(&mut rhs);
|
||||||
self.assert_ty(pos, &mut rhs, lhs.ty, "struct operand");
|
self.assert_ty(pos, &mut rhs, lhs.ty, "struct operand");
|
||||||
let dst = self.ci.nodes.new_node(lhs.ty, Kind::Stck, [VOID, MEM]);
|
let dst = self.new_stack(lhs.ty);
|
||||||
self.struct_op(left.pos(), op, s, dst, lhs.id, rhs.id);
|
self.struct_op(left.pos(), op, s, dst, lhs.id, rhs.id);
|
||||||
Some(Value::ptr(dst).ty(lhs.ty))
|
Some(Value::ptr(dst).ty(lhs.ty))
|
||||||
}
|
}
|
||||||
|
@ -2468,7 +2481,7 @@ impl<'a> Codegen<'a> {
|
||||||
match ty.loc(self.tys) {
|
match ty.loc(self.tys) {
|
||||||
Loc::Reg if mem::take(&mut val.ptr) => val.id = self.load_mem(val.id, ty),
|
Loc::Reg if mem::take(&mut val.ptr) => val.id = self.load_mem(val.id, ty),
|
||||||
Loc::Stack if !val.ptr => {
|
Loc::Stack if !val.ptr => {
|
||||||
let stack = self.ci.nodes.new_node_nop(ty, Kind::Stck, [VOID, MEM]);
|
let stack = self.new_stack(ty);
|
||||||
self.store_mem(stack, val.ty, val.id);
|
self.store_mem(stack, val.ty, val.id);
|
||||||
val.id = stack;
|
val.id = stack;
|
||||||
val.ptr = true;
|
val.ptr = true;
|
||||||
|
@ -2525,7 +2538,6 @@ impl<'a> Codegen<'a> {
|
||||||
|
|
||||||
let mut inps = Vc::from([NEVER]);
|
let mut inps = Vc::from([NEVER]);
|
||||||
let arg_base = self.tys.tmp.args.len();
|
let arg_base = self.tys.tmp.args.len();
|
||||||
let mut has_ptr_arg = false;
|
|
||||||
let mut clobbered_aliases = vec![];
|
let mut clobbered_aliases = vec![];
|
||||||
for arg in args {
|
for arg in args {
|
||||||
let value = self.expr(arg)?;
|
let value = self.expr(arg)?;
|
||||||
|
@ -2568,7 +2580,7 @@ impl<'a> Codegen<'a> {
|
||||||
let alt_value = match ty.loc(self.tys) {
|
let alt_value = match ty.loc(self.tys) {
|
||||||
Loc::Reg => None,
|
Loc::Reg => None,
|
||||||
Loc::Stack => {
|
Loc::Stack => {
|
||||||
let stck = self.ci.nodes.new_node_nop(ty, Kind::Stck, [VOID, MEM]);
|
let stck = self.new_stack(ty);
|
||||||
inps.push(stck);
|
inps.push(stck);
|
||||||
Some(Value::ptr(stck).ty(ty))
|
Some(Value::ptr(stck).ty(ty))
|
||||||
}
|
}
|
||||||
|
@ -2580,6 +2592,14 @@ impl<'a> Codegen<'a> {
|
||||||
&mut self.ci.nodes,
|
&mut self.ci.nodes,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
for &clobbered in clobbered_aliases.iter() {
|
||||||
|
if clobbered == 0 {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let aclass = self.ci.scope.aclasses[clobbered].last_store.get();
|
||||||
|
self.store_mem(self.ci.nodes[aclass].inputs[2], ty::Id::VOID, VOID);
|
||||||
|
}
|
||||||
|
|
||||||
alt_value.or(Some(Value::new(self.ci.ctrl.get()).ty(ty)))
|
alt_value.or(Some(Value::new(self.ci.ctrl.get()).ty(ty)))
|
||||||
}
|
}
|
||||||
Expr::Call { func, args, .. } => {
|
Expr::Call { func, args, .. } => {
|
||||||
|
@ -2618,7 +2638,6 @@ impl<'a> Codegen<'a> {
|
||||||
let mut tys = sig.args.args();
|
let mut tys = sig.args.args();
|
||||||
let mut cargs = cargs.iter();
|
let mut cargs = cargs.iter();
|
||||||
let mut args = args.iter();
|
let mut args = args.iter();
|
||||||
let mut has_ptr_arg = false;
|
|
||||||
let mut clobbered_aliases = vec![];
|
let mut clobbered_aliases = vec![];
|
||||||
while let Some(ty) = tys.next(self.tys) {
|
while let Some(ty) = tys.next(self.tys) {
|
||||||
let carg = cargs.next().unwrap();
|
let carg = cargs.next().unwrap();
|
||||||
|
@ -2665,7 +2684,7 @@ impl<'a> Codegen<'a> {
|
||||||
let alt_value = match sig.ret.loc(self.tys) {
|
let alt_value = match sig.ret.loc(self.tys) {
|
||||||
Loc::Reg => None,
|
Loc::Reg => None,
|
||||||
Loc::Stack => {
|
Loc::Stack => {
|
||||||
let stck = self.ci.nodes.new_node_nop(sig.ret, Kind::Stck, [VOID, MEM]);
|
let stck = self.new_stack(sig.ret);
|
||||||
inps.push(stck);
|
inps.push(stck);
|
||||||
Some(Value::ptr(stck).ty(sig.ret))
|
Some(Value::ptr(stck).ty(sig.ret))
|
||||||
}
|
}
|
||||||
|
@ -2677,6 +2696,14 @@ impl<'a> Codegen<'a> {
|
||||||
&mut self.ci.nodes,
|
&mut self.ci.nodes,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
for &clobbered in clobbered_aliases.iter() {
|
||||||
|
if clobbered == 0 {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let aclass = self.ci.scope.aclasses[clobbered].last_store.get();
|
||||||
|
self.store_mem(self.ci.nodes[aclass].inputs[2], ty::Id::VOID, VOID);
|
||||||
|
}
|
||||||
|
|
||||||
alt_value.or(Some(Value::new(self.ci.ctrl.get()).ty(sig.ret)))
|
alt_value.or(Some(Value::new(self.ci.ctrl.get()).ty(sig.ret)))
|
||||||
}
|
}
|
||||||
Expr::Directive { name: "inline", args: [func, args @ ..], .. } => {
|
Expr::Directive { name: "inline", args: [func, args @ ..], .. } => {
|
||||||
|
@ -2794,7 +2821,7 @@ impl<'a> Codegen<'a> {
|
||||||
|
|
||||||
match sty.expand() {
|
match sty.expand() {
|
||||||
ty::Kind::Struct(s) => {
|
ty::Kind::Struct(s) => {
|
||||||
let mem = self.ci.nodes.new_node(sty, Kind::Stck, [VOID, MEM]);
|
let mem = self.new_stack(sty);
|
||||||
let mut offs = OffsetIter::new(s, self.tys);
|
let mut offs = OffsetIter::new(s, self.tys);
|
||||||
for field in fields {
|
for field in fields {
|
||||||
let Some((ty, offset)) = offs.next_ty(self.tys) else {
|
let Some((ty, offset)) = offs.next_ty(self.tys) else {
|
||||||
|
@ -2848,7 +2875,7 @@ impl<'a> Codegen<'a> {
|
||||||
return Value::NEVER;
|
return Value::NEVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mem = self.ci.nodes.new_node(aty, Kind::Stck, [VOID, MEM]);
|
let mem = self.new_stack(aty);
|
||||||
|
|
||||||
for (field, offset) in
|
for (field, offset) in
|
||||||
fields.iter().zip((0u32..).step_by(elem_size as usize))
|
fields.iter().zip((0u32..).step_by(elem_size as usize))
|
||||||
|
@ -2901,7 +2928,7 @@ impl<'a> Codegen<'a> {
|
||||||
.into_iter(self.tys)
|
.into_iter(self.tys)
|
||||||
.map(|(f, o)| (f.ty, o))
|
.map(|(f, o)| (f.ty, o))
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
let mem = self.ci.nodes.new_node(sty, Kind::Stck, [VOID, MEM]);
|
let mem = self.new_stack(sty);
|
||||||
for field in fields {
|
for field in fields {
|
||||||
let Some(index) = self.tys.find_struct_field(s, field.name) else {
|
let Some(index) = self.tys.find_struct_field(s, field.name) else {
|
||||||
self.report(
|
self.report(
|
||||||
|
@ -3514,6 +3541,10 @@ impl<'a> Codegen<'a> {
|
||||||
value,
|
value,
|
||||||
&mut self.ci.nodes,
|
&mut self.ci.nodes,
|
||||||
));
|
));
|
||||||
|
if ty.loc(self.tys) == Loc::Stack {
|
||||||
|
self.ci.nodes[value].aclass = self.ci.scope.aclasses.len();
|
||||||
|
self.ci.scope.aclasses.push(AClass::new(&mut self.ci.nodes));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -423,7 +423,7 @@ impl ItemCtx {
|
||||||
self.emit(instrs::ld(atr(allocs[0]), base, offset as _, size as _));
|
self.emit(instrs::ld(atr(allocs[0]), base, offset as _, size as _));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Kind::Stre if node.inputs[2] == VOID => {}
|
Kind::Stre if node.inputs[1] == VOID => {}
|
||||||
Kind::Stre => {
|
Kind::Stre => {
|
||||||
let mut region = node.inputs[2];
|
let mut region = node.inputs[2];
|
||||||
let mut offset = 0;
|
let mut offset = 0;
|
||||||
|
@ -987,7 +987,7 @@ impl<'a> Function<'a> {
|
||||||
};
|
};
|
||||||
self.add_instr(nid, ops);
|
self.add_instr(nid, ops);
|
||||||
}
|
}
|
||||||
Kind::Stre if node.inputs[2] == VOID => self.nodes.lock(nid),
|
Kind::Stre if node.inputs[1] == VOID => self.nodes.lock(nid),
|
||||||
Kind::Stre => {
|
Kind::Stre => {
|
||||||
let mut region = node.inputs[2];
|
let mut region = node.inputs[2];
|
||||||
if self.nodes[region].kind == (Kind::BinOp { op: TokenKind::Add })
|
if self.nodes[region].kind == (Kind::BinOp { op: TokenKind::Add })
|
||||||
|
|
|
@ -1,44 +1,42 @@
|
||||||
main:
|
main:
|
||||||
ADDI64 r254, r254, -40d
|
ADDI64 r254, r254, -32d
|
||||||
LI64 r6, 4d
|
LI64 r6, 1d
|
||||||
LI64 r7, 1d
|
LI64 r7, 4d
|
||||||
LI64 r4, 0d
|
LI64 r4, 0d
|
||||||
ADDI64 r5, r254, 0d
|
ADDI64 r5, r254, 0d
|
||||||
CP r8, r4
|
CP r8, r4
|
||||||
6: JNE r8, r6, :0
|
6: JNE r8, r7, :0
|
||||||
LI64 r6, 2d
|
LI64 r7, 2d
|
||||||
ADDI64 r1, r254, 32d
|
|
||||||
CP r8, r4
|
CP r8, r4
|
||||||
4: JNE r8, r7, :1
|
4: JNE r8, r6, :1
|
||||||
LD r1, r254, 0a, 8h
|
LD r1, r254, 0a, 8h
|
||||||
JMP :2
|
JMP :2
|
||||||
1: MUL64 r11, r8, r6
|
1: MUL64 r10, r8, r7
|
||||||
ADD64 r8, r8, r7
|
ADD64 r8, r8, r6
|
||||||
SUB64 r9, r6, r8
|
SUB64 r3, r7, r8
|
||||||
MUL64 r9, r9, r6
|
MUL64 r9, r3, r7
|
||||||
CP r2, r4
|
CP r2, r4
|
||||||
5: JNE r2, r6, :3
|
5: JNE r2, r7, :3
|
||||||
JMP :4
|
JMP :4
|
||||||
3: ADD64 r3, r2, r7
|
3: ADD64 r1, r2, r6
|
||||||
ADD64 r10, r11, r2
|
ADD64 r11, r10, r2
|
||||||
MULI64 r10, r10, 8d
|
ADD64 r12, r9, r2
|
||||||
ADD64 r2, r9, r2
|
MULI64 r2, r11, 8d
|
||||||
ADD64 r10, r5, r10
|
MULI64 r12, r12, 8d
|
||||||
MULI64 r12, r2, 8d
|
ADD64 r11, r5, r2
|
||||||
ADD64 r12, r5, r12
|
ADD64 r12, r5, r12
|
||||||
BMC r10, r1, 8h
|
BMC r12, r11, 8h
|
||||||
BMC r12, r10, 8h
|
BMC r11, r12, 8h
|
||||||
BMC r1, r12, 8h
|
CP r2, r1
|
||||||
CP r2, r3
|
|
||||||
JMP :5
|
JMP :5
|
||||||
0: ADD64 r1, r8, r7
|
0: ADD64 r11, r8, r6
|
||||||
MULI64 r12, r8, 8d
|
MULI64 r10, r8, 8d
|
||||||
ADD64 r9, r5, r12
|
ADD64 r9, r5, r10
|
||||||
ST r8, r9, 0a, 8h
|
ST r8, r9, 0a, 8h
|
||||||
CP r8, r1
|
CP r8, r11
|
||||||
JMP :6
|
JMP :6
|
||||||
2: ADDI64 r254, r254, 40d
|
2: ADDI64 r254, r254, 32d
|
||||||
JALA r0, r31, 0a
|
JALA r0, r31, 0a
|
||||||
code size: 271
|
code size: 255
|
||||||
ret: 2
|
ret: 2
|
||||||
status: Ok(())
|
status: Ok(())
|
||||||
|
|
|
@ -1,113 +1,99 @@
|
||||||
main:
|
main:
|
||||||
ADDI64 r254, r254, -168d
|
ADDI64 r254, r254, -152d
|
||||||
LI8 r1, 0b
|
LI8 r1, 0b
|
||||||
|
LI8 r3, 1b
|
||||||
ST r1, r254, 148a, 1h
|
ST r1, r254, 148a, 1h
|
||||||
|
ST r3, r254, 144a, 1h
|
||||||
ST r1, r254, 149a, 1h
|
ST r1, r254, 149a, 1h
|
||||||
|
ST r3, r254, 145a, 1h
|
||||||
ST r1, r254, 150a, 1h
|
ST r1, r254, 150a, 1h
|
||||||
|
ST r3, r254, 146a, 1h
|
||||||
ST r1, r254, 151a, 1h
|
ST r1, r254, 151a, 1h
|
||||||
LI8 r7, 1b
|
ST r3, r254, 147a, 1h
|
||||||
ST r7, r254, 144a, 1h
|
LD r1, r254, 148a, 1h
|
||||||
ST r7, r254, 145a, 1h
|
LD r4, r254, 144a, 1h
|
||||||
ST r7, r254, 146a, 1h
|
ADD8 r5, r4, r1
|
||||||
ST r7, r254, 147a, 1h
|
LD r8, r254, 145a, 1h
|
||||||
LD r2, r254, 144a, 1h
|
LD r9, r254, 149a, 1h
|
||||||
LD r3, r254, 148a, 1h
|
|
||||||
ADD8 r5, r2, r3
|
|
||||||
ST r5, r254, 148a, 1h
|
ST r5, r254, 148a, 1h
|
||||||
LD r9, r254, 145a, 1h
|
ADD8 r12, r9, r8
|
||||||
LD r10, r254, 149a, 1h
|
|
||||||
ADD8 r12, r10, r9
|
|
||||||
ST r12, r254, 149a, 1h
|
|
||||||
LD r4, r254, 146a, 1h
|
LD r4, r254, 146a, 1h
|
||||||
LD r5, r254, 150a, 1h
|
LD r5, r254, 150a, 1h
|
||||||
|
ST r12, r254, 149a, 1h
|
||||||
ADD8 r7, r5, r4
|
ADD8 r7, r5, r4
|
||||||
ST r7, r254, 150a, 1h
|
ST r7, r254, 150a, 1h
|
||||||
LD r11, r254, 147a, 1h
|
ST r3, r254, 151a, 1h
|
||||||
LD r12, r254, 151a, 1h
|
LD r12, r254, 149a, 1h
|
||||||
ADD8 r2, r12, r11
|
LD r1, r254, 150a, 1h
|
||||||
ST r2, r254, 151a, 1h
|
ADD8 r4, r1, r12
|
||||||
LD r6, r254, 149a, 1h
|
LD r5, r254, 148a, 1h
|
||||||
LD r7, r254, 150a, 1h
|
ADD8 r7, r5, r4
|
||||||
ADD8 r9, r7, r6
|
LI8 r9, 4b
|
||||||
LD r11, r254, 148a, 1h
|
ADD8 r1, r7, r3
|
||||||
ADD8 r1, r11, r9
|
ANDI r1, r1, 255d
|
||||||
LI8 r3, 4b
|
ANDI r9, r9, 255d
|
||||||
ADD8 r6, r1, r2
|
JEQ r1, r9, :0
|
||||||
ANDI r6, r6, 255d
|
|
||||||
ANDI r3, r3, 255d
|
|
||||||
JEQ r6, r3, :0
|
|
||||||
LI64 r1, 1008d
|
LI64 r1, 1008d
|
||||||
JMP :1
|
JMP :1
|
||||||
0: LI64 r10, 1d
|
0: LI64 r6, 1d
|
||||||
ADDI64 r1, r254, 80d
|
ADDI64 r5, r254, 112d
|
||||||
ST r10, r254, 80a, 8h
|
ST r6, r254, 112a, 8h
|
||||||
LI64 r2, 2d
|
LI64 r9, 2d
|
||||||
ST r2, r254, 88a, 8h
|
ST r9, r254, 120a, 8h
|
||||||
LI64 r6, 3d
|
LI64 r2, 3d
|
||||||
ST r6, r254, 32a, 8h
|
ADDI64 r1, r254, 96d
|
||||||
LI64 r9, 4d
|
|
||||||
ST r9, r254, 40a, 8h
|
|
||||||
LD r3, r254, 32a, 8h
|
|
||||||
LD r4, r254, 80a, 8h
|
|
||||||
ADDI64 r2, r254, 0d
|
|
||||||
ADD64 r6, r3, r4
|
|
||||||
ST r6, r254, 0a, 8h
|
|
||||||
LD r10, r254, 40a, 8h
|
|
||||||
LD r11, r254, 88a, 8h
|
|
||||||
ADD64 r3, r10, r11
|
|
||||||
ST r3, r254, 8a, 8h
|
|
||||||
LD r5, r254, 80a, 8h
|
|
||||||
LD r6, r254, 32a, 8h
|
|
||||||
SUB64 r8, r6, r5
|
|
||||||
ST r8, r254, 16a, 8h
|
|
||||||
LD r12, r254, 88a, 8h
|
|
||||||
LD r3, r254, 40a, 8h
|
|
||||||
SUB64 r3, r3, r12
|
|
||||||
ST r3, r254, 24a, 8h
|
|
||||||
ADDI64 r6, r254, 112d
|
|
||||||
BMC r2, r6, 32h
|
|
||||||
LI64 r9, 0d
|
|
||||||
ST r9, r254, 96a, 8h
|
|
||||||
ST r9, r254, 104a, 8h
|
|
||||||
LD r2, r254, 32a, 8h
|
|
||||||
LD r3, r254, 96a, 8h
|
|
||||||
ADDI64 r9, r254, 48d
|
|
||||||
SUB64 r6, r3, r2
|
|
||||||
ST r6, r254, 48a, 8h
|
|
||||||
LD r10, r254, 40a, 8h
|
|
||||||
LD r11, r254, 104a, 8h
|
|
||||||
SUB64 r2, r11, r10
|
|
||||||
ST r2, r254, 56a, 8h
|
|
||||||
ADDI64 r11, r9, 16d
|
|
||||||
BMC r1, r11, 16h
|
|
||||||
LD r8, r254, 112a, 8h
|
|
||||||
LD r9, r254, 48a, 8h
|
|
||||||
ADD64 r11, r9, r8
|
|
||||||
ST r11, r254, 48a, 8h
|
|
||||||
LD r3, r254, 120a, 8h
|
|
||||||
LD r4, r254, 56a, 8h
|
|
||||||
ADD64 r6, r3, r4
|
|
||||||
ST r6, r254, 56a, 8h
|
|
||||||
LD r11, r254, 128a, 8h
|
|
||||||
LD r12, r254, 64a, 8h
|
|
||||||
ADD64 r2, r11, r12
|
|
||||||
ST r2, r254, 64a, 8h
|
ST r2, r254, 64a, 8h
|
||||||
LD r6, r254, 136a, 8h
|
LI64 r6, 4d
|
||||||
LD r7, r254, 72a, 8h
|
LI64 r2, 0d
|
||||||
ADD64 r9, r6, r7
|
BMC r5, r1, 16h
|
||||||
ST r9, r254, 72a, 8h
|
ST r6, r254, 72a, 8h
|
||||||
|
ST r2, r254, 80a, 8h
|
||||||
|
LD r11, r254, 96a, 8h
|
||||||
LD r1, r254, 64a, 8h
|
LD r1, r254, 64a, 8h
|
||||||
LD r2, r254, 48a, 8h
|
ST r2, r254, 88a, 8h
|
||||||
ADD64 r4, r1, r2
|
ADD64 r4, r1, r11
|
||||||
ST r4, r254, 152a, 8h
|
LD r7, r254, 104a, 8h
|
||||||
LD r8, r254, 72a, 8h
|
LD r2, r254, 80a, 8h
|
||||||
LD r9, r254, 56a, 8h
|
ST r4, r254, 32a, 8h
|
||||||
ADD64 r11, r8, r9
|
ADD64 r12, r7, r6
|
||||||
ST r11, r254, 160a, 8h
|
SUB64 r3, r2, r1
|
||||||
LD r2, r254, 152a, 8h
|
ADDI64 r8, r254, 0d
|
||||||
ADD64 r1, r2, r11
|
ST r12, r254, 40a, 8h
|
||||||
1: ADDI64 r254, r254, 168d
|
SUB64 r2, r1, r11
|
||||||
|
ST r3, r254, 0a, 8h
|
||||||
|
LI64 r9, -4d
|
||||||
|
ST r2, r254, 48a, 8h
|
||||||
|
SUB64 r7, r6, r7
|
||||||
|
ST r9, r254, 8a, 8h
|
||||||
|
ADDI64 r8, r8, 16d
|
||||||
|
ST r7, r254, 56a, 8h
|
||||||
|
BMC r5, r8, 16h
|
||||||
|
LD r6, r254, 32a, 8h
|
||||||
|
LD r8, r254, 0a, 8h
|
||||||
|
ADD64 r9, r8, r6
|
||||||
|
LD r11, r254, 8a, 8h
|
||||||
|
LD r1, r254, 40a, 8h
|
||||||
|
ST r9, r254, 0a, 8h
|
||||||
|
ADD64 r4, r1, r11
|
||||||
|
LD r8, r254, 16a, 8h
|
||||||
|
LD r9, r254, 48a, 8h
|
||||||
|
ST r4, r254, 8a, 8h
|
||||||
|
ADD64 r12, r9, r8
|
||||||
|
LD r2, r254, 24a, 8h
|
||||||
|
ST r12, r254, 16a, 8h
|
||||||
|
ADD64 r12, r2, r7
|
||||||
|
ST r12, r254, 24a, 8h
|
||||||
|
LD r7, r254, 0a, 8h
|
||||||
|
LD r9, r254, 16a, 8h
|
||||||
|
ADD64 r11, r9, r7
|
||||||
|
LD r1, r254, 8a, 8h
|
||||||
|
ST r11, r254, 128a, 8h
|
||||||
|
ADD64 r6, r1, r12
|
||||||
|
ST r6, r254, 136a, 8h
|
||||||
|
LD r7, r254, 128a, 8h
|
||||||
|
ADD64 r1, r7, r6
|
||||||
|
1: ADDI64 r254, r254, 152d
|
||||||
JALA r0, r31, 0a
|
JALA r0, r31, 0a
|
||||||
code size: 1145
|
code size: 980
|
||||||
ret: 10
|
ret: 10
|
||||||
status: Ok(())
|
status: Ok(())
|
||||||
|
|
|
@ -6,13 +6,13 @@ main:
|
||||||
ST r2, r254, 32a, 8h
|
ST r2, r254, 32a, 8h
|
||||||
LI64 r33, 3d
|
LI64 r33, 3d
|
||||||
ST r33, r254, 40a, 8h
|
ST r33, r254, 40a, 8h
|
||||||
ADDI64 r34, r254, 16d
|
ADDI64 r34, r254, 0d
|
||||||
LD r3, r32, 0a, 16h
|
LD r3, r32, 0a, 16h
|
||||||
JAL r31, r0, :odher_pass
|
JAL r31, r0, :odher_pass
|
||||||
ST r1, r254, 16a, 16h
|
ST r1, r254, 0a, 16h
|
||||||
ADDI64 r11, r254, 0d
|
ADDI64 r11, r254, 16d
|
||||||
BMC r32, r11, 16h
|
BMC r32, r11, 16h
|
||||||
LD r4, r254, 24a, 8h
|
LD r4, r254, 8a, 8h
|
||||||
JNE r4, r33, :0
|
JNE r4, r33, :0
|
||||||
CP r2, r34
|
CP r2, r34
|
||||||
JAL r31, r0, :pass
|
JAL r31, r0, :pass
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
main:
|
main:
|
||||||
ADDI64 r254, r254, -10240d
|
ADDI64 r254, r254, -10240d
|
||||||
LI8 r6, 64b
|
LI8 r6, 64b
|
||||||
LI64 r7, 1024d
|
LI64 r7, 1d
|
||||||
LI64 r8, 1d
|
LI64 r8, 1024d
|
||||||
LI64 r9, 0d
|
LI64 r9, 0d
|
||||||
ADDI64 r5, r254, 0d
|
ADDI64 r5, r254, 0d
|
||||||
4: JLTU r9, r7, :0
|
4: JLTU r9, r8, :0
|
||||||
LI64 r4, 10d
|
LI64 r4, 10d
|
||||||
CP r6, r8
|
CP r6, r7
|
||||||
3: JLTU r6, r4, :1
|
3: JLTU r6, r4, :1
|
||||||
LD r10, r254, 2048a, 1h
|
LD r10, r254, 2048a, 1h
|
||||||
ANDI r1, r10, 255d
|
ANDI r1, r10, 255d
|
||||||
JMP :2
|
JMP :2
|
||||||
1: ADD64 r12, r6, r8
|
1: ADD64 r12, r6, r7
|
||||||
MULI64 r1, r6, 1024d
|
MULI64 r1, r6, 1024d
|
||||||
ADD64 r6, r5, r1
|
ADD64 r6, r5, r1
|
||||||
BMC r5, r6, 1024h
|
BMC r5, r6, 1024h
|
||||||
CP r6, r12
|
CP r6, r12
|
||||||
JMP :3
|
JMP :3
|
||||||
0: ADD64 r1, r9, r8
|
0: ADD64 r1, r9, r7
|
||||||
ADD64 r10, r5, r9
|
ADD64 r10, r5, r9
|
||||||
ST r6, r10, 0a, 1h
|
ST r6, r10, 0a, 1h
|
||||||
CP r9, r1
|
CP r9, r1
|
||||||
|
|
|
@ -16,28 +16,28 @@ main:
|
||||||
maina:
|
maina:
|
||||||
ADDI64 r254, r254, -44d
|
ADDI64 r254, r254, -44d
|
||||||
ST r31, r254, 36a, 8h
|
ST r31, r254, 36a, 8h
|
||||||
ADDI64 r6, r254, 16d
|
ADDI64 r6, r254, 32d
|
||||||
JAL r31, r0, :small_struct
|
JAL r31, r0, :small_struct
|
||||||
ST r1, r254, 16a, 4h
|
ST r1, r254, 32a, 4h
|
||||||
LI8 r11, 0b
|
LI8 r11, 0b
|
||||||
ADDI64 r10, r254, 0d
|
ADDI64 r10, r254, 24d
|
||||||
ST r11, r254, 0a, 1h
|
ST r11, r254, 24a, 1h
|
||||||
ST r11, r254, 1a, 1h
|
ST r11, r254, 25a, 1h
|
||||||
ST r11, r254, 2a, 1h
|
ST r11, r254, 26a, 1h
|
||||||
LI8 r4, 3b
|
LI8 r4, 3b
|
||||||
ST r4, r254, 3a, 1h
|
ST r4, r254, 27a, 1h
|
||||||
LI8 r7, 1b
|
LI8 r7, 1b
|
||||||
ST r7, r254, 4a, 1h
|
ST r7, r254, 28a, 1h
|
||||||
ST r11, r254, 5a, 1h
|
ST r11, r254, 29a, 1h
|
||||||
ST r11, r254, 6a, 1h
|
ST r11, r254, 30a, 1h
|
||||||
ST r11, r254, 7a, 1h
|
ST r11, r254, 31a, 1h
|
||||||
ADDI64 r1, r254, 8d
|
ADDI64 r2, r254, 0d
|
||||||
BMC r10, r1, 8h
|
BMC r10, r2, 8h
|
||||||
ADDI64 r4, r254, 20d
|
ADDI64 r5, r2, 8d
|
||||||
|
ADDI64 r4, r254, 16d
|
||||||
|
BMC r10, r5, 8h
|
||||||
BMC r10, r4, 8h
|
BMC r10, r4, 8h
|
||||||
ADDI64 r7, r4, 8d
|
LD r1, r2, 0a, 16h
|
||||||
BMC r1, r7, 8h
|
|
||||||
LD r1, r4, 0a, 16h
|
|
||||||
LD r31, r254, 36a, 8h
|
LD r31, r254, 36a, 8h
|
||||||
ADDI64 r254, r254, 44d
|
ADDI64 r254, r254, 44d
|
||||||
JALA r0, r31, 0a
|
JALA r0, r31, 0a
|
||||||
|
|
Loading…
Reference in a new issue