Pastey Bad loop translation ticket 835
- Posted by SDPringle
Jan 13, 2013
function pow_sum(sequence s)
atom sum = 0
for i = 1 to length(s) by 2 do
atom p = 1
while s[i+1] > 0 do
p *= s[i]
s[i+1] -= 1
end while
sum += p
end for
return sum
end function
object _1pow_sum(object _s_14757)
{
object _sum_14758 = NOVALUE;
object _p_14762 = NOVALUE;
object _8294 = NOVALUE;
object _8293 = NOVALUE;
object _8292 = NOVALUE;
object _8290 = NOVALUE;
object _8288 = NOVALUE;
object _8287 = NOVALUE;
object _8286 = NOVALUE;
object _0, _1, _2;
/** t_callc.e:79 atom sum = 0*/
DeRef(_sum_14758);
_sum_14758 = 0;
/** t_callc.e:80 for i = 1 to length(s) by 2 do*/
_8286 = 1;
{
object _i_14760;
_i_14760 = 1;
L1:
if (_i_14760 > 1){
goto L2; // [13] 90
}
/** t_callc.e:81 atom p = 1*/
DeRef(_p_14762);
_p_14762 = 1;
/** t_callc.e:82 while s[i+1] > 0 do*/
L3:
_8287 = 2;
_2 = (object)SEQ_PTR(_s_14757);
_8288 = (object)*(((s1_ptr)_2)->base + 2);
if (binary_op_a(LESSEQ, _8288, 0)){
_8288 = NOVALUE;
goto L4; // [38] 75
}
_8288 = NOVALUE;
/** t_callc.e:83 p *= s[i]*/
_2 = (object)SEQ_PTR(_s_14757);
_8290 = (object)*(((s1_ptr)_2)->base + 1);
_0 = _p_14762;
if (IS_ATOM_INT(_p_14762) && IS_ATOM_INT(_8290)) {
if (_p_14762 == (short)_p_14762 && _8290 <= INT15 && _8290 >= -INT15){
_p_14762 = _p_14762 * _8290;
}
else{
_p_14762 = NewDouble(_p_14762 * (eudouble)_8290);
}
}
else {
_p_14762 = binary_op(MULTIPLY, _p_14762, _8290);
}
DeRef(_0);
_8290 = NOVALUE;
/** t_callc.e:84 s[i+1] -= 1*/
_8292 = 2;
_2 = (object)SEQ_PTR(_s_14757);
_8293 = (object)*(((s1_ptr)_2)->base + 2);
if (IS_ATOM_INT(_8293)) {
_8294 = _8293 - 1;
if ((object)((uintptr_t)_8294 +(uintptr_t) HIGH_BITS) >= 0){
_8294 = NewDouble((eudouble)_8294);
}
}
else {
_8294 = binary_op(MINUS, _8293, 1);
}
_8293 = NOVALUE;
_2 = (object)SEQ_PTR(_s_14757);
if (!UNIQUE(_2)) {
_2 = (object)SequenceCopy((s1_ptr)_2);
_s_14757 = MAKE_SEQ(_2);
}
_2 = (object)(((s1_ptr)_2)->base + 2);
_1 = *(intptr_t *)_2;
*(intptr_t *)_2 = _8294;
if( _1 != _8294 ){
DeRef(_1);
}
_8294 = NOVALUE;
/** t_callc.e:85 end while*/
goto L3; // [72] 30
L4:
/** t_callc.e:86 sum += p*/
_0 = _sum_14758;
if (IS_ATOM_INT(_sum_14758) && IS_ATOM_INT(_p_14762)) {
_sum_14758 = _sum_14758 + _p_14762;
if ((object)((uintptr_t)_sum_14758 + (uintptr_t)HIGH_BITS) >= 0){
_sum_14758 = NewDouble((eudouble)_sum_14758);
}
}
else {
if (IS_ATOM_INT(_sum_14758)) {
_sum_14758 = NewDouble((eudouble)_sum_14758 + DBL_PTR(_p_14762)->dbl);
}
else {
if (IS_ATOM_INT(_p_14762)) {
_sum_14758 = NewDouble(DBL_PTR(_sum_14758)->dbl + (eudouble)_p_14762);
}
else
_sum_14758 = NewDouble(DBL_PTR(_sum_14758)->dbl + DBL_PTR(_p_14762)->dbl);
}
}
DeRef(_0);
DeRef(_p_14762);
_p_14762 = NOVALUE;
/** t_callc.e:87 end for*/
_i_14760 = 1 + 2;
goto L1; // [85] 20
L2:
;
}
/** t_callc.e:88 return sum*/
DeRefDS(_s_14757);
DeRef(_8287);
_8287 = NOVALUE;
DeRef(_8292);
_8292 = NOVALUE;
return _sum_14758;
;
}