From 9bd282eb3b29d20cfde2e711f96dd8138fb61765 Mon Sep 17 00:00:00 2001 From: nickysn Date: Tue, 5 Jan 2021 08:40:33 +0000 Subject: [PATCH] + implemented int to real conversion git-svn-id: branches/wasm@48081 - --- compiler/wasm32/nwasmcnv.pas | 83 ++++++++++++++++++++++++++++++++++-- 1 file changed, 79 insertions(+), 4 deletions(-) diff --git a/compiler/wasm32/nwasmcnv.pas b/compiler/wasm32/nwasmcnv.pas index c21dc5dbea..39be8bc5d7 100644 --- a/compiler/wasm32/nwasmcnv.pas +++ b/compiler/wasm32/nwasmcnv.pas @@ -25,7 +25,7 @@ unit nwasmcnv; interface uses - ncnv,ncgcnv; + node,ncnv,ncgcnv; type @@ -33,20 +33,95 @@ interface twasmtypeconvnode = class(tcgtypeconvnode) protected + function first_int_to_real: tnode; override; + procedure second_int_to_real;override; procedure second_int_to_bool;override; end; implementation uses - globals,aasmdata, - defutil, - cgbase,cgutils,pass_2, + verbose,globals,globtype,aasmdata, + defutil,cpubase, + cgbase,cgutils,pass_1,pass_2, + aasmcpu, + symdef, hlcgobj,hlcgcpu; { twasmtypeconvnode } + function twasmtypeconvnode.first_int_to_real: tnode; + begin + first_int_to_real:=nil; + if left.resultdef.size<4 then + begin + inserttypeconv(left,s32inttype); + firstpass(left); + end; + expectloc:=LOC_FPUREGISTER; + end; + + + procedure twasmtypeconvnode.second_int_to_real; + var + op: TAsmOp; + begin + secondpass(left); + if codegenerror then + exit; + + case tfloatdef(resultdef).floattype of + s32real: + begin + if is_64bitint(left.resultdef) or + is_currency(left.resultdef) then + begin + if is_signed(left.resultdef) then + op:=a_f32_convert_s_i64 + else + op:=a_f32_convert_u_i64; + end + else + { other integers are supposed to be 32 bit } + begin + if is_signed(left.resultdef) then + op:=a_f32_convert_s_i32 + else + op:=a_f32_convert_u_i32; + end; + end; + s64real: + begin + if is_64bitint(left.resultdef) or + is_currency(left.resultdef) then + begin + if is_signed(left.resultdef) then + op:=a_f64_convert_s_i64 + else + op:=a_f64_convert_u_i64; + end + else + { other integers are supposed to be 32 bit } + begin + if is_signed(left.resultdef) then + op:=a_f64_convert_s_i32 + else + op:=a_f64_convert_u_i32; + end; + end; + else + internalerror(2021010501); + end; + + thlcgwasm(hlcg).a_load_loc_stack(current_asmdata.CurrAsmList,left.resultdef,left.location); + current_asmdata.CurrAsmList.concat(taicpu.op_none(op)); + location_reset(location,LOC_FPUREGISTER,def_cgsize(resultdef)); + location.register := hlcg.getfpuregister(current_asmdata.CurrAsmList,resultdef); + thlcgwasm(hlcg).a_load_stack_loc(current_asmdata.CurrAsmList,resultdef,location); + end; + + procedure twasmtypeconvnode.second_int_to_bool; begin secondpass(left);