Skip to content
Snippets Groups Projects
Commit fe1cc11e authored by Zbynek Slajchrt's avatar Zbynek Slajchrt
Browse files

Ceiling and Floor builtins refactored

parent 378e9134
Branches
No related tags found
No related merge requests found
......@@ -22,6 +22,7 @@
*/
package com.oracle.truffle.r.nodes.builtin.base;
import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.complexValue;
import static com.oracle.truffle.r.runtime.RDispatch.MATH_GROUP_GENERIC;
import static com.oracle.truffle.r.runtime.builtins.RBehavior.PURE;
import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.PRIMITIVE;
......@@ -29,32 +30,61 @@ import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.PRIMITIVE;
import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.r.nodes.binary.BoxPrimitiveNode;
import com.oracle.truffle.r.nodes.binary.BoxPrimitiveNodeGen;
import com.oracle.truffle.r.nodes.builtin.CastBuilder;
import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
import com.oracle.truffle.r.nodes.unary.UnaryArithmeticBuiltinNode;
import com.oracle.truffle.r.nodes.unary.UnaryArithmeticNode;
import com.oracle.truffle.r.nodes.unary.UnaryArithmeticNodeGen;
import com.oracle.truffle.r.runtime.RError;
import com.oracle.truffle.r.runtime.RType;
import com.oracle.truffle.r.runtime.builtins.RBuiltin;
import com.oracle.truffle.r.runtime.data.RComplex;
import com.oracle.truffle.r.runtime.data.RDataFactory;
import com.oracle.truffle.r.runtime.ops.UnaryArithmeticFactory;
@RBuiltin(name = "ceiling", kind = PRIMITIVE, parameterNames = {"x"}, dispatch = MATH_GROUP_GENERIC, behavior = PURE)
public abstract class Ceiling extends RBuiltinNode {
public abstract class Ceiling extends UnaryArithmeticBuiltinNode {
public static final UnaryArithmeticFactory CEILING = CeilingArithmetic::new;
public static final UnaryArithmeticFactory CEILING = FloorNodeGen.create(null);
@Child private BoxPrimitiveNode boxPrimitive = BoxPrimitiveNodeGen.create();
@Child private UnaryArithmeticNode ceiling = UnaryArithmeticNodeGen.create(CEILING, RError.Message.NON_NUMERIC_MATH, RType.Double);
public Ceiling() {
super(RType.Double, RError.Message.NON_NUMERIC_ARGUMENT_FUNCTION, null);
}
@Specialization
protected Object ceiling(Object value) {
return ceiling.execute(boxPrimitive.execute(value));
@Override
protected void createCasts(CastBuilder casts) {
casts.arg("x").mustBe(complexValue().not(), RError.Message.UNIMPLEMENTED_COMPLEX_FUN).asDoubleVector();
}
@Override
public int op(byte op) {
return op;
}
private static final class CeilingArithmetic extends Round.RoundArithmetic {
@Override
public int op(int op) {
return op;
}
@Override
public double op(double op) {
return Math.ceil(op);
}
@Override
public double op(double op) {
return Math.ceil(op);
}
@Override
protected double opd(double re, double im) {
return op(re);
}
@Override
public RComplex op(double re, double im) {
return RDataFactory.createComplex(op(re), op(im));
}
@Specialization
@Override
public Object calculateUnboxed(Object op) {
return super.calculateUnboxed(op);
}
}
......@@ -22,39 +22,64 @@
*/
package com.oracle.truffle.r.nodes.builtin.base;
import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.complexValue;
import static com.oracle.truffle.r.runtime.RDispatch.MATH_GROUP_GENERIC;
import static com.oracle.truffle.r.runtime.builtins.RBehavior.PURE;
import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.PRIMITIVE;
import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.r.nodes.binary.BoxPrimitiveNode;
import com.oracle.truffle.r.nodes.binary.BoxPrimitiveNodeGen;
import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
import com.oracle.truffle.r.nodes.unary.UnaryArithmeticNode;
import com.oracle.truffle.r.nodes.unary.UnaryArithmeticNodeGen;
import com.oracle.truffle.r.nodes.builtin.CastBuilder;
import com.oracle.truffle.r.nodes.unary.UnaryArithmeticBuiltinNode;
import com.oracle.truffle.r.runtime.RError;
import com.oracle.truffle.r.runtime.RType;
import com.oracle.truffle.r.runtime.builtins.RBuiltin;
import com.oracle.truffle.r.runtime.data.RComplex;
import com.oracle.truffle.r.runtime.data.RDataFactory;
import com.oracle.truffle.r.runtime.ops.UnaryArithmeticFactory;
@RBuiltin(name = "floor", kind = PRIMITIVE, parameterNames = {"x"}, dispatch = MATH_GROUP_GENERIC, behavior = PURE)
public abstract class Floor extends RBuiltinNode {
public abstract class Floor extends UnaryArithmeticBuiltinNode {
public static final UnaryArithmeticFactory FLOOR = FloorArithmetic::new;
public static final UnaryArithmeticFactory FLOOR = FloorNodeGen.create(null);
@Child private BoxPrimitiveNode boxPrimitive = BoxPrimitiveNodeGen.create();
@Child private UnaryArithmeticNode floor = UnaryArithmeticNodeGen.create(FLOOR, RError.Message.NON_NUMERIC_MATH, RType.Double);
public Floor() {
super(RType.Double, RError.Message.NON_NUMERIC_ARGUMENT_FUNCTION, null);
}
@Specialization
protected Object floor(Object value) {
return floor.execute(boxPrimitive.execute(value));
@Override
protected void createCasts(CastBuilder casts) {
casts.arg("x").mustBe(complexValue().not(), RError.Message.UNIMPLEMENTED_COMPLEX_FUN).asDoubleVector();
}
@Override
public int op(byte op) {
return op;
}
private static final class FloorArithmetic extends Round.RoundArithmetic {
@Override
public int op(int op) {
return op;
}
@Override
public double op(double op) {
return Math.floor(op);
}
@Override
public double op(double op) {
return Math.floor(op);
}
@Override
protected double opd(double re, double im) {
return op(re);
}
@Override
public RComplex op(double re, double im) {
return RDataFactory.createComplex(op(re), op(im));
}
@Specialization
@Override
public Object calculateUnboxed(Object op) {
return super.calculateUnboxed(op);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment