Commit Graph

480 Commits

Author SHA1 Message Date
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