From 79aa92dfd81d569fe6120b8e5c00d41528801153 Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Wed, 7 Oct 2020 23:03:33 -0400 Subject: Optimized generation of I64, F64 and variants on JVM. --- .../source/luxc/lang/translation/jvm/primitive.lux | 77 +++++++++++++++++++--- 1 file changed, 68 insertions(+), 9 deletions(-) (limited to 'lux-jvm/source/luxc/lang/translation/jvm/primitive.lux') diff --git a/lux-jvm/source/luxc/lang/translation/jvm/primitive.lux b/lux-jvm/source/luxc/lang/translation/jvm/primitive.lux index 873c363bd..469e730de 100644 --- a/lux-jvm/source/luxc/lang/translation/jvm/primitive.lux +++ b/lux-jvm/source/luxc/lang/translation/jvm/primitive.lux @@ -1,5 +1,9 @@ (.module: [lux (#- i64) + ["." host (#+ import:)] + [data + [number + ["i" int]]] [target [jvm ["." type]]] @@ -18,13 +22,68 @@ (function (_ value) (operation@wrap (_.GETSTATIC Boolean (if value "TRUE" "FALSE") Boolean))))) -(template [ ] - [(def: #export ( value) - (-> (Operation Inst)) - (let [loadI (|> value )] - (operation@wrap (|>> loadI ))))] +(def: #export (i64 value) + (-> (I64 Any) (Operation Inst)) + (case (.int value) + (^template [ ] + + (operation@wrap (|>> (_.wrap type.long)))) + ([+0 _.LCONST_0] + [+1 _.LCONST_1]) - [i64 (I64 Any) (<| _.long .int) (_.wrap type.long)] - [f64 Frac _.double (_.wrap type.double)] - [text Text _.string (<|)] - ) + (^template [ ] + + (operation@wrap (|>> _.I2L (_.wrap type.long)))) + ([-1 _.ICONST_M1] + ## [+0 _.ICONST_0] + ## [+1 _.ICONST_1] + [+2 _.ICONST_2] + [+3 _.ICONST_3] + [+4 _.ICONST_4] + [+5 _.ICONST_5]) + + _ + (let [loadI (|> value .int _.long)] + (operation@wrap (|>> loadI (_.wrap type.long)))))) + +(import: #long java/lang/Double + (#static doubleToRawLongBits #manual [double] int)) + +(def: d0-bits + Int + (java/lang/Double::doubleToRawLongBits +0.0)) + +(def: #export (f64 value) + (-> Frac (Operation Inst)) + (case value + (^template [ ] + + (operation@wrap (|>> (_.wrap type.double)))) + ([+1.0 _.DCONST_1]) + + (^template [ ] + + (operation@wrap (|>> _.F2D (_.wrap type.double)))) + ([+2.0 _.FCONST_2]) + + (^template [ ] + + (operation@wrap (|>> _.I2D (_.wrap type.double)))) + ([-1.0 _.ICONST_M1] + ## [+0.0 _.ICONST_0] + ## [+1.0 _.ICONST_1] + [+2.0 _.ICONST_2] + [+3.0 _.ICONST_3] + [+4.0 _.ICONST_4] + [+5.0 _.ICONST_5]) + + _ + (let [loadI (if (i.= ..d0-bits + (java/lang/Double::doubleToRawLongBits (:coerce java/lang/Double value))) + _.DCONST_0 + (_.double value))] + (operation@wrap (|>> loadI (_.wrap type.double)))))) + +(def: #export (text value) + (-> Text (Operation Inst)) + (operation@wrap (_.string value))) -- cgit v1.2.3