Skip to content

Commit

Permalink
Resolves #830 - Fix floating point comparison operations
Browse files Browse the repository at this point in the history
  • Loading branch information
rahulmutt committed Aug 4, 2018
1 parent 03640ae commit 4566f4b
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 26 deletions.
2 changes: 1 addition & 1 deletion codec-jvm
26 changes: 13 additions & 13 deletions compiler/Eta/CodeGen/Expr.hs
Expand Up @@ -545,19 +545,19 @@ comparisonPrimOp primop
cmpOp CharGeOp = liftUnsignedOp ifge
cmpOp CharGtOp = liftUnsignedOp ifgt

cmpOp DoubleEqOp = liftTypedCmpOp jdouble ifeq
cmpOp DoubleNeOp = liftTypedCmpOp jdouble ifne
cmpOp DoubleGeOp = liftTypedCmpOp jdouble ifge
cmpOp DoubleLeOp = liftTypedCmpOp jdouble ifle
cmpOp DoubleGtOp = liftTypedCmpOp jdouble ifgt
cmpOp DoubleLtOp = liftTypedCmpOp jdouble iflt

cmpOp FloatEqOp = liftTypedCmpOp jfloat ifeq
cmpOp FloatNeOp = liftTypedCmpOp jfloat ifne
cmpOp FloatGeOp = liftTypedCmpOp jfloat ifge
cmpOp FloatLeOp = liftTypedCmpOp jfloat ifle
cmpOp FloatGtOp = liftTypedCmpOp jfloat ifgt
cmpOp FloatLtOp = liftTypedCmpOp jfloat iflt
cmpOp DoubleEqOp = liftNormalOp if_dcmpeq
cmpOp DoubleNeOp = liftNormalOp if_dcmpne
cmpOp DoubleGeOp = liftNormalOp if_dcmpge
cmpOp DoubleLeOp = liftNormalOp if_dcmple
cmpOp DoubleGtOp = liftNormalOp if_dcmpgt
cmpOp DoubleLtOp = liftNormalOp if_dcmplt

cmpOp FloatEqOp = liftNormalOp if_fcmpeq
cmpOp FloatNeOp = liftNormalOp if_fcmpne
cmpOp FloatGeOp = liftNormalOp if_fcmpge
cmpOp FloatLeOp = liftNormalOp if_fcmple
cmpOp FloatGtOp = liftNormalOp if_fcmpgt
cmpOp FloatLtOp = liftNormalOp if_fcmplt

cmpOp AddrEqOp = liftTypedCmpOp jlong ifeq
cmpOp AddrNeOp = liftTypedCmpOp jlong ifne
Expand Down
27 changes: 15 additions & 12 deletions compiler/Eta/CodeGen/Prim.hs
Expand Up @@ -667,12 +667,12 @@ simpleOp CharLeOp = Just $ unsignedCmp ifle
simpleOp CharLtOp = Just $ unsignedCmp iflt

-- Double# ops
simpleOp DoubleEqOp = Just $ typedCmp jdouble ifeq
simpleOp DoubleNeOp = Just $ typedCmp jdouble ifne
simpleOp DoubleGeOp = Just $ typedCmp jdouble ifge
simpleOp DoubleLeOp = Just $ typedCmp jdouble ifle
simpleOp DoubleGtOp = Just $ typedCmp jdouble ifgt
simpleOp DoubleLtOp = Just $ typedCmp jdouble iflt
simpleOp DoubleEqOp = Just $ floatCmp if_dcmpeq
simpleOp DoubleNeOp = Just $ floatCmp if_dcmpne
simpleOp DoubleGeOp = Just $ floatCmp if_dcmpge
simpleOp DoubleLeOp = Just $ floatCmp if_dcmple
simpleOp DoubleGtOp = Just $ floatCmp if_dcmpgt
simpleOp DoubleLtOp = Just $ floatCmp if_dcmplt

simpleOp DoubleAddOp = Just $ normalOp dadd
simpleOp DoubleSubOp = Just $ normalOp dsub
Expand All @@ -697,12 +697,12 @@ simpleOp DoubleTanhOp = Just $ normalOp $ doubleMathEndoOp "tanh"
simpleOp DoublePowerOp = Just $ normalOp $ doubleMathOp "pow" [jdouble, jdouble] jdouble

-- Float# ops
simpleOp FloatEqOp = Just $ typedCmp jfloat ifeq
simpleOp FloatNeOp = Just $ typedCmp jfloat ifne
simpleOp FloatGeOp = Just $ typedCmp jfloat ifge
simpleOp FloatLeOp = Just $ typedCmp jfloat ifle
simpleOp FloatGtOp = Just $ typedCmp jfloat ifgt
simpleOp FloatLtOp = Just $ typedCmp jfloat iflt
simpleOp FloatEqOp = Just $ floatCmp if_fcmpeq
simpleOp FloatNeOp = Just $ floatCmp if_fcmpne
simpleOp FloatGeOp = Just $ floatCmp if_fcmpge
simpleOp FloatLeOp = Just $ floatCmp if_fcmple
simpleOp FloatGtOp = Just $ floatCmp if_fcmpgt
simpleOp FloatLtOp = Just $ floatCmp if_fcmplt

simpleOp FloatAddOp = Just $ normalOp fadd
simpleOp FloatSubOp = Just $ normalOp fsub
Expand Down Expand Up @@ -1048,6 +1048,9 @@ typedCmp ft ifop [arg1, arg2]
<> ifop (iconst jint 1) (iconst jint 0)
typedCmp _ _ _ = error $ "typedCmp: bad typedCmp"

floatCmp :: (Code -> Code -> Code) -> [Code] -> Code
floatCmp ifop args = fold args <> ifop (iconst jint 1) (iconst jint 0)

unsignedCmp :: (Code -> Code -> Code) -> [Code] -> Code
unsignedCmp ifop args
= typedCmp jlong ifop $ map unsignedExtend args
Expand Down

0 comments on commit 4566f4b

Please sign in to comment.