blob: b9e1cf4e89bcd19e109d7afc217e95aa892b7ef3 [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
/*
* Rules to do constant arithmetic.
*/
/*
* Binary expressions: multiplicative.
*/
numeric_constant=
Op_MultiplyID(numeric_constant l, numeric_constant r): 0
{
reducer.checkBinaryOp(__p, OP_multiply);
return l.doubleValue() * r.doubleValue();
}
numeric_constant=
Op_MultiplyID(constant_value l, constant_value r): 0
{
reducer.checkBinaryOp(__p, OP_multiply);
return ECMASupport.toNumeric(l).doubleValue() * ECMASupport.toNumeric(r).doubleValue();
}
numeric_constant=
Op_DivideID(numeric_constant l, numeric_constant r): 0
{
reducer.checkBinaryOp(__p, OP_divide);
return l.doubleValue() / r.doubleValue();
}
numeric_constant=
Op_DivideID(constant_value l, constant_value r): 0
{
reducer.checkBinaryOp(__p, OP_divide);
return ECMASupport.toNumeric(l).doubleValue() / ECMASupport.toNumeric(r).doubleValue();
}
double_constant=
Op_ModuloID(numeric_constant l, LiteralIntegerZeroID(void)): 0
{
return Double.NaN;
}
/*
* NOTE: We always want Mod(l, Int_Zero) to win over Mod(l, r).
* As a result, Mod(l, r) is hard-coded to have cost of 2000.
*/
numeric_constant=
Op_ModuloID(numeric_constant l, numeric_constant r): 2000
{
reducer.checkBinaryOp(__p, OP_modulo);
return l.doubleValue() % r.doubleValue();
}
numeric_constant=
Op_ModuloID(constant_value l, constant_value r): 0
{
reducer.checkBinaryOp(__p, OP_modulo);
return ECMASupport.toNumeric(l).doubleValue() % ECMASupport.toNumeric(r).doubleValue();
}
/*
* Binary expressions: additive.
*/
numeric_constant=
Op_AddID(numeric_constant l, numeric_constant r): 0
{
reducer.checkBinaryOp(__p, OP_add);
return l.doubleValue() + r.doubleValue();
}
constant_value=
Op_AddID(constant_value l, constant_value r): 1 // prefer the other addition rules
JBurg.Reduction reducer.reduce_constantAddition(__p, l, r);
/*
* Specializations for adding strings
*/
string_constant=
Op_AddID(string_constant l, string_constant r):0
JBurg.Reduction reducer.reduce_constantStringConcatenation(__p, l, r);
string_constant=
Op_AddID(string_constant l, constant_value r):0
JBurg.Reduction reducer.reduce_constantStringConcatenation(__p, l, r);
string_constant=
Op_AddID(constant_value l, string_constant r):0
JBurg.Reduction reducer.reduce_constantStringConcatenation(__p, l, r);
numeric_constant=
Op_SubtractID(numeric_constant l, numeric_constant r): 0
{
reducer.checkBinaryOp(__p, OP_subtract);
return l.doubleValue() - r.doubleValue();
}
numeric_constant=
Op_SubtractID(constant_value l, constant_value r): 0
{
reducer.checkBinaryOp(__p, OP_subtract);
return ECMASupport.toNumeric(l).doubleValue() - ECMASupport.toNumeric(r).doubleValue();
}
/*
* Binary expressions: bitwise.
*/
integer_constant=
Op_LeftShiftID(numeric_constant l, numeric_constant r): 0
{
reducer.checkBinaryOp(__p, OP_lshift);
return ECMASupport.leftShiftOperation(l, r);
}
integer_constant=
Op_LeftShiftID(constant_value l, constant_value r): 0
{
reducer.checkBinaryOp(__p, OP_lshift);
return ECMASupport.leftShiftOperation(ECMASupport.toNumeric(l), ECMASupport.toNumeric(r));
}
integer_constant=
Op_RightShiftID(numeric_constant l, numeric_constant r): 0
{
reducer.checkBinaryOp(__p, OP_rshift);
return ECMASupport.signedRightShiftOperation(l, r);
}
integer_constant=
Op_RightShiftID(constant_value l, constant_value r): 0
{
reducer.checkBinaryOp(__p, OP_rshift);
return ECMASupport.signedRightShiftOperation(ECMASupport.toNumeric(l), ECMASupport.toNumeric(r));
}
uint_constant=
Op_UnsignedRightShift(numeric_constant l, numeric_constant r): 0
{
reducer.checkBinaryOp(__p, OP_urshift);
return ECMASupport.unsignedRightShiftOperation(l, r);
}
uint_constant=
Op_UnsignedRightShift(constant_value l, constant_value r): 0
{
reducer.checkBinaryOp(__p, OP_urshift);
return ECMASupport.unsignedRightShiftOperation(ECMASupport.toNumeric(l), ECMASupport.toNumeric(r));
}
integer_constant=
Op_BitwiseAndID(numeric_constant l, numeric_constant r): 0
{
reducer.checkBinaryOp(__p, OP_bitand);
return ECMASupport.toInt32(l) & ECMASupport.toInt32(r);
}
integer_constant=
Op_BitwiseAndID(constant_value l, constant_value r): 0
{
reducer.checkBinaryOp(__p, OP_bitand);
return ECMASupport.toInt32(l) & ECMASupport.toInt32(r);
}
integer_constant=
Op_BitwiseOrID(numeric_constant l, numeric_constant r): 0
{
reducer.checkBinaryOp(__p, OP_bitor);
return ECMASupport.toInt32(l) | ECMASupport.toInt32(r);
}
integer_constant=
Op_BitwiseOrID(constant_value l, constant_value r): 0
{
reducer.checkBinaryOp(__p, OP_bitor);
return ECMASupport.toInt32(l) | ECMASupport.toInt32(r);
}
integer_constant=
Op_BitwiseXorID(numeric_constant l, numeric_constant r): 0
{
reducer.checkBinaryOp(__p, OP_bitxor);
return ECMASupport.toInt32(l) ^ ECMASupport.toInt32(r);
}
integer_constant=
Op_BitwiseXorID(constant_value l, constant_value r): 0
{
reducer.checkBinaryOp(__p, OP_bitxor);
return ECMASupport.toInt32(l) ^ ECMASupport.toInt32(r);
}
/*
* Unary expressions.
*/
numeric_constant=
Op_SubtractID(numeric_constant e): 0
{
reducer.checkUnaryOp(__p, OP_negate);
return -e.doubleValue();
}
numeric_constant=
Op_SubtractID(constant_value e): 0
{
reducer.checkUnaryOp(__p, OP_negate);
return -(ECMASupport.toNumeric(e).doubleValue());
}
numeric_constant=
Op_AddID(numeric_constant e): 0
{
reducer.checkUnaryOp(__p, reducer.op_unplus());
return e.doubleValue();
}
numeric_constant=
Op_AddID(constant_value e): 0
{
reducer.checkUnaryOp(__p, reducer.op_unplus());
return ECMASupport.toNumeric(e);
}
integer_constant=
Op_BitwiseNotID(numeric_constant unary): 0
{
reducer.checkUnaryOp(__p, OP_bitnot);
return ~ECMASupport.toInt32(unary);
}
integer_constant=
Op_BitwiseNotID(constant_value unary): 0
{
reducer.checkUnaryOp(__p, OP_bitnot);
return ~ECMASupport.toInt32(unary);
}