Prechádzať zdrojové kódy

+ support for FMA intrinsic: if there is no hardware support, the compiler throws an error.
Currently it is implemented only for x86-CPUs supporting the FMA extension. While it would
be possible to implement it in software or simulate fma(<single>,<single>,<single>) using
double operations, it makes no sense in my opinion to do so.

git-svn-id: trunk@27564 -

florian 11 rokov pred
rodič
commit
d88d644925

+ 1 - 0
.gitattributes

@@ -11382,6 +11382,7 @@ tests/test/textthr.pp svneol=native#text/plain
 tests/test/tfillchr.pp svneol=native#text/plain
 tests/test/tfillchr.pp svneol=native#text/plain
 tests/test/tfinal1.pp svneol=native#text/pascal
 tests/test/tfinal1.pp svneol=native#text/pascal
 tests/test/tfinal2.pp svneol=native#text/pascal
 tests/test/tfinal2.pp svneol=native#text/pascal
+tests/test/tfma1.pp svneol=native#text/pascal
 tests/test/tforin1.pp svneol=native#text/pascal
 tests/test/tforin1.pp svneol=native#text/pascal
 tests/test/tforin10.pp svneol=native#text/plain
 tests/test/tforin10.pp svneol=native#text/plain
 tests/test/tforin11.pp svneol=native#text/plain
 tests/test/tforin11.pp svneol=native#text/plain

+ 4 - 0
compiler/compinnr.inc

@@ -115,6 +115,10 @@ const
    in_arctan_real      = 130;
    in_arctan_real      = 130;
    in_ln_real          = 131;
    in_ln_real          = 131;
    in_sin_real         = 132;
    in_sin_real         = 132;
+   in_fma_single       = 133;
+   in_fma_double       = 134;
+   in_fma_extended     = 135;
+   in_fma_float128     = 136;
 
 
 { MMX functions }
 { MMX functions }
   { these contants are used by the mmx unit }
   { these contants are used by the mmx unit }

+ 4 - 2
compiler/i386/cpuinfo.pas

@@ -137,7 +137,9 @@ type
        CPUX86_HAS_POPCNT,
        CPUX86_HAS_POPCNT,
        CPUX86_HAS_AVXUNIT,
        CPUX86_HAS_AVXUNIT,
        CPUX86_HAS_LZCNT,
        CPUX86_HAS_LZCNT,
-       CPUX86_HAS_MOVBE
+       CPUX86_HAS_MOVBE,
+       CPUX86_HAS_FMA,
+       CPUX86_HAS_FMA4
       );
       );
 
 
  const
  const
@@ -151,7 +153,7 @@ type
      { cpu_PentiumM  } [CPUX86_HAS_SSEUNIT],
      { cpu_PentiumM  } [CPUX86_HAS_SSEUNIT],
      { cpu_core_i    } [CPUX86_HAS_SSEUNIT,CPUX86_HAS_POPCNT],
      { cpu_core_i    } [CPUX86_HAS_SSEUNIT,CPUX86_HAS_POPCNT],
      { cpu_core_avx  } [CPUX86_HAS_SSEUNIT,CPUX86_HAS_POPCNT,CPUX86_HAS_AVXUNIT],
      { cpu_core_avx  } [CPUX86_HAS_SSEUNIT,CPUX86_HAS_POPCNT,CPUX86_HAS_AVXUNIT],
-     { cpu_core_avx2 } [CPUX86_HAS_SSEUNIT,CPUX86_HAS_POPCNT,CPUX86_HAS_AVXUNIT,CPUX86_HAS_BMI1,CPUX86_HAS_BMI2,CPUX86_HAS_LZCNT,CPUX86_HAS_MOVBE]
+     { cpu_core_avx2 } [CPUX86_HAS_SSEUNIT,CPUX86_HAS_POPCNT,CPUX86_HAS_AVXUNIT,CPUX86_HAS_BMI1,CPUX86_HAS_BMI2,CPUX86_HAS_LZCNT,CPUX86_HAS_MOVBE,CPUX86_HAS_FMA]
    );
    );
 
 
 
 

+ 5 - 1
compiler/msg/errore.msg

@@ -2358,6 +2358,11 @@ cg_e_mod_only_defined_for_pos_quotient=06054_E_In ISO mode, the mod operator is
 % In ISO pascal, only positive values are allowed for the quotient: \var{n mod m} is only valid if \var{m>0}.
 % In ISO pascal, only positive values are allowed for the quotient: \var{n mod m} is only valid if \var{m>0}.
 cg_d_autoinlining=06055_DL_Auto inlining: $1
 cg_d_autoinlining=06055_DL_Auto inlining: $1
 % Due to auto inlining turned on, the compiler auto inlines this subroutine.
 % Due to auto inlining turned on, the compiler auto inlines this subroutine.
+cg_e_function_not_support_by_selected_instruction_set=06056_E_The function used, is not supported by the selected instruction set: $1
+% Some functions cannot be implemented efficiently for certain instruction sets, one example is fused multiply/add.
+% To avoid very inefficient code, the compiler complains in this case, so either select another instruction set
+% or replace the function call by alternative code
+%
 % \end{description}
 % \end{description}
 # EndOfTeX
 # EndOfTeX
 #
 #
@@ -2615,7 +2620,6 @@ asmr_e_mixing_regtypes=07108_E_All registers in a register set must be of the sa
 asmr_e_empty_regset=07109_E_A register set cannot be empty
 asmr_e_empty_regset=07109_E_A register set cannot be empty
 % Instructions on the ARM architecture that take a register set as argument require that such a set
 % Instructions on the ARM architecture that take a register set as argument require that such a set
 % contains at least one register.
 % contains at least one register.
-
 asmr_w_useless_got_for_local=07110_W_@GOTPCREL is useless and potentially dangereous for local symbols
 asmr_w_useless_got_for_local=07110_W_@GOTPCREL is useless and potentially dangereous for local symbols
 % The use of @GOTPCREL supposes an extra indirection that is
 % The use of @GOTPCREL supposes an extra indirection that is
 % not present if the symbol is local, which might lead to wrong asembler code
 % not present if the symbol is local, which might lead to wrong asembler code

+ 3 - 2
compiler/msgidx.inc

@@ -654,6 +654,7 @@ const
   cg_e_goto_across_procedures_with_exceptions_not_allowed=06053;
   cg_e_goto_across_procedures_with_exceptions_not_allowed=06053;
   cg_e_mod_only_defined_for_pos_quotient=06054;
   cg_e_mod_only_defined_for_pos_quotient=06054;
   cg_d_autoinlining=06055;
   cg_d_autoinlining=06055;
+  cg_e_function_not_support_by_selected_instruction_set=06056;
   asmr_d_start_reading=07000;
   asmr_d_start_reading=07000;
   asmr_d_finish_reading=07001;
   asmr_d_finish_reading=07001;
   asmr_e_none_label_contain_at=07002;
   asmr_e_none_label_contain_at=07002;
@@ -985,9 +986,9 @@ const
   option_info=11024;
   option_info=11024;
   option_help_pages=11025;
   option_help_pages=11025;
 
 
-  MsgTxtSize = 71162;
+  MsgTxtSize = 71242;
 
 
   MsgIdxMax : array[1..20] of longint=(
   MsgIdxMax : array[1..20] of longint=(
-    26,96,337,121,89,56,126,27,202,64,
+    26,96,337,121,89,57,126,27,202,64,
     57,20,1,1,1,1,1,1,1,1
     57,20,1,1,1,1,1,1,1,1
   );
   );

+ 341 - 338
compiler/msgtxt.inc

@@ -809,395 +809,396 @@ const msgtxt : array[0..000296,1..240] of char=(
   '06054_E_I','n ISO mode, the mod operator is defined only for positive q'+
   '06054_E_I','n ISO mode, the mod operator is defined only for positive q'+
   'uotient'#000+
   'uotient'#000+
   '06055_DL_Auto inlining: $1'#000+
   '06055_DL_Auto inlining: $1'#000+
+  '06056_E_The function used, is not supported by the selected instructio'+
+  'n set: $1'#000+
   '07000_DL_Starting $1 styled assembler parsing'#000+
   '07000_DL_Starting $1 styled assembler parsing'#000+
-  '07001_DL_Finished $1 styled assembler parsing'#000+
+  '07001_DL_Finished $1',' styled assembler parsing'#000+
   '07002_E_Non-label pattern contains @'#000+
   '07002_E_Non-label pattern contains @'#000+
-  '07004_E_Error bui','lding record offset'#000+
+  '07004_E_Error building record offset'#000+
   '07005_E_OFFSET used without identifier'#000+
   '07005_E_OFFSET used without identifier'#000+
   '07006_E_TYPE used without identifier'#000+
   '07006_E_TYPE used without identifier'#000+
   '07007_E_Cannot use local variable or parameters here'#000+
   '07007_E_Cannot use local variable or parameters here'#000+
-  '07008_E_need to use OFFSET here'#000+
+  '07008_E_nee','d to use OFFSET here'#000+
   '07009_E_need to use $ here'#000+
   '07009_E_need to use $ here'#000+
-  '07010_E_Cannot use multiple relo','catable symbols'#000+
+  '07010_E_Cannot use multiple relocatable symbols'#000+
   '07011_E_Relocatable symbol can only be added'#000+
   '07011_E_Relocatable symbol can only be added'#000+
   '07012_E_Invalid constant expression'#000+
   '07012_E_Invalid constant expression'#000+
   '07013_E_Relocatable symbol is not allowed'#000+
   '07013_E_Relocatable symbol is not allowed'#000+
-  '07014_E_Invalid reference syntax'#000+
+  '07014_E_Invalid refer','ence syntax'#000+
   '07015_E_You cannot reach $1 from that code'#000+
   '07015_E_You cannot reach $1 from that code'#000+
-  '07016_E_Local symbols/lab','els are not allowed as references'#000+
+  '07016_E_Local symbols/labels are not allowed as references'#000+
   '07017_E_Invalid base and index register usage'#000+
   '07017_E_Invalid base and index register usage'#000+
   '07018_W_Possible error in object field handling'#000+
   '07018_W_Possible error in object field handling'#000+
-  '07019_E_Wrong scale factor specified'#000+
+  '07019_E_Wrong scale factor speci','fied'#000+
   '07020_E_Multiple index register usage'#000+
   '07020_E_Multiple index register usage'#000+
   '07021_E_Invalid operand type'#000+
   '07021_E_Invalid operand type'#000+
-  '07022_E_','Invalid string as opcode operand: $1'#000+
+  '07022_E_Invalid string as opcode operand: $1'#000+
   '07023_W_@CODE and @DATA not supported'#000+
   '07023_W_@CODE and @DATA not supported'#000+
   '07024_E_Null label references are not allowed'#000+
   '07024_E_Null label references are not allowed'#000+
-  '07025_E_Divide by zero in asm evaluator'#000+
+  '07025_E_Divide by zero in asm evaluator',#000+
   '07026_E_Illegal expression'#000+
   '07026_E_Illegal expression'#000+
   '07027_E_escape sequence ignored: $1'#000+
   '07027_E_escape sequence ignored: $1'#000+
-  '07028_E_Invalid ','symbol reference'#000+
+  '07028_E_Invalid symbol reference'#000+
   '07029_W_Fwait can cause emulation problems with emu387'#000+
   '07029_W_Fwait can cause emulation problems with emu387'#000+
   '07030_W_$1 without operand translated into $1P'#000+
   '07030_W_$1 without operand translated into $1P'#000+
-  '07031_W_ENTER instruction is not supported by Linux kernel'#000+
+  '07031_W_ENTER instruction is not supporte','d by Linux kernel'#000+
   '07032_W_Calling an overload function in assembler'#000+
   '07032_W_Calling an overload function in assembler'#000+
-  '07033_E_Unsu','pported symbol type for operand'#000+
+  '07033_E_Unsupported symbol type for operand'#000+
   '07034_E_Constant value out of bounds'#000+
   '07034_E_Constant value out of bounds'#000+
   '07035_E_Error converting decimal $1'#000+
   '07035_E_Error converting decimal $1'#000+
   '07036_E_Error converting octal $1'#000+
   '07036_E_Error converting octal $1'#000+
-  '07037_E_Error converting binary $1'#000+
+  '07037_E_Error convert','ing binary $1'#000+
   '07038_E_Error converting hexadecimal $1'#000+
   '07038_E_Error converting hexadecimal $1'#000+
-  '07039_H_$1 translated to $','2'#000+
+  '07039_H_$1 translated to $2'#000+
   '07040_W_$1 is associated to an overloaded function'#000+
   '07040_W_$1 is associated to an overloaded function'#000+
   '07041_E_Cannot use SELF outside a method'#000+
   '07041_E_Cannot use SELF outside a method'#000+
   '07042_E_Cannot use OLDEBP outside a nested procedure'#000+
   '07042_E_Cannot use OLDEBP outside a nested procedure'#000+
-  '07043_W_Procedures cannot return any value in asm code'#000+
+  '07043_W_Proce','dures cannot return any value in asm code'#000+
   '07044_E_SEG not supported'#000+
   '07044_E_SEG not supported'#000+
-  '07045_E_Size',' suffix and destination or source size do not match'#000+
+  '07045_E_Size suffix and destination or source size do not match'#000+
   '07046_W_Size suffix and destination or source size do not match'#000+
   '07046_W_Size suffix and destination or source size do not match'#000+
   '07047_E_Assembler syntax error'#000+
   '07047_E_Assembler syntax error'#000+
-  '07048_E_Invalid combination of opcode and operands'#000+
-  '07049_E_Assembler syntax error in operand'#000,
+  '07048_E_Inval','id combination of opcode and operands'#000+
+  '07049_E_Assembler syntax error in operand'#000+
   '07050_E_Assembler syntax error in constant'#000+
   '07050_E_Assembler syntax error in constant'#000+
   '07051_E_Invalid String expression'#000+
   '07051_E_Invalid String expression'#000+
   '07052_W_constant with symbol $1 for address which is not on a pointer'#000+
   '07052_W_constant with symbol $1 for address which is not on a pointer'#000+
-  '07053_E_Unrecognized opcode $1'#000+
+  '07053_E_Unrec','ognized opcode $1'#000+
   '07054_E_Invalid or missing opcode'#000+
   '07054_E_Invalid or missing opcode'#000+
-  '07055_E_Invalid combination ','of prefix and opcode: $1'#000+
+  '07055_E_Invalid combination of prefix and opcode: $1'#000+
   '07056_E_Invalid combination of override and opcode: $1'#000+
   '07056_E_Invalid combination of override and opcode: $1'#000+
   '07057_E_Too many operands on line'#000+
   '07057_E_Too many operands on line'#000+
   '07058_W_NEAR ignored'#000+
   '07058_W_NEAR ignored'#000+
   '07059_W_FAR ignored'#000+
   '07059_W_FAR ignored'#000+
-  '07060_E_Duplicate local symbol $1'#000+
+  '07060','_E_Duplicate local symbol $1'#000+
   '07061_E_Undefined local symbol $1'#000+
   '07061_E_Undefined local symbol $1'#000+
-  '07062_E_Unknown l','abel identifier $1'#000+
+  '07062_E_Unknown label identifier $1'#000+
   '07063_E_Invalid register name'#000+
   '07063_E_Invalid register name'#000+
   '07064_E_Invalid floating point register name'#000+
   '07064_E_Invalid floating point register name'#000+
   '07066_W_Modulo not supported'#000+
   '07066_W_Modulo not supported'#000+
-  '07067_E_Invalid floating point constant $1'#000+
+  '07067_E_Invalid floating point consta','nt $1'#000+
   '07068_E_Invalid floating point expression'#000+
   '07068_E_Invalid floating point expression'#000+
   '07069_E_Wrong symbol type'#000+
   '07069_E_Wrong symbol type'#000+
-  '07070_','E_Cannot index a local var or parameter with a register'#000+
+  '07070_E_Cannot index a local var or parameter with a register'#000+
   '07071_E_Invalid segment override expression'#000+
   '07071_E_Invalid segment override expression'#000+
   '07072_W_Identifier $1 supposed external'#000+
   '07072_W_Identifier $1 supposed external'#000+
-  '07073_E_Strings not allowed as constants'#000+
+  '07073_E_Strings not ','allowed as constants'#000+
   '07074_E_No type of variable specified'#000+
   '07074_E_No type of variable specified'#000+
-  '07075_E_assembler cod','e not returned to text section'#000+
+  '07075_E_assembler code not returned to text section'#000+
   '07076_E_Not a directive or local symbol $1'#000+
   '07076_E_Not a directive or local symbol $1'#000+
   '07077_E_Using a defined name as a local label'#000+
   '07077_E_Using a defined name as a local label'#000+
-  '07078_E_Dollar token is used without an identifier'#000+
+  '07078_E_Dollar token is used without an ','identifier'#000+
   '07079_W_32bit constant created for address'#000+
   '07079_W_32bit constant created for address'#000+
-  '07080_N_.align is target s','pecific, use .balign or .p2align'#000+
+  '07080_N_.align is target specific, use .balign or .p2align'#000+
   '07081_E_Can'#039't access fields directly for parameters'#000+
   '07081_E_Can'#039't access fields directly for parameters'#000+
   '07082_E_Can'#039't access fields of objects/classes directly'#000+
   '07082_E_Can'#039't access fields of objects/classes directly'#000+
-  '07083_E_No size specified and unable to determine the size of the oper'+
-  'ands'#000+
-  '07084_E_Cannot use RESUL','T in this function'#000+
+  '07083_E_No size spe','cified and unable to determine the size of the op'+
+  'erands'#000+
+  '07084_E_Cannot use RESULT in this function'#000+
   '07086_W_"$1" without operand translated into "$1 %st,%st(1)"'#000+
   '07086_W_"$1" without operand translated into "$1 %st,%st(1)"'#000+
   '07087_W_"$1 %st(n)" translated into "$1 %st,%st(n)"'#000+
   '07087_W_"$1 %st(n)" translated into "$1 %st,%st(n)"'#000+
-  '07088_W_"$1 %st(n)" translated into "$1 %st(n),%st"'#000+
+  '07088_W_"$1 %st(n)" translat','ed into "$1 %st(n),%st"'#000+
   '07089_E_Char < not allowed here'#000+
   '07089_E_Char < not allowed here'#000+
-  '07090_E_Char > not allow','ed here'#000+
+  '07090_E_Char > not allowed here'#000+
   '07093_W_ALIGN not supported'#000+
   '07093_W_ALIGN not supported'#000+
   '07094_E_Inc and Dec cannot be together'#000+
   '07094_E_Inc and Dec cannot be together'#000+
   '07095_E_Invalid reglist for movem'#000+
   '07095_E_Invalid reglist for movem'#000+
   '07096_E_Reglist invalid for opcode'#000+
   '07096_E_Reglist invalid for opcode'#000+
-  '07097_E_Higher cpu mode required ($1)'#000+
-  '07098_W_No size specified and unable to determine the size',' of the op'+
-  'erands, using DWORD as default'#000+
+  '07097_E_Higher c','pu mode required ($1)'#000+
+  '07098_W_No size specified and unable to determine the size of the oper'+
+  'ands, using DWORD as default'#000+
   '07099_E_Syntax error while trying to parse a shifter operand'#000+
   '07099_E_Syntax error while trying to parse a shifter operand'#000+
-  '07100_E_Address of packed component is not at a byte boundary'#000+
+  '07100_E_Address of packed component is not at a byte bound','ary'#000+
   '07101_W_No size specified and unable to determine the size of the oper'+
   '07101_W_No size specified and unable to determine the size of the oper'+
-  'ands, ','using BYTE as default'#000+
+  'ands, using BYTE as default'#000+
   '07102_W_Use of +offset(%ebp) for parameters invalid here'#000+
   '07102_W_Use of +offset(%ebp) for parameters invalid here'#000+
   '07103_W_Use of +offset(%ebp) is not compatible with regcall convention'+
   '07103_W_Use of +offset(%ebp) is not compatible with regcall convention'+
   #000+
   #000+
-  '07104_W_Use of -offset(%ebp) is not recommended for local variable acc'+
-  'ess'#000+
-  '07105_W_Use of -','offset(%esp), access may cause a crash or value may '+
-  'be lost'#000+
+  '07104_W_Us','e of -offset(%ebp) is not recommended for local variable a'+
+  'ccess'#000+
+  '07105_W_Use of -offset(%esp), access may cause a crash or value may be'+
+  ' lost'#000+
   '07106_E_VMTOffset must be used in combination with a virtual method, a'+
   '07106_E_VMTOffset must be used in combination with a virtual method, a'+
   'nd "$1" is not virtual'#000+
   'nd "$1" is not virtual'#000+
-  '07107_E_Generating PIC, but reference is not PIC-safe'#000+
-  '07108_E_All registers in a regist','er set must be of the same kind and'+
-  ' width'#000+
+  '07107_E','_Generating PIC, but reference is not PIC-safe'#000+
+  '07108_E_All registers in a register set must be of the same kind and w'+
+  'idth'#000+
   '07109_E_A register set cannot be empty'#000+
   '07109_E_A register set cannot be empty'#000+
   '07110_W_@GOTPCREL is useless and potentially dangereous for local symb'+
   '07110_W_@GOTPCREL is useless and potentially dangereous for local symb'+
   'ols'#000+
   'ols'#000+
-  '07111_W_Constant with general purpose segment register'#000+
-  '07112_E_Invalid offset value f','or $1'#000+
+  '07111','_W_Constant with general purpose segment register'#000+
+  '07112_E_Invalid offset value for $1'#000+
   '07113_E_Invalid register for $1'#000+
   '07113_E_Invalid register for $1'#000+
   '07114_E_SEH directives are allowed only in pure assembler procedures'#000+
   '07114_E_SEH directives are allowed only in pure assembler procedures'#000+
-  '07115_E_Directive "$1" is not supported for the current target'#000+
+  '07115_E_Directive "$1" is not supported for the curre','nt target'#000+
   '07116_E_This function'#039's result location cannot be encoded directly'+
   '07116_E_This function'#039's result location cannot be encoded directly'+
-  ' in ','a single operand when "nostackframe" is used'#000+
+  ' in a single operand when "nostackframe" is used'#000+
   '07117_E_GOTPCREL references in Intel assembler syntax cannot contain a'+
   '07117_E_GOTPCREL references in Intel assembler syntax cannot contain a'+
-  ' base or index register, and their offset must 0.'#000+
+  ' base or index register, and their offset mus','t 0.'#000+
   '07118_E_The current target does not support GOTPCREL relocations'#000+
   '07118_E_The current target does not support GOTPCREL relocations'#000+
-  '07119_W_Ex','ported/global symbols should accessed via the GOT'#000+
+  '07119_W_Exported/global symbols should accessed via the GOT'#000+
   '07120_W_Check size of memory operand "$1"'#000+
   '07120_W_Check size of memory operand "$1"'#000+
-  '07121_W_Check size of memory operand "$1: memory-operand-size is $2 bi'+
-  'ts, but expected [$3 bits]"'#000+
-  '07122_W_Check size of memory operand "$1: memory-o','perand-size is $2 '+
-  'bits, but expected [$3 bits + $4 byte offset]"'#000+
+  '07121_W_Check size of memory operand "$1: memory-operand-size is $2 ','b'+
+  'its, but expected [$3 bits]"'#000+
+  '07122_W_Check size of memory operand "$1: memory-operand-size is $2 bi'+
+  'ts, but expected [$3 bits + $4 byte offset]"'#000+
   '07123_W_Check "$1: offset of memory operand is negative "$2 byte"'#000+
   '07123_W_Check "$1: offset of memory operand is negative "$2 byte"'#000+
-  '07124_W_Check "$1: size of memory operand is empty, but es exists diff'+
-  'erent definitions of the memory size =>','> map to $2 (smallest option)'+
+  '07124_W_Check "$1: size of me','mory operand is empty, but es exists di'+
+  'fferent definitions of the memory size =>> map to $2 (smallest option)'+
   '"'#000+
   '"'#000+
   '07125_E_Invalid register used in memory reference expression: "$1"'#000+
   '07125_E_Invalid register used in memory reference expression: "$1"'#000+
   '08000_F_Too many assembler files'#000+
   '08000_F_Too many assembler files'#000+
-  '08001_F_Selected assembler output not supported'#000+
+  '08001_F_Selected assembler ou','tput not supported'#000+
   '08002_F_Comp not supported'#000+
   '08002_F_Comp not supported'#000+
-  '08003_F_Direct not support for bin','ary writers'#000+
+  '08003_F_Direct not support for binary writers'#000+
   '08004_E_Allocating of data is only allowed in bss section'#000+
   '08004_E_Allocating of data is only allowed in bss section'#000+
   '08005_F_No binary writer selected'#000+
   '08005_F_No binary writer selected'#000+
   '08006_E_Asm: Opcode $1 not in table'#000+
   '08006_E_Asm: Opcode $1 not in table'#000+
-  '08007_E_Asm: $1 invalid combination of opcode and operands'#000+
-  '08008_E_Asm: 16 Bit references not suppor','ted'#000+
+  '08007_E_Asm: $1 inva','lid combination of opcode and operands'#000+
+  '08008_E_Asm: 16 Bit references not supported'#000+
   '08009_E_Asm: Invalid effective address'#000+
   '08009_E_Asm: Invalid effective address'#000+
   '08010_E_Asm: Immediate or reference expected'#000+
   '08010_E_Asm: Immediate or reference expected'#000+
   '08011_E_Asm: $1 value exceeds bounds $2'#000+
   '08011_E_Asm: $1 value exceeds bounds $2'#000+
-  '08012_E_Asm: Short jump is out of range $1'#000+
+  '08012_E_Asm: Short jump is out o','f range $1'#000+
   '08013_E_Asm: Undefined label $1'#000+
   '08013_E_Asm: Undefined label $1'#000+
-  '08014_E_Asm: Comp type not supported ','for this target'#000+
+  '08014_E_Asm: Comp type not supported for this target'#000+
   '08015_E_Asm: Extended type not supported for this target'#000+
   '08015_E_Asm: Extended type not supported for this target'#000+
   '08016_E_Asm: Duplicate label $1'#000+
   '08016_E_Asm: Duplicate label $1'#000+
   '08017_E_Asm: Redefined label $1'#000+
   '08017_E_Asm: Redefined label $1'#000+
-  '08018_E_Asm: First defined here'#000+
+  '08018_E_Asm: First defi','ned here'#000+
   '08019_E_Asm: Invalid register $1'#000+
   '08019_E_Asm: Invalid register $1'#000+
-  '08020_E_Asm: 16 or 32 Bit references n','ot supported'#000+
+  '08020_E_Asm: 16 or 32 Bit references not supported'#000+
   '08021_E_Asm: 64 Bit operands not supported'#000+
   '08021_E_Asm: 64 Bit operands not supported'#000+
   '08022_E_Asm: AH,BH,CH or DH cannot be used in an instruction requiring'+
   '08022_E_Asm: AH,BH,CH or DH cannot be used in an instruction requiring'+
   ' REX prefix'#000+
   ' REX prefix'#000+
-  '08023_E_Missing .seh_endprologue directive'#000+
+  '08023_E_Missing .seh_e','ndprologue directive'#000+
   '08024_E_Function prologue exceeds 255 bytes'#000+
   '08024_E_Function prologue exceeds 255 bytes'#000+
-  '08025_E_.seh_ha','ndlerdata directive without preceding .seh_handler'#000+
+  '08025_E_.seh_handlerdata directive without preceding .seh_handler'#000+
   '08026_F_Relocation count for section $1 exceeds 65535'#000+
   '08026_F_Relocation count for section $1 exceeds 65535'#000+
   '09000_W_Source operating system redefined'#000+
   '09000_W_Source operating system redefined'#000+
-  '09001_I_Assembling (pipe) $1'#000+
+  '09001_I_Assem','bling (pipe) $1'#000+
   '09002_E_Can'#039't create assembler file: $1'#000+
   '09002_E_Can'#039't create assembler file: $1'#000+
-  '09003_E_Can'#039't create obj','ect file: $1 (error code: $2)'#000+
+  '09003_E_Can'#039't create object file: $1 (error code: $2)'#000+
   '09004_E_Can'#039't create archive file: $1'#000+
   '09004_E_Can'#039't create archive file: $1'#000+
   '09005_E_Assembler $1 not found, switching to external assembling'#000+
   '09005_E_Assembler $1 not found, switching to external assembling'#000+
-  '09006_T_Using assembler: $1'#000+
+  '09006_T_Using assembler: $1',#000+
   '09007_E_Error while assembling exitcode $1'#000+
   '09007_E_Error while assembling exitcode $1'#000+
-  '09008_E_Can'#039't call the assembler, er','ror $1 switching to external'+
-  ' assembling'#000+
+  '09008_E_Can'#039't call the assembler, error $1 switching to external a'+
+  'ssembling'#000+
   '09009_I_Assembling $1'#000+
   '09009_I_Assembling $1'#000+
   '09010_I_Assembling with smartlinking $1'#000+
   '09010_I_Assembling with smartlinking $1'#000+
   '09011_W_Object $1 not found, Linking may fail !'#000+
   '09011_W_Object $1 not found, Linking may fail !'#000+
-  '09012_W_Library $1 not found, Linking may fail !'#000+
+  '09012_W_Li','brary $1 not found, Linking may fail !'#000+
   '09013_E_Error while linking'#000+
   '09013_E_Error while linking'#000+
-  '09014_E_Can'#039't',' call the linker, switching to external linking'#000+
+  '09014_E_Can'#039't call the linker, switching to external linking'#000+
   '09015_I_Linking $1'#000+
   '09015_I_Linking $1'#000+
   '09016_E_Util $1 not found, switching to external linking'#000+
   '09016_E_Util $1 not found, switching to external linking'#000+
   '09017_T_Using util $1'#000+
   '09017_T_Using util $1'#000+
-  '09018_E_Creation of Executables not supported'#000+
-  '09019_E_Creation of Dynamic/Shared Libraries not',' supported'#000+
+  '09018_E_Creati','on of Executables not supported'#000+
+  '09019_E_Creation of Dynamic/Shared Libraries not supported'#000+
   '09035_E_Creation of Static Libraries not supported'#000+
   '09035_E_Creation of Static Libraries not supported'#000+
   '09020_I_Closing script $1'#000+
   '09020_I_Closing script $1'#000+
   '09021_E_resource compiler "$1" not found, switching to external mode'#000+
   '09021_E_resource compiler "$1" not found, switching to external mode'#000+
-  '09022_I_Compiling resource $1'#000+
-  '09023_T_unit $1 cannot be statically linked, switchin','g to smart link'+
-  'ing'#000+
+  '090','22_I_Compiling resource $1'#000+
+  '09023_T_unit $1 cannot be statically linked, switching to smart linkin'+
+  'g'#000+
   '09024_T_unit $1 cannot be smart linked, switching to static linking'#000+
   '09024_T_unit $1 cannot be smart linked, switching to static linking'#000+
   '09025_T_unit $1 cannot be shared linked, switching to static linking'#000+
   '09025_T_unit $1 cannot be shared linked, switching to static linking'#000+
-  '09026_E_unit $1 cannot be smart or static linked'#000+
-  '09027_E_unit $1 cannot be shared or',' static linked'#000+
+  '0902','6_E_unit $1 cannot be smart or static linked'#000+
+  '09027_E_unit $1 cannot be shared or static linked'#000+
   '09028_D_Calling resource compiler "$1" with "$2" as command line'#000+
   '09028_D_Calling resource compiler "$1" with "$2" as command line'#000+
   '09029_E_Error while compiling resources'#000+
   '09029_E_Error while compiling resources'#000+
-  '09030_E_Can'#039't call the resource compiler "$1", switching to extern'+
-  'al mode'#000+
+  '09030_E_Can'#039't call the resource compiler',' "$1", switching to exte'+
+  'rnal mode'#000+
   '09031_E_Can'#039't open resource file "$1"'#000+
   '09031_E_Can'#039't open resource file "$1"'#000+
-  '09032_E_','Can'#039't write resource file "$1"'#000+
+  '09032_E_Can'#039't write resource file "$1"'#000+
   '09033_N_File "$1" not found for backquoted cat command'#000+
   '09033_N_File "$1" not found for backquoted cat command'#000+
   '09034_W_"$1" not found, this will probably cause a linking failure'#000+
   '09034_W_"$1" not found, this will probably cause a linking failure'#000+
-  '09128_F_Can'#039't post process executable $1'#000+
+  '09128_F','_Can'#039't post process executable $1'#000+
   '09129_F_Can'#039't open executable $1'#000+
   '09129_F_Can'#039't open executable $1'#000+
-  '09130_X_Size ','of Code: $1 bytes'#000+
+  '09130_X_Size of Code: $1 bytes'#000+
   '09131_X_Size of initialized data: $1 bytes'#000+
   '09131_X_Size of initialized data: $1 bytes'#000+
   '09132_X_Size of uninitialized data: $1 bytes'#000+
   '09132_X_Size of uninitialized data: $1 bytes'#000+
   '09133_X_Stack space reserved: $1 bytes'#000+
   '09133_X_Stack space reserved: $1 bytes'#000+
-  '09134_X_Stack space committed: $1 bytes'#000+
-  '09200_F_Executable image size is too big for $1 target.',#000+
+  '09134_X_Stack s','pace committed: $1 bytes'#000+
+  '09200_F_Executable image size is too big for $1 target.'#000+
   '09201_W_Object file "$1" contains 32-bit absolute relocation to symbol'+
   '09201_W_Object file "$1" contains 32-bit absolute relocation to symbol'+
   ' "$2".'#000+
   ' "$2".'#000+
   '10000_T_Unitsearch: $1'#000+
   '10000_T_Unitsearch: $1'#000+
   '10001_T_PPU Loading $1'#000+
   '10001_T_PPU Loading $1'#000+
   '10002_U_PPU Name: $1'#000+
   '10002_U_PPU Name: $1'#000+
-  '10003_U_PPU Flags: $1'#000+
+  '10003_U_PPU Fla','gs: $1'#000+
   '10004_U_PPU Crc: $1'#000+
   '10004_U_PPU Crc: $1'#000+
   '10005_U_PPU Time: $1'#000+
   '10005_U_PPU Time: $1'#000+
   '10006_U_PPU File too short'#000+
   '10006_U_PPU File too short'#000+
-  '10007','_U_PPU Invalid Header (no PPU at the begin)'#000+
+  '10007_U_PPU Invalid Header (no PPU at the begin)'#000+
   '10008_U_PPU Invalid Version $1'#000+
   '10008_U_PPU Invalid Version $1'#000+
   '10009_U_PPU is compiled for another processor'#000+
   '10009_U_PPU is compiled for another processor'#000+
-  '10010_U_PPU is compiled for another target'#000+
+  '10010_U_PPU is compiled for another tar','get'#000+
   '10011_U_PPU Source: $1'#000+
   '10011_U_PPU Source: $1'#000+
   '10012_U_Writing $1'#000+
   '10012_U_Writing $1'#000+
   '10013_F_Can'#039't Write PPU-File'#000+
   '10013_F_Can'#039't Write PPU-File'#000+
-  '10014','_F_Error reading PPU-File'#000+
+  '10014_F_Error reading PPU-File'#000+
   '10015_F_unexpected end of PPU-File'#000+
   '10015_F_unexpected end of PPU-File'#000+
   '10016_F_Invalid PPU-File entry: $1'#000+
   '10016_F_Invalid PPU-File entry: $1'#000+
   '10017_F_PPU Dbx count problem'#000+
   '10017_F_PPU Dbx count problem'#000+
   '10018_E_Illegal unit name: $1'#000+
   '10018_E_Illegal unit name: $1'#000+
-  '10019_F_Too much units'#000+
+  '1001','9_F_Too much units'#000+
   '10020_F_Circular unit reference between $1 and $2'#000+
   '10020_F_Circular unit reference between $1 and $2'#000+
-  '10021_F_Can',#039't compile unit $1, no sources available'#000+
+  '10021_F_Can'#039't compile unit $1, no sources available'#000+
   '10022_F_Can'#039't find unit $1 used by $2'#000+
   '10022_F_Can'#039't find unit $1 used by $2'#000+
   '10023_W_Unit $1 was not found but $2 exists'#000+
   '10023_W_Unit $1 was not found but $2 exists'#000+
-  '10024_F_Unit $1 searched but $2 found'#000+
+  '10024_F_Unit $1 searched but $2 found',#000+
   '10025_W_Compiling the system unit requires the -Us switch'#000+
   '10025_W_Compiling the system unit requires the -Us switch'#000+
-  '10026_F_There were $1',' errors compiling module, stopping'#000+
+  '10026_F_There were $1 errors compiling module, stopping'#000+
   '10027_U_Load from $1 ($2) unit $3'#000+
   '10027_U_Load from $1 ($2) unit $3'#000+
   '10028_U_Recompiling $1, checksum changed for $2'#000+
   '10028_U_Recompiling $1, checksum changed for $2'#000+
   '10029_U_Recompiling $1, source found only'#000+
   '10029_U_Recompiling $1, source found only'#000+
-  '10030_U_Recompiling unit, static lib is older than ppufile'#000+
-  '10031_U_Recompiling un','it, shared lib is older than ppufile'#000+
+  '1','0030_U_Recompiling unit, static lib is older than ppufile'#000+
+  '10031_U_Recompiling unit, shared lib is older than ppufile'#000+
   '10032_U_Recompiling unit, obj and asm are older than ppufile'#000+
   '10032_U_Recompiling unit, obj and asm are older than ppufile'#000+
   '10033_U_Recompiling unit, obj is older than asm'#000+
   '10033_U_Recompiling unit, obj is older than asm'#000+
-  '10034_U_Parsing interface of $1'#000+
+  '10034_U_Parsin','g interface of $1'#000+
   '10035_U_Parsing implementation of $1'#000+
   '10035_U_Parsing implementation of $1'#000+
-  '10036_U_Second load for u','nit $1'#000+
+  '10036_U_Second load for unit $1'#000+
   '10037_U_PPU Check file $1 time $2'#000+
   '10037_U_PPU Check file $1 time $2'#000+
   '10040_W_Can'#039't recompile unit $1, but found modifed include files'#000+
   '10040_W_Can'#039't recompile unit $1, but found modifed include files'#000+
-  '10041_U_File $1 is newer than the one used for creating PPU file $2'#000+
-  '10042_U_Trying to use a unit which was compiled with a different F','PU'+
-  ' mode'#000+
+  '10041_U_File $1 is newer than the one used for creatin','g PPU file $2'#000+
+  '10042_U_Trying to use a unit which was compiled with a different FPU m'+
+  'ode'#000+
   '10043_U_Loading interface units from $1'#000+
   '10043_U_Loading interface units from $1'#000+
   '10044_U_Loading implementation units from $1'#000+
   '10044_U_Loading implementation units from $1'#000+
   '10045_U_Interface CRC changed for unit $1'#000+
   '10045_U_Interface CRC changed for unit $1'#000+
-  '10046_U_Implementation CRC changed for unit $1'#000+
+  '10046_U_Implementation CR','C changed for unit $1'#000+
   '10047_U_Finished compiling unit $1'#000+
   '10047_U_Finished compiling unit $1'#000+
-  '10048_U_Adding dependen','cy: $1 depends on $2'#000+
+  '10048_U_Adding dependency: $1 depends on $2'#000+
   '10049_U_No reload, is caller: $1'#000+
   '10049_U_No reload, is caller: $1'#000+
   '10050_U_No reload, already in second compile: $1'#000+
   '10050_U_No reload, already in second compile: $1'#000+
   '10051_U_Flag for reload: $1'#000+
   '10051_U_Flag for reload: $1'#000+
   '10052_U_Forced reloading'#000+
   '10052_U_Forced reloading'#000+
-  '10053_U_Previous state of $1: $2'#000+
-  '10054_U_Already compiling $1, setting second compil','e'#000+
+  '1005','3_U_Previous state of $1: $2'#000+
+  '10054_U_Already compiling $1, setting second compile'#000+
   '10055_U_Loading unit $1'#000+
   '10055_U_Loading unit $1'#000+
   '10056_U_Finished loading unit $1'#000+
   '10056_U_Finished loading unit $1'#000+
   '10057_U_Registering new unit $1'#000+
   '10057_U_Registering new unit $1'#000+
   '10058_U_Re-resolving unit $1'#000+
   '10058_U_Re-resolving unit $1'#000+
-  '10059_U_Skipping re-resolving unit $1, still loading used units'#000+
+  '10059_U_Skipping re-resolving unit $1, s','till loading used units'#000+
   '10060_U_Unloading resource unit $1 (not needed)'#000+
   '10060_U_Unloading resource unit $1 (not needed)'#000+
-  '10061_E_','Unit $1 was compiled using a different whole program optimiz'+
-  'ation feedback input ($2, $3); recompile it without wpo or use the sam'+
-  'e wpo feedback input file for this compilation invocation'#000+
-  '10062_U_Indirect interface (objects/classes) CRC cha','nged for unit $1'+
-  #000+
+  '10061_E_Unit $1 was compiled using a different whole program optimizat'+
+  'ion feedback input ($2, $3); recompile it without wpo or use the same '+
+  'wpo feedback input file for ','this compilation invocation'#000+
+  '10062_U_Indirect interface (objects/classes) CRC changed for unit $1'#000+
   '10063_U_PPU is compiled for another i8086 memory model'#000+
   '10063_U_PPU is compiled for another i8086 memory model'#000+
   '11000_O_$1 [options] <inputfile> [options]'#000+
   '11000_O_$1 [options] <inputfile> [options]'#000+
-  '11001_W_Only one source file supported, changing source file to compil'+
-  'e from "$1" into "$2"'#000+
-  '11002_W_DEF file can be created o','nly for OS/2'#000+
+  '11001_W_Only one source file supported, chang','ing source file to comp'+
+  'ile from "$1" into "$2"'#000+
+  '11002_W_DEF file can be created only for OS/2'#000+
   '11003_E_nested response files are not supported'#000+
   '11003_E_nested response files are not supported'#000+
   '11004_F_No source file name in command line'#000+
   '11004_F_No source file name in command line'#000+
   '11005_N_No option inside $1 config file'#000+
   '11005_N_No option inside $1 config file'#000+
-  '11006_E_Illegal parameter: $1'#000+
+  '11006_E_Illegal',' parameter: $1'#000+
   '11007_H_-? writes help pages'#000+
   '11007_H_-? writes help pages'#000+
-  '11008_F_Too many config files nested',#000+
+  '11008_F_Too many config files nested'#000+
   '11009_F_Unable to open file $1'#000+
   '11009_F_Unable to open file $1'#000+
   '11010_D_Reading further options from $1'#000+
   '11010_D_Reading further options from $1'#000+
   '11011_W_Target is already set to: $1'#000+
   '11011_W_Target is already set to: $1'#000+
-  '11012_W_Shared libs not supported on DOS platform, reverting to static'+
-  #000+
-  '11013_F_In options file $1 at line $2 too many \var{\#IF(N)D','EFs} enc'+
-  'ountered'#000+
+  '11012_W_Shared libs not supported on DOS platform, ','reverting to stat'+
+  'ic'#000+
+  '11013_F_In options file $1 at line $2 too many \var{\#IF(N)DEFs} encou'+
+  'ntered'#000+
   '11014_F_In options file $1 at line $2 unexpected \var{\#ENDIFs} encoun'+
   '11014_F_In options file $1 at line $2 unexpected \var{\#ENDIFs} encoun'+
   'tered'#000+
   'tered'#000+
   '11015_F_Open conditional at the end of the options file'#000+
   '11015_F_Open conditional at the end of the options file'#000+
-  '11016_W_Debug information generation is not supported by this executab'+
-  'le'#000+
-  '11017_H_Try recomp','iling with -dGDB'#000+
+  '11016_W_Deb','ug information generation is not supported by this execut'+
+  'able'#000+
+  '11017_H_Try recompiling with -dGDB'#000+
   '11018_W_You are using the obsolete switch $1'#000+
   '11018_W_You are using the obsolete switch $1'#000+
   '11019_W_You are using the obsolete switch $1, please use $2'#000+
   '11019_W_You are using the obsolete switch $1, please use $2'#000+
-  '11020_N_Switching assembler to default source writing assembler'#000+
-  '11021_W_Assembler output selected "$1" is not compatib','le with "$2"'#000+
+  '11020_N_Switching assembler to default',' source writing assembler'#000+
+  '11021_W_Assembler output selected "$1" is not compatible with "$2"'#000+
   '11022_W_"$1" assembler use forced'#000+
   '11022_W_"$1" assembler use forced'#000+
   '11026_T_Reading options from file $1'#000+
   '11026_T_Reading options from file $1'#000+
   '11027_T_Reading options from environment $1'#000+
   '11027_T_Reading options from environment $1'#000+
   '11028_D_Handling option "$1"'#000+
   '11028_D_Handling option "$1"'#000+
-  '11029_O_*** press enter ***'#000+
+  '110','29_O_*** press enter ***'#000+
   '11030_H_Start of reading config file $1'#000+
   '11030_H_Start of reading config file $1'#000+
-  '11031_H_End of ','reading config file $1'#000+
+  '11031_H_End of reading config file $1'#000+
   '11032_D_interpreting option "$1"'#000+
   '11032_D_interpreting option "$1"'#000+
   '11036_D_interpreting firstpass option "$1"'#000+
   '11036_D_interpreting firstpass option "$1"'#000+
   '11033_D_interpreting file option "$1"'#000+
   '11033_D_interpreting file option "$1"'#000+
-  '11034_D_Reading config file "$1"'#000+
+  '11034_D_Reading config ','file "$1"'#000+
   '11035_D_found source file name "$1"'#000+
   '11035_D_found source file name "$1"'#000+
   '11039_E_Unknown codepage "$1"'#000+
   '11039_E_Unknown codepage "$1"'#000+
-  '1104','0_F_Config file $1 is a directory'#000+
+  '11040_F_Config file $1 is a directory'#000+
   '11041_W_Assembler output selected "$1" cannot generate debug info, deb'+
   '11041_W_Assembler output selected "$1" cannot generate debug info, deb'+
   'ugging disabled'#000+
   'ugging disabled'#000+
-  '11042_W_Use of ppc386.cfg is deprecated, please use fpc.cfg instead'#000+
-  '11043_F_In options file $1 at line $2 \var{\#ELSE} d','irective without'+
-  ' \var{\#IF(N)DEF} found'#000+
+  '11042_W_Use of ppc386.cfg is deprecated,',' please use fpc.cfg instead'#000+
+  '11043_F_In options file $1 at line $2 \var{\#ELSE} directive without \'+
+  'var{\#IF(N)DEF} found'#000+
   '11044_F_Option "$1" is not, or not yet, supported on the current targe'+
   '11044_F_Option "$1" is not, or not yet, supported on the current targe'+
   't platform'#000+
   't platform'#000+
-  '11045_F_The feature "$1" is not, or not yet, supported on the selected'+
-  ' target platform'#000+
-  '11046_N_DWARF debug information ','cannot be used with smart linking on'+
-  ' this target, switching to static linking'#000+
+  '11045_F_The feature "$1" is not, or not',' yet, supported on the select'+
+  'ed target platform'#000+
+  '11046_N_DWARF debug information cannot be used with smart linking on t'+
+  'his target, switching to static linking'#000+
   '11047_W_Option "$1" is ignored for the current target platform.'#000+
   '11047_W_Option "$1" is ignored for the current target platform.'#000+
-  '11048_W_Disabling external debug information because it is unsupported'+
-  ' for the selected target/deb','ug format combination.'#000+
+  '11048_W_Disabling ','external debug information because it is unsupport'+
+  'ed for the selected target/debug format combination.'#000+
   '11049_N_DWARF debug information cannot be used with smart linking with'+
   '11049_N_DWARF debug information cannot be used with smart linking with'+
   ' external assembler, disabling static library creation.'#000+
   ' external assembler, disabling static library creation.'#000+
-  '11050_E_Invalid value for MACOSX_DEPLOYMENT_TARGET environment variabl'+
-  'e: $1'#000+
-  '11051_E_Invalid',' value for IPHONEOS_DEPLOYMENT_TARGET environment var'+
-  'iable: $1'#000+
+  '11050_E_Inv','alid value for MACOSX_DEPLOYMENT_TARGET environment varia'+
+  'ble: $1'#000+
+  '11051_E_Invalid value for IPHONEOS_DEPLOYMENT_TARGET environment varia'+
+  'ble: $1'#000+
   '11052_E_You must use a FPU type of VFPV2, VFPV3 or VFPV3_D16 when usin'+
   '11052_E_You must use a FPU type of VFPV2, VFPV3 or VFPV3_D16 when usin'+
   'g the EABIHF ABI target'#000+
   'g the EABIHF ABI target'#000+
-  '11053_W_The selected debug format is not supported on the current targ'+
-  'et, not chang','ing the current setting'#000+
+  '110','53_W_The selected debug format is not supported on the current ta'+
+  'rget, not changing the current setting'#000+
   '11054_E_argument to "$1" is missing'#000+
   '11054_E_argument to "$1" is missing'#000+
   '11055_E_malformed parameter: $1'#000+
   '11055_E_malformed parameter: $1'#000+
   '11056_W_Smart linking requires external linker'#000+
   '11056_W_Smart linking requires external linker'#000+
-  '12000_F_Cannot open whole program optimization feedback file "$1"'#000+
-  '12001_D_Processing whole program op','timization information in wpo fee'+
-  'dback file "$1"'#000+
+  '12000_F_Cannot open w','hole program optimization feedback file "$1"'#000+
+  '12001_D_Processing whole program optimization information in wpo feedb'+
+  'ack file "$1"'#000+
   '12002_D_Finished processing the whole program optimization information'+
   '12002_D_Finished processing the whole program optimization information'+
   ' in wpo feedback file "$1"'#000+
   ' in wpo feedback file "$1"'#000+
-  '12003_E_Expected section header, but got "$2" at line $1 of wpo feedba'+
-  'ck file'#000+
-  '12004_W_No handl','er registered for whole program optimization section'+
-  ' "$2" at line $1 of wpo feedback file, ignoring'#000+
-  '12005_D_Found whole program optimization section "$1" with information'+
-  ' about "$2"'#000+
-  '12006_F_The selected whole program optimizations require a',' previousl'+
-  'y generated feedback file (use -Fw to specify)'#000+
+  '12003_E_Expect','ed section header, but got "$2" at line $1 of wpo feed'+
+  'back file'#000+
+  '12004_W_No handler registered for whole program optimization section "'+
+  '$2" at line $1 of wpo feedback file, ignoring'#000+
+  '12005_D_Found whole program optimization section "$1" with i','nformati'+
+  'on about "$2"'#000+
+  '12006_F_The selected whole program optimizations require a previously '+
+  'generated feedback file (use -Fw to specify)'#000+
   '12007_E_No collected information necessary to perform "$1" whole progr'+
   '12007_E_No collected information necessary to perform "$1" whole progr'+
   'am optimization found'#000+
   'am optimization found'#000+
-  '12008_F_Specify a whole program optimization feedback file to store th'+
-  'e generated info in (','using -FW)'#000+
+  '12008_F_Spe','cify a whole program optimization feedback file to store '+
+  'the generated info in (using -FW)'#000+
   '12009_E_Not generating any whole program optimization information, yet'+
   '12009_E_Not generating any whole program optimization information, yet'+
   ' a feedback file was specified (using -FW)'#000+
   ' a feedback file was specified (using -FW)'#000+
-  '12010_E_Not performing any whole program optimizations, yet an input f'+
-  'eedback file was specified (using -Fw)'#000+
-  '12011_D','_Skipping whole program optimization section "$1", because no'+
-  't needed by the requested optimizations'#000+
-  '12012_W_Overriding previously read information for "$1" from feedback '+
-  'input file using information in section "$2"'#000+
-  '12013_E_Cannot extract s','ymbol liveness information from program when'+
-  ' stripping symbols, use -Xs-'#000+
+  '12010_E_Not performing any whole pro','gram optimizations, yet an input'+
+  ' feedback file was specified (using -Fw)'#000+
+  '12011_D_Skipping whole program optimization section "$1", because not '+
+  'needed by the requested optimizations'#000+
+  '12012_W_Overriding previously read information for "$1" fro','m feedbac'+
+  'k input file using information in section "$2"'#000+
+  '12013_E_Cannot extract symbol liveness information from program when s'+
+  'tripping symbols, use -Xs-'#000+
   '12014_E_Cannot extract symbol liveness information from program when w'+
   '12014_E_Cannot extract symbol liveness information from program when w'+
   'hen not linking'#000+
   'hen not linking'#000+
-  '12015_F_Cannot find "$1" or "$2" to extract symbol liveness informatio'+
-  'n from link','ed program'#000+
+  '1','2015_F_Cannot find "$1" or "$2" to extract symbol liveness informat'+
+  'ion from linked program'#000+
   '12016_E_Error during reading symbol liveness information produced by "'+
   '12016_E_Error during reading symbol liveness information produced by "'+
   '$1"'#000+
   '$1"'#000+
   '12017_F_Error executing "$1" (exitcode: $2) to extract symbol informat'+
   '12017_F_Error executing "$1" (exitcode: $2) to extract symbol informat'+
-  'ion from linked program'#000+
-  '12018_E_Collection of symbol liveness information can only he','lp when'+
-  ' using smart linking, use -CX -XX'#000+
+  'ion f','rom linked program'#000+
+  '12018_E_Collection of symbol liveness information can only help when u'+
+  'sing smart linking, use -CX -XX'#000+
   '12019_E_Cannot create specified whole program optimisation feedback fi'+
   '12019_E_Cannot create specified whole program optimisation feedback fi'+
   'le "$1"'#000+
   'le "$1"'#000+
-  '11023_Free Pascal Compiler version $FPCFULLVERSION [$FPCDATE] for $FPC'+
-  'CPU'#010+
-  'Copyright (c) 1993-2014 by Florian Klaempfl and',' others'#000+
+  '11023_Free Pascal Compiler version $FPCFU','LLVERSION [$FPCDATE] for $F'+
+  'PCCPU'#010+
+  'Copyright (c) 1993-2014 by Florian Klaempfl and others'#000+
   '11024_Free Pascal Compiler version $FPCVERSION'#010+
   '11024_Free Pascal Compiler version $FPCVERSION'#010+
   #010+
   #010+
   'Compiler Date      : $FPCDATE'#010+
   'Compiler Date      : $FPCDATE'#010+
@@ -1206,11 +1207,11 @@ const msgtxt : array[0..000296,1..240] of char=(
   'Supported targets:'#010+
   'Supported targets:'#010+
   '  $OSTARGETS'#010+
   '  $OSTARGETS'#010+
   #010+
   #010+
-  'Supported CPU instruction sets:'#010+
+  'Supported C','PU instruction sets:'#010+
   '  $INSTRUCTIONSETS'#010+
   '  $INSTRUCTIONSETS'#010+
   #010+
   #010+
   'Supported FPU instruction sets:'#010+
   'Supported FPU instruction sets:'#010+
-  '  $FPUI','NSTRUCTIONSETS'#010+
+  '  $FPUINSTRUCTIONSETS'#010+
   #010+
   #010+
   'Supported inline assembler modes:'#010+
   'Supported inline assembler modes:'#010+
   '  $ASMMODES'#010+
   '  $ASMMODES'#010+
@@ -1221,414 +1222,416 @@ const msgtxt : array[0..000296,1..240] of char=(
   'Supported Optimizations:'#010+
   'Supported Optimizations:'#010+
   '  $OPTIMIZATIONS'#010+
   '  $OPTIMIZATIONS'#010+
   #010+
   #010+
-  'Supported Whole Program Optimizations:'#010+
+  'Supported Whole ','Program Optimizations:'#010+
   '  All'#010+
   '  All'#010+
   '  $WPOPTIMIZATIONS'#010+
   '  $WPOPTIMIZATIONS'#010+
   #010+
   #010+
-  'Supported Microcontroller types',':'#010+
+  'Supported Microcontroller types:'#010+
   '  $CONTROLLERTYPES'#010+
   '  $CONTROLLERTYPES'#010+
   #010+
   #010+
   'This program comes under the GNU General Public Licence'#010+
   'This program comes under the GNU General Public Licence'#010+
   'For more information read COPYING.v2'#010+
   'For more information read COPYING.v2'#010+
   #010+
   #010+
   'Please report bugs in our bug tracker on:'#010+
   'Please report bugs in our bug tracker on:'#010+
-  '                 http://bugs.freepascal.org'#010+
-  #010+
-  'More information may be found on our ','WWW pages (including directions'+
+  '  ','               http://bugs.freepascal.org'#010+
   #010+
   #010+
+  'More information may be found on our WWW pages (including directions'#010+
   'for mailing lists useful for asking questions or discussing potential'#010+
   'for mailing lists useful for asking questions or discussing potential'#010+
   'new features, etc.):'#010+
   'new features, etc.):'#010+
-  '                 http://www.freepascal.org'#000+
+  '                 http://www.freepasca','l.org'#000+
   '11025_**0*_Put + after a boolean switch option to enable it, - to disa'+
   '11025_**0*_Put + after a boolean switch option to enable it, - to disa'+
-  'ble ','it'#010+
+  'ble it'#010+
   '**1a_The compiler does not delete the generated assembler file'#010+
   '**1a_The compiler does not delete the generated assembler file'#010+
   '**2al_List sourcecode lines in assembler file'#010+
   '**2al_List sourcecode lines in assembler file'#010+
-  '**2an_List node info in assembler file (-dEXTDEBUG compiler)'#010+
-  '**2ao_Add an extra option to external assembler call (ignored for i','n'+
-  'ternal)'#010+
+  '**2an_List node info in assembler file (-dEXTDEB','UG compiler)'#010+
+  '**2ao_Add an extra option to external assembler call (ignored for inte'+
+  'rnal)'#010+
   '*L2ap_Use pipes instead of creating temporary assembler files'#010+
   '*L2ap_Use pipes instead of creating temporary assembler files'#010+
   '**2ar_List register allocation/release info in assembler file'#010+
   '**2ar_List register allocation/release info in assembler file'#010+
-  '**2at_List temp allocation/release info in assembler file'#010+
+  '**2at_List temp allocation/','release info in assembler file'#010+
   '**1A<x>_Output format:'#010+
   '**1A<x>_Output format:'#010+
-  '**2Adefault_Use default as','sembler'#010+
+  '**2Adefault_Use default assembler'#010+
   '3*2Aas_Assemble using GNU AS'#010+
   '3*2Aas_Assemble using GNU AS'#010+
   '3*2Amacho_Mach-O (Darwin, Intel 32 bit) using internal writer'#010+
   '3*2Amacho_Mach-O (Darwin, Intel 32 bit) using internal writer'#010+
   '8*2Anasm_Assemble using Nasm'#010+
   '8*2Anasm_Assemble using Nasm'#010+
-  '8*2Anasmobj_Assemble using Nasm'#010+
+  '8*2Anasmobj_Assemble using Nasm'#010,
   '3*2Anasm_Assemble using Nasm'#010+
   '3*2Anasm_Assemble using Nasm'#010+
   '3*2Anasmcoff_COFF (Go32v2) file using Nasm'#010+
   '3*2Anasmcoff_COFF (Go32v2) file using Nasm'#010+
-  '3*2Anasm','elf_ELF32 (Linux) file using Nasm'#010+
+  '3*2Anasmelf_ELF32 (Linux) file using Nasm'#010+
   '3*2Anasmwin32_Win32 object file using Nasm'#010+
   '3*2Anasmwin32_Win32 object file using Nasm'#010+
   '3*2Anasmwdosx_Win32/WDOSX object file using Nasm'#010+
   '3*2Anasmwdosx_Win32/WDOSX object file using Nasm'#010+
-  '3*2Anasmdarwin macho32 object file using Nasm (experimental)'#010+
+  '3*2Anasmdarwin macho32 object file',' using Nasm (experimental)'#010+
   '3*2Awasm_Obj file using Wasm (Watcom)'#010+
   '3*2Awasm_Obj file using Wasm (Watcom)'#010+
-  '3*2Anasmobj_Obj',' file using Nasm'#010+
+  '3*2Anasmobj_Obj file using Nasm'#010+
   '3*2Amasm_Obj file using Masm (Microsoft)'#010+
   '3*2Amasm_Obj file using Masm (Microsoft)'#010+
   '3*2Atasm_Obj file using Tasm (Borland)'#010+
   '3*2Atasm_Obj file using Tasm (Borland)'#010+
   '3*2Aelf_ELF (Linux) using internal writer'#010+
   '3*2Aelf_ELF (Linux) using internal writer'#010+
-  '3*2Acoff_COFF (Go32v2) using internal writer'#010+
+  '3*2Acoff_COFF (Go32v2',') using internal writer'#010+
   '3*2Apecoff_PE-COFF (Win32) using internal writer'#010+
   '3*2Apecoff_PE-COFF (Win32) using internal writer'#010+
-  '3*2Ayas','m_Assmeble using Yasm (experimental)'#010+
+  '3*2Ayasm_Assmeble using Yasm (experimental)'#010+
   '4*2Aas_Assemble using GNU AS'#010+
   '4*2Aas_Assemble using GNU AS'#010+
   '4*2Agas_Assemble using GNU GAS'#010+
   '4*2Agas_Assemble using GNU GAS'#010+
   '4*2Agas-darwin_Assemble darwin Mach-O64 using GNU GAS'#010+
   '4*2Agas-darwin_Assemble darwin Mach-O64 using GNU GAS'#010+
-  '4*2Amasm_Win64 object file using ml64 (Microsoft)'#010+
-  '4*2Apecoff_PE-COFF (Win64) using intern','al writer'#010+
+  '4*2Amasm_','Win64 object file using ml64 (Microsoft)'#010+
+  '4*2Apecoff_PE-COFF (Win64) using internal writer'#010+
   '4*2Aelf_ELF (Linux-64bit) using internal writer'#010+
   '4*2Aelf_ELF (Linux-64bit) using internal writer'#010+
   '4*2Ayasm_Assemble using Yasm (experimental)'#010+
   '4*2Ayasm_Assemble using Yasm (experimental)'#010+
   '4*2Anasm_Assemble  using Nasm (experimental)'#010+
   '4*2Anasm_Assemble  using Nasm (experimental)'#010+
-  '4*2Anasmwin64_Assemble Win64 object file using Nasm (experimental)'#010+
-  '4*2Anasmelf_Assemble Linux','-64bit object file using Nasm (experimenta'+
-  'l)'#010+
+  '4*2Anasmwin64','_Assemble Win64 object file using Nasm (experimental)'#010+
+  '4*2Anasmelf_Assemble Linux-64bit object file using Nasm (experimental)'+
+  #010+
   '4*2Anasmdarwin_Assemble darwin macho64 object file using Nasm (experim'+
   '4*2Anasmdarwin_Assemble darwin macho64 object file using Nasm (experim'+
   'ental)'#010+
   'ental)'#010+
   '6*2Aas_Unix o-file using GNU AS'#010+
   '6*2Aas_Unix o-file using GNU AS'#010+
-  '6*2Agas_GNU Motorola assembler'#010+
+  '6*2Aga','s_GNU Motorola assembler'#010+
   '6*2Amit_MIT Syntax (old GAS)'#010+
   '6*2Amit_MIT Syntax (old GAS)'#010+
-  '6*2Amot_Standard Motorola ','assembler'#010+
+  '6*2Amot_Standard Motorola assembler'#010+
   'A*2Aas_Assemble using GNU AS'#010+
   'A*2Aas_Assemble using GNU AS'#010+
   'P*2Aas_Assemble using GNU AS'#010+
   'P*2Aas_Assemble using GNU AS'#010+
   'S*2Aas_Assemble using GNU AS'#010+
   'S*2Aas_Assemble using GNU AS'#010+
   '**1b_Generate browser info'#010+
   '**1b_Generate browser info'#010+
   '**2bl_Generate local symbol info'#010+
   '**2bl_Generate local symbol info'#010+
-  '**1B_Build all modules'#010+
+  '**1','B_Build all modules'#010+
   '**1C<x>_Code generation options:'#010+
   '**1C<x>_Code generation options:'#010+
-  '**2C3_Turn on ieee error ch','ecking for constants'#010+
+  '**2C3_Turn on ieee error checking for constants'#010+
   '**2Ca<x>_Select ABI, see fpc -i for possible values'#010+
   '**2Ca<x>_Select ABI, see fpc -i for possible values'#010+
   '**2Cb_Generate code for a big-endian variant of the target architectur'+
   '**2Cb_Generate code for a big-endian variant of the target architectur'+
   'e'#010+
   'e'#010+
-  '**2Cc<x>_Set default calling convention to <x>'#010+
-  '**2CD_Create also dynamic library (not supported',')'#010+
+  '**2Cc<x>_Set de','fault calling convention to <x>'#010+
+  '**2CD_Create also dynamic library (not supported)'#010+
   '**2Ce_Compilation with emulated floating point opcodes'#010+
   '**2Ce_Compilation with emulated floating point opcodes'#010+
   '**2Cf<x>_Select fpu instruction set to use, see fpc -i for possible va'+
   '**2Cf<x>_Select fpu instruction set to use, see fpc -i for possible va'+
   'lues'#010+
   'lues'#010+
-  '**2CF<x>_Minimal floating point constant precision (default, 32, 64)'#010+
+  '**2CF<x>_Minimal floating po','int constant precision (default, 32, 64)'+
+  #010+
   '**2Cg_Generate PIC code'#010+
   '**2Cg_Generate PIC code'#010+
-  '**2Ch<n>_<n> by','tes heap (between 1023 and 67107840)'#010+
+  '**2Ch<n>_<n> bytes heap (between 1023 and 67107840)'#010+
   '**2Ci_IO-checking'#010+
   '**2Ci_IO-checking'#010+
   'A*2CI<x>_Select instruction set on ARM: ARM or THUMB'#010+
   'A*2CI<x>_Select instruction set on ARM: ARM or THUMB'#010+
   '**2Cn_Omit linking stage'#010+
   '**2Cn_Omit linking stage'#010+
-  'P*2CN_Generate nil-pointer checks (AIX-only)'#010+
+  'P*2CN_Generate nil-pointer ','checks (AIX-only)'#010+
   '**2Co_Check overflow of integer operations'#010+
   '**2Co_Check overflow of integer operations'#010+
-  '**2CO_Check for pos','sible overflow of integer operations'#010+
+  '**2CO_Check for possible overflow of integer operations'#010+
   '**2Cp<x>_Select instruction set, see fpc -i for possible values'#010+
   '**2Cp<x>_Select instruction set, see fpc -i for possible values'#010+
   '**2CP<x>=<y>_ packing settings'#010+
   '**2CP<x>=<y>_ packing settings'#010+
-  '**3CPPACKSET=<y>_ <y> set allocation: 0, 1 or DEFAULT or NORMAL, 2, 4 '+
-  'and 8'#010+
+  '**3CPPACKSET=<y>_ <y> set al','location: 0, 1 or DEFAULT or NORMAL, 2, '+
+  '4 and 8'#010+
   '**2Cr_Range checking'#010+
   '**2Cr_Range checking'#010+
-  '**2CR_Verif','y object method call validity'#010+
+  '**2CR_Verify object method call validity'#010+
   '**2Cs<n>_Set stack checking size to <n>'#010+
   '**2Cs<n>_Set stack checking size to <n>'#010+
   '**2Ct_Stack checking (for testing only, see manual)'#010+
   '**2Ct_Stack checking (for testing only, see manual)'#010+
-  '8*2CT<x>_Target-specific code generation options'#010+
+  '8*2CT<x>_Target-specific code generati','on options'#010+
   '3*2CT<x>_Target-specific code generation options'#010+
   '3*2CT<x>_Target-specific code generation options'#010+
-  '4*2CT<x>_Target-spec','ific code generation options'#010+
+  '4*2CT<x>_Target-specific code generation options'#010+
   'p*2CT<x>_Target-specific code generation options'#010+
   'p*2CT<x>_Target-specific code generation options'#010+
   'P*2CT<x>_Target-specific code generation options'#010+
   'P*2CT<x>_Target-specific code generation options'#010+
-  'J*2CT<x>_Target-specific code generation options'#010+
+  'J*2CT<x>_Target-specific code gen','eration options'#010+
   'A*2CT<x>_Target-specific code generation options'#010+
   'A*2CT<x>_Target-specific code generation options'#010+
-  'p*3CTsmalltoc_ ','Generate smaller TOCs at the expense of execution spe'+
-  'ed (AIX)'#010+
+  'p*3CTsmalltoc_ Generate smaller TOCs at the expense of execution speed'+
+  ' (AIX)'#010+
   'P*3CTsmalltoc_ Generate smaller TOCs at the expense of execution speed'+
   'P*3CTsmalltoc_ Generate smaller TOCs at the expense of execution speed'+
   ' (AIX)'#010+
   ' (AIX)'#010+
-  'J*3CTautogetterprefix=X_  Automatically create getters for properties '+
-  'with prefix X (empty string dis','ables)'#010+
+  'J*3CTautogetterprefix','=X_  Automatically create getters for propertie'+
+  's with prefix X (empty string disables)'#010+
   'J*3CTautosetterprefix=X_  Automatically create setters for properties '+
   'J*3CTautosetterprefix=X_  Automatically create setters for properties '+
   'with prefix X (empty string disables)'#010+
   'with prefix X (empty string disables)'#010+
-  '8*3CTcld_                 Emit a CLD instruction before using the x86 '+
-  'string instructions'#010+
-  '3*3CTcld_                 Emit a CL','D instruction before using the x8'+
+  '8*3CTcld_                 Emit a CLD instruct','ion before using the x8'+
   '6 string instructions'#010+
   '6 string instructions'#010+
+  '3*3CTcld_                 Emit a CLD instruction before using the x86 '+
+  'string instructions'#010+
   '4*3CTcld_                 Emit a CLD instruction before using the x86 '+
   '4*3CTcld_                 Emit a CLD instruction before using the x86 '+
   'string instructions'#010+
   'string instructions'#010+
-  'J*3CTcompactintarrayinit_ Generate smaller (but potentially slower) co'+
-  'de for initializing integ','er array constants'#010+
+  'J*3CTcompactint','arrayinit_ Generate smaller (but potentially slower) '+
+  'code for initializing integer array constants'#010+
   'J*3CTenumfieldinit_       Initialize enumeration fields in constructor'+
   'J*3CTenumfieldinit_       Initialize enumeration fields in constructor'+
   's to enumtype(0), after calling inherited constructors'#010+
   's to enumtype(0), after calling inherited constructors'#010+
-  'J*3CTinitlocals_          Initialize local variables that trigger a JV'+
-  'M bytecode verification er','ror if used uninitialized (slows down code'+
+  'J*3CTinitlocals_','          Initialize local variables that trigger a '+
+  'JVM bytecode verification error if used uninitialized (slows down code'+
   ')'#010+
   ')'#010+
   'J*3CTlowercaseprocstart_  Lowercase the first character of procedure/f'+
   'J*3CTlowercaseprocstart_  Lowercase the first character of procedure/f'+
   'unction/method names'#010+
   'unction/method names'#010+
-  'A*3CTthumbinterworking_ Generate Thumb interworking-safe code if possi'+
-  'ble'#010+
-  'J*2Cv_Var/out parameter copy-ou','t checking'#010+
+  'A*3CTthumbinterworking_ G','enerate Thumb interworking-safe code if pos'+
+  'sible'#010+
+  'J*2Cv_Var/out parameter copy-out checking'#010+
   '**2CX_Create also smartlinked library'#010+
   '**2CX_Create also smartlinked library'#010+
   '**1d<x>_Defines the symbol <x>'#010+
   '**1d<x>_Defines the symbol <x>'#010+
   '**1D_Generate a DEF file'#010+
   '**1D_Generate a DEF file'#010+
   '**2Dd<x>_Set description to <x>'#010+
   '**2Dd<x>_Set description to <x>'#010+
-  '**2Dv<x>_Set DLL version to <x>'#010+
+  '**2Dv<x>_Set DLL versio','n to <x>'#010+
   '*O2Dw_PM application'#010+
   '*O2Dw_PM application'#010+
   '**1e<x>_Set path to executable'#010+
   '**1e<x>_Set path to executable'#010+
   '**1E_Same as -Cn'#010+
   '**1E_Same as -Cn'#010+
-  '**','1fPIC_Same as -Cg'#010+
+  '**1fPIC_Same as -Cg'#010+
   '**1F<x>_Set file names and paths:'#010+
   '**1F<x>_Set file names and paths:'#010+
   '**2Fa<x>[,y]_(for a program) load units <x> and [y] before uses is par'+
   '**2Fa<x>[,y]_(for a program) load units <x> and [y] before uses is par'+
   'sed'#010+
   'sed'#010+
-  '**2Fc<x>_Set input codepage to <x>'#010+
+  '**2Fc<x>_Set input codepage to <x>',#010+
   '**2FC<x>_Set RC compiler binary name to <x>'#010+
   '**2FC<x>_Set RC compiler binary name to <x>'#010+
-  '**2Fd_Disable the compiler'#039's intern','al directory cache'#010+
+  '**2Fd_Disable the compiler'#039's internal directory cache'#010+
   '**2FD<x>_Set the directory where to search for compiler utilities'#010+
   '**2FD<x>_Set the directory where to search for compiler utilities'#010+
   '**2Fe<x>_Redirect error output to <x>'#010+
   '**2Fe<x>_Redirect error output to <x>'#010+
-  '**2Ff<x>_Add <x> to framework path (Darwin only)'#010+
+  '**2Ff<x>_Add <x> to framework path (D','arwin only)'#010+
   '**2FE<x>_Set exe/unit output path to <x>'#010+
   '**2FE<x>_Set exe/unit output path to <x>'#010+
-  '**2Fi<x>_Add <x> to include',' path'#010+
+  '**2Fi<x>_Add <x> to include path'#010+
   '**2Fl<x>_Add <x> to library path'#010+
   '**2Fl<x>_Add <x> to library path'#010+
   '**2FL<x>_Use <x> as dynamic linker'#010+
   '**2FL<x>_Use <x> as dynamic linker'#010+
   '**2Fm<x>_Load unicode conversion table from <x>.txt in the compiler di'+
   '**2Fm<x>_Load unicode conversion table from <x>.txt in the compiler di'+
   'r'#010+
   'r'#010+
-  '**2FM<x>_Set the directory where to search for unicode binary files'#010+
-  '**2Fo<x>_Add <x> to object',' path'#010+
+  '**2FM<x>_Set t','he directory where to search for unicode binary files'#010+
+  '**2Fo<x>_Add <x> to object path'#010+
   '**2Fr<x>_Load error message file <x>'#010+
   '**2Fr<x>_Load error message file <x>'#010+
   '**2FR<x>_Set resource (.res) linker to <x>'#010+
   '**2FR<x>_Set resource (.res) linker to <x>'#010+
   '**2Fu<x>_Add <x> to unit path'#010+
   '**2Fu<x>_Add <x> to unit path'#010+
-  '**2FU<x>_Set unit output path to <x>, overrides -FE'#010+
+  '**2FU<x>_Set unit output path to <x>, overri','des -FE'#010+
   '**2FW<x>_Store generated whole-program optimization feedback in <x>'#010+
   '**2FW<x>_Store generated whole-program optimization feedback in <x>'#010+
-  '**2F','w<x>_Load previously stored whole-program optimization feedback '+
-  'from <x>'#010+
+  '**2Fw<x>_Load previously stored whole-program optimization feedback fr'+
+  'om <x>'#010+
   '*g1g_Generate debug information (default format for target)'#010+
   '*g1g_Generate debug information (default format for target)'#010+
-  '*g2gc_Generate checks for pointers'#010+
+  '*g2gc_Generate checks for p','ointers'#010+
   '*g2gh_Use heaptrace unit (for memory leak/corruption debugging)'#010+
   '*g2gh_Use heaptrace unit (for memory leak/corruption debugging)'#010+
-  '*g2gl_Us','e line info unit (show more info with backtraces)'#010+
+  '*g2gl_Use line info unit (show more info with backtraces)'#010+
   '*g2go<x>_Set debug information options'#010+
   '*g2go<x>_Set debug information options'#010+
   '*g3godwarfsets_ Enable DWARF '#039'set'#039' type debug information (bre'+
   '*g3godwarfsets_ Enable DWARF '#039'set'#039' type debug information (bre'+
-  'aks gdb < 6.5)'#010+
+  'aks gdb <',' 6.5)'#010+
   '*g3gostabsabsincludes_ Store absolute/full include file paths in Stabs'+
   '*g3gostabsabsincludes_ Store absolute/full include file paths in Stabs'+
   #010+
   #010+
-  '*g3','godwarfmethodclassprefix_ Prefix method names in DWARF with class'+
-  ' name'#010+
+  '*g3godwarfmethodclassprefix_ Prefix method names in DWARF with class n'+
+  'ame'#010+
   '*g2gp_Preserve case in stabs symbol names'#010+
   '*g2gp_Preserve case in stabs symbol names'#010+
   '*g2gs_Generate Stabs debug information'#010+
   '*g2gs_Generate Stabs debug information'#010+
-  '*g2gt_Trash local variables (to detect uninitialized uses)'#010+
-  '*g2gv_Generates programs trac','eable with Valgrind'#010+
+  '*g2gt_Tr','ash local variables (to detect uninitialized uses)'#010+
+  '*g2gv_Generates programs traceable with Valgrind'#010+
   '*g2gw_Generate DWARFv2 debug information (same as -gw2)'#010+
   '*g2gw_Generate DWARFv2 debug information (same as -gw2)'#010+
   '*g2gw2_Generate DWARFv2 debug information'#010+
   '*g2gw2_Generate DWARFv2 debug information'#010+
-  '*g2gw3_Generate DWARFv3 debug information'#010+
+  '*g2gw3_Generate DWARFv3 debug information'#010,
   '*g2gw4_Generate DWARFv4 debug information (experimental)'#010+
   '*g2gw4_Generate DWARFv4 debug information (experimental)'#010+
   '**1i_Information'#010+
   '**1i_Information'#010+
-  '**2iD_','Return compiler date'#010+
+  '**2iD_Return compiler date'#010+
   '**2iV_Return short compiler version'#010+
   '**2iV_Return short compiler version'#010+
   '**2iW_Return full compiler version'#010+
   '**2iW_Return full compiler version'#010+
   '**2iSO_Return compiler OS'#010+
   '**2iSO_Return compiler OS'#010+
   '**2iSP_Return compiler host processor'#010+
   '**2iSP_Return compiler host processor'#010+
-  '**2iTO_Return target OS'#010+
+  '**2i','TO_Return target OS'#010+
   '**2iTP_Return target processor'#010+
   '**2iTP_Return target processor'#010+
-  '**1I<x>_Add <x> to include pa','th'#010+
+  '**1I<x>_Add <x> to include path'#010+
   '**1k<x>_Pass <x> to the linker'#010+
   '**1k<x>_Pass <x> to the linker'#010+
   '**1l_Write logo'#010+
   '**1l_Write logo'#010+
   '**1M<x>_Set language mode to <x>'#010+
   '**1M<x>_Set language mode to <x>'#010+
   '**2Mfpc_Free Pascal dialect (default)'#010+
   '**2Mfpc_Free Pascal dialect (default)'#010+
-  '**2Mobjfpc_FPC mode with Object Pascal support'#010+
+  '**2Mobjfpc_FPC mode with Object Pascal ','support'#010+
   '**2Mdelphi_Delphi 7 compatibility mode'#010+
   '**2Mdelphi_Delphi 7 compatibility mode'#010+
-  '**2Mtp_TP/BP 7.0 compatibility mo','de'#010+
+  '**2Mtp_TP/BP 7.0 compatibility mode'#010+
   '**2Mmacpas_Macintosh Pascal dialects compatibility mode'#010+
   '**2Mmacpas_Macintosh Pascal dialects compatibility mode'#010+
   '**1n_Do not read the default config files'#010+
   '**1n_Do not read the default config files'#010+
   '**1o<x>_Change the name of the executable produced to <x>'#010+
   '**1o<x>_Change the name of the executable produced to <x>'#010+
-  '**1O<x>_Optimizations:'#010+
+  '*','*1O<x>_Optimizations:'#010+
   '**2O-_Disable optimizations'#010+
   '**2O-_Disable optimizations'#010+
-  '**2O1_Level 1 optimizations (q','uick and debugger friendly)'#010+
+  '**2O1_Level 1 optimizations (quick and debugger friendly)'#010+
   '**2O2_Level 2 optimizations (-O1 + quick optimizations)'#010+
   '**2O2_Level 2 optimizations (-O1 + quick optimizations)'#010+
   '**2O3_Level 3 optimizations (-O2 + slow optimizations)'#010+
   '**2O3_Level 3 optimizations (-O2 + slow optimizations)'#010+
-  '**2O4_Level 4 optimizations (-O3 + optimizations which might have unex'+
-  'pected side effects)'#010+
-  '**2Oa<x>=<','y>_Set alignment'#010+
+  '**2O4_Level 4 optimiz','ations (-O3 + optimizations which might have un'+
+  'expected side effects)'#010+
+  '**2Oa<x>=<y>_Set alignment'#010+
   '**2Oo[NO]<x>_Enable or disable optimizations, see fpc -i for possible '+
   '**2Oo[NO]<x>_Enable or disable optimizations, see fpc -i for possible '+
   'values'#010+
   'values'#010+
-  '**2Op<x>_Set target cpu for optimizing, see fpc -i for possible values'+
-  #010+
+  '**2Op<x>_Set target cpu for optimizing, see fpc -i for possible va','lu'+
+  'es'#010+
   '**2OW<x>_Generate whole-program optimization feedback for optimization'+
   '**2OW<x>_Generate whole-program optimization feedback for optimization'+
-  ' <x>,',' see fpc -i for possible values'#010+
+  ' <x>, see fpc -i for possible values'#010+
   '**2Ow<x>_Perform whole-program optimization <x>, see fpc -i for possib'+
   '**2Ow<x>_Perform whole-program optimization <x>, see fpc -i for possib'+
   'le values'#010+
   'le values'#010+
   '**2Os_Optimize for size rather than speed'#010+
   '**2Os_Optimize for size rather than speed'#010+
-  '**1pg_Generate profile code for gprof (defines FPC_PROFILE)'#010+
-  'F*1P<x>_Target CPU / compi','ler related options:'#010+
+  '**1pg_','Generate profile code for gprof (defines FPC_PROFILE)'#010+
+  'F*1P<x>_Target CPU / compiler related options:'#010+
   'F*2PB_Show default compiler binary'#010+
   'F*2PB_Show default compiler binary'#010+
   'F*2PP_Show default target cpu'#010+
   'F*2PP_Show default target cpu'#010+
   'F*2P<x>_Set target CPU (arm,i386,m68k,mips,mipsel,powerpc,powerpc64,sp'+
   'F*2P<x>_Set target CPU (arm,i386,m68k,mips,mipsel,powerpc,powerpc64,sp'+
-  'arc,x86_64'#010+
+  'arc,','x86_64'#010+
   '**1R<x>_Assembler reading style:'#010+
   '**1R<x>_Assembler reading style:'#010+
-  '**2Rdefault_Use default assembler for ta','rget'#010+
+  '**2Rdefault_Use default assembler for target'#010+
   '3*2Ratt_Read AT&T style assembler'#010+
   '3*2Ratt_Read AT&T style assembler'#010+
   '3*2Rintel_Read Intel style assembler'#010+
   '3*2Rintel_Read Intel style assembler'#010+
   '6*2RMOT_Read motorola style assembler'#010+
   '6*2RMOT_Read motorola style assembler'#010+
   '**1S<x>_Syntax options:'#010+
   '**1S<x>_Syntax options:'#010+
-  '**2S2_Same as -Mobjfpc'#010+
+  '**2S2_Same as -Mobjfpc',#010+
   '**2Sc_Support operators like C (*=,+=,/= and -=)'#010+
   '**2Sc_Support operators like C (*=,+=,/= and -=)'#010+
   '**2Sa_Turn on assertions'#010+
   '**2Sa_Turn on assertions'#010+
-  '**2Sd','_Same as -Mdelphi'#010+
+  '**2Sd_Same as -Mdelphi'#010+
   '**2Se<x>_Error options. <x> is a combination of the following:'#010+
   '**2Se<x>_Error options. <x> is a combination of the following:'#010+
   '**3*_<n> : Compiler halts after the <n> errors (default is 1)'#010+
   '**3*_<n> : Compiler halts after the <n> errors (default is 1)'#010+
-  '**3*_w : Compiler also halts after warnings'#010+
+  '**3*_w : Compiler',' also halts after warnings'#010+
   '**3*_n : Compiler also halts after notes'#010+
   '**3*_n : Compiler also halts after notes'#010+
-  '**3*_h : Com','piler also halts after hints'#010+
+  '**3*_h : Compiler also halts after hints'#010+
   '**2Sg_Enable LABEL and GOTO (default in -Mtp and -Mdelphi)'#010+
   '**2Sg_Enable LABEL and GOTO (default in -Mtp and -Mdelphi)'#010+
   '**2Sh_Use reference counted strings (ansistring by default) instead of'+
   '**2Sh_Use reference counted strings (ansistring by default) instead of'+
-  ' shortstrings'#010+
-  '**2Si_Turn on inlining of procedures/functions declared as "inline"'#010,
+  ' s','hortstrings'#010+
+  '**2Si_Turn on inlining of procedures/functions declared as "inline"'#010+
   '**2Sk_Load fpcylix unit'#010+
   '**2Sk_Load fpcylix unit'#010+
   '**2SI<x>_Set interface style to <x>'#010+
   '**2SI<x>_Set interface style to <x>'#010+
   '**3SIcom_COM compatible interface (default)'#010+
   '**3SIcom_COM compatible interface (default)'#010+
   '**3SIcorba_CORBA compatible interface'#010+
   '**3SIcorba_CORBA compatible interface'#010+
-  '**2Sm_Support macros like C (global)'#010+
+  '**2Sm_Support macr','os like C (global)'#010+
   '**2So_Same as -Mtp'#010+
   '**2So_Same as -Mtp'#010+
-  '**2Ss_Constructor name must be init (destr','uctor must be done)'#010+
+  '**2Ss_Constructor name must be init (destructor must be done)'#010+
   '**2Sx_Enable exception keywords (default in Delphi/ObjFPC modes)'#010+
   '**2Sx_Enable exception keywords (default in Delphi/ObjFPC modes)'#010+
   '**2Sy_@<pointer> returns a typed pointer, same as $T+'#010+
   '**2Sy_@<pointer> returns a typed pointer, same as $T+'#010+
-  '**1s_Do not call assembler and linker'#010+
+  '**1s_Do not call asse','mbler and linker'#010+
   '**2sh_Generate script to link on host'#010+
   '**2sh_Generate script to link on host'#010+
-  '**2st_Generate script to ','link on target'#010+
+  '**2st_Generate script to link on target'#010+
   '**2sr_Skip register allocation phase (use with -alr)'#010+
   '**2sr_Skip register allocation phase (use with -alr)'#010+
   '**1T<x>_Target operating system:'#010+
   '**1T<x>_Target operating system:'#010+
   '3*2Tdarwin_Darwin/Mac OS X'#010+
   '3*2Tdarwin_Darwin/Mac OS X'#010+
-  '3*2Temx_OS/2 via EMX (including EMX/RSX extender)'#010+
+  '3*2Temx_OS/2 via EMX (including ','EMX/RSX extender)'#010+
   '3*2Tfreebsd_FreeBSD'#010+
   '3*2Tfreebsd_FreeBSD'#010+
-  '3*2Tgo32v2_Version 2 of DJ Delorie DOS ext','ender'#010+
+  '3*2Tgo32v2_Version 2 of DJ Delorie DOS extender'#010+
   '3*2Tiphonesim_ iPhoneSimulator from iOS SDK 3.2+ (older versions: -Tda'+
   '3*2Tiphonesim_ iPhoneSimulator from iOS SDK 3.2+ (older versions: -Tda'+
   'rwin)'#010+
   'rwin)'#010+
   '3*2Tlinux_Linux'#010+
   '3*2Tlinux_Linux'#010+
   '3*2Tnativent_Native NT API (experimental)'#010+
   '3*2Tnativent_Native NT API (experimental)'#010+
   '3*2Tnetbsd_NetBSD'#010+
   '3*2Tnetbsd_NetBSD'#010+
-  '3*2Tnetware_Novell Netware Module (clib)'#010+
-  '3*2Tnetwlibc_Novell Netware Module (libc)',#010+
+  '3*','2Tnetware_Novell Netware Module (clib)'#010+
+  '3*2Tnetwlibc_Novell Netware Module (libc)'#010+
   '3*2Topenbsd_OpenBSD'#010+
   '3*2Topenbsd_OpenBSD'#010+
   '3*2Tos2_OS/2 / eComStation'#010+
   '3*2Tos2_OS/2 / eComStation'#010+
   '3*2Tsunos_SunOS/Solaris'#010+
   '3*2Tsunos_SunOS/Solaris'#010+
   '3*2Tsymbian_Symbian OS'#010+
   '3*2Tsymbian_Symbian OS'#010+
   '3*2Tsolaris_Solaris'#010+
   '3*2Tsolaris_Solaris'#010+
   '3*2Twatcom_Watcom compatible DOS extender'#010+
   '3*2Twatcom_Watcom compatible DOS extender'#010+
-  '3*2Twdosx_WDOSX DOS extender'#010+
+  '3*2','Twdosx_WDOSX DOS extender'#010+
   '3*2Twin32_Windows 32 Bit'#010+
   '3*2Twin32_Windows 32 Bit'#010+
   '3*2Twince_Windows CE'#010+
   '3*2Twince_Windows CE'#010+
-  '4*2Tdarw','in_Darwin/Mac OS X'#010+
+  '4*2Tdarwin_Darwin/Mac OS X'#010+
   '4*2Tlinux_Linux'#010+
   '4*2Tlinux_Linux'#010+
   '4*2Twin64_Win64 (64 bit Windows systems)'#010+
   '4*2Twin64_Win64 (64 bit Windows systems)'#010+
   '6*2Tamiga_Commodore Amiga'#010+
   '6*2Tamiga_Commodore Amiga'#010+
   '6*2Tatari_Atari ST/STe/TT'#010+
   '6*2Tatari_Atari ST/STe/TT'#010+
   '6*2Tlinux_Linux'#010+
   '6*2Tlinux_Linux'#010+
-  '6*2Tpalmos_PalmOS'#010+
+  '6*2Tpalmos_PalmO','S'#010+
   'A*2Tdarwin_Darwin/iPhoneOS/iOS'#010+
   'A*2Tdarwin_Darwin/iPhoneOS/iOS'#010+
   'A*2Tlinux_Linux'#010+
   'A*2Tlinux_Linux'#010+
   'A*2Twince_Windows CE'#010+
   'A*2Twince_Windows CE'#010+
-  'P*2Tamiga_','AmigaOS'#010+
+  'P*2Tamiga_AmigaOS'#010+
   'P*2Tdarwin_Darwin/Mac OS X'#010+
   'P*2Tdarwin_Darwin/Mac OS X'#010+
   'P*2Tlinux_Linux'#010+
   'P*2Tlinux_Linux'#010+
   'P*2Tmacos_Mac OS (classic)'#010+
   'P*2Tmacos_Mac OS (classic)'#010+
   'P*2Tmorphos_MorphOS'#010+
   'P*2Tmorphos_MorphOS'#010+
   'S*2Tsolaris_Solaris'#010+
   'S*2Tsolaris_Solaris'#010+
   'S*2Tlinux_Linux'#010+
   'S*2Tlinux_Linux'#010+
-  '**1u<x>_Undefines the symbol <x>'#010+
+  '**1u<x>_Undefines the symb','ol <x>'#010+
   '**1U_Unit options:'#010+
   '**1U_Unit options:'#010+
-  '**2Un_Do not check where the unit name matches the fil','e name'#010+
+  '**2Un_Do not check where the unit name matches the file name'#010+
   '**2Ur_Generate release unit files (never automatically recompiled)'#010+
   '**2Ur_Generate release unit files (never automatically recompiled)'#010+
   '**2Us_Compile a system unit'#010+
   '**2Us_Compile a system unit'#010+
-  '**1v<x>_Be verbose. <x> is a combination of the following letters:'#010+
+  '**1v<x>_Be verbose. <x> is a combination of the following ','letters:'#010+
   '**2*_e : Show errors (default)       0 : Show nothing (except errors)'#010+
   '**2*_e : Show errors (default)       0 : Show nothing (except errors)'#010+
-  '*','*2*_w : Show warnings               u : Show unit info'#010+
+  '**2*_w : Show warnings               u : Show unit info'#010+
   '**2*_n : Show notes                  t : Show tried/used files'#010+
   '**2*_n : Show notes                  t : Show tried/used files'#010+
-  '**2*_h : Show hints                  c : Show conditionals'#010+
+  '**2*_h : Show hints                  c : S','how conditionals'#010+
   '**2*_i : Show general info           d : Show debug info'#010+
   '**2*_i : Show general info           d : Show debug info'#010+
-  '**2*_l',' : Show linenumbers            r : Rhide/GCC compatibility mod'+
-  'e'#010+
+  '**2*_l : Show linenumbers            r : Rhide/GCC compatibility mode'#010+
   '**2*_s : Show time stamps            q : Show message numbers'#010+
   '**2*_s : Show time stamps            q : Show message numbers'#010+
-  '**2*_a : Show everything             x : Executable info (Win32 only)'#010+
-  '**2*_b : Write file names messages   p : Wri','te tree.log with parse t'+
-  'ree'#010+
+  '**2*_a : Show everything          ','   x : Executable info (Win32 only'+
+  ')'#010+
+  '**2*_b : Write file names messages   p : Write tree.log with parse tre'+
+  'e'#010+
   '**2*_    with full path              v : Write fpcdebug.txt with'#010+
   '**2*_    with full path              v : Write fpcdebug.txt with'#010+
   '**2*_                                    lots of debugging info'#010+
   '**2*_                                    lots of debugging info'#010+
-  '**2*_m<x>,<y> : Do not show messages numbered <x> and <y>'#010+
-  'F*1V<x>_Append '#039'-<x>'#039' to ','the used compiler binary name (e.g.'+
-  ' for version)'#010+
+  '**2','*_m<x>,<y> : Do not show messages numbered <x> and <y>'#010+
+  'F*1V<x>_Append '#039'-<x>'#039' to the used compiler binary name (e.g. f'+
+  'or version)'#010+
   '**1W<x>_Target-specific options (targets)'#010+
   '**1W<x>_Target-specific options (targets)'#010+
   '3*2WA_Specify native type application (Windows)'#010+
   '3*2WA_Specify native type application (Windows)'#010+
-  '4*2WA_Specify native type application (Windows)'#010+
+  '4*2WA_Specify native ','type application (Windows)'#010+
   'A*2WA_Specify native type application (Windows)'#010+
   'A*2WA_Specify native type application (Windows)'#010+
-  '3*2Wb','_Create a bundle instead of a library (Darwin)'#010+
+  '3*2Wb_Create a bundle instead of a library (Darwin)'#010+
   'P*2Wb_Create a bundle instead of a library (Darwin)'#010+
   'P*2Wb_Create a bundle instead of a library (Darwin)'#010+
   'p*2Wb_Create a bundle instead of a library (Darwin)'#010+
   'p*2Wb_Create a bundle instead of a library (Darwin)'#010+
-  'A*2Wb_Create a bundle instead of a library (Darwin)'#010+
-  '4*2Wb_Create a bundle instead of a li','brary (Darwin)'#010+
+  'A*2Wb_Cre','ate a bundle instead of a library (Darwin)'#010+
+  '4*2Wb_Create a bundle instead of a library (Darwin)'#010+
   '3*2WB_Create a relocatable image (Windows, Symbian)'#010+
   '3*2WB_Create a relocatable image (Windows, Symbian)'#010+
   '3*2WBxxxx_Set image base to xxxx (Windows, Symbian)'#010+
   '3*2WBxxxx_Set image base to xxxx (Windows, Symbian)'#010+
-  '4*2WB_Create a relocatable image (Windows)'#010+
+  '4*2WB_Create a relocatable image (Windows',')'#010+
   '4*2WBxxxx_Set image base to xxxx (Windows)'#010+
   '4*2WBxxxx_Set image base to xxxx (Windows)'#010+
-  'A*2WB_Create a relocatable image (W','indows, Symbian)'#010+
+  'A*2WB_Create a relocatable image (Windows, Symbian)'#010+
   'A*2WBxxxx_Set image base to xxxx (Windows, Symbian)'#010+
   'A*2WBxxxx_Set image base to xxxx (Windows, Symbian)'#010+
   '3*2WC_Specify console type application (EMX, OS/2, Windows)'#010+
   '3*2WC_Specify console type application (EMX, OS/2, Windows)'#010+
-  '4*2WC_Specify console type application (EMX, OS/2, Windows)'#010+
+  '4*2WC_Specify console type appl','ication (EMX, OS/2, Windows)'#010+
   'A*2WC_Specify console type application (Windows)'#010+
   'A*2WC_Specify console type application (Windows)'#010+
-  'P*','2WC_Specify console type application (Classic Mac OS)'#010+
+  'P*2WC_Specify console type application (Classic Mac OS)'#010+
   '3*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#010+
   '3*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#010+
-  '4*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#010+
-  'A*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#010,
+  '4*2WD_Use DEFFILE to export functions of DLL',' or EXE (Windows)'#010+
+  'A*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#010+
   '3*2We_Use external resources (Darwin)'#010+
   '3*2We_Use external resources (Darwin)'#010+
   '4*2We_Use external resources (Darwin)'#010+
   '4*2We_Use external resources (Darwin)'#010+
   'A*2We_Use external resources (Darwin)'#010+
   'A*2We_Use external resources (Darwin)'#010+
   'P*2We_Use external resources (Darwin)'#010+
   'P*2We_Use external resources (Darwin)'#010+
-  'p*2We_Use external resources (Darwin)'#010+
-  '3*2WF_Specify full-screen type application (EMX, O','S/2)'#010+
+  'p*2We_Us','e external resources (Darwin)'#010+
+  '3*2WF_Specify full-screen type application (EMX, OS/2)'#010+
   '3*2WG_Specify graphic type application (EMX, OS/2, Windows)'#010+
   '3*2WG_Specify graphic type application (EMX, OS/2, Windows)'#010+
   '4*2WG_Specify graphic type application (EMX, OS/2, Windows)'#010+
   '4*2WG_Specify graphic type application (EMX, OS/2, Windows)'#010+
-  'A*2WG_Specify graphic type application (Windows)'#010+
+  'A*2WG_Specify graphic type applicat','ion (Windows)'#010+
   'P*2WG_Specify graphic type application (Classic Mac OS)'#010+
   'P*2WG_Specify graphic type application (Classic Mac OS)'#010+
-  '3*2Wi_Use ','internal resources (Darwin)'#010+
+  '3*2Wi_Use internal resources (Darwin)'#010+
   '4*2Wi_Use internal resources (Darwin)'#010+
   '4*2Wi_Use internal resources (Darwin)'#010+
   'A*2Wi_Use internal resources (Darwin)'#010+
   'A*2Wi_Use internal resources (Darwin)'#010+
   'P*2Wi_Use internal resources (Darwin)'#010+
   'P*2Wi_Use internal resources (Darwin)'#010+
-  'p*2Wi_Use internal resources (Darwin)'#010+
+  'p*2Wi_Use internal',' resources (Darwin)'#010+
   '3*2WI_Turn on/off the usage of import sections (Windows)'#010+
   '3*2WI_Turn on/off the usage of import sections (Windows)'#010+
-  '4*2','WI_Turn on/off the usage of import sections (Windows)'#010+
+  '4*2WI_Turn on/off the usage of import sections (Windows)'#010+
   'A*2WI_Turn on/off the usage of import sections (Windows)'#010+
   'A*2WI_Turn on/off the usage of import sections (Windows)'#010+
   '8*2Wm<x>_Set memory model'#010+
   '8*2Wm<x>_Set memory model'#010+
-  '8*3WmTiny_Tiny memory model'#010+
+  '8*3WmTiny_Tiny memory m','odel'#010+
   '8*3WmSmall_Small memory model (default)'#010+
   '8*3WmSmall_Small memory model (default)'#010+
   '8*3WmMedium_Medium memory model'#010+
   '8*3WmMedium_Medium memory model'#010+
-  '3*2','WM<x>_Minimum Mac OS X deployment version: 10.4, 10.5.1, ... (Dar'+
-  'win)'#010+
-  '4*2WM<x>_Minimum Mac OS X deployment version: 10.4, 10.5.1, ... (Darwi'+
+  '3*2WM<x>_Minimum Mac OS X deployment version: 10.4, 10.5.1, ... (Darwi'+
   'n)'#010+
   'n)'#010+
-  'p*2WM<x>_Minimum Mac OS X deployment version: 10.4, 10.5.1, ... (Darwi'+
+  '4*2WM<x>_Minimum Mac OS X deployment version: 10.4, 10.5.1, ... (Darwi'+
   'n)'#010+
   'n)'#010+
-  'P*2WM<x>_Minimum Mac OS ','X deployment version: 10.4, 10.5.1, ... (Dar'+
+  'p*2WM<x>_Minimum ','Mac OS X deployment version: 10.4, 10.5.1, ... (Dar'+
   'win)'#010+
   'win)'#010+
+  'P*2WM<x>_Minimum Mac OS X deployment version: 10.4, 10.5.1, ... (Darwi'+
+  'n)'#010+
   '3*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+
   '3*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+
-  '4*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+
-  'A*2WN_Do not generate relocation code, needed for d','ebugging (Windows'+
+  '4*2WN_Do not generate relocation code, ne','eded for debugging (Windows'+
   ')'#010+
   ')'#010+
+  'A*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+
   'A*2Wpxxxx_Specify the controller type, see fpc -i for possible values'#010+
   'A*2Wpxxxx_Specify the controller type, see fpc -i for possible values'#010+
   'V*2Wpxxxx_Specify the controller type, see fpc -i for possible values'#010+
   'V*2Wpxxxx_Specify the controller type, see fpc -i for possible values'#010+
-  '3*2WP<x>_Minimum iOS deployment version: 3.0, 5.0.1, ... (iphonesim)'#010+
-  'A*2WP<x>_Min','imum iOS deployment version: 3.0, 5.0.1, ... (Darwin)'#010+
+  '3','*2WP<x>_Minimum iOS deployment version: 3.0, 5.0.1, ... (iphonesim)'+
+  #010+
+  'A*2WP<x>_Minimum iOS deployment version: 3.0, 5.0.1, ... (Darwin)'#010+
   '3*2WR_Generate relocation code (Windows)'#010+
   '3*2WR_Generate relocation code (Windows)'#010+
   '4*2WR_Generate relocation code (Windows)'#010+
   '4*2WR_Generate relocation code (Windows)'#010+
-  'A*2WR_Generate relocation code (Windows)'#010+
+  'A*2WR_Generate relocatio','n code (Windows)'#010+
   '8*2Wt<x>_Set the target executable format'#010+
   '8*2Wt<x>_Set the target executable format'#010+
-  '8*3Wtexe_Create a DOS',' .EXE file (default)'#010+
+  '8*3Wtexe_Create a DOS .EXE file (default)'#010+
   '8*3Wtcom_Create a DOS .COM file (requires tiny memory model)'#010+
   '8*3Wtcom_Create a DOS .COM file (requires tiny memory model)'#010+
   'P*2WT_Specify MPW tool type application (Classic Mac OS)'#010+
   'P*2WT_Specify MPW tool type application (Classic Mac OS)'#010+
-  '**2WX_Enable executable stack (Linux)'#010+
+  '**2WX_Enable executab','le stack (Linux)'#010+
   '**1X_Executable options:'#010+
   '**1X_Executable options:'#010+
-  '**2Xc_Pass --shared/-dynamic to the li','nker (BeOS, Darwin, FreeBSD, L'+
-  'inux)'#010+
+  '**2Xc_Pass --shared/-dynamic to the linker (BeOS, Darwin, FreeBSD, Lin'+
+  'ux)'#010+
   '**2Xd_Do not search default library path (sometimes required for cross'+
   '**2Xd_Do not search default library path (sometimes required for cross'+
   '-compiling when not using -XR)'#010+
   '-compiling when not using -XR)'#010+
-  '**2Xe_Use external linker'#010+
+  '**2Xe_Use external link','er'#010+
   '**2Xg_Create debuginfo in a separate file and add a debuglink section '+
   '**2Xg_Create debuginfo in a separate file and add a debuglink section '+
-  'to exec','utable'#010+
+  'to executable'#010+
   '**2XD_Try to link units dynamically      (defines FPC_LINK_DYNAMIC)'#010+
   '**2XD_Try to link units dynamically      (defines FPC_LINK_DYNAMIC)'#010+
   '**2Xi_Use internal linker'#010+
   '**2Xi_Use internal linker'#010+
   '**2Xm_Generate link map'#010+
   '**2Xm_Generate link map'#010+
-  '**2XM<x>_Set the name of the '#039'main'#039' program routine (default i'+
-  's '#039'main'#039')'#010+
-  'F*2Xp<x>_First search for the compiler bina','ry in the directory <x>'#010+
+  '**2XM<x>_Set the name of the '#039'main'#039,' program routine (default '+
+  'is '#039'main'#039')'#010+
+  'F*2Xp<x>_First search for the compiler binary in the directory <x>'#010+
   '**2XP<x>_Prepend the binutils names with the prefix <x>'#010+
   '**2XP<x>_Prepend the binutils names with the prefix <x>'#010+
   '**2Xr<x>_Set the linker'#039's rlink-path to <x> (needed for cross comp'+
   '**2Xr<x>_Set the linker'#039's rlink-path to <x> (needed for cross comp'+
-  'ile, see the ld manual for more information) (BeOS, Linux)'#010+
-  '**2XR<x>_Prepend <x> to all linker ','search paths (BeOS, Darwin, FreeB'+
-  'SD, Linux, Mac OS, Solaris)'#010+
+  'ile, see the l','d manual for more information) (BeOS, Linux)'#010+
+  '**2XR<x>_Prepend <x> to all linker search paths (BeOS, Darwin, FreeBSD'+
+  ', Linux, Mac OS, Solaris)'#010+
   '**2Xs_Strip all symbols from executable'#010+
   '**2Xs_Strip all symbols from executable'#010+
-  '**2XS_Try to link units statically (default, defines FPC_LINK_STATIC)'#010+
+  '**2XS_Try to link units statically (default, defines FPC_LI','NK_STATIC'+
+  ')'#010+
   '**2Xt_Link with static libraries (-static is passed to linker)'#010+
   '**2Xt_Link with static libraries (-static is passed to linker)'#010+
-  '**2XX_','Try to smartlink units             (defines FPC_LINK_SMART)'#010+
+  '**2XX_Try to smartlink units             (defines FPC_LINK_SMART)'#010+
   '**1*_'#010+
   '**1*_'#010+
   '**1?_Show this help'#010+
   '**1?_Show this help'#010+
   '**1h_Shows this help without waiting'
   '**1h_Shows this help without waiting'

+ 1 - 0
compiler/ncal.pas

@@ -220,6 +220,7 @@ interface
           { a refcounted into a non-refcounted type                     }
           { a refcounted into a non-refcounted type                     }
           function can_be_inlined: boolean;
           function can_be_inlined: boolean;
 
 
+          property paravalue : tnode read left write left;
           property nextpara : tnode read right write right;
           property nextpara : tnode read right write right;
           { third is reused to store the parameter name (only while parsing
           { third is reused to store the parameter name (only while parsing
             vardispatch calls, never in real node tree) and copy of 'high'
             vardispatch calls, never in real node tree) and copy of 'high'

+ 12 - 0
compiler/ncginl.pas

@@ -60,6 +60,7 @@ interface
           procedure second_box; virtual; abstract;
           procedure second_box; virtual; abstract;
           procedure second_popcnt; virtual;
           procedure second_popcnt; virtual;
           procedure second_seg; virtual; abstract;
           procedure second_seg; virtual; abstract;
+          procedure second_fma; virtual;
        end;
        end;
 
 
 implementation
 implementation
@@ -190,6 +191,11 @@ implementation
                second_popcnt;
                second_popcnt;
             in_seg_x:
             in_seg_x:
                second_seg;
                second_seg;
+            in_fma_single,
+            in_fma_double,
+            in_fma_extended,
+            in_fma_float128:
+               second_fma;
             else internalerror(9);
             else internalerror(9);
          end;
          end;
       end;
       end;
@@ -768,6 +774,12 @@ implementation
       end;
       end;
 
 
 
 
+    procedure tcginlinenode.second_fma;
+      begin
+        internalerror(2014032701);
+      end;
+
+
 begin
 begin
    cinlinenode:=tcginlinenode;
    cinlinenode:=tcginlinenode;
 end.  s
 end.  s

+ 25 - 0
compiler/ninl.pas

@@ -45,6 +45,7 @@ interface
           { pack and unpack are changed into for-loops by the compiler }
           { pack and unpack are changed into for-loops by the compiler }
           function first_pack_unpack: tnode; virtual;
           function first_pack_unpack: tnode; virtual;
 
 
+          property parameters : tnode read left write left;
          protected
          protected
           { All the following routines currently
           { All the following routines currently
             call compilerprocs, unless they are
             call compilerprocs, unless they are
@@ -83,6 +84,7 @@ interface
           function typecheck_seg: tnode; virtual;
           function typecheck_seg: tnode; virtual;
           function first_seg: tnode; virtual;
           function first_seg: tnode; virtual;
           function first_sar: tnode; virtual;
           function first_sar: tnode; virtual;
+          function first_fma : tnode; virtual;
         private
         private
           function handle_str: tnode;
           function handle_str: tnode;
           function handle_reset_rewrite_typed: tnode;
           function handle_reset_rewrite_typed: tnode;
@@ -3245,6 +3247,16 @@ implementation
                 begin
                 begin
                   result:=handle_unbox;
                   result:=handle_unbox;
                 end;
                 end;
+              in_fma_single,
+              in_fma_double,
+              in_fma_extended,
+              in_fma_float128:
+                begin
+                  set_varstate(tcallparanode(left).left,vs_read,[vsf_must_be_valid]);
+                  set_varstate(tcallparanode(tcallparanode(left).right).left,vs_read,[vsf_must_be_valid]);
+                  set_varstate(tcallparanode(tcallparanode(tcallparanode(left).right).right).left,vs_read,[vsf_must_be_valid]);
+                  resultdef:=tcallparanode(left).left.resultdef;
+                end;
               else
               else
                 internalerror(8);
                 internalerror(8);
             end;
             end;
@@ -3659,6 +3671,11 @@ implementation
            result:=first_box;
            result:=first_box;
          in_unbox_x_y:
          in_unbox_x_y:
            result:=first_unbox;
            result:=first_unbox;
+         in_fma_single,
+         in_fma_double,
+         in_fma_extended,
+         in_fma_float128:
+           result:=first_fma;
          else
          else
            internalerror(89);
            internalerror(89);
           end;
           end;
@@ -4218,4 +4235,12 @@ implementation
          result := loop;
          result := loop;
        end;
        end;
 
 
+
+     function tinlinenode.first_fma: tnode;
+       begin
+         CGMessage1(cg_e_function_not_support_by_selected_instruction_set,'FMA');
+         result:=nil;
+       end;
+
 end.
 end.
+

+ 7 - 0
compiler/x86/cga.pas

@@ -44,6 +44,7 @@ interface
 
 
     procedure emit_const_reg_reg(i : tasmop;s : topsize;c : longint;reg1,reg2 : tregister);
     procedure emit_const_reg_reg(i : tasmop;s : topsize;c : longint;reg1,reg2 : tregister);
     procedure emit_reg_reg_reg(i : tasmop;s : topsize;reg1,reg2,reg3 : tregister);
     procedure emit_reg_reg_reg(i : tasmop;s : topsize;reg1,reg2,reg3 : tregister);
+    procedure emit_ref_reg_reg(i : tasmop;s : topsize;ref : treference;reg1,reg2 : tregister);
 
 
 
 
     procedure emit_sym(i : tasmop;s : topsize;op : tasmsymbol);
     procedure emit_sym(i : tasmop;s : topsize;op : tasmsymbol);
@@ -124,6 +125,12 @@ implementation
          current_asmdata.CurrAsmList.concat(Taicpu.Op_reg_reg_reg(i,s,reg1,reg2,reg3));
          current_asmdata.CurrAsmList.concat(Taicpu.Op_reg_reg_reg(i,s,reg1,reg2,reg3));
       end;
       end;
 
 
+    procedure emit_ref_reg_reg(i : tasmop;s : topsize;ref : treference;reg1,reg2 : tregister);
+      begin
+        tcgx86(cg).make_simple_ref(current_asmdata.CurrAsmList,ref);
+        current_asmdata.CurrAsmList.concat(Taicpu.Op_ref_reg_reg(i,s,ref,reg1,reg2));
+      end;
+
     procedure emit_sym(i : tasmop;s : topsize;op : tasmsymbol);
     procedure emit_sym(i : tasmop;s : topsize;op : tasmsymbol);
       begin
       begin
         current_asmdata.CurrAsmList.concat(Taicpu.Op_sym(i,s,op));
         current_asmdata.CurrAsmList.concat(Taicpu.Op_sym(i,s,op));

+ 1 - 1
compiler/x86/cgx86.pas

@@ -185,7 +185,7 @@ unit cgx86;
 
 
     function UseAVX: boolean;
     function UseAVX: boolean;
       begin
       begin
-        Result:=current_settings.fputype in fpu_avx_instructionsets;
+        Result:=(current_settings.fputype in fpu_avx_instructionsets) or (CPUX86_HAS_AVXUNIT in cpu_capabilities[current_settings.cputype]);
       end;
       end;
 
 
 
 

+ 97 - 1
compiler/x86/nx86inl.pas

@@ -45,6 +45,7 @@ interface
           function first_round_real: tnode; override;
           function first_round_real: tnode; override;
           function first_trunc_real: tnode; override;
           function first_trunc_real: tnode; override;
           function first_popcnt: tnode; override;
           function first_popcnt: tnode; override;
+          function first_fma: tnode; override;
           { second pass override to generate these nodes }
           { second pass override to generate these nodes }
           procedure second_IncludeExclude;override;
           procedure second_IncludeExclude;override;
           procedure second_pi; override;
           procedure second_pi; override;
@@ -64,6 +65,7 @@ interface
           procedure second_abs_long;override;
           procedure second_abs_long;override;
 {$endif not i8086}
 {$endif not i8086}
           procedure second_popcnt;override;
           procedure second_popcnt;override;
+          procedure second_fma;override;
        private
        private
           procedure load_fpu_location(lnode: tnode);
           procedure load_fpu_location(lnode: tnode);
        end;
        end;
@@ -247,7 +249,20 @@ implementation
        end;
        end;
 
 
 
 
-     procedure tx86inlinenode.second_Pi;
+     function tx86inlinenode.first_fma : tnode;
+       begin
+         if ((cpu_capabilities[current_settings.cputype]*[CPUX86_HAS_FMA,CPUX86_HAS_FMA4])<>[]) and
+           ((is_double(resultdef)) or (is_single(resultdef))) then
+           begin
+             expectloc:=LOC_MMREGISTER;
+             Result:=nil;
+           end
+         else
+           Result:=inherited first_fma;
+       end;
+
+
+     procedure tx86inlinenode.second_pi;
        begin
        begin
          location_reset(location,LOC_FPUREGISTER,def_cgsize(resultdef));
          location_reset(location,LOC_FPUREGISTER,def_cgsize(resultdef));
          emit_none(A_FLDPI,S_NO);
          emit_none(A_FLDPI,S_NO);
@@ -741,4 +756,85 @@ implementation
         else
         else
           emit_ref_reg(A_POPCNT,TCGSize2OpSize[opsize],left.location.reference,location.register);
           emit_ref_reg(A_POPCNT,TCGSize2OpSize[opsize],left.location.reference,location.register);
       end;
       end;
+
+
+    procedure tx86inlinenode.second_fma;
+      const
+        op : array[s32real..s64real,0..3] of TAsmOp = ((A_VFMADD231SS,A_VFMADD231SS,A_VFMADD231SS,A_VFMADD213SS),
+                                                       (A_VFMADD231SD,A_VFMADD231SD,A_VFMADD231SD,A_VFMADD213SD));
+      var
+        paraarray : array[1..3] of tnode;
+        memop,
+        i : integer;
+        gotmem : boolean;
+      begin
+         if (cpu_capabilities[current_settings.cputype]*[CPUX86_HAS_FMA,CPUX86_HAS_FMA4])<>[] then
+           begin
+             paraarray[1]:=tcallparanode(tcallparanode(tcallparanode(parameters).nextpara).nextpara).paravalue;
+             paraarray[2]:=tcallparanode(tcallparanode(parameters).nextpara).paravalue;
+             paraarray[3]:=tcallparanode(parameters).paravalue;
+
+             for i:=1 to 3 do
+               secondpass(paraarray[i]);
+
+             { only one memory operand is allowed }
+             gotmem:=false;
+             memop:=0;
+             for i:=1 to 3 do
+               begin
+                 if not(paraarray[i].location.loc in [LOC_MMREGISTER,LOC_CMMREGISTER]) then
+                   begin
+                     if (paraarray[i].location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) and not(gotmem) then
+                       begin
+                         memop:=i;
+                         gotmem:=true;
+                       end
+                     else
+                       hlcg.location_force_mmregscalar(current_asmdata.CurrAsmList,paraarray[i].location,paraarray[i].resultdef,true);
+                   end;
+               end;
+
+             location_reset(location,LOC_MMREGISTER,paraarray[1].location.size);
+             location.register:=cg.getmmregister(current_asmdata.CurrAsmList,location.size);
+
+             if gotmem then
+               begin
+                 case memop of
+                   1:
+                     begin
+                       hlcg.a_loadmm_reg_reg(current_asmdata.CurrAsmList,paraarray[3].resultdef,resultdef,
+                         paraarray[3].location.register,location.register,mms_movescalar);
+                       emit_ref_reg_reg(op[tfloatdef(resultdef).floattype,memop],S_NO,
+                         paraarray[1].location.reference,paraarray[2].location.register,location.register);
+                     end;
+                   2:
+                     begin
+                       hlcg.a_loadmm_reg_reg(current_asmdata.CurrAsmList,paraarray[3].resultdef,resultdef,
+                         paraarray[3].location.register,location.register,mms_movescalar);
+                       emit_ref_reg_reg(op[tfloatdef(resultdef).floattype,memop],S_NO,
+                         paraarray[2].location.reference,paraarray[1].location.register,location.register);
+                     end;
+                   3:
+                     begin
+                       hlcg.a_loadmm_reg_reg(current_asmdata.CurrAsmList,paraarray[1].resultdef,resultdef,
+                         paraarray[1].location.register,location.register,mms_movescalar);
+                       emit_ref_reg_reg(op[tfloatdef(resultdef).floattype,memop],S_NO,
+                         paraarray[3].location.reference,paraarray[2].location.register,location.register);
+                     end
+                   else
+                     internalerror(2014041301);
+                 end;
+               end
+             else
+               begin
+                 hlcg.a_loadmm_reg_reg(current_asmdata.CurrAsmList,paraarray[3].resultdef,resultdef,
+                   paraarray[3].location.register,location.register,mms_movescalar);
+                 emit_reg_reg_reg(op[tfloatdef(resultdef).floattype,0],S_NO,
+                   paraarray[1].location.register,paraarray[2].location.register,location.register);
+               end;
+           end
+         else
+           internalerror(2014032301);
+      end;
+
 end.
 end.

+ 4 - 2
compiler/x86_64/cpuinfo.pas

@@ -125,7 +125,9 @@ type
        CPUX86_HAS_POPCNT,
        CPUX86_HAS_POPCNT,
        CPUX86_HAS_AVXUNIT,
        CPUX86_HAS_AVXUNIT,
        CPUX86_HAS_LZCNT,
        CPUX86_HAS_LZCNT,
-       CPUX86_HAS_MOVBE
+       CPUX86_HAS_MOVBE,
+       CPUX86_HAS_FMA,
+       CPUX86_HAS_FMA4
       );
       );
 
 
  const
  const
@@ -134,7 +136,7 @@ type
      { Athlon64      } [CPUX86_HAS_SSEUNIT],
      { Athlon64      } [CPUX86_HAS_SSEUNIT],
      { cpu_core_i    } [CPUX86_HAS_SSEUNIT,CPUX86_HAS_POPCNT],
      { cpu_core_i    } [CPUX86_HAS_SSEUNIT,CPUX86_HAS_POPCNT],
      { cpu_core_avx  } [CPUX86_HAS_SSEUNIT,CPUX86_HAS_POPCNT,CPUX86_HAS_AVXUNIT],
      { cpu_core_avx  } [CPUX86_HAS_SSEUNIT,CPUX86_HAS_POPCNT,CPUX86_HAS_AVXUNIT],
-     { cpu_core_avx2 } [CPUX86_HAS_SSEUNIT,CPUX86_HAS_POPCNT,CPUX86_HAS_AVXUNIT,CPUX86_HAS_BMI1,CPUX86_HAS_BMI2,CPUX86_HAS_LZCNT,CPUX86_HAS_MOVBE]
+     { cpu_core_avx2 } [CPUX86_HAS_SSEUNIT,CPUX86_HAS_POPCNT,CPUX86_HAS_AVXUNIT,CPUX86_HAS_BMI1,CPUX86_HAS_BMI2,CPUX86_HAS_LZCNT,CPUX86_HAS_MOVBE,CPUX86_HAS_FMA]
    );
    );
 
 
 Implementation
 Implementation

+ 4 - 0
rtl/inc/innr.inc

@@ -115,6 +115,10 @@ const
    fpc_in_arctan_real      = 130;
    fpc_in_arctan_real      = 130;
    fpc_in_ln_real          = 131;
    fpc_in_ln_real          = 131;
    fpc_in_sin_real         = 132;
    fpc_in_sin_real         = 132;
+   fpc_in_fma_single       = 133;
+   fpc_in_fma_double       = 134;
+   fpc_in_fma_extended     = 135;
+   fpc_in_fma_float128     = 136;
 
 
 { MMX functions }
 { MMX functions }
 { these contants are used by the mmx unit }
 { these contants are used by the mmx unit }

+ 12 - 0
rtl/inc/mathh.inc

@@ -109,3 +109,15 @@ procedure float_raise(i: TFPUExceptionMask);
     operator := (b:real48) e:extended;
     operator := (b:real48) e:extended;
 {$endif SUPPORT_EXTENDED}
 {$endif SUPPORT_EXTENDED}
 
 
+
+    function fma(s1,s2,s3 : single) : single;[internproc:fpc_in_fma_single];
+{$ifdef SUPPORT_DOUBLE}
+    function fma(d1,d2,d3 : double) : double;[internproc:fpc_in_fma_double];
+{$endif SUPPORT_DOUBLE}
+{$ifdef SUPPORT_EXTENDED}
+    function fma(e1,e2,e3 : extended) : extended;[internproc:fpc_in_fma_extended];
+{$endif SUPPORT_EXTENDED}
+{$ifdef SUPPORT_FLOAT128}
+    function fma(f1,f2,f3 : float128) : float128;[internproc:fpc_in_fma_float128];
+{$endif SUPPORT_FLOAT128}
+

+ 121 - 0
tests/test/tfma1.pp

@@ -0,0 +1,121 @@
+{ %CPU=i386,x86_64 }
+{ %OPT=-Cfavx2 -Cpcoreavx2 }
+uses
+  cpu;
+var
+  d0,d1,d2,d3 : double;
+  s0,s1,s2,s3 : single;
+
+procedure testsingle;
+  var
+    l0,l1,l2,l3 : single;
+  begin
+    l1:=2;
+    l2:=3;
+    l3:=4;
+    l0:=fma(l1,l2,l3);
+    writeln(l0);
+    if l0<>10.0 then
+      halt(1);
+
+    l0:=fma(s1,l2,l3);
+    writeln(l0);
+    if l0<>10.0 then
+      halt(1);
+
+    l0:=fma(l1,s2,l3);
+    writeln(l0);
+    if l0<>10.0 then
+      halt(1);
+
+    l0:=fma(l1,l2,s3);
+    writeln(l0);
+    if l0<>10.0 then
+      halt(1);
+
+    l0:=fma(s1,s2,l3);
+    writeln(l0);
+    if l0<>10.0 then
+      halt(1);
+
+    l0:=fma(s1,l2,s3);
+    writeln(l0);
+    if l0<>10.0 then
+      halt(1);
+
+    l0:=fma(l1,s2,s3);
+    writeln(l0);
+    if l0<>10.0 then
+      halt(1);
+  end;
+
+procedure testdouble;
+  var
+    l0,l1,l2,l3 : double;
+  begin
+    l1:=2;
+    l2:=3;
+    l3:=4;
+    l0:=fma(l1,l2,l3);
+    writeln(l0);
+    if l0<>10.0 then
+      halt(1);
+
+    l0:=fma(d1,l2,l3);
+    writeln(l0);
+    if l0<>10.0 then
+      halt(1);
+
+    l0:=fma(l1,d2,l3);
+    writeln(l0);
+    if l0<>10.0 then
+      halt(1);
+
+    l0:=fma(l1,l2,d3);
+    writeln(l0);
+    if l0<>10.0 then
+      halt(1);
+
+    l0:=fma(d1,d2,l3);
+    writeln(l0);
+    if l0<>10.0 then
+      halt(1);
+
+    l0:=fma(d1,l2,d3);
+    writeln(l0);
+    if l0<>10.0 then
+      halt(1);
+
+    l0:=fma(l1,d2,d3);
+    writeln(l0);
+    if l0<>10.0 then
+      halt(1);
+  end;
+
+begin
+  if AVXSupport and FMASupport then
+    begin
+      d1:=2;
+      d2:=3;
+      d3:=4;
+      d0:=fma(d1,d2,d3);
+      writeln(d0);
+      if d0<>10.0 then
+        halt(1);
+
+      s1:=2;
+      s2:=3;
+      s3:=4;
+      s0:=fma(s1,s2,s3);
+      writeln(s0);
+      if s0<>10.0 then
+        halt(1);
+
+      testsingle;
+      testdouble;
+
+      writeln('ok');
+    end
+  else
+    writeln('Skipped because not supported by the CPU');
+end.