diff options
author | jonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2015-01-21 23:28:34 +0000 |
---|---|---|
committer | jonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2015-01-21 23:28:34 +0000 |
commit | 1903b037de2fb3e75826406b46f055acb70963fa (patch) | |
tree | 604cd8b790fe14e5fbe441d4cd647c80d2a36a9a /compiler/ncgmat.pas | |
parent | ad1141d52f8353457053b925cd674fe1d5c4eafc (diff) | |
parent | 953d907e4d6c3a5c2f8aaee6e5e4f73c55ce5985 (diff) | |
download | fpc-blocks.tar.gz |
* synchronised with trunk till r29513blocks
git-svn-id: http://svn.freepascal.org/svn/fpc/branches/blocks@29516 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'compiler/ncgmat.pas')
-rw-r--r-- | compiler/ncgmat.pas | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/compiler/ncgmat.pas b/compiler/ncgmat.pas index 88baa9a2dd..82f75f4e66 100644 --- a/compiler/ncgmat.pas +++ b/compiler/ncgmat.pas @@ -50,6 +50,7 @@ interface {$endif not cpu64bitalu} procedure second_integer;virtual; procedure second_float;virtual; + procedure second_float_emulated;virtual; public procedure pass_generate_code;override; end; @@ -206,6 +207,23 @@ implementation end; {$endif not cpu64bitalu} + + procedure tcgunaryminusnode.second_float_emulated; + begin + secondpass(left); + hlcg.location_force_reg(current_asmdata.CurrAsmList,left.location,left.resultdef,left.resultdef,false); + location:=left.location; + case location.size of + OS_32: + cg.a_op_const_reg(current_asmdata.CurrAsmList,OP_XOR,OS_32,tcgint($80000000),location.register); + OS_64: + cg.a_op_const_reg(current_asmdata.CurrAsmList,OP_XOR,OS_32,tcgint($80000000),location.registerhi); + else + internalerror(2014033101); + end; + end; + + procedure tcgunaryminusnode.second_float; begin secondpass(left); @@ -282,7 +300,12 @@ implementation else {$endif SUPPORT_MMX} if (left.resultdef.typ=floatdef) then - second_float + begin + if (cs_fp_emulation in current_settings.moduleswitches) then + second_float_emulated + else + second_float; + end else second_integer; end; |