"not $a, $b";
"st $b, [$reg_sp+$i_str]";
}
+ free_reg(b);
+ free_reg(a);
}
else
arg_error ("com", n);
n= n % 32;
if (n)
{
- a= alloc_reg();
- pop_reg_as(a);
+ a= pop_reg();
b= alloc_reg();
c= alloc_reg();
sprint(n_str, "%d", n);
"sll $a, $n_str, $b";
sprint(n_str, "%d", 32-n);
"srl $a, $n_str, $c";
- "or $b, $c, $a";
- push_reg(a);
+ "or $b, $c, $c";
+ free_reg(a);
free_reg(b);
- free_reg(c);
+ push_reg(c);
}
}
}
else
{
- a= alloc_reg();
- pop_reg_as(a);
- b= alloc_reg();
- pop_reg_as(b);
+ a= pop_reg();
+ b= pop_reg();
c= alloc_reg();
d= alloc_reg();
"and $a, 31, $c";
- "mov 32, $a";
- "sub $a, $c, $d";
- "sll $b, $c, $a";
- "srl $b, $d, $c";
- "or $a, $c, $b";
+ "mov 32, $d";
+ "sub $d, $c, $d";
+ "sll $b, $c, $c";
+ "srl $b, $d, $d";
+ "or $c, $d, $d";
free_reg(a);
- push_reg(b);
+ free_reg(b);
free_reg(c);
- free_reg(d);
+ push_ref(d);
}
}.
default ==>
n= n % 32;
if (n)
{
- a= alloc_reg();
- pop_reg_as(a);
+ a= pop_reg();
b= alloc_reg();
c= alloc_reg();
sprint(n_str, "%d", n);
"srl $a, $n_str, $b";
sprint(n_str, "%d", 32-n);
"sll $a, $n_str, $c";
- "or $b, $c, $a";
- push_reg(a);
+ "or $b, $c, $c";
+ free_reg(a);
free_reg(b);
- free_reg(c);
+ push_reg(c);
}
}
}
else
{
- a= alloc_reg();
- pop_reg_as(a);
- b= alloc_reg();
- pop_reg_as(b);
+ a= pop_reg();
+ b= pop_reg();
c= alloc_reg();
d= alloc_reg();
"and $a, 31, $c";
- "mov 32, $a";
- "sub $a, $c, $d";
- "srl $b, $c, $a";
- "sll $b, $d, $c";
- "or $a, $c, $b";
+ "mov 32, $d";
+ "sub $d, $c, $d";
+ "srl $b, $c, $c";
+ "sll $b, $d, $d";
+ "or $c, $d, $d";
free_reg(a);
- push_reg(b);
+ free_reg(b);
free_reg(c);
- free_reg(d);
+ push_reg(d);
}
}.
default ==>
"bnz 1b";
"st %g0, [$reg_sp+$a]"; /* HACK delay */
"andn $b, 31, $c";
- "and $b, 31, $b";
+ "and $b, 31, $d";
"srl $c, 3, $c";
"set 1, $a";
- "sll $a, $b, $d";
+ "sll $a, $d, $d";
"st $d, [$reg_sp+$c]";
free_reg(a);
free_reg(b);
} else {
a= alloc_reg();
pop_reg_as(a);
- b= alloc_reg();
- pop_reg_as(b);
+ b= pop_reg();
flush_cache();
c= alloc_reg();
d= alloc_reg();
"bnz 1b";
"st %g0, [$reg_sp+$a]"; /* HACK delay */
"andn $b, 31, $c";
- "and $b, 31, $b";
+ "and $b, 31, $d";
"srl $c, 3, $c";
"set 1, $a";
- "sll $a, $b, $d";
+ "sll $a, $d, $d";
"st $d, [$reg_sp+$c]";
free_reg(a);
free_reg(b);
reg_t b;
reg_t c;
reg_t d;
+ reg_t e;
reg_t ao_reg;
reg_t bo_reg;
int n;
b= pop_reg(); /* src */
c= alloc_reg();
d= alloc_reg();
- "set $n_str, $c";
+ e = alloc_reg();
+ "set $n_str-4, $c";
+ "set -4, $e";
"1:";
- "deccc 4, $c";
- "ld [$b+$c], $d";
+ "inc 4, $e";
+ "ld [$b+$e], $d";
+ "cmp $e,$c";
"bnz 1b";
- "st $d, [$a+$c]";
+ "st $d, [$a+$e]";
free_reg(a);
free_reg(b);
free_reg(c);
free_reg(d);
+ free_reg(e);
}
}
else
a= pop_reg(); /* dest */
b= pop_reg(); /* src */
d= alloc_reg();
+ e= alloc_reg();
+ "ba 2f";
+ "clr $e";
"1:";
- "deccc 4, $c";
- "ld [$b+$c], $d";
+ "st $d, [$a+$e]";
+ "inc 4, $e";
+ "2:";
+ "cmp $e, $c"
"bnz 1b";
- "st $d, [$a+$c]";
+ "ld [$b+$e], $d";
free_reg(a);
free_reg(b);
free_reg(c);
free_reg(d);
+ free_reg(e);
}
}.