ncginl.pas 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676
  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_assigned;virtual; abstract;
  27. procedure second_assert;virtual;
  28. procedure second_sizeoftypeof;virtual;
  29. procedure second_length;virtual;
  30. procedure second_predsucc;virtual;
  31. procedure second_incdec;virtual;
  32. procedure second_typeinfo;virtual;
  33. procedure second_includeexclude;virtual;
  34. procedure second_pi; virtual;
  35. procedure second_arctan_real; virtual;
  36. procedure second_abs_real; virtual;
  37. procedure second_sqr_real; virtual;
  38. procedure second_sqrt_real; virtual;
  39. procedure second_ln_real; virtual;
  40. procedure second_cos_real; virtual;
  41. procedure second_sin_real; virtual;
  42. end;
  43. implementation
  44. uses
  45. globtype,systems,
  46. cutils,verbose,globals,fmodule,
  47. symconst,symdef,defbase,
  48. aasmbase,aasmtai,aasmcpu,
  49. cginfo,cgbase,pass_1,pass_2,
  50. cpubase,paramgr,
  51. nbas,ncon,ncal,ncnv,nld,
  52. cga,tgobj,ncgutil,cgobj,cg64f32,rgobj,rgcpu;
  53. {*****************************************************************************
  54. TCGINLINENODE
  55. *****************************************************************************}
  56. procedure tcginlinenode.pass_2;
  57. var
  58. asmop : tasmop;
  59. l : longint;
  60. oldpushedparasize : longint;
  61. begin
  62. { save & reset pushedparasize }
  63. oldpushedparasize:=pushedparasize;
  64. pushedparasize:=0;
  65. case inlinenumber of
  66. in_assert_x_y:
  67. begin
  68. second_Assert;
  69. end;
  70. in_sizeof_x,
  71. in_typeof_x :
  72. begin
  73. second_SizeofTypeOf;
  74. end;
  75. in_length_x :
  76. begin
  77. second_Length;
  78. end;
  79. in_pred_x,
  80. in_succ_x:
  81. begin
  82. second_PredSucc;
  83. end;
  84. in_dec_x,
  85. in_inc_x :
  86. begin
  87. second_IncDec;
  88. end;
  89. in_typeinfo_x:
  90. begin
  91. second_TypeInfo;
  92. end;
  93. in_assigned_x :
  94. begin
  95. second_Assigned;
  96. end;
  97. in_include_x_y,
  98. in_exclude_x_y:
  99. begin
  100. second_IncludeExclude;
  101. end;
  102. in_pi:
  103. begin
  104. second_pi;
  105. end;
  106. in_sin_extended:
  107. begin
  108. second_sin_real;
  109. end;
  110. in_arctan_extended:
  111. begin
  112. second_arctan_real;
  113. end;
  114. in_abs_extended:
  115. begin
  116. second_abs_real;
  117. end;
  118. in_sqr_extended:
  119. begin
  120. second_sqr_real;
  121. end;
  122. in_sqrt_extended:
  123. begin
  124. second_sqrt_real;
  125. end;
  126. in_ln_extended:
  127. begin
  128. second_ln_real;
  129. end;
  130. in_cos_extended:
  131. begin
  132. second_cos_real;
  133. end;
  134. {$ifdef SUPPORT_MMX}
  135. in_mmx_pcmpeqb..in_mmx_pcmpgtw:
  136. begin
  137. location_reset(location,LOC_MMXREGISTER,OS_NO);
  138. if left.location.loc=LOC_REGISTER then
  139. begin
  140. {!!!!!!!}
  141. end
  142. else if tcallparanode(left).left.location.loc=LOC_REGISTER then
  143. begin
  144. {!!!!!!!}
  145. end
  146. else
  147. begin
  148. {!!!!!!!}
  149. end;
  150. end;
  151. {$endif SUPPORT_MMX}
  152. else internalerror(9);
  153. end;
  154. { reset pushedparasize }
  155. pushedparasize:=oldpushedparasize;
  156. end;
  157. {*****************************************************************************
  158. ASSERT GENERIC HANDLING
  159. *****************************************************************************}
  160. procedure tcginlinenode.second_Assert;
  161. var
  162. hp2 : tstringconstnode;
  163. otlabel,oflabel{,l1} : tasmlabel;
  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. getlabel(truelabel);
  171. 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. cg.a_param_reg(exprasmlist,OS_ADDR,FRAME_POINTER_REG,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(hp2);
  182. secondpass(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 : treference;
  203. hregister : tregister;
  204. begin
  205. location_reset(location,LOC_REGISTER,OS_ADDR);
  206. { for both cases load vmt }
  207. if left.nodetype=typen then
  208. begin
  209. hregister:=rg.getaddressregister(exprasmlist);
  210. reference_reset_symbol(href,newasmsymbol(tobjectdef(left.resulttype.def).vmt_mangledname),0);
  211. cg.a_loadaddr_ref_reg(exprasmlist,href,hregister);
  212. end
  213. else
  214. begin
  215. secondpass(left);
  216. location_release(exprasmlist,left.location);
  217. hregister:=rg.getaddressregister(exprasmlist);
  218. { load VMT pointer }
  219. inc(left.location.reference.offset,tobjectdef(left.resulttype.def).vmt_offset);
  220. cg.a_load_ref_reg(exprasmlist,OS_ADDR,left.location.reference,hregister);
  221. end;
  222. { in sizeof load size }
  223. if inlinenumber=in_sizeof_x then
  224. begin
  225. reference_reset_base(href,hregister,0);
  226. rg.ungetaddressregister(exprasmlist,hregister);
  227. hregister:=rg.getregisterint(exprasmlist);
  228. cg.a_load_ref_reg(exprasmlist,OS_INT,href,hregister);
  229. end;
  230. location.register:=hregister;
  231. end;
  232. {*****************************************************************************
  233. LENGTH GENERIC HANDLING
  234. *****************************************************************************}
  235. procedure tcginlinenode.second_Length;
  236. var
  237. lengthlab : tasmlabel;
  238. hregister : tregister;
  239. href : treference;
  240. begin
  241. secondpass(left);
  242. { length in ansi strings is at offset -8 }
  243. if is_ansistring(left.resulttype.def) or
  244. is_widestring(left.resulttype.def) then
  245. begin
  246. location_force_reg(exprasmlist,left.location,OS_ADDR,false);
  247. hregister:=left.location.register;
  248. getlabel(lengthlab);
  249. cg.a_cmp_const_reg_label(exprasmlist,OS_ADDR,OC_EQ,0,hregister,lengthlab);
  250. reference_reset_base(href,hregister,-8);
  251. cg.a_load_ref_reg(exprasmlist,OS_32,href,hregister);
  252. cg.a_label(exprasmlist,lengthlab);
  253. location_reset(location,LOC_REGISTER,OS_32);
  254. location.register:=hregister;
  255. end
  256. else
  257. begin
  258. location_copy(location,left.location);
  259. location.size:=OS_8;
  260. end;
  261. end;
  262. {*****************************************************************************
  263. PRED/SUCC GENERIC HANDLING
  264. *****************************************************************************}
  265. procedure tcginlinenode.second_PredSucc;
  266. var
  267. cgsize : TCGSize;
  268. cgop : topcg;
  269. begin
  270. secondpass(left);
  271. if inlinenumber=in_pred_x then
  272. cgop:=OP_SUB
  273. else
  274. cgop:=OP_ADD;
  275. cgsize:=def_cgsize(resulttype.def);
  276. { we need a value in a register }
  277. location_copy(location,left.location);
  278. location_force_reg(exprasmlist,location,cgsize,false);
  279. if cgsize in [OS_64,OS_S64] then
  280. cg64.a_op64_const_reg(exprasmlist,cgop,1,
  281. location.register64)
  282. else
  283. cg.a_op_const_reg(exprasmlist,cgop,1,location.register);
  284. cg.g_overflowcheck(exprasmlist,self);
  285. cg.g_rangecheck(exprasmlist,self,resulttype.def);
  286. end;
  287. {*****************************************************************************
  288. INC/DEC GENERIC HANDLING
  289. *****************************************************************************}
  290. procedure tcginlinenode.second_IncDec;
  291. const
  292. addsubop:array[in_inc_x..in_dec_x] of TOpCG=(OP_ADD,OP_SUB);
  293. var
  294. addvalue : longint;
  295. addconstant : boolean;
  296. hregisterhi,
  297. hregister : tregister;
  298. cgsize : tcgsize;
  299. pushedregs : tmaybesave;
  300. begin
  301. { set defaults }
  302. addconstant:=true;
  303. { load first parameter, must be a reference }
  304. secondpass(tcallparanode(left).left);
  305. cgsize:=def_cgsize(tcallparanode(left).left.resulttype.def);
  306. { get addvalue }
  307. case tcallparanode(left).left.resulttype.def.deftype of
  308. orddef,
  309. enumdef :
  310. addvalue:=1;
  311. pointerdef :
  312. begin
  313. if is_void(tpointerdef(tcallparanode(left).left.resulttype.def).pointertype.def) then
  314. addvalue:=1
  315. else
  316. addvalue:=tpointerdef(tcallparanode(left).left.resulttype.def).pointertype.def.size;
  317. end;
  318. else
  319. internalerror(10081);
  320. end;
  321. { second_ argument specified?, must be a s32bit in register }
  322. if assigned(tcallparanode(left).right) then
  323. begin
  324. maybe_save(exprasmlist,tcallparanode(tcallparanode(left).right).left.registers32,
  325. tcallparanode(left).left.location,pushedregs);
  326. secondpass(tcallparanode(tcallparanode(left).right).left);
  327. maybe_restore(exprasmlist,tcallparanode(left).left.location,pushedregs);
  328. { when constant, just multiply the addvalue }
  329. if is_constintnode(tcallparanode(tcallparanode(left).right).left) then
  330. addvalue:=addvalue*get_ordinal_value(tcallparanode(tcallparanode(left).right).left)
  331. else
  332. begin
  333. location_force_reg(exprasmlist,tcallparanode(tcallparanode(left).right).left.location,cgsize,false);
  334. hregister:=tcallparanode(tcallparanode(left).right).left.location.register;
  335. hregisterhi:=tcallparanode(tcallparanode(left).right).left.location.registerhigh;
  336. { insert multiply with addvalue if its >1 }
  337. if addvalue>1 then
  338. cg.a_op_const_reg(exprasmlist,OP_IMUL,addvalue,hregister);
  339. addconstant:=false;
  340. end;
  341. end;
  342. { write the add instruction }
  343. if addconstant then
  344. begin
  345. if cgsize in [OS_64,OS_S64] then
  346. cg64.a_op64_const_loc(exprasmlist,addsubop[inlinenumber],
  347. addvalue,tcallparanode(left).left.location)
  348. else
  349. cg.a_op_const_loc(exprasmlist,addsubop[inlinenumber],
  350. addvalue,tcallparanode(left).left.location);
  351. end
  352. else
  353. begin
  354. if cgsize in [OS_64,OS_S64] then
  355. cg64.a_op64_reg_loc(exprasmlist,addsubop[inlinenumber],
  356. joinreg64(hregister,hregisterhi),tcallparanode(left).left.location)
  357. else
  358. cg.a_op_reg_loc(exprasmlist,addsubop[inlinenumber],
  359. hregister,tcallparanode(left).left.location);
  360. location_release(exprasmlist,tcallparanode(tcallparanode(left).right).left.location);
  361. end;
  362. cg.g_overflowcheck(exprasmlist,tcallparanode(left).left);
  363. cg.g_rangecheck(exprasmlist,tcallparanode(left).left,tcallparanode(left).left.resulttype.def);
  364. end;
  365. {*****************************************************************************
  366. TYPEINFO GENERIC HANDLING
  367. *****************************************************************************}
  368. procedure tcginlinenode.second_typeinfo;
  369. var
  370. href : treference;
  371. begin
  372. location_reset(location,LOC_REGISTER,OS_ADDR);
  373. location.register:=rg.getaddressregister(exprasmlist);
  374. reference_reset_symbol(href,tstoreddef(ttypenode(tcallparanode(left).left).resulttype.def).get_rtti_label(fullrtti),0);
  375. cg.a_loadaddr_ref_reg(exprasmlist,href,location.register);
  376. end;
  377. {*****************************************************************************
  378. ASSIGNED GENERIC HANDLING
  379. *****************************************************************************}
  380. (*
  381. procedure tcginlinenode.second_Assigned;
  382. var
  383. hreg : tregister;
  384. ptrvalidlabel : tasmlabel;
  385. begin
  386. secondpass(tcallparanode(left).left);
  387. location_release(exprasmlist,tcallparanode(left).left.location);
  388. hreg := rg.getregisterint(exprasmlist);
  389. if (tcallparanode(left).left.location.loc in [LOC_REGISTER,LOC_CREGISTER]) then
  390. begin
  391. { if pointer is non-nil, and is in register, this directly the value we can use }
  392. cg.a_load_reg_reg(exprasmlist, OS_ADDR, tcallparanode(left).left.location.register, hreg);
  393. end
  394. else
  395. begin
  396. getlabel(ptrvalidlabel);
  397. cg.a_load_const_reg(exprasmlist, OS_INT, 1, hreg);
  398. cg.a_cmp_const_ref_label(exprasmlist, OS_ADDR, OC_NE, 0,
  399. tcallparanode(left).left.location.reference, ptrvalidlabel);
  400. cg.a_load_const_reg(exprasmlist, OS_INT, 0, hreg);
  401. cg.a_label(exprasmlist,ptrvalidlabel);
  402. end;
  403. location.register := hreg;
  404. location_reset(location,LOC_REGISTER,OS_INT);
  405. WriteLn('Exiting assigned node!');
  406. end;
  407. *)
  408. {*****************************************************************************
  409. INCLUDE/EXCLUDE GENERIC HANDLING
  410. *****************************************************************************}
  411. procedure tcginlinenode.second_IncludeExclude;
  412. var
  413. scratch_reg : boolean;
  414. hregister : tregister;
  415. asmop : tasmop;
  416. L : longint;
  417. pushedregs : TMaybesave;
  418. cgop : topcg;
  419. addrreg, hregister2: tregister;
  420. use_small : boolean;
  421. cgsize : tcgsize;
  422. href : treference;
  423. begin
  424. location_copy(location,left.location);
  425. secondpass(tcallparanode(left).left);
  426. if tcallparanode(tcallparanode(left).right).left.nodetype=ordconstn then
  427. begin
  428. { calculate bit position }
  429. l:=1 shl (tordconstnode(tcallparanode(tcallparanode(left).right).left).value mod 32);
  430. { determine operator }
  431. if inlinenumber=in_include_x_y then
  432. cgop:=OP_OR
  433. else
  434. begin
  435. cgop:=OP_AND;
  436. l:=not(l);
  437. end;
  438. if (tcallparanode(left).left.location.loc=LOC_REFERENCE) then
  439. begin
  440. inc(tcallparanode(left).left.location.reference.offset,
  441. (tordconstnode(tcallparanode(tcallparanode(left).right).left).value div 32)*4);
  442. cg.a_op_const_ref(exprasmlist,cgop,OS_INT,l,tcallparanode(left).left.location.reference);
  443. location_release(exprasmlist,tcallparanode(left).left.location);
  444. end
  445. else
  446. { LOC_CREGISTER }
  447. begin
  448. cg.a_op_const_reg(exprasmlist,cgop,l,tcallparanode(left).left.location.register);
  449. end;
  450. end
  451. else
  452. begin
  453. use_small:=
  454. { set type }
  455. (tsetdef(tcallparanode(left).left.resulttype.def).settype=smallset)
  456. and
  457. { elemenut number between 1 and 32 }
  458. ((tcallparanode(tcallparanode(left).right).left.resulttype.def.deftype=orddef) and
  459. (torddef(tcallparanode(tcallparanode(left).right).left.resulttype.def).high<=32) or
  460. (tcallparanode(tcallparanode(left).right).left.resulttype.def.deftype=enumdef) and
  461. (tenumdef(tcallparanode(tcallparanode(left).right).left.resulttype.def).max<=32));
  462. { generate code for the element to set }
  463. maybe_save(exprasmlist,tcallparanode(tcallparanode(left).right).left.registers32,
  464. tcallparanode(left).left.location,pushedregs);
  465. secondpass(tcallparanode(tcallparanode(left).right).left);
  466. maybe_restore(exprasmlist,tcallparanode(left).left.location,pushedregs);
  467. { bitnumber - which must be loaded into register }
  468. hregister := cg.get_scratch_reg_int(exprasmlist);
  469. hregister2 := rg.getregisterint(exprasmlist);
  470. case tcallparanode(tcallparanode(left).right).left.location.loc of
  471. LOC_CREGISTER,
  472. LOC_REGISTER:
  473. begin
  474. cg.a_load_reg_reg(exprasmlist,OS_INT,
  475. tcallparanode(tcallparanode(left).right).left.location.register,hregister);
  476. end;
  477. LOC_REFERENCE:
  478. begin
  479. cgsize := def_cgsize(tcallparanode(tcallparanode(left).right).left.resulttype.def);
  480. cg.a_load_ref_reg(exprasmlist,cgsize,
  481. tcallparanode(tcallparanode(left).right).left.location.reference,hregister);
  482. end;
  483. else
  484. internalerror(20020727);
  485. end;
  486. { hregister contains the bitnumber to add }
  487. cg.a_load_const_reg(exprasmlist, OS_INT, 1, hregister2);
  488. cg.a_op_reg_reg(exprasmlist, OP_SHL, OS_INT, hregister, hregister2);
  489. if use_small then
  490. begin
  491. { possiblities :
  492. bitnumber : LOC_REFERENCE, LOC_REGISTER, LOC_CREGISTER
  493. set value : LOC_REFERENCE, LOC_REGISTER
  494. }
  495. { location of set }
  496. if (tcallparanode(left).left.location.loc=LOC_REFERENCE) then
  497. begin
  498. if inlinenumber=in_include_x_y then
  499. begin
  500. cg.a_op_reg_ref(exprasmlist, OP_OR, OS_32, hregister2,
  501. tcallparanode(left).left.location.reference);
  502. end
  503. else
  504. begin
  505. cg.a_op_reg_reg(exprasmlist, OP_NOT, OS_32, hregister2,
  506. hregister2);
  507. cg.a_op_reg_ref(exprasmlist, OP_AND, OS_32, hregister2,
  508. tcallparanode(left).left.location.reference);
  509. end;
  510. end
  511. else
  512. internalerror(20020728);
  513. end
  514. else
  515. begin
  516. { possiblities :
  517. bitnumber : LOC_REFERENCE, LOC_REGISTER, LOC_CREGISTER
  518. set value : LOC_REFERENCE
  519. }
  520. { hregister contains the bitnumber (div 32 to get the correct offset) }
  521. cg.a_op_const_reg(exprasmlist, OP_SHR, 5, hregister);
  522. addrreg := cg.get_scratch_reg_address(exprasmlist);
  523. { calculate the correct address of the operand }
  524. cg.a_loadaddr_ref_reg(exprasmlist, tcallparanode(left).left.location.reference,addrreg);
  525. cg.a_op_reg_reg(exprasmlist, OP_ADD, OS_INT, hregister, addrreg);
  526. reference_reset_base(href,addrreg,0);
  527. if inlinenumber=in_include_x_y then
  528. begin
  529. cg.a_op_reg_ref(exprasmlist, OP_OR, OS_32, hregister2, href);
  530. end
  531. else
  532. begin
  533. cg.a_op_reg_reg(exprasmlist, OP_NOT, OS_32, hregister2, hregister2);
  534. cg.a_op_reg_ref(exprasmlist, OP_AND, OS_32, hregister2, href);
  535. end;
  536. cg.free_scratch_reg(exprasmlist, addrreg);
  537. end;
  538. cg.free_scratch_reg(exprasmlist,hregister);
  539. rg.ungetregisterint(exprasmlist,hregister2);
  540. end;
  541. end;
  542. {*****************************************************************************
  543. FLOAT GENERIC HANDLING
  544. *****************************************************************************}
  545. {
  546. These routines all call internal RTL routines, so if they are
  547. called here, they give an internal error
  548. }
  549. procedure tcginlinenode.second_pi;
  550. begin
  551. internalerror(20020718);
  552. end;
  553. procedure tcginlinenode.second_arctan_real;
  554. begin
  555. internalerror(20020718);
  556. end;
  557. procedure tcginlinenode.second_abs_real;
  558. begin
  559. internalerror(20020718);
  560. end;
  561. procedure tcginlinenode.second_sqr_real;
  562. begin
  563. internalerror(20020718);
  564. end;
  565. procedure tcginlinenode.second_sqrt_real;
  566. begin
  567. internalerror(20020718);
  568. end;
  569. procedure tcginlinenode.second_ln_real;
  570. begin
  571. internalerror(20020718);
  572. end;
  573. procedure tcginlinenode.second_cos_real;
  574. begin
  575. internalerror(20020718);
  576. end;
  577. procedure tcginlinenode.second_sin_real;
  578. begin
  579. internalerror(20020718);
  580. end;
  581. begin
  582. cinlinenode:=tcginlinenode;
  583. end.
  584. {
  585. $Log$
  586. Revision 1.10 2002-08-05 18:27:48 carl
  587. + more more more documentation
  588. + first version include/exclude (can't test though, not enough scratch for i386 :()...
  589. Revision 1.9 2002/08/04 19:06:41 carl
  590. + added generic exception support (still does not work!)
  591. + more documentation
  592. Revision 1.8 2002/07/31 07:54:59 jonas
  593. * re-enabled second_assigned()
  594. Revision 1.7 2002/07/30 20:50:43 florian
  595. * the code generator knows now if parameters are in registers
  596. Revision 1.6 2002/07/29 21:23:42 florian
  597. * more fixes for the ppc
  598. + wrappers for the tcnvnode.first_* stuff introduced
  599. Revision 1.5 2002/07/28 20:45:22 florian
  600. + added direct assembler reader for PowerPC
  601. Revision 1.4 2002/07/26 09:45:20 florian
  602. * fixed a mistake in yesterday's commit, forgot to commit it
  603. Revision 1.3 2002/07/25 22:58:30 florian
  604. no message
  605. Revision 1.2 2002/07/25 17:55:41 carl
  606. + First working revision
  607. Revision 1.1 2002/07/24 04:07:49 carl
  608. + first revision (incomplete)
  609. }