@@ -1781,33 +1781,98 @@ codet java_bytecode_convert_methodt::convert_instructions(
1781
1781
assert (!stack.empty () && results.empty ());
1782
1782
1783
1783
if (get_bytecode_type_width (stack.back ().type ())==32 )
1784
- op=pop (2 );
1784
+ {
1785
+ op=pop (2 ); // op0 is value1 op1 is value2
1786
+ const exprt tmp_var1=
1787
+ tmp_variable (" stack_dup2_1" , op[0 ].type ());
1788
+ const exprt tmp_var2=
1789
+ tmp_variable (" stack_dup2_2" , op[1 ].type ());
1790
+ c=code_blockt ();
1791
+ c.copy_to_operands (
1792
+ code_assignt (tmp_var1, java_bytecode_promotion (op[0 ])));
1793
+ c.copy_to_operands (
1794
+ code_assignt (tmp_var2, java_bytecode_promotion (op[1 ])));
1795
+ results.push_back (tmp_var1);
1796
+ results.push_back (tmp_var2);
1797
+ }
1785
1798
else
1799
+ {
1786
1800
op=pop (1 );
1801
+ const exprt tmp_var=
1802
+ tmp_variable (" stack_dup2" , op[0 ].type ());
1803
+ c=code_assignt (tmp_var, java_bytecode_promotion (op[0 ]));
1804
+ results.push_back (tmp_var);
1805
+ }
1787
1806
1788
1807
results.insert (results.end (), op.begin (), op.end ());
1789
- results.insert (results.end (), op.begin (), op.end ());
1790
1808
}
1791
1809
else if (statement==" dup2_x1" )
1792
1810
{
1793
1811
assert (!stack.empty () && results.empty ());
1794
1812
1795
1813
if (get_bytecode_type_width (stack.back ().type ())==32 )
1814
+ {
1796
1815
op=pop (3 );
1816
+ const exprt tmp_var1=
1817
+ tmp_variable (" stack_dup2_x1_1" , op[2 ].type ());
1818
+ const exprt tmp_var2=
1819
+ tmp_variable (" stack_dup2_x1_2" , op[1 ].type ());
1820
+ c=code_blockt ();
1821
+ c.copy_to_operands (
1822
+ code_assignt (tmp_var1, java_bytecode_promotion (op[2 ])));
1823
+ c.copy_to_operands (
1824
+ code_assignt (tmp_var2, java_bytecode_promotion (op[1 ])));
1825
+ results.push_back (tmp_var2);
1826
+ results.push_back (tmp_var1);
1827
+ c=code_blockt ();
1828
+ c.copy_to_operands (
1829
+ code_assignt (tmp_var1, java_bytecode_promotion (op[2 ])));
1830
+ c.copy_to_operands (
1831
+ code_assignt (tmp_var2, java_bytecode_promotion (op[1 ])));
1832
+ }
1797
1833
else
1834
+ {
1798
1835
op=pop (2 );
1836
+ const exprt tmp_var=
1837
+ tmp_variable (" stack_dup2_x1" , op[1 ].type ());
1838
+ results.push_back (tmp_var);
1839
+ c=code_assignt (tmp_var, java_bytecode_promotion (op[1 ]));
1840
+ }
1799
1841
1800
- results.insert (results.end (), op.begin ()+1 , op.end ());
1801
1842
results.insert (results.end (), op.begin (), op.end ());
1802
1843
}
1803
1844
else if (statement==" dup2_x2" )
1804
1845
{
1805
1846
assert (!stack.empty () && results.empty ());
1806
1847
1807
1848
if (get_bytecode_type_width (stack.back ().type ())==32 )
1849
+ {
1808
1850
op=pop (2 );
1851
+ const exprt tmp_var1=
1852
+ tmp_variable (" stack_dup2_x2_1" , op[1 ].type ());
1853
+ const exprt tmp_var2=
1854
+ tmp_variable (" stack_dup2_x2_2" , op[0 ].type ());
1855
+ c=code_blockt ();
1856
+ c.copy_to_operands (
1857
+ code_assignt (tmp_var1, java_bytecode_promotion (op[1 ])));
1858
+ c.copy_to_operands (
1859
+ code_assignt (tmp_var2, java_bytecode_promotion (op[0 ])));
1860
+ results.push_back (tmp_var2);
1861
+ results.push_back (tmp_var1);
1862
+ c=code_blockt ();
1863
+ c.copy_to_operands (
1864
+ code_assignt (tmp_var1, java_bytecode_promotion (op[1 ])));
1865
+ c.copy_to_operands (
1866
+ code_assignt (tmp_var2, java_bytecode_promotion (op[0 ])));
1867
+ }
1809
1868
else
1869
+ {
1810
1870
op=pop (1 );
1871
+ const exprt tmp_var=
1872
+ tmp_variable (" stack_dup2_x2" , op[0 ].type ());
1873
+ c=code_assignt (tmp_var, java_bytecode_promotion (op[0 ]));
1874
+ results.push_back (tmp_var);
1875
+ }
1811
1876
1812
1877
assert (!stack.empty ());
1813
1878
exprt::operandst op2;
0 commit comments