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