@@ -711,8 +711,13 @@ private sub check_optim(byref code as string)
711711
712712 if part2=prevpart1 then
713713 if part1=prevpart2 then
714- 'asm_info("OPTIMIZATION 1")
715- code= "#O1 " +code
714+ if instr(part2, "[" )<> 0 and (right(part1, 1 )= "d" or part1 [0 ]=asc( "e" )) then
715+ ''to avoid issue if after 64bit register is used with xmm
716+ writepos=len(ctx.proc_txt)+len(code)+ 9
717+ code= "#O1" +code+newline+ string ( ctx.indent* 3 , 32 )+ "and " +part1+ " ,0xFFFFFFFF"
718+ else
719+ code= "#O1 " +code
720+ End If
716721 else
717722 if prevpart2= "" then ''todo remove me after fixed
718723 asm_error( "prev/part empty " + "part1=" +part1+ " part2=" +part2+ " prevpart1=" +prevpart1+ " prevpart2=" +prevpart2)
@@ -5081,11 +5086,17 @@ private sub _emitconvert( byval v1 as IRVREG ptr, byval v2 as IRVREG ptr )
50815086 end if
50825087
50835088 case FB_DATATYPE_LONG,FB_DATATYPE_ULONG
5084- if v1dtype=FB_DATATYPE_DOUBLE then
5089+ if v2dtype=FB_DATATYPE_ULONG then
5090+ asm_code( "mov eax, " +prefix2+op2)
5091+ asm_code( "cvtsi2sd xmm0, rax" )
5092+ else
50855093 asm_code( "cvtsi2sd xmm0, " +prefix2+op2)
5094+ end if
5095+
5096+ if v1dtype=FB_DATATYPE_DOUBLE then
50865097 asm_code( "movq " +op1+ ", xmm0" )
50875098 else
5088- asm_code( "cvtsi2ss xmm0, " +prefix2+op2 )
5099+ asm_code( "cvtsd2ss xmm0, xmm0" )
50895100 asm_code( "movd " +op1+ ", xmm0" )
50905101 end if
50915102
0 commit comments