From 28e296820ec84c3a67e177986ce451b2bc97a5f8 Mon Sep 17 00:00:00 2001 From: Mick Jordan <mick.jordan@oracle.com> Date: Sat, 6 Jun 2015 10:56:08 -0700 Subject: [PATCH] add logical specialization for Order --- .../truffle/r/nodes/builtin/base/Order.java | 24 +++++++++++++++++++ .../truffle/r/test/ExpectedTestOutput.test | 4 ++++ .../r/test/builtins/TestBuiltin_order.java | 1 + 3 files changed, 29 insertions(+) diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Order.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Order.java index a2f9f24870..e68c67738e 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Order.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Order.java @@ -575,6 +575,30 @@ public abstract class Order extends RPrecedenceBuiltinNode { public abstract int executeInt(VirtualFrame frame, Object v, int i, int j, byte naLast); + @Specialization + protected int lcmp(RAbstractLogicalVector v, int i, int j, byte naLast) { + byte x = v.getDataAt(i); + byte y = v.getDataAt(j); + boolean nax = RRuntime.isNA(x); + boolean nay = RRuntime.isNA(y); + if (nax && nay) { + return 0; + } + if (nax) { + return naLast == RRuntime.LOGICAL_TRUE ? 1 : -1; + } + if (nay) { + return naLast == RRuntime.LOGICAL_TRUE ? -1 : 1; + } + if (x < y) { + return -1; + } + if (x > y) { + return 1; + } + return 0; + } + @Specialization protected int icmp(RAbstractIntVector v, int i, int j, byte naLast) { int x = v.getDataAt(i); diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test index b12913ea87..cc9bab4b2e 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test @@ -34322,6 +34322,10 @@ NULL #{ order(c(NA,NA,1), c(2,1,3)) } [1] 3 2 1 +##com.oracle.truffle.r.test.builtins.TestBuiltin_order.testOrder +#{ order(c(TRUE, FALSE)) } +[1] 2 1 + ##com.oracle.truffle.r.test.builtins.TestBuiltin_order.testOrder #{ order(character()) } integer(0) diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_order.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_order.java index 20fbe94487..056d35a41b 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_order.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_order.java @@ -152,6 +152,7 @@ public class TestBuiltin_order extends TestBase { assertEval("{ order(c(1,2,3,NA), na.last=FALSE) }"); assertEval("{ order(c(1,2,3,NA), na.last=FALSE, decreasing=TRUE) }"); assertEval("{ order(c(0/0, -1/0, 2)) }"); + assertEval("{ order(c(TRUE, FALSE)) }"); assertEval("{ x<-c(40, 40, 1, 40, 1, 20, 40, 10, 40, 10, 16, 40, 10, 26, 40, 10, 39, 40, 11, 40, 12, 40, 12, 20); order(x, decreasing=TRUE) }"); assertEval("{ x<-c(40, 40, 1, 40, 1, 20, 40, 10, 40, 10, 16, 40, 10, 26, 40, 10, 39, 40, 11, 40, 12, 40, 12, 20); order(x, decreasing=FALSE) }"); -- GitLab