aboutsummaryrefslogtreecommitdiff
path: root/new-luxc/source/luxc
diff options
context:
space:
mode:
authorEduardo Julian2017-10-12 15:22:25 -0400
committerEduardo Julian2017-10-12 15:22:25 -0400
commit1acc9f4cdd7b7cff29351594fa603c3b6fa4c666 (patch)
tree32db1b85c7972c564a0250cf46d11e0f98c49806 /new-luxc/source/luxc
parentf3acc0d67e6cd4e7245c1e169a3c0469da4373a3 (diff)
- Compilation and tests for arithmetic, bit-wise operations and order.
Diffstat (limited to 'new-luxc/source/luxc')
-rw-r--r--new-luxc/source/luxc/analyser/procedure/host.jvm.lux9
-rw-r--r--new-luxc/source/luxc/generator/host/jvm/inst.lux33
-rw-r--r--new-luxc/source/luxc/generator/procedure/host.jvm.lux168
3 files changed, 187 insertions, 23 deletions
diff --git a/new-luxc/source/luxc/analyser/procedure/host.jvm.lux b/new-luxc/source/luxc/analyser/procedure/host.jvm.lux
index 1dba7a5f8..e21281984 100644
--- a/new-luxc/source/luxc/analyser/procedure/host.jvm.lux
+++ b/new-luxc/source/luxc/analyser/procedure/host.jvm.lux
@@ -92,7 +92,6 @@
(@;install "%" (@;binary <type> <type> <type>))
(@;install "=" (@;binary <type> <type> Boolean))
(@;install "<" (@;binary <type> <type> Boolean))
- (@;install ">" (@;binary <type> <type> Boolean))
(@;install "and" (@;binary <type> <type> <type>))
(@;install "or" (@;binary <type> <type> <type>))
(@;install "xor" (@;binary <type> <type> <type>))
@@ -117,7 +116,6 @@
(@;install "%" (@;binary <type> <type> <type>))
(@;install "=" (@;binary <type> <type> Boolean))
(@;install "<" (@;binary <type> <type> Boolean))
- (@;install ">" (@;binary <type> <type> Boolean))
)))]
[float-procs "float" Float]
@@ -130,7 +128,6 @@
(|> (dict;new text;Hash<Text>)
(@;install "=" (@;binary Character Character Boolean))
(@;install "<" (@;binary Character Character Boolean))
- (@;install ">" (@;binary Character Character Boolean))
)))
(def: #export boxes
@@ -825,13 +822,11 @@
(dict;merge (<| (@;prefix "static")
(|> (dict;new text;Hash<Text>)
(@;install "get" static-get)
- (@;install "put" static-put)
- )))
+ (@;install "put" static-put))))
(dict;merge (<| (@;prefix "virtual")
(|> (dict;new text;Hash<Text>)
(@;install "get" virtual-get)
- (@;install "put" virtual-put)
- )))
+ (@;install "put" virtual-put))))
)))
(def: #export procedures
diff --git a/new-luxc/source/luxc/generator/host/jvm/inst.lux b/new-luxc/source/luxc/generator/host/jvm/inst.lux
index ebf12023f..7a6215804 100644
--- a/new-luxc/source/luxc/generator/host/jvm/inst.lux
+++ b/new-luxc/source/luxc/generator/host/jvm/inst.lux
@@ -36,11 +36,12 @@
GOTO)
<var> (declare ILOAD LLOAD DLOAD ALOAD
ISTORE LSTORE ASTORE)
- <arithmethic> (declare IADD ISUB
- LADD LSUB LMUL LDIV LREM
- LCMP
- DADD DSUB DMUL DDIV DREM
- DCMPG DCMPL)
+ <arithmethic> (declare IADD ISUB IMUL IDIV IREM
+ LADD LSUB LMUL LDIV LREM LCMP
+ FADD FSUB FMUL FDIV FREM FCMPG FCMPL
+ DADD DSUB DMUL DDIV DREM DCMPG DCMPL)
+ <bit-wise> (declare IAND IOR IXOR ISHL ISHR IUSHR
+ LAND LOR LXOR LSHL LSHR LUSHR)
<return> (declare RETURN IRETURN LRETURN DRETURN ARETURN)]
(host;import org.objectweb.asm.Opcodes
(#static NOP int)
@@ -60,14 +61,8 @@
<var>
- (#static LAND int)
- (#static LOR int)
- (#static LXOR int)
- (#static LSHL int)
- (#static LSHR int)
- (#static LUSHR int)
-
<arithmethic>
+ <bit-wise>
(#static AALOAD int)
(#static AASTORE int)
@@ -161,17 +156,23 @@
[F2D] [F2I] [F2L]
[I2B] [I2C] [I2D] [I2F] [I2L] [I2S]
[L2D] [L2F] [L2I]
-
- ## Long bitwise
- [LAND] [LOR] [LXOR] [LSHL] [LSHR] [LUSHR]
## Integer arithmetic
- [IADD] [ISUB]
+ [IADD] [ISUB] [IMUL] [IDIV] [IREM]
+
+ ## Integer bitwise
+ [IAND] [IOR] [IXOR] [ISHL] [ISHR] [IUSHR]
## Long arithmethic
[LADD] [LSUB] [LMUL] [LDIV] [LREM]
[LCMP]
+ ## Long bitwise
+ [LAND] [LOR] [LXOR] [LSHL] [LSHR] [LUSHR]
+
+ ## Float arithmetic
+ [FADD] [FSUB] [FMUL] [FDIV] [FREM] [FCMPG] [FCMPL]
+
## Double arithmetic
[DADD] [DSUB] [DMUL] [DDIV] [DREM]
[DCMPG] [DCMPL]
diff --git a/new-luxc/source/luxc/generator/procedure/host.jvm.lux b/new-luxc/source/luxc/generator/procedure/host.jvm.lux
index 66b7bc77e..c99c23385 100644
--- a/new-luxc/source/luxc/generator/procedure/host.jvm.lux
+++ b/new-luxc/source/luxc/generator/procedure/host.jvm.lux
@@ -98,9 +98,177 @@
(@;install "short-to-long" (@;unary convert//short-to-long))
)))
+(do-template [<name> <op> <unwrapX> <unwrapY> <wrap>]
+ [(def: (<name> [xI yI])
+ @;Binary
+ (|>. xI ($i;unwrap <unwrapX>)
+ yI ($i;unwrap <unwrapY>)
+ <op> ($i;wrap <wrap>)))]
+
+ [int//+ $i;IADD #$;Int #$;Int #$;Int]
+ [int//- $i;ISUB #$;Int #$;Int #$;Int]
+ [int//* $i;IMUL #$;Int #$;Int #$;Int]
+ [int/// $i;IDIV #$;Int #$;Int #$;Int]
+ [int//% $i;IREM #$;Int #$;Int #$;Int]
+ [int//and $i;IAND #$;Int #$;Int #$;Int]
+ [int//or $i;IOR #$;Int #$;Int #$;Int]
+ [int//xor $i;IXOR #$;Int #$;Int #$;Int]
+ [int//shl $i;ISHL #$;Int #$;Int #$;Int]
+ [int//shr $i;ISHR #$;Int #$;Int #$;Int]
+ [int//ushr $i;IUSHR #$;Int #$;Int #$;Int]
+
+ [long//+ $i;LADD #$;Long #$;Long #$;Long]
+ [long//- $i;LSUB #$;Long #$;Long #$;Long]
+ [long//* $i;LMUL #$;Long #$;Long #$;Long]
+ [long/// $i;LDIV #$;Long #$;Long #$;Long]
+ [long//% $i;LREM #$;Long #$;Long #$;Long]
+ [long//and $i;LAND #$;Long #$;Long #$;Long]
+ [long//or $i;LOR #$;Long #$;Long #$;Long]
+ [long//xor $i;LXOR #$;Long #$;Long #$;Long]
+ [long//shl $i;LSHL #$;Long #$;Int #$;Long]
+ [long//shr $i;LSHR #$;Long #$;Int #$;Long]
+ [long//ushr $i;LUSHR #$;Long #$;Int #$;Long]
+
+ [float//+ $i;FADD #$;Float #$;Float #$;Float]
+ [float//- $i;FSUB #$;Float #$;Float #$;Float]
+ [float//* $i;FMUL #$;Float #$;Float #$;Float]
+ [float/// $i;FDIV #$;Float #$;Float #$;Float]
+ [float//% $i;FREM #$;Float #$;Float #$;Float]
+
+ [double//+ $i;DADD #$;Double #$;Double #$;Double]
+ [double//- $i;DSUB #$;Double #$;Double #$;Double]
+ [double//* $i;DMUL #$;Double #$;Double #$;Double]
+ [double/// $i;DDIV #$;Double #$;Double #$;Double]
+ [double//% $i;DREM #$;Double #$;Double #$;Double]
+ )
+
+(do-template [<name> <op> <unwrapX> <unwrapY> <wrap>]
+ [(def: (<name> [xI yI])
+ @;Binary
+ (<| $i;with-label (function [@then])
+ $i;with-label (function [@end])
+ (|>. xI ($i;unwrap <unwrapX>)
+ yI ($i;unwrap <unwrapY>)
+ (<op> @then)
+ ($i;GETSTATIC "java.lang.Boolean" "FALSE" ($t;class "java.lang.Boolean" (list)))
+ ($i;GOTO @end)
+ ($i;label @then)
+ ($i;GETSTATIC "java.lang.Boolean" "TRUE" ($t;class "java.lang.Boolean" (list)))
+ ($i;label @end))))]
+
+ [int//= $i;IF_ICMPEQ #$;Int #$;Int #$;Boolean]
+ [int//< $i;IF_ICMPLT #$;Int #$;Int #$;Boolean]
+
+ [char//= $i;IF_ICMPEQ #$;Char #$;Char #$;Boolean]
+ [char//< $i;IF_ICMPLT #$;Char #$;Char #$;Boolean]
+ )
+
+(do-template [<name> <op> <reference> <unwrapX> <unwrapY> <wrap>]
+ [(def: (<name> [xI yI])
+ @;Binary
+ (<| $i;with-label (function [@then])
+ $i;with-label (function [@end])
+ (|>. xI ($i;unwrap <unwrapX>)
+ yI ($i;unwrap <unwrapY>)
+ <op>
+ ($i;int <reference>)
+ ($i;IF_ICMPEQ @then)
+ ($i;GETSTATIC "java.lang.Boolean" "FALSE" ($t;class "java.lang.Boolean" (list)))
+ ($i;GOTO @end)
+ ($i;label @then)
+ ($i;GETSTATIC "java.lang.Boolean" "TRUE" ($t;class "java.lang.Boolean" (list)))
+ ($i;label @end))))]
+
+ [long//= $i;LCMP 0 #$;Long #$;Long #$;Boolean]
+ [long//< $i;LCMP -1 #$;Long #$;Long #$;Boolean]
+
+ [float//= $i;FCMPG 0 #$;Float #$;Float #$;Boolean]
+ [float//< $i;FCMPG -1 #$;Float #$;Float #$;Boolean]
+
+ [double//= $i;DCMPG 0 #$;Double #$;Double #$;Boolean]
+ [double//< $i;DCMPG -1 #$;Double #$;Double #$;Boolean]
+ )
+
+(def: int-procs
+ @;Bundle
+ (<| (@;prefix "int")
+ (|> (dict;new text;Hash<Text>)
+ (@;install "+" (@;binary int//+))
+ (@;install "-" (@;binary int//-))
+ (@;install "*" (@;binary int//*))
+ (@;install "/" (@;binary int///))
+ (@;install "%" (@;binary int//%))
+ (@;install "=" (@;binary int//=))
+ (@;install "<" (@;binary int//<))
+ (@;install "and" (@;binary int//and))
+ (@;install "or" (@;binary int//or))
+ (@;install "xor" (@;binary int//xor))
+ (@;install "shl" (@;binary int//shl))
+ (@;install "shr" (@;binary int//shr))
+ (@;install "ushr" (@;binary int//ushr))
+ )))
+
+(def: long-procs
+ @;Bundle
+ (<| (@;prefix "long")
+ (|> (dict;new text;Hash<Text>)
+ (@;install "+" (@;binary long//+))
+ (@;install "-" (@;binary long//-))
+ (@;install "*" (@;binary long//*))
+ (@;install "/" (@;binary long///))
+ (@;install "%" (@;binary long//%))
+ (@;install "=" (@;binary long//=))
+ (@;install "<" (@;binary long//<))
+ (@;install "and" (@;binary long//and))
+ (@;install "or" (@;binary long//or))
+ (@;install "xor" (@;binary long//xor))
+ (@;install "shl" (@;binary long//shl))
+ (@;install "shr" (@;binary long//shr))
+ (@;install "ushr" (@;binary long//ushr))
+ )))
+
+(def: float-procs
+ @;Bundle
+ (<| (@;prefix "float")
+ (|> (dict;new text;Hash<Text>)
+ (@;install "+" (@;binary float//+))
+ (@;install "-" (@;binary float//-))
+ (@;install "*" (@;binary float//*))
+ (@;install "/" (@;binary float///))
+ (@;install "%" (@;binary float//%))
+ (@;install "=" (@;binary float//=))
+ (@;install "<" (@;binary float//<))
+ )))
+
+(def: double-procs
+ @;Bundle
+ (<| (@;prefix "double")
+ (|> (dict;new text;Hash<Text>)
+ (@;install "+" (@;binary double//+))
+ (@;install "-" (@;binary double//-))
+ (@;install "*" (@;binary double//*))
+ (@;install "/" (@;binary double///))
+ (@;install "%" (@;binary double//%))
+ (@;install "=" (@;binary double//=))
+ (@;install "<" (@;binary double//<))
+ )))
+
+(def: char-procs
+ @;Bundle
+ (<| (@;prefix "char")
+ (|> (dict;new text;Hash<Text>)
+ (@;install "=" (@;binary char//=))
+ (@;install "<" (@;binary char//<))
+ )))
+
(def: #export procedures
@;Bundle
(<| (@;prefix "jvm")
(|> (dict;new text;Hash<Text>)
(dict;merge conversion-procs)
+ (dict;merge int-procs)
+ (dict;merge long-procs)
+ (dict;merge float-procs)
+ (dict;merge double-procs)
+ (dict;merge char-procs)
)))