From eb49e10ea97e85a5995765777048fb6f25ce13fb Mon Sep 17 00:00:00 2001 From: Stephen Heumann Date: Sun, 14 Feb 2021 17:37:55 -0600 Subject: [PATCH] Implement && and || operators for long long types. This is done by comparing against 0 (similar to how it is done for reals), rather than introducing new intermediate code operations. --- Expression.pas | 72 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 52 insertions(+), 20 deletions(-) diff --git a/Expression.pas b/Expression.pas index 7eebcf1..8090004 100644 --- a/Expression.pas +++ b/Expression.pas @@ -3460,20 +3460,36 @@ case tree^.token.kind of GenerateCode(tree^.left); if expressionType^.kind in [pointerType,arrayType] then expressionType := uLongPtr - else if UsualUnaryConversions = cgExtended then begin - GenLdcReal(0.0); - Gen0t(pc_neq, cgExtended); - expressionType := intPtr; - end; {if} + else begin + et := UsualUnaryConversions; + if et = cgExtended then begin + GenLdcReal(0.0); + Gen0t(pc_neq, cgExtended); + expressionType := intPtr; + end {if} + else if et in [cgQuad,cgUQuad] then begin + GenLdcQuad(longlong0); + Gen0t(pc_neq, et); + expressionType := intPtr; + end; {else if} + end; {else} lType := expressionType; GenerateCode(tree^.right); if expressionType^.kind in [pointerType,arrayType] then expressionType := uLongPtr - else if UsualUnaryConversions = cgExtended then begin - GenLdcReal(0.0); - Gen0t(pc_neq, cgExtended); - expressionType := intPtr; - end; {if} + else begin + et := UsualUnaryConversions; + if et = cgExtended then begin + GenLdcReal(0.0); + Gen0t(pc_neq, cgExtended); + expressionType := intPtr; + end {if} + else if et in [cgQuad,cgUQuad] then begin + GenLdcQuad(longlong0); + Gen0t(pc_neq, et); + expressionType := intPtr; + end; {else if} + end; {else} case UsualBinaryConversions(lType) of cgByte,cgUByte,cgWord,cgUWord: Gen0(pc_ior); @@ -3489,20 +3505,36 @@ case tree^.token.kind of GenerateCode(tree^.left); if expressionType^.kind in [pointerType,arrayType] then expressionType := uLongPtr - else if UsualUnaryConversions = cgExtended then begin - GenLdcReal(0.0); - Gen0t(pc_neq, cgExtended); - expressionType := intPtr; - end; {if} + else begin + et := UsualUnaryConversions; + if et = cgExtended then begin + GenLdcReal(0.0); + Gen0t(pc_neq, cgExtended); + expressionType := intPtr; + end {if} + else if et in [cgQuad,cgUQuad] then begin + GenLdcQuad(longlong0); + Gen0t(pc_neq, et); + expressionType := intPtr; + end; {else if} + end; {else} lType := expressionType; GenerateCode(tree^.right); if expressionType^.kind in [pointerType,arrayType] then expressionType := uLongPtr - else if UsualUnaryConversions = cgExtended then begin - GenLdcReal(0.0); - Gen0t(pc_neq, cgExtended); - expressionType := intPtr; - end; {if} + else begin + et := UsualUnaryConversions; + if et = cgExtended then begin + GenLdcReal(0.0); + Gen0t(pc_neq, cgExtended); + expressionType := intPtr; + end {if} + else if et in [cgQuad,cgUQuad] then begin + GenLdcQuad(longlong0); + Gen0t(pc_neq, et); + expressionType := intPtr; + end; {else if} + end; {else} case UsualBinaryConversions(lType) of cgByte,cgUByte,cgWord,cgUWord: Gen0(pc_and);