ncginl.pas 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737
  1. {
  2. $Id$
  3. Copyright (c) 1998-2002 by Florian Klaempfl and Carl Eric Codere
  4. Generate generic inline nodes
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16. ****************************************************************************
  17. }
  18. unit ncginl;
  19. {$i fpcdefs.inc}
  20. interface
  21. uses
  22. node,ninl;
  23. type
  24. tcginlinenode = class(tinlinenode)
  25. procedure pass_2;override;
  26. procedure second_assert;virtual;
  27. procedure second_sizeoftypeof;virtual;
  28. procedure second_length;virtual;
  29. procedure second_predsucc;virtual;
  30. procedure second_incdec;virtual;
  31. procedure second_typeinfo;virtual;
  32. procedure second_includeexclude;virtual;
  33. procedure second_pi; virtual;
  34. procedure second_arctan_real; virtual;
  35. procedure second_abs_real; virtual;
  36. procedure second_sqr_real; virtual;
  37. procedure second_sqrt_real; virtual;
  38. procedure second_ln_real; virtual;
  39. procedure second_cos_real; virtual;
  40. procedure second_sin_real; virtual;
  41. end;
  42. implementation
  43. uses
  44. globtype,systems,
  45. cutils,verbose,globals,fmodule,
  46. symconst,symdef,defutil,symsym,
  47. aasmbase,aasmtai,aasmcpu,
  48. cginfo,cgbase,pass_1,pass_2,
  49. cpubase,paramgr,
  50. nbas,ncon,ncal,ncnv,nld,
  51. tgobj,ncgutil,cgobj,rgobj,rgcpu
  52. {$ifndef cpu64bit}
  53. ,cg64f32
  54. {$endif cpu64bit}
  55. ;
  56. {*****************************************************************************
  57. TCGINLINENODE
  58. *****************************************************************************}
  59. procedure tcginlinenode.pass_2;
  60. var
  61. oldpushedparasize : longint;
  62. begin
  63. { save & reset pushedparasize }
  64. oldpushedparasize:=pushedparasize;
  65. pushedparasize:=0;
  66. case inlinenumber of
  67. in_assert_x_y:
  68. begin
  69. second_Assert;
  70. end;
  71. in_sizeof_x,
  72. in_typeof_x :
  73. begin
  74. second_SizeofTypeOf;
  75. end;
  76. in_length_x :
  77. begin
  78. second_Length;
  79. end;
  80. in_pred_x,
  81. in_succ_x:
  82. begin
  83. second_PredSucc;
  84. end;
  85. in_dec_x,
  86. in_inc_x :
  87. begin
  88. second_IncDec;
  89. end;
  90. in_typeinfo_x:
  91. begin
  92. second_TypeInfo;
  93. end;
  94. in_include_x_y,
  95. in_exclude_x_y:
  96. begin
  97. second_IncludeExclude;
  98. end;
  99. in_pi:
  100. begin
  101. second_pi;
  102. end;
  103. in_sin_extended:
  104. begin
  105. second_sin_real;
  106. end;
  107. in_arctan_extended:
  108. begin
  109. second_arctan_real;
  110. end;
  111. in_abs_extended:
  112. begin
  113. second_abs_real;
  114. end;
  115. in_sqr_extended:
  116. begin
  117. second_sqr_real;
  118. end;
  119. in_sqrt_extended:
  120. begin
  121. second_sqrt_real;
  122. end;
  123. in_ln_extended:
  124. begin
  125. second_ln_real;
  126. end;
  127. in_cos_extended:
  128. begin
  129. second_cos_real;
  130. end;
  131. {$ifdef SUPPORT_MMX}
  132. in_mmx_pcmpeqb..in_mmx_pcmpgtw:
  133. begin
  134. location_reset(location,LOC_MMXREGISTER,OS_NO);
  135. if left.location.loc=LOC_REGISTER then
  136. begin
  137. {!!!!!!!}
  138. end
  139. else if tcallparanode(left).left.location.loc=LOC_REGISTER then
  140. begin
  141. {!!!!!!!}
  142. end
  143. else
  144. begin
  145. {!!!!!!!}
  146. end;
  147. end;
  148. {$endif SUPPORT_MMX}
  149. else internalerror(9);
  150. end;
  151. { reset pushedparasize }
  152. pushedparasize:=oldpushedparasize;
  153. end;
  154. {*****************************************************************************
  155. ASSERT GENERIC HANDLING
  156. *****************************************************************************}
  157. procedure tcginlinenode.second_Assert;
  158. var
  159. hp2 : tstringconstnode;
  160. otlabel,oflabel{,l1} : tasmlabel;
  161. r: Tregister;
  162. begin
  163. { the node should be removed in the firstpass }
  164. if not (cs_do_assertion in aktlocalswitches) then
  165. internalerror(7123458);
  166. otlabel:=truelabel;
  167. oflabel:=falselabel;
  168. objectlibrary.getlabel(truelabel);
  169. objectlibrary.getlabel(falselabel);
  170. secondpass(tcallparanode(left).left);
  171. maketojumpbool(exprasmlist,tcallparanode(left).left,lr_load_regvars);
  172. cg.a_label(exprasmlist,falselabel);
  173. { erroraddr }
  174. r.enum:=R_INTREGISTER;
  175. r.number:=NR_FRAME_POINTER_REG;
  176. cg.a_param_reg(exprasmlist,OS_ADDR,r,paramanager.getintparaloc(4));
  177. { lineno }
  178. cg.a_param_const(exprasmlist,OS_INT,aktfilepos.line,paramanager.getintparaloc(3));
  179. { filename string }
  180. hp2:=cstringconstnode.createstr(current_module.sourcefiles.get_file_name(aktfilepos.fileindex),st_shortstring);
  181. firstpass(tnode(hp2));
  182. secondpass(tnode(hp2));
  183. if codegenerror then
  184. exit;
  185. cg.a_paramaddr_ref(exprasmlist,hp2.location.reference,paramanager.getintparaloc(2));
  186. hp2.free;
  187. { push msg }
  188. secondpass(tcallparanode(tcallparanode(left).right).left);
  189. cg.a_paramaddr_ref(exprasmlist,tcallparanode(tcallparanode(left).right).left.location.reference,paramanager.getintparaloc(1));
  190. { call }
  191. cg.a_call_name(exprasmlist,'FPC_ASSERT');
  192. cg.a_label(exprasmlist,truelabel);
  193. truelabel:=otlabel;
  194. falselabel:=oflabel;
  195. end;
  196. {*****************************************************************************
  197. SIZEOF / TYPEOF GENERIC HANDLING
  198. *****************************************************************************}
  199. { second_handle_ the sizeof and typeof routines }
  200. procedure tcginlinenode.second_SizeOfTypeOf;
  201. var
  202. href,
  203. hrefvmt : treference;
  204. hregister : tregister;
  205. begin
  206. location_reset(location,LOC_REGISTER,OS_ADDR);
  207. { for both cases load vmt }
  208. if left.nodetype=typen then
  209. begin
  210. hregister:=rg.getaddressregister(exprasmlist);
  211. reference_reset_symbol(href,objectlibrary.newasmsymboldata(tobjectdef(left.resulttype.def).vmt_mangledname),0);
  212. cg.a_loadaddr_ref_reg(exprasmlist,href,hregister);
  213. end
  214. else
  215. begin
  216. secondpass(left);
  217. location_release(exprasmlist,left.location);
  218. hregister:=rg.getaddressregister(exprasmlist);
  219. { handle self inside a method of a class }
  220. case left.location.loc of
  221. LOC_CREGISTER,
  222. LOC_REGISTER :
  223. begin
  224. if (left.resulttype.def.deftype=classrefdef) or
  225. (po_staticmethod in aktprocdef.procoptions) then
  226. cg.a_load_reg_reg(exprasmlist,OS_ADDR,OS_ADDR,left.location.register,hregister)
  227. else
  228. begin
  229. { load VMT pointer }
  230. reference_reset_base(hrefvmt,left.location.register,tobjectdef(left.resulttype.def).vmt_offset);
  231. cg.a_load_ref_reg(exprasmlist,OS_ADDR,hrefvmt,hregister);
  232. end
  233. end;
  234. LOC_REFERENCE,
  235. LOC_CREFERENCE :
  236. begin
  237. if is_class(left.resulttype.def) then
  238. begin
  239. { deref class }
  240. cg.a_load_ref_reg(exprasmlist,OS_ADDR,left.location.reference,hregister);
  241. cg.g_maybe_testself(exprasmlist,hregister);
  242. { load VMT pointer }
  243. reference_reset_base(hrefvmt,hregister,tobjectdef(left.resulttype.def).vmt_offset);
  244. cg.a_load_ref_reg(exprasmlist,OS_ADDR,hrefvmt,hregister);
  245. end
  246. else
  247. begin
  248. { load VMT pointer, but not for classrefdefs }
  249. if (left.resulttype.def.deftype=objectdef) then
  250. inc(left.location.reference.offset,tobjectdef(left.resulttype.def).vmt_offset);
  251. cg.a_load_ref_reg(exprasmlist,OS_ADDR,left.location.reference,hregister);
  252. end;
  253. end;
  254. else
  255. internalerror(200301301);
  256. end;
  257. end;
  258. { in sizeof load size }
  259. if inlinenumber=in_sizeof_x then
  260. begin
  261. reference_reset_base(href,hregister,0);
  262. rg.ungetaddressregister(exprasmlist,hregister);
  263. hregister:=rg.getregisterint(exprasmlist,OS_INT);
  264. cg.a_load_ref_reg(exprasmlist,OS_INT,href,hregister);
  265. end;
  266. location.register:=hregister;
  267. end;
  268. {*****************************************************************************
  269. LENGTH GENERIC HANDLING
  270. *****************************************************************************}
  271. procedure tcginlinenode.second_Length;
  272. var
  273. lengthlab : tasmlabel;
  274. hregister : tregister;
  275. href : treference;
  276. begin
  277. secondpass(left);
  278. { length in ansi strings is at offset -8 }
  279. if is_ansistring(left.resulttype.def) or
  280. is_widestring(left.resulttype.def) then
  281. begin
  282. location_force_reg(exprasmlist,left.location,OS_ADDR,false);
  283. hregister:=left.location.register;
  284. objectlibrary.getlabel(lengthlab);
  285. cg.a_cmp_const_reg_label(exprasmlist,OS_ADDR,OC_EQ,0,hregister,lengthlab);
  286. reference_reset_base(href,hregister,-8);
  287. cg.a_load_ref_reg(exprasmlist,OS_32,href,hregister);
  288. cg.a_label(exprasmlist,lengthlab);
  289. location_reset(location,LOC_REGISTER,OS_32);
  290. location.register:=hregister;
  291. end
  292. else
  293. begin
  294. location_copy(location,left.location);
  295. location.size:=OS_8;
  296. end;
  297. end;
  298. {*****************************************************************************
  299. PRED/SUCC GENERIC HANDLING
  300. *****************************************************************************}
  301. procedure tcginlinenode.second_PredSucc;
  302. var
  303. cgsize : TCGSize;
  304. cgop : topcg;
  305. begin
  306. secondpass(left);
  307. if inlinenumber=in_pred_x then
  308. cgop:=OP_SUB
  309. else
  310. cgop:=OP_ADD;
  311. cgsize:=def_cgsize(resulttype.def);
  312. { we need a value in a register }
  313. location_copy(location,left.location);
  314. location_force_reg(exprasmlist,location,cgsize,false);
  315. if cgsize in [OS_64,OS_S64] then
  316. cg64.a_op64_const_reg(exprasmlist,cgop,1,
  317. location.register64)
  318. else
  319. cg.a_op_const_reg(exprasmlist,cgop,1,location.register);
  320. cg.g_overflowcheck(exprasmlist,self);
  321. cg.g_rangecheck(exprasmlist,self,resulttype.def);
  322. end;
  323. {*****************************************************************************
  324. INC/DEC GENERIC HANDLING
  325. *****************************************************************************}
  326. procedure tcginlinenode.second_IncDec;
  327. const
  328. addsubop:array[in_inc_x..in_dec_x] of TOpCG=(OP_ADD,OP_SUB);
  329. var
  330. addvalue : longint;
  331. addconstant : boolean;
  332. hregisterhi,
  333. hregister : tregister;
  334. cgsize : tcgsize;
  335. pushedregs : tmaybesave;
  336. begin
  337. { set defaults }
  338. addconstant:=true;
  339. { load first parameter, must be a reference }
  340. secondpass(tcallparanode(left).left);
  341. cgsize:=def_cgsize(tcallparanode(left).left.resulttype.def);
  342. { get addvalue }
  343. case tcallparanode(left).left.resulttype.def.deftype of
  344. orddef,
  345. enumdef :
  346. addvalue:=1;
  347. pointerdef :
  348. begin
  349. if is_void(tpointerdef(tcallparanode(left).left.resulttype.def).pointertype.def) then
  350. addvalue:=1
  351. else
  352. addvalue:=tpointerdef(tcallparanode(left).left.resulttype.def).pointertype.def.size;
  353. end;
  354. else
  355. internalerror(10081);
  356. end;
  357. { second_ argument specified?, must be a s32bit in register }
  358. if assigned(tcallparanode(left).right) then
  359. begin
  360. maybe_save(exprasmlist,tcallparanode(tcallparanode(left).right).left.registers32,
  361. tcallparanode(left).left.location,pushedregs);
  362. secondpass(tcallparanode(tcallparanode(left).right).left);
  363. maybe_restore(exprasmlist,tcallparanode(left).left.location,pushedregs);
  364. { when constant, just multiply the addvalue }
  365. if is_constintnode(tcallparanode(tcallparanode(left).right).left) then
  366. addvalue:=addvalue*get_ordinal_value(tcallparanode(tcallparanode(left).right).left)
  367. else
  368. begin
  369. location_force_reg(exprasmlist,tcallparanode(tcallparanode(left).right).left.location,cgsize,false);
  370. hregister:=tcallparanode(tcallparanode(left).right).left.location.register;
  371. hregisterhi:=tcallparanode(tcallparanode(left).right).left.location.registerhigh;
  372. { insert multiply with addvalue if its >1 }
  373. if addvalue>1 then
  374. cg.a_op_const_reg(exprasmlist,OP_IMUL,addvalue,hregister);
  375. addconstant:=false;
  376. end;
  377. end;
  378. { write the add instruction }
  379. if addconstant then
  380. begin
  381. if cgsize in [OS_64,OS_S64] then
  382. cg64.a_op64_const_loc(exprasmlist,addsubop[inlinenumber],
  383. addvalue,tcallparanode(left).left.location)
  384. else
  385. cg.a_op_const_loc(exprasmlist,addsubop[inlinenumber],
  386. addvalue,tcallparanode(left).left.location);
  387. end
  388. else
  389. begin
  390. {$ifndef cpu64bit}
  391. if cgsize in [OS_64,OS_S64] then
  392. cg64.a_op64_reg_loc(exprasmlist,addsubop[inlinenumber],
  393. joinreg64(hregister,hregisterhi),tcallparanode(left).left.location)
  394. else
  395. {$endif cpu64bit}
  396. cg.a_op_reg_loc(exprasmlist,addsubop[inlinenumber],
  397. hregister,tcallparanode(left).left.location);
  398. location_release(exprasmlist,tcallparanode(tcallparanode(left).right).left.location);
  399. end;
  400. cg.g_overflowcheck(exprasmlist,tcallparanode(left).left);
  401. cg.g_rangecheck(exprasmlist,tcallparanode(left).left,tcallparanode(left).left.resulttype.def);
  402. end;
  403. {*****************************************************************************
  404. TYPEINFO GENERIC HANDLING
  405. *****************************************************************************}
  406. procedure tcginlinenode.second_typeinfo;
  407. var
  408. href : treference;
  409. begin
  410. location_reset(location,LOC_REGISTER,OS_ADDR);
  411. location.register:=rg.getaddressregister(exprasmlist);
  412. reference_reset_symbol(href,tstoreddef(ttypenode(tcallparanode(left).left).resulttype.def).get_rtti_label(fullrtti),0);
  413. cg.a_loadaddr_ref_reg(exprasmlist,href,location.register);
  414. end;
  415. {*****************************************************************************
  416. INCLUDE/EXCLUDE GENERIC HANDLING
  417. *****************************************************************************}
  418. procedure tcginlinenode.second_IncludeExclude;
  419. var
  420. hregister : tregister;
  421. L : longint;
  422. pushedregs : TMaybesave;
  423. cgop : topcg;
  424. addrreg, hregister2: tregister;
  425. use_small : boolean;
  426. cgsize : tcgsize;
  427. href : treference;
  428. begin
  429. location_copy(location,left.location);
  430. secondpass(tcallparanode(left).left);
  431. if tcallparanode(tcallparanode(left).right).left.nodetype=ordconstn then
  432. begin
  433. { calculate bit position }
  434. l:=1 shl (tordconstnode(tcallparanode(tcallparanode(left).right).left).value mod 32);
  435. { determine operator }
  436. if inlinenumber=in_include_x_y then
  437. cgop:=OP_OR
  438. else
  439. begin
  440. cgop:=OP_AND;
  441. l:=not(l);
  442. end;
  443. if (tcallparanode(left).left.location.loc=LOC_REFERENCE) then
  444. begin
  445. inc(tcallparanode(left).left.location.reference.offset,
  446. (tordconstnode(tcallparanode(tcallparanode(left).right).left).value div 32)*4);
  447. cg.a_op_const_ref(exprasmlist,cgop,OS_INT,l,tcallparanode(left).left.location.reference);
  448. location_release(exprasmlist,tcallparanode(left).left.location);
  449. end
  450. else
  451. { LOC_CREGISTER }
  452. begin
  453. cg.a_op_const_reg(exprasmlist,cgop,l,tcallparanode(left).left.location.register);
  454. end;
  455. end
  456. else
  457. begin
  458. use_small:=
  459. { set type }
  460. (tsetdef(tcallparanode(left).left.resulttype.def).settype=smallset)
  461. and
  462. { elemenut number between 1 and 32 }
  463. ((tcallparanode(tcallparanode(left).right).left.resulttype.def.deftype=orddef) and
  464. (torddef(tcallparanode(tcallparanode(left).right).left.resulttype.def).high<=32) or
  465. (tcallparanode(tcallparanode(left).right).left.resulttype.def.deftype=enumdef) and
  466. (tenumdef(tcallparanode(tcallparanode(left).right).left.resulttype.def).max<=32));
  467. { generate code for the element to set }
  468. maybe_save(exprasmlist,tcallparanode(tcallparanode(left).right).left.registers32,
  469. tcallparanode(left).left.location,pushedregs);
  470. secondpass(tcallparanode(tcallparanode(left).right).left);
  471. maybe_restore(exprasmlist,tcallparanode(left).left.location,pushedregs);
  472. { bitnumber - which must be loaded into register }
  473. hregister := cg.get_scratch_reg_int(exprasmlist,OS_INT);
  474. hregister2 := rg.getregisterint(exprasmlist,OS_INT);
  475. case tcallparanode(tcallparanode(left).right).left.location.loc of
  476. LOC_CREGISTER,
  477. LOC_REGISTER:
  478. begin
  479. cg.a_load_reg_reg(exprasmlist,OS_INT,OS_INT,
  480. tcallparanode(tcallparanode(left).right).left.location.register,hregister);
  481. end;
  482. LOC_REFERENCE:
  483. begin
  484. cgsize := def_cgsize(tcallparanode(tcallparanode(left).right).left.resulttype.def);
  485. cg.a_load_ref_reg(exprasmlist,cgsize,
  486. tcallparanode(tcallparanode(left).right).left.location.reference,hregister);
  487. end;
  488. else
  489. internalerror(20020727);
  490. end;
  491. { hregister contains the bitnumber to add }
  492. cg.a_load_const_reg(exprasmlist, OS_INT, 1, hregister2);
  493. cg.a_op_reg_reg(exprasmlist, OP_SHL, OS_INT, hregister, hregister2);
  494. if use_small then
  495. begin
  496. { possiblities :
  497. bitnumber : LOC_REFERENCE, LOC_REGISTER, LOC_CREGISTER
  498. set value : LOC_REFERENCE, LOC_REGISTER
  499. }
  500. { location of set }
  501. if (tcallparanode(left).left.location.loc=LOC_REFERENCE) then
  502. begin
  503. if inlinenumber=in_include_x_y then
  504. begin
  505. cg.a_op_reg_ref(exprasmlist, OP_OR, OS_32, hregister2,
  506. tcallparanode(left).left.location.reference);
  507. end
  508. else
  509. begin
  510. cg.a_op_reg_reg(exprasmlist, OP_NOT, OS_32, hregister2,
  511. hregister2);
  512. cg.a_op_reg_ref(exprasmlist, OP_AND, OS_32, hregister2,
  513. tcallparanode(left).left.location.reference);
  514. end;
  515. end
  516. else
  517. internalerror(20020728);
  518. end
  519. else
  520. begin
  521. { possiblities :
  522. bitnumber : LOC_REFERENCE, LOC_REGISTER, LOC_CREGISTER
  523. set value : LOC_REFERENCE
  524. }
  525. { hregister contains the bitnumber (div 32 to get the correct offset) }
  526. cg.a_op_const_reg(exprasmlist, OP_SHR, 5, hregister);
  527. addrreg := cg.get_scratch_reg_address(exprasmlist);
  528. { calculate the correct address of the operand }
  529. cg.a_loadaddr_ref_reg(exprasmlist, tcallparanode(left).left.location.reference,addrreg);
  530. cg.a_op_reg_reg(exprasmlist, OP_ADD, OS_INT, hregister, addrreg);
  531. reference_reset_base(href,addrreg,0);
  532. if inlinenumber=in_include_x_y then
  533. begin
  534. cg.a_op_reg_ref(exprasmlist, OP_OR, OS_32, hregister2, href);
  535. end
  536. else
  537. begin
  538. cg.a_op_reg_reg(exprasmlist, OP_NOT, OS_32, hregister2, hregister2);
  539. cg.a_op_reg_ref(exprasmlist, OP_AND, OS_32, hregister2, href);
  540. end;
  541. cg.free_scratch_reg(exprasmlist, addrreg);
  542. end;
  543. cg.free_scratch_reg(exprasmlist,hregister);
  544. rg.ungetregisterint(exprasmlist,hregister2);
  545. end;
  546. end;
  547. {*****************************************************************************
  548. FLOAT GENERIC HANDLING
  549. *****************************************************************************}
  550. {
  551. These routines all call internal RTL routines, so if they are
  552. called here, they give an internal error
  553. }
  554. procedure tcginlinenode.second_pi;
  555. begin
  556. internalerror(20020718);
  557. end;
  558. procedure tcginlinenode.second_arctan_real;
  559. begin
  560. internalerror(20020718);
  561. end;
  562. procedure tcginlinenode.second_abs_real;
  563. begin
  564. internalerror(20020718);
  565. end;
  566. procedure tcginlinenode.second_sqr_real;
  567. begin
  568. internalerror(20020718);
  569. end;
  570. procedure tcginlinenode.second_sqrt_real;
  571. begin
  572. internalerror(20020718);
  573. end;
  574. procedure tcginlinenode.second_ln_real;
  575. begin
  576. internalerror(20020718);
  577. end;
  578. procedure tcginlinenode.second_cos_real;
  579. begin
  580. internalerror(20020718);
  581. end;
  582. procedure tcginlinenode.second_sin_real;
  583. begin
  584. internalerror(20020718);
  585. end;
  586. begin
  587. cinlinenode:=tcginlinenode;
  588. end.
  589. {
  590. $Log$
  591. Revision 1.23 2003-04-06 21:11:23 olle
  592. * changed newasmsymbol to newasmsymboldata for data symbols
  593. Revision 1.22 2003/03/28 19:16:56 peter
  594. * generic constructor working for i386
  595. * remove fixed self register
  596. * esi added as address register for i386
  597. Revision 1.21 2003/02/19 22:00:14 daniel
  598. * Code generator converted to new register notation
  599. - Horribily outdated todo.txt removed
  600. Revision 1.20 2003/01/31 22:47:27 peter
  601. * fix previous typeof change
  602. Revision 1.19 2003/01/30 21:46:57 peter
  603. * self fixes for static methods (merged)
  604. Revision 1.18 2003/01/08 18:43:56 daniel
  605. * Tregister changed into a record
  606. Revision 1.17 2002/11/25 17:43:18 peter
  607. * splitted defbase in defutil,symutil,defcmp
  608. * merged isconvertable and is_equal into compare_defs(_ext)
  609. * made operator search faster by walking the list only once
  610. Revision 1.16 2002/10/05 12:43:25 carl
  611. * fixes for Delphi 6 compilation
  612. (warning : Some features do not work under Delphi)
  613. Revision 1.15 2002/09/30 07:00:46 florian
  614. * fixes to common code to get the alpha compiler compiled applied
  615. Revision 1.14 2002/09/17 18:54:02 jonas
  616. * a_load_reg_reg() now has two size parameters: source and dest. This
  617. allows some optimizations on architectures that don't encode the
  618. register size in the register name.
  619. Revision 1.13 2002/08/13 18:01:52 carl
  620. * rename swatoperands to swapoperands
  621. + m68k first compilable version (still needs a lot of testing):
  622. assembler generator, system information , inline
  623. assembler reader.
  624. Revision 1.12 2002/08/11 14:32:26 peter
  625. * renamed current_library to objectlibrary
  626. Revision 1.11 2002/08/11 13:24:11 peter
  627. * saving of asmsymbols in ppu supported
  628. * asmsymbollist global is removed and moved into a new class
  629. tasmlibrarydata that will hold the info of a .a file which
  630. corresponds with a single module. Added librarydata to tmodule
  631. to keep the library info stored for the module. In the future the
  632. objectfiles will also be stored to the tasmlibrarydata class
  633. * all getlabel/newasmsymbol and friends are moved to the new class
  634. Revision 1.10 2002/08/05 18:27:48 carl
  635. + more more more documentation
  636. + first version include/exclude (can't test though, not enough scratch for i386 :()...
  637. Revision 1.9 2002/08/04 19:06:41 carl
  638. + added generic exception support (still does not work!)
  639. + more documentation
  640. Revision 1.8 2002/07/31 07:54:59 jonas
  641. * re-enabled second_assigned()
  642. Revision 1.7 2002/07/30 20:50:43 florian
  643. * the code generator knows now if parameters are in registers
  644. Revision 1.6 2002/07/29 21:23:42 florian
  645. * more fixes for the ppc
  646. + wrappers for the tcnvnode.first_* stuff introduced
  647. Revision 1.5 2002/07/28 20:45:22 florian
  648. + added direct assembler reader for PowerPC
  649. Revision 1.4 2002/07/26 09:45:20 florian
  650. * fixed a mistake in yesterday's commit, forgot to commit it
  651. Revision 1.3 2002/07/25 22:58:30 florian
  652. no message
  653. Revision 1.2 2002/07/25 17:55:41 carl
  654. + First working revision
  655. Revision 1.1 2002/07/24 04:07:49 carl
  656. + first revision (incomplete)
  657. }