florian
251b18b966
* do not fold constants if the resulttypes do not match, improved fix for #tw26587
...
git-svn-id: trunk@44165 -
2020-02-13 20:34:27 +00:00
yury
39c48f0d01
* Fixed r43577 for cases when the size of the new result of a simplified node after typecheckpass is smaller than the size of the original node's result. This caused internal errors or invalid assembly in some cases. Issue #36587 .
...
git-svn-id: trunk@44151 -
2020-02-11 12:49:12 +00:00
florian
77b54f501f
* when optimizing boolean expressions, might_have_sideeffects is only relevant if the expression would be optimized away
...
git-svn-id: trunk@44084 -
2020-02-01 18:02:17 +00:00
florian
051b9840a5
* write a proper error message if <int>/<int> is encountered while no
...
floating point support is available, resolves #32006
git-svn-id: trunk@43794 -
2019-12-25 18:09:30 +00:00
florian
0cb85eef9b
* more currency fixes, should resolve #36176
...
git-svn-id: trunk@43635 -
2019-12-03 19:31:50 +00:00
pierre
c87facbae1
Use PInt64(@value_currency)^ construct to avoid internal error when starting from 3.0.4 ppcarm compiler
...
git-svn-id: trunk@43634 -
2019-12-03 16:05:30 +00:00
pierre
91e550edb6
Remove assigned but unused local variable i64 in taddnode.pass_typecheck_internal as suggested by Ondrej Pokorny
...
This also solves the "Invalid TypeCast Error" in rtl-objpas when compiled with -CriotR option.
git-svn-id: trunk@43631 -
2019-12-02 23:11:21 +00:00
florian
86d8e79e86
* fix some currency issues, resolves #33963 and #36179
...
git-svn-id: trunk@43620 -
2019-12-01 20:24:00 +00:00
florian
acdff47554
+ optimize integer expressions like 2*x*4; which were not found by the node simplifier yet
...
git-svn-id: trunk@43577 -
2019-11-24 20:21:33 +00:00
Jonas Maebe
d23c7980aa
* properly perform (or not) range/overflow checking when performing constant
...
propagation into inlined routines, regardless of the range/overflow
checking state at the caller site
git-svn-id: trunk@43436 -
2019-11-10 12:00:05 +00:00
florian
cb67577002
* fix length(<dyn. type>)=0 optimization, resolves #36215
...
git-svn-id: trunk@43343 -
2019-10-31 21:29:41 +00:00
florian
ee3258c0da
* optimizing length(<dyn. type>)=0 is not possible for jvm
...
git-svn-id: trunk@43280 -
2019-10-20 21:10:56 +00:00
florian
e80eee5da5
* generate better code for length(<dyn. type>)=0, resolves #36060
...
git-svn-id: trunk@43272 -
2019-10-20 13:03:45 +00:00
pierre
f82cc96cb9
Check that inserttypeconv really change node type to ttypeconvnode before setting convtype field (should fix taddbool.pp bytebool failure on powerpc)
...
git-svn-id: trunk@42692 -
2019-08-14 23:00:35 +00:00
Jonas Maebe
40082100e1
* fixed range test optimization for signed types and enabled it for them
...
git-svn-id: trunk@42332 -
2019-07-06 09:57:32 +00:00
Jonas Maebe
faf75095cd
* synchronised with trunk till r42189
...
git-svn-id: branches/debug_eh@42190 -
2019-06-07 18:24:38 +00:00
Jonas Maebe
eab079c7bd
* fixed cbool "and" with full boolean evaluation, and cbool "xor"
...
(mantis #35272 )
git-svn-id: trunk@42167 -
2019-06-02 20:04:06 +00:00
Jonas Maebe
1b6425176b
* synchronised with trunk till r42049
...
git-svn-id: branches/debug_eh@42050 -
2019-05-12 18:44:05 +00:00
Jonas Maebe
281b3ad276
* fix case completeness and unreachable code warnings in compiler that would
...
be introduced by the next commit
git-svn-id: trunk@42046 -
2019-05-12 14:29:03 +00:00
florian
38be96e586
* allow pointer+ord. const always if the node is created internally
...
git-svn-id: branches/debug_eh@41381 -
2019-02-19 22:16:05 +00:00
Jonas Maebe
7af95cbf06
* LLVM does not support 128 bits arithmetic on 32 bit platforms, which we
...
need for overflow checking -> use RTL built-ins
git-svn-id: trunk@41205 -
2019-02-03 21:01:02 +00:00
Jonas Maebe
04d295f186
* first step towards supporting 32 bit targets with the LLVM code generator:
...
use the generic code in more cases when cpuhighleveltarget is defined
git-svn-id: trunk@41133 -
2019-01-29 21:39:09 +00:00
Jonas Maebe
d1361ca6ed
* fixed adjustments of lower/upper bounds in range test optimization in case
...
of strictly smaller/greater comparisons (mantis #34385 )
git-svn-id: trunk@40344 -
2018-11-17 22:38:31 +00:00
yury
4357caaad8
* Removed unused local vars.
...
git-svn-id: trunk@40183 -
2018-11-02 18:44:29 +00:00
florian
116f36fe56
* avoid range check errors
...
git-svn-id: trunk@39990 -
2018-10-20 10:17:34 +00:00
Jonas Maebe
0b246f3dbd
* converted Boolean8 to an internal type, and mapped Boolean to the
...
new internal pasbool1(type) (part of mantis #34411 )
o apply the _Bool x86-64 parameter passing rules only to pasbool1
git-svn-id: trunk@39949 -
2018-10-16 21:14:18 +00:00
pierre
293973b306
Add missing setting of expectloc for multiplications
...
git-svn-id: trunk@39935 -
2018-10-14 22:18:50 +00:00
florian
352fb866ef
* is_range_test returns false if "lower" bound is greater than "upper" bound
...
git-svn-id: trunk@39837 -
2018-09-27 20:24:52 +00:00
florian
a34d4e715c
Merged riscv_new branch
...
git-svn-id: trunk@39813 -
2018-09-26 19:49:08 +00:00
florian
a21397e356
+ based on a patch by Laksen, optimize (v>=x) and (v<=y) into (v-x)<(y-x)
...
git-svn-id: trunk@39759 -
2018-09-16 13:09:36 +00:00
svenbarth
32c307e9ce
* fix for Mantis #34021 : if one of the two operators is an array constructor try to use an operator overload for that first before converting it to a set
...
+ added tests
git-svn-id: trunk@39554 -
2018-08-03 15:24:59 +00:00
florian
32a58ba7d1
* might_have_sideeffects gets flags: if mhs_exceptions is passed, nodes which might cause an exception are considered as having a side effect
...
git-svn-id: branches/laksen/riscv_new@39483 -
2018-07-22 13:11:21 +00:00
florian
52846df241
* fixed condition in getbestreal
...
git-svn-id: trunk@39446 -
2018-07-13 19:53:47 +00:00
florian
0c6cf12fbf
+ support for the directive $EXCESSPRECISION
...
git-svn-id: trunk@39443 -
2018-07-12 21:39:50 +00:00
svenbarth
fa78bb0e89
* warn if the compiler hides an eventual "+" operator overload if modeswitch ArrayOperators is active
...
git-svn-id: trunk@39261 -
2018-06-20 19:53:56 +00:00
svenbarth
97acf24290
+ add a new modeswitch ArrayOperators which is set by default in Delphi modes that enables the internal array operators (currently only "+")
...
git-svn-id: trunk@39259 -
2018-06-20 19:53:43 +00:00
svenbarth
9b45f58c0b
+ add flags that allow checking for overloads with isbinaryoverloaded() and isunaryoverloaded() without modifying the passed in node or even checking for normally non-overloadable operators
...
git-svn-id: trunk@39258 -
2018-06-20 19:53:34 +00:00
svenbarth
199b5809a3
* optimize "dynarr := dynarr + [elem]" to "Insert(elem, dynarr, High(SizeInt))" and "dynarr := [elem] + dynarr" to "Insert(elem, dynarr, 0)" (we need to do this in the typecheck of taddnode as otherwise the array constructor is already converted)
...
+ added test
* adjusted test for Mantis #30463 as p1 triggers the optimization as well
git-svn-id: trunk@39119 -
2018-05-25 16:03:56 +00:00
florian
71e71ad267
* fix currency division on non x86 32 bit targets
...
* disable fix for #33439 during bootstrapping with 3.0.x, as 3.0.x cannot compile the currency division without the fix above
git-svn-id: trunk@38558 -
2018-03-17 22:44:44 +00:00
florian
b2825f2467
* scale constants if possible before currency multiplications to avoid overflows, resolves #33439
...
git-svn-id: trunk@38555 -
2018-03-17 21:33:07 +00:00
florian
c230f81719
+ support for <dyn. array>+<dyn. array>, resolves #30463
...
git-svn-id: trunk@38406 -
2018-03-04 16:12:43 +00:00
Jonas Maebe
1934285c20
* don't convert "int64(sint32) * cardinal_const" into a 32x32->64
...
multiplication (mantis #32046 )
git-svn-id: trunk@37921 -
2018-01-06 13:44:03 +00:00
pierre
59edd81a26
Disable some code using bestrealrec if macro FPC_SOFT_FPUX80 is defined
...
git-svn-id: trunk@37296 -
2017-09-21 14:39:14 +00:00
Károly Balogh
b755524c38
made it possible to override the decision from the cgs, if a certain muln needs a helper
...
git-svn-id: trunk@36347 -
2017-05-26 18:42:21 +00:00
nickysn
34113b930b
* removed the checkoverflow: boolean parameter of the software mul helpers;
...
replaced it with a separate "_checkoverflow" version of each helper
git-svn-id: trunk@36344 -
2017-05-26 15:34:26 +00:00
Károly Balogh
3e8ee48458
m68k: define cpurox and enabled the rotate-related optimizations on CPUs which support rotate instructionsoptions.pas
...
git-svn-id: trunk@36302 -
2017-05-23 00:16:29 +00:00
nickysn
efc5e339d0
* use an enum instead of integer constants to represent inline numbers
...
* compinnr.inc include file converted to a unit
* inline number field size stored in ppu increased from byte to longint
* inlines in the parse tree (when written with the -vp option) now printed with
their enum name, instead of number
git-svn-id: trunk@36174 -
2017-05-10 14:41:43 +00:00
florian
b1dff29cbf
* removed unused units
...
git-svn-id: trunk@36165 -
2017-05-09 19:53:14 +00:00
nickysn
546e993c25
* use resultdef for the type of the resulting zero const from the '0*x' and
...
'0 and x' optimization
git-svn-id: trunk@36040 -
2017-05-01 18:11:12 +00:00
nickysn
f26a844b19
* only do the '0*x' and '0 and x' optimization if x has no side effects (except
...
at -O4, where it is done regardless of whether there are side effects or not)
git-svn-id: trunk@36039 -
2017-05-01 17:34:19 +00:00
nickysn
f44f2f9194
* do the optimizations in r36027 at level -O3 or higher
...
git-svn-id: trunk@36034 -
2017-05-01 13:14:32 +00:00
nickysn
6d589f415b
* do the left.equals(right) check before might_have_sideeffects, because
...
left.equals(right) is usually faster
git-svn-id: trunk@36033 -
2017-05-01 12:57:15 +00:00
nickysn
217d39abf1
* fixed bug in r36027 (I had it fixed already, but accidentally committed the
...
wrong file in r36027)
git-svn-id: trunk@36030 -
2017-05-01 11:43:16 +00:00
nickysn
5aeb73b940
+ optimizations (at -O2 level) for (where 'a' is an integer expression, without
...
side effects):
* a - a -> 0
* a xor a -> 0
* a and a -> a
* a or a -> a
* a <> a -> false
* a < a -> false
* a > a -> false
* a = a -> true
* a <= a -> true
* a >= a -> true
git-svn-id: trunk@36027 -
2017-05-01 10:17:50 +00:00
nickysn
1560f20e7f
+ implemented other 32-bit rol/ror by const methods for i8086 and added a
...
(hopefully) reasonable selection for them for all consts between 1 and 31
git-svn-id: trunk@35744 -
2017-04-06 15:41:39 +00:00
nickysn
321876252b
+ enabled the rol/ror intrinsic on i8086
...
git-svn-id: trunk@35734 -
2017-04-04 22:37:58 +00:00
florian
8bea3e0614
* the optimization introduced in r35526 requires that the tested set has no side effects as it is copied
...
git-svn-id: trunk@35531 -
2017-03-06 21:35:04 +00:00
florian
13b3866552
* convert (s*[const. set])<>/=[] for var. sets into or'ed in nodes, if const. set contains only a few elements
...
git-svn-id: trunk@35526 -
2017-03-05 20:29:22 +00:00
florian
7213a13081
* split fpc_mul_<64 bit> into separate procedures with and without overflow checking
...
git-svn-id: trunk@35454 -
2017-02-19 19:15:14 +00:00
florian
331bb95c5e
* simplify logical operations with constant booleans if the expresions involve no side effects
...
git-svn-id: trunk@35230 -
2017-01-04 16:33:29 +00:00
florian
3e2aff15fb
* short boolean evaluation is too expensive for simple nodes with no side effects, do full evaluation in this case
...
git-svn-id: trunk@35229 -
2017-01-04 16:33:27 +00:00
florian
ef81009362
* set nf_internal for nodes being generated by constant folding
...
git-svn-id: trunk@34800 -
2016-11-05 23:06:03 +00:00
Jonas Maebe
ec5dea1092
* don't perform the "/ const" to "* (1/const)" transformation for comp-typed
...
expressions, since comp cannot represent fractions (bug reported at
http://lists.freepascal.org/pipermail/fpc-pascal/2016-June/048234.html )
git-svn-id: trunk@34035 -
2016-06-30 15:33:51 +00:00
Jonas Maebe
2bbab60c92
* when simplifying a constant string concatenation that gets assigned to a
...
rawbytestring, ensure the resulting constant string does not get CP_NONE
as codepage, but the default system code page (mantis #30082 )
git-svn-id: trunk@33597 -
2016-05-01 13:16:02 +00:00
yury
d4d70d3865
* Evaluate currency constant expressions when the currency type is 64-bit integer. Issue #28749 .
...
git-svn-id: trunk@33334 -
2016-03-26 17:48:50 +00:00
Jonas Maebe
4ae8dcc91e
* make the resultdef of left and right equal when comparing a dynarray
...
with nil (for llvm)
git-svn-id: trunk@32902 -
2016-01-10 14:01:39 +00:00
nickysn
a159ebdbad
* fixed comparison of two procvars in the i8086 compact and medium memory models
...
git-svn-id: trunk@32166 -
2015-10-27 17:24:33 +00:00
nickysn
8eceb73dd4
* also use an 8-bit zero constant for string comparisons with the empty string.
...
This avoids the unnecessary 32-bit comparison on 16-bit and 8-bit CPUs
git-svn-id: trunk@32103 -
2015-10-20 15:50:02 +00:00
nickysn
a20428f246
* when doing a string comparison that calls an rtl helper, compare the function
...
result with an 8-bit zero constant (which will be expanded to the native
integer size by the comparison node), instead of 32-bit zero. This avoids the
unnecessary 32-bit comparison on 16-bit and 8-bit cpus.
git-svn-id: trunk@32099 -
2015-10-20 01:22:01 +00:00
Jonas Maebe
b22e2ef400
* add "doregister" parameter to tsetdef.create, and don't register temporary
...
defs created in the scanner for evaluating compile time expressions
git-svn-id: trunk@32048 -
2015-10-13 15:59:12 +00:00
Jonas Maebe
fbacf9682f
* rename WinCE softfp compilerproc names to lowercase, needed since r31404
...
(mantis #28598 )
git-svn-id: trunk@31478 -
2015-09-02 09:54:02 +00:00
Jonas Maebe
f402b0d7df
* changed getpointerdef() into a tpointerdef.getreusable() class method
...
o allows removing the ugly x86 hacks
git-svn-id: trunk@31144 -
2015-06-22 08:17:49 +00:00
Jonas Maebe
e9800ad3f9
* make the resultdef of left and right equal when comparing a procvar
...
with nil (for llvm)
git-svn-id: trunk@30954 -
2015-05-31 16:50:59 +00:00
florian
cfa68be55b
* do not use 16 Bit mul helper on avr, the code generator generates
...
muls and adds. For simple cases this might be cause longer code than a call to a well crafted assembler helper
but inlining the muls/adds makes register allocation more flexible
git-svn-id: trunk@30739 -
2015-04-27 20:51:32 +00:00
florian
a8e001d4ad
* do not warn about disjunct ranges for internally created cmp nodes
...
git-svn-id: trunk@30269 -
2015-03-21 22:56:30 +00:00
Jonas Maebe
dd2aa17de1
* also allow 64 bit platforms have have a 32x32->64 bit multiplication to
...
take advantage of this transormation (enables this optimization for
AArch64)
git-svn-id: trunk@30035 -
2015-02-28 22:31:06 +00:00
florian
ccb01d6196
* allow subtraction/addition of internally generated nodes, resolves #27256
...
git-svn-id: trunk@29456 -
2015-01-12 20:56:17 +00:00
florian
5c67fcc43f
+ change always floating point divisions into multiplications if they are a power of two,
...
this is an exact operation so it is always allowed
* change only divisions by normal numbers into multiplications
git-svn-id: trunk@29085 -
2014-11-16 20:47:38 +00:00
florian
9fdfe4f474
+ convert floating point division by a constant into a multiplication if fastmath is turned on
...
git-svn-id: trunk@29069 -
2014-11-13 21:13:12 +00:00
florian
499dd078e3
+ automatically insert fma inlines into floating point code if possible and fastmath is activated
...
git-svn-id: trunk@28382 -
2014-08-11 20:50:21 +00:00
sergei
0d96963459
* Do not promote integer comparison operations to native size if one side is a constant and its value is within range of opposite side. Instead, cast the constant to type of the opposite side.
...
Comparisons are already not promoted if sides are equally signed, but this wasn't true for "unsigned vs constant" case, because constants are preferably parsed as signed.
The change considerably improves generated code for i386 and even more considerably for m68k. Tested on i386-win32.
git-svn-id: trunk@28266 -
2014-07-25 21:40:22 +00:00
nickysn
33dac14554
* defutil.get_int_type_for_pointer_arithmetic replaced with a virtual method
...
tpointerdef.pointer_arithmetic_int_type
git-svn-id: trunk@28258 -
2014-07-24 14:18:57 +00:00
nickysn
bb48761652
* taddnode.pass_typecheck_internal: always pass a tpointerdef to
...
get_int_type_for_pointer_arithmetic, even when adding a zero-based array with
a number
git-svn-id: trunk@28257 -
2014-07-24 13:28:19 +00:00
nickysn
6d54046300
* output a proper error message in case number+nil is encountered (just like
...
it's already done for nil+number and nil-number)
git-svn-id: trunk@28225 -
2014-07-15 22:26:58 +00:00
nickysn
d86a8ebc99
* defutil.get_int_result_type_from_pointer_subtraction moved to a virtual
...
method tpointerdef.pointer_subtraction_result_type
git-svn-id: trunk@28219 -
2014-07-14 23:30:29 +00:00
nickysn
99c555cea8
+ implemented huge pointer subtraction
...
* the result of far pointer subtraction changed to word (for TP7 compatibility)
git-svn-id: trunk@28218 -
2014-07-13 23:40:43 +00:00
nickysn
2b2224494b
* call first_addpointer and first_cmppointer in pass_1 for pchars as well. Fixes
...
huge pointer arithmetic/comparison on huge pchars.
git-svn-id: trunk@28159 -
2014-07-04 23:58:26 +00:00
nickysn
c8130843b2
* fixed 'cannot convert type' error when comparing two voidhugepointers with
...
= or <>
git-svn-id: trunk@28158 -
2014-07-04 23:54:47 +00:00
nickysn
e80ecd4d5b
+ moved handling of pointer comparison in pass_1 to new virtual method
...
taddnode.first_cmppointer. To be overriden for i8086 huge pointer comparisons.
git-svn-id: trunk@28156 -
2014-07-04 22:47:21 +00:00
nickysn
da77535631
* the handling of pointer arithmetic in pass_1 moved to a new virtual method
...
taddnode.first_addpointer. This will be overridden in the i8086 code generator
in order to implement huge pointer arithmetic.
git-svn-id: trunk@28138 -
2014-07-03 13:47:47 +00:00
nickysn
89db1e4118
+ add proper int type conversions for huge pointer arithmetic in pass_typecheck
...
of the add node
git-svn-id: trunk@28094 -
2014-06-27 23:37:08 +00:00
sergei
4c3a4646ec
* Fixed floating-point comparisons for softfloat targets (part of Mantis #9362 ).
...
git-svn-id: trunk@27584 -
2014-04-15 23:36:21 +00:00
nickysn
4563b2994d
+ handle constint+pointerconst in taddnode.simplify
...
git-svn-id: trunk@27491 -
2014-04-06 16:36:09 +00:00
Jonas Maebe
d452686c39
* moved pbestrealtype from symdef to symcpu
...
git-svn-id: trunk@27441 -
2014-04-01 21:41:37 +00:00
Jonas Maebe
b57c95043f
+ support overriding tdef/tsym methods with target-specific functionality:
...
o made all (non-abstract) tdef and tsym constructors virtual
o added c*def/c*sym classref types for every (non-abstract) t*def/t*sym
class
o added cpusym unit for every architecture that derives a tcpu*def/tcpu*sym
class from the base classes, and initialises the c*def/c*sym classes with
them. This is done so that the llvm target will be able to derive from
the tcpu*def/sym classes without umpteen ifdefs, and it also means that
the WPO can devirtualise everything because the c* variables are only
initialised with one class type
o replaced all t*def/t*sym constructor calls with c*def/c*sym constructor
calls
git-svn-id: trunk@27361 -
2014-03-29 22:31:55 +00:00
nickysn
71720533d7
* fixed the comparison of near pointers in i8086 far data memory models
...
+ added charfarpointertype and charnearpointertype to symdef
* the system unit compiles in the i8086 compact memory model now
git-svn-id: trunk@27251 -
2014-03-24 00:34:52 +00:00
nickysn
888ecdaee4
* fixed the type conversions of the 'and' operator to be Delphi compatible. Fixes Mantis #25179
...
git-svn-id: trunk@26882 -
2014-02-25 18:06:29 +00:00
nickysn
83dd2aed4a
* refactored the pass_typecheck code for and/or/xor/comparisons, so that the logic is simpler, but still yields exactly the same result
...
git-svn-id: trunk@26823 -
2014-02-21 14:55:00 +00:00
nickysn
3c332bf276
* not(is_signed(ld) xor is_signed(rd)) changed to (is_signed(ld)=is_signed(rd)) for better readability
...
git-svn-id: trunk@26817 -
2014-02-19 16:49:03 +00:00
sergei
8b3217815b
* When inlining currency (ordinal) multiplication, change resultdef to int64, in order to be consistent with behavior of generic handling. Fixes compilation faliure after r26500, Mantis #25565 .
...
git-svn-id: trunk@26534 -
2014-01-20 17:16:11 +00:00