ncginl.pas 27 KB

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