Mercurial > projects > ldc
comparison gen/asm-x86-32.h @ 1310:85b80c4fe48a
Fix certain cases of floating point instruction mistranslation.
author | Christian Kamm <kamm incasoftware de> |
---|---|
date | Thu, 07 May 2009 21:01:44 +0200 |
parents | b995c146366e |
children | acc5d68a21d3 |
comparison
equal
deleted
inserted
replaced
1304:b995c146366e | 1310:85b80c4fe48a |
---|---|
1878 assert ( type_char != 0 ); | 1878 assert ( type_char != 0 ); |
1879 insnTemplate.write(mnemonic, mlen-1) << tc_1 << type_char; | 1879 insnTemplate.write(mnemonic, mlen-1) << tc_1 << type_char; |
1880 } | 1880 } |
1881 break; | 1881 break; |
1882 | 1882 |
1883 case Op_FMath0: | |
1884 // the no-operand versions of floating point ops always pop | |
1885 insnTemplate << mnemonic << "p"; | |
1886 break; | |
1887 | |
1888 default: | 1883 default: |
1889 // special case fdiv, fsub: see dmd 840, ldc 256 | 1884 // special case fdiv, fsub: see dmd 840, ldc 256 |
1890 if (strncmp(mnemonic, "fsub", 4) == 0 || | 1885 if ((strncmp(mnemonic, "fsub", 4) == 0 || |
1891 strncmp(mnemonic, "fdiv", 4) == 0) | 1886 strncmp(mnemonic, "fdiv", 4) == 0) && |
1887 operands[0].reg != Reg_ST) | |
1892 { | 1888 { |
1893 // replace: | 1889 // replace: |
1894 // f{sub,div}r{p,} <-> f{sub,div}{p,} | 1890 // f{sub,div}r{p,} <-> f{sub,div}{p,} |
1895 if (mnemonic[4] == 'r') | 1891 if (mnemonic[4] == 'r') |
1896 { | 1892 { |
1905 } | 1901 } |
1906 else | 1902 else |
1907 { | 1903 { |
1908 insnTemplate << mnemonic; | 1904 insnTemplate << mnemonic; |
1909 } | 1905 } |
1906 // the no-operand versions of floating point ops always pop | |
1907 if (op == Op_FMath0) | |
1908 insnTemplate << "p"; | |
1910 if ( type_char ) | 1909 if ( type_char ) |
1911 insnTemplate << type_char; | 1910 insnTemplate << type_char; |
1912 break; | 1911 break; |
1913 } | 1912 } |
1914 | 1913 |