From bd0e6209dd7490c93f2b9a4ac85e6315ca003b87 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Tue, 16 Oct 2012 22:00:49 +0200 Subject: [PATCH] Convert most operations to the new calling convention Change-Id: I2dbf61b215a03a3c44c9c6bc431859bb9d067625 Reviewed-by: Simon Hausmann --- llvm_runtime.cpp | 42 +++---- moth/qv4instr_moth_p.h | 2 +- moth/qv4isel_moth.cpp | 2 +- moth/qv4vme_moth.cpp | 2 +- qmljs_runtime.cpp | 52 ++++---- qmljs_runtime.h | 331 ++++++++++++++++++++++++------------------------- qv4isel_masm.cpp | 37 +++--- 7 files changed, 232 insertions(+), 236 deletions(-) diff --git a/llvm_runtime.cpp b/llvm_runtime.cpp index 713968d..96d5e36 100644 --- a/llvm_runtime.cpp +++ b/llvm_runtime.cpp @@ -93,107 +93,107 @@ bool __qmljs_llvm_to_boolean(Context *ctx, const Value *value) void __qmljs_llvm_bit_and(Context *ctx, Value *result, Value *left, Value *right) { - __qmljs_bit_and(ctx, result, left, right); + *result = __qmljs_bit_and(*left, *right, ctx); } void __qmljs_llvm_bit_or(Context *ctx, Value *result, Value *left, Value *right) { - __qmljs_bit_or(ctx, result, left, right); + *result = __qmljs_bit_or(*left, *right, ctx); } void __qmljs_llvm_bit_xor(Context *ctx, Value *result, Value *left, Value *right) { - __qmljs_bit_xor(ctx, result, left, right); + *result = __qmljs_bit_xor(*left, *right, ctx); } void __qmljs_llvm_add(Context *ctx, Value *result, Value *left, Value *right) { - __qmljs_add(ctx, result, left, right); + *result = __qmljs_add(*left, *right, ctx); } void __qmljs_llvm_sub(Context *ctx, Value *result, Value *left, Value *right) { - __qmljs_sub(ctx, result, left, right); + *result = __qmljs_sub(*left, *right, ctx); } void __qmljs_llvm_mul(Context *ctx, Value *result, Value *left, Value *right) { - __qmljs_mul(ctx, result, left, right); + *result = __qmljs_mul(*left, *right, ctx); } void __qmljs_llvm_div(Context *ctx, Value *result, Value *left, Value *right) { - __qmljs_div(ctx, result, left, right); + *result = __qmljs_div(*left, *right, ctx); } void __qmljs_llvm_mod(Context *ctx, Value *result, Value *left, Value *right) { - __qmljs_mod(ctx, result, left, right); + *result = __qmljs_mod(*left, *right, ctx); } void __qmljs_llvm_shl(Context *ctx, Value *result, Value *left, Value *right) { - __qmljs_shl(ctx, result, left, right); + *result = __qmljs_shl(*left, *right, ctx); } void __qmljs_llvm_shr(Context *ctx, Value *result, Value *left, Value *right) { - __qmljs_shr(ctx, result, left, right); + *result = __qmljs_shr(*left, *right, ctx); } void __qmljs_llvm_ushr(Context *ctx, Value *result, Value *left, Value *right) { - __qmljs_ushr(ctx, result, left, right); + *result = __qmljs_ushr(*left, *right, ctx); } void __qmljs_llvm_gt(Context *ctx, Value *result, Value *left, Value *right) { - __qmljs_gt(ctx, result, left, right); + *result = __qmljs_gt(*left, *right, ctx); } void __qmljs_llvm_lt(Context *ctx, Value *result, Value *left, Value *right) { - __qmljs_lt(ctx, result, left, right); + *result = __qmljs_lt(*left, *right, ctx); } void __qmljs_llvm_ge(Context *ctx, Value *result, Value *left, Value *right) { - __qmljs_ge(ctx, result, left, right); + *result = __qmljs_ge(*left, *right, ctx); } void __qmljs_llvm_le(Context *ctx, Value *result, Value *left, Value *right) { - __qmljs_le(ctx, result, left, right); + *result = __qmljs_le(*left, *right, ctx); } void __qmljs_llvm_eq(Context *ctx, Value *result, Value *left, Value *right) { - __qmljs_eq(ctx, result, left, right); + *result = __qmljs_eq(*left, *right, ctx); } void __qmljs_llvm_ne(Context *ctx, Value *result, Value *left, Value *right) { - __qmljs_ne(ctx, result, left, right); + *result = __qmljs_ne(*left, *right, ctx); } void __qmljs_llvm_se(Context *ctx, Value *result, Value *left, Value *right) { - __qmljs_se(ctx, result, left, right); + *result = __qmljs_se(*left, *right, ctx); } void __qmljs_llvm_sne(Context *ctx, Value *result, Value *left, Value *right) { - __qmljs_sne(ctx, result, left, right); + *result = __qmljs_sne(*left, *right, ctx); } void __qmljs_llvm_instanceof(Context *ctx, Value *result, Value *left, Value *right) { - __qmljs_instanceof(ctx, result, left, right); + *result = __qmljs_instanceof(*left, *right, ctx); } void __qmljs_llvm_in(Context *ctx, Value *result, Value *left, Value *right) { - __qmljs_in(ctx, result, left, right); + *result = __qmljs_in(*left, *right, ctx); } void __qmljs_llvm_uplus(Context *ctx, Value *result, const Value *value) diff --git a/moth/qv4instr_moth_p.h b/moth/qv4instr_moth_p.h index d9f2c11..f9931de 100644 --- a/moth/qv4instr_moth_p.h +++ b/moth/qv4instr_moth_p.h @@ -101,7 +101,7 @@ union Instr MOTH_INSTR_HEADER int lhsTempIndex; int rhsTempIndex; - void (*alu)(VM::Context *, VM::Value *, const VM::Value *, const VM::Value *); + VM::Value (*alu)(const VM::Value , const VM::Value, VM::Context *); }; instr_common common; diff --git a/moth/qv4isel_moth.cpp b/moth/qv4isel_moth.cpp index bfa9a06..d37bcda 100644 --- a/moth/qv4isel_moth.cpp +++ b/moth/qv4isel_moth.cpp @@ -130,7 +130,7 @@ void InstructionSelection::visitMove(IR::Move *s) qWarning("UNKNOWN MOVE"); } -typedef void (*ALUFunction)(VM::Context*, VM::Value*, const VM::Value*, const VM::Value *); +typedef VM::Value (*ALUFunction)(const VM::Value, const VM::Value, VM::Context*); ALUFunction aluOpFunction(IR::AluOp op) { switch (op) { diff --git a/moth/qv4vme_moth.cpp b/moth/qv4vme_moth.cpp index bc8c9b5..4bc2304 100644 --- a/moth/qv4vme_moth.cpp +++ b/moth/qv4vme_moth.cpp @@ -146,7 +146,7 @@ void VME::operator()(QQmlJS::VM::Context *context, const uchar *code MOTH_END_INSTR(CJump) MOTH_BEGIN_INSTR(Binop) - instr.alu(context, &tempRegister, &TEMP(instr.lhsTempIndex), &TEMP(instr.rhsTempIndex)); + tempRegister = instr.alu(TEMP(instr.lhsTempIndex), TEMP(instr.rhsTempIndex), context); MOTH_END_INSTR(Binop) MOTH_BEGIN_INSTR(Ret) diff --git a/qmljs_runtime.cpp b/qmljs_runtime.cpp index 8b2c7c9..94c2bc2 100644 --- a/qmljs_runtime.cpp +++ b/qmljs_runtime.cpp @@ -489,43 +489,41 @@ Value __qmljs_delete_value(Context *ctx, Value value) return __qmljs_throw_type_error(ctx); // ### throw syntax error } -void __qmljs_add_helper(Context *ctx, Value *result, const Value *left, const Value *right) +Value __qmljs_add_helper(const Value left, const Value right, Context *ctx) { - Value pleft = __qmljs_to_primitive(ctx, *left, PREFERREDTYPE_HINT); - Value pright = __qmljs_to_primitive(ctx, *right, PREFERREDTYPE_HINT); + Value pleft = __qmljs_to_primitive(ctx, left, PREFERREDTYPE_HINT); + Value pright = __qmljs_to_primitive(ctx, right, PREFERREDTYPE_HINT); if (pleft.isString() || pright.isString()) { if (!pleft.isString()) pleft = __qmljs_to_string(ctx, pleft); if (!pright.isString()) pright = __qmljs_to_string(ctx, pright); String *string = __qmljs_string_concat(ctx, pleft.stringValue(), pright.stringValue()); - *result = Value::fromString(string); - } else { - double x = __qmljs_to_number(pleft, ctx); - double y = __qmljs_to_number(pright, ctx); - *result = Value::fromDouble(x + y); + return Value::fromString(string); } + double x = __qmljs_to_number(pleft, ctx); + double y = __qmljs_to_number(pright, ctx); + return Value::fromDouble(x + y); } -void __qmljs_instanceof(Context *ctx, Value *result, const Value *left, const Value *right) +Value __qmljs_instanceof(const Value left, const Value right, Context *ctx) { - if (FunctionObject *function = right->asFunctionObject()) { - bool r = function->hasInstance(ctx, *left); - *result = Value::fromBoolean(r); - return; + if (FunctionObject *function = right.asFunctionObject()) { + bool r = function->hasInstance(ctx, left); + return Value::fromBoolean(r); } - *result = __qmljs_throw_type_error(ctx); + return __qmljs_throw_type_error(ctx); } -void __qmljs_in(Context *ctx, Value *result, const Value *left, const Value *right) +Value __qmljs_in(const Value left, const Value right, Context *ctx) { - if (right->isObject()) { - Value s = __qmljs_to_string(ctx, *left); - bool r = right->objectValue()->hasProperty(ctx, s.stringValue()); - *result = Value::fromBoolean(r); + if (right.isObject()) { + Value s = __qmljs_to_string(ctx, left); + bool r = right.objectValue()->hasProperty(ctx, s.stringValue()); + return Value::fromBoolean(r); } else { - *result = __qmljs_throw_type_error(ctx); + return __qmljs_throw_type_error(ctx); } } @@ -547,7 +545,7 @@ void __qmljs_inplace_bit_xor_name(Context *ctx, String *name, Value *value) void __qmljs_inplace_add_name(Context *ctx, String *name, Value *value) { if (Value *prop = ctx->lookupPropertyDescriptor(name)) - __qmljs_add(ctx, prop, prop, value); + *prop = __qmljs_add(*prop, *value, ctx); else ctx->throwReferenceError(Value::fromString(name)); } @@ -599,7 +597,7 @@ void __qmljs_inplace_bit_or_element(Context *ctx, Value *base, Value *index, Val if (index->isNumber()) { const quint32 idx = index->toUInt32(ctx); Value v = a->value.at(idx); - __qmljs_bit_or(ctx, &v, &v, value); + v = __qmljs_bit_or(v, *value, ctx); a->value.assign(idx, v); return; } @@ -614,7 +612,7 @@ void __qmljs_inplace_bit_xor_element(Context *ctx, Value *base, Value *index, Va if (index->isNumber()) { const quint32 idx = index->toUInt32(ctx); Value v = a->value.at(idx); - __qmljs_bit_xor(ctx, &v, &v, value); + v = __qmljs_bit_xor(v, *value, ctx); a->value.assign(idx, v); return; } @@ -629,7 +627,7 @@ void __qmljs_inplace_add_element(Context *ctx, Value *base, Value *index, Value if (index->isNumber()) { const quint32 idx = index->toUInt32(ctx); Value v = a->value.at(idx); - __qmljs_add(ctx, &v, &v, value); + v = __qmljs_add(v, *value, ctx); a->value.assign(idx, v); return; } @@ -644,7 +642,7 @@ void __qmljs_inplace_sub_element(Context *ctx, Value *base, Value *index, Value if (index->isNumber()) { const quint32 idx = index->toUInt32(ctx); Value v = a->value.at(idx); - __qmljs_sub(ctx, &v, &v, value); + v = __qmljs_sub(v, *value, ctx); a->value.assign(idx, v); return; } @@ -700,14 +698,14 @@ void __qmljs_inplace_bit_xor_member(Context *ctx, Value *base, String *name, Val void __qmljs_inplace_add_member(Context *ctx, Value *base, String *name, Value *value) { Value prop = base->objectValue()->getProperty(ctx, name); - __qmljs_add(ctx, &prop, &prop, value); + prop = __qmljs_add(prop, *value, ctx); base->objectValue()->setProperty(ctx, name, prop); } void __qmljs_inplace_sub_member(Context *ctx, Value *base, String *name, Value *value) { Value prop = base->objectValue()->getProperty(ctx, name); - __qmljs_sub(ctx, &prop, &prop, value); + prop = __qmljs_sub(prop, *value, ctx); base->objectValue()->setProperty(ctx, name, prop); } diff --git a/qmljs_runtime.h b/qmljs_runtime.h index b69e8b9..2feadbe 100644 --- a/qmljs_runtime.h +++ b/qmljs_runtime.h @@ -185,29 +185,29 @@ void __qmljs_throw(Context *context, Value value); Value __qmljs_rethrow(Context *context); // binary operators -void __qmljs_instanceof(Context *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_in(Context *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_bit_or(Context *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_bit_xor(Context *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_bit_and(Context *ctx, Value *result, const Value *left,const Value *right); -void __qmljs_add(Context *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_sub(Context *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_mul(Context *ctx, Value *result, const Value *left,const Value *right); -void __qmljs_div(Context *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_mod(Context *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_shl(Context *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_shr(Context *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_ushr(Context *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_gt(Context *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_lt(Context *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_ge(Context *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_le(Context *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_eq(Context *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_ne(Context *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_se(Context *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_sne(Context *ctx, Value *result, const Value *left, const Value *right); - -void __qmljs_add_helper(Context *ctx, Value *result, const Value *left, const Value *right); +Value __qmljs_instanceof(const Value left, const Value right, Context *ctx); +Value __qmljs_in(const Value left, const Value right, Context *ctx); +Value __qmljs_bit_or(const Value left, const Value right, Context *ctx); +Value __qmljs_bit_xor(const Value left, const Value right, Context *ctx); +Value __qmljs_bit_and(const Value left, const Value right, Context *ctx); +Value __qmljs_add(const Value left, const Value right, Context *ctx); +Value __qmljs_sub(const Value left, const Value right, Context *ctx); +Value __qmljs_mul(const Value left, const Value right, Context *ctx); +Value __qmljs_div(const Value left, const Value right, Context *ctx); +Value __qmljs_mod(const Value left, const Value right, Context *ctx); +Value __qmljs_shl(const Value left, const Value right, Context *ctx); +Value __qmljs_shr(const Value left, const Value right, Context *ctx); +Value __qmljs_ushr(const Value left, const Value right, Context *ctx); +Value __qmljs_gt(const Value left, const Value right, Context *ctx); +Value __qmljs_lt(const Value left, const Value right, Context *ctx); +Value __qmljs_ge(const Value left, const Value right, Context *ctx); +Value __qmljs_le(const Value left, const Value right, Context *ctx); +Value __qmljs_eq(const Value left, const Value right, Context *ctx); +Value __qmljs_ne(const Value left, const Value right, Context *ctx); +Value __qmljs_se(const Value left, const Value right, Context *ctx); +Value __qmljs_sne(const Value left, const Value right, Context *ctx); + +Value __qmljs_add_helper(const Value left, const Value right, Context *ctx); void __qmljs_inplace_bit_and(Context *ctx, Value *result, Value *value); void __qmljs_inplace_bit_or(Context *ctx, Value *result, Value *value); @@ -257,16 +257,16 @@ void __qmljs_inplace_shl_member(Context *ctx, Value *base, String *name, Value * void __qmljs_inplace_shr_member(Context *ctx, Value *base, String *name, Value *value); void __qmljs_inplace_ushr_member(Context *ctx, Value *base, String *name, Value *value); -Bool __qmljs_cmp_gt(Context *ctx, const Value *left, const Value *right); -Bool __qmljs_cmp_lt(Context *ctx, const Value *left, const Value *right); -Bool __qmljs_cmp_ge(Context *ctx, const Value *left, const Value *right); -Bool __qmljs_cmp_le(Context *ctx, const Value *left, const Value *right); -Bool __qmljs_cmp_eq(Context *ctx, const Value *left, const Value *right); -Bool __qmljs_cmp_ne(Context *ctx, const Value *left, const Value *right); -Bool __qmljs_cmp_se(Context *ctx, const Value *left, const Value *right); -Bool __qmljs_cmp_sne(Context *ctx, const Value *left, const Value *right); -Bool __qmljs_cmp_instanceof(Context *ctx, const Value *left, const Value *right); -Bool __qmljs_cmp_in(Context *ctx, const Value *left, const Value *right); +Bool __qmljs_cmp_gt(Context *ctx, const Value left, const Value right); +Bool __qmljs_cmp_lt(Context *ctx, const Value left, const Value right); +Bool __qmljs_cmp_ge(Context *ctx, const Value left, const Value right); +Bool __qmljs_cmp_le(Context *ctx, const Value left, const Value right); +Bool __qmljs_cmp_eq(Context *ctx, const Value left, const Value right); +Bool __qmljs_cmp_ne(Context *ctx, const Value left, const Value right); +Bool __qmljs_cmp_se(Context *ctx, const Value left, const Value right); +Bool __qmljs_cmp_sne(Context *ctx, const Value left, const Value right); +Bool __qmljs_cmp_instanceof(Context *ctx, const Value left, const Value right); +Bool __qmljs_cmp_in(Context *ctx, const Value left, const Value right); } // extern "C" @@ -944,80 +944,80 @@ inline Value __qmljs_not(const Value value, Context *ctx) } // binary operators -inline void __qmljs_bit_or(Context *ctx, Value *result, const Value *left, const Value *right) +inline Value __qmljs_bit_or(const Value left, const Value right, Context *ctx) { - int lval = __qmljs_to_int32(*left, ctx); - int rval = __qmljs_to_int32(*right, ctx); - *result = Value::fromDouble(lval | rval); + int lval = __qmljs_to_int32(left, ctx); + int rval = __qmljs_to_int32(right, ctx); + return Value::fromDouble(lval | rval); } -inline void __qmljs_bit_xor(Context *ctx, Value *result, const Value *left, const Value *right) +inline Value __qmljs_bit_xor(const Value left, const Value right, Context *ctx) { - int lval = __qmljs_to_int32(*left, ctx); - int rval = __qmljs_to_int32(*right, ctx); - *result = Value::fromDouble(lval ^ rval); + int lval = __qmljs_to_int32(left, ctx); + int rval = __qmljs_to_int32(right, ctx); + return Value::fromDouble(lval ^ rval); } -inline void __qmljs_bit_and(Context *ctx, Value *result, const Value *left, const Value *right) +inline Value __qmljs_bit_and(const Value left, const Value right, Context *ctx) { - int lval = __qmljs_to_int32(*left, ctx); - int rval = __qmljs_to_int32(*right, ctx); - *result = Value::fromDouble(lval & rval); + int lval = __qmljs_to_int32(left, ctx); + int rval = __qmljs_to_int32(right, ctx); + return Value::fromDouble(lval & rval); } inline void __qmljs_inplace_bit_and(Context *ctx, Value *result, Value *value) { - __qmljs_bit_xor(ctx, result, result, value); + *result = __qmljs_bit_xor(*result, *value, ctx); } inline void __qmljs_inplace_bit_or(Context *ctx, Value *result, Value *value) { - __qmljs_bit_or(ctx, result, result, value); + *result = __qmljs_bit_or(*result, *value, ctx); } inline void __qmljs_inplace_bit_xor(Context *ctx, Value *result, Value *value) { - __qmljs_bit_xor(ctx, result, result, value); + *result = __qmljs_bit_xor(*result, *value, ctx); } inline void __qmljs_inplace_add(Context *ctx, Value *result, Value *value) { - __qmljs_add(ctx, result, result, value); + *result = __qmljs_add(*result, *value, ctx); } inline void __qmljs_inplace_sub(Context *ctx, Value *result, Value *value) { - __qmljs_sub(ctx, result, result, value); + *result = __qmljs_sub(*result, *value, ctx); } inline void __qmljs_inplace_mul(Context *ctx, Value *result, Value *value) { - __qmljs_mul(ctx, result, result, value); + *result = __qmljs_mul(*result, *value, ctx); } inline void __qmljs_inplace_div(Context *ctx, Value *result, Value *value) { - __qmljs_div(ctx, result, result, value); + *result = __qmljs_div(*result, *value, ctx); } inline void __qmljs_inplace_mod(Context *ctx, Value *result, Value *value) { - __qmljs_mod(ctx, result, result, value); + *result = __qmljs_mod(*result, *value, ctx); } inline void __qmljs_inplace_shl(Context *ctx, Value *result, Value *value) { - __qmljs_shl(ctx, result, result, value); + *result = __qmljs_shl(*result, *value, ctx); } inline void __qmljs_inplace_shr(Context *ctx, Value *result, Value *value) { - __qmljs_shr(ctx, result, result, value); + *result = __qmljs_shr(*result, *value, ctx); } inline void __qmljs_inplace_ushr(Context *ctx, Value *result, Value *value) { - __qmljs_ushr(ctx, result, result, value); + *result = __qmljs_ushr(*result, *value, ctx); } static inline Value add_int32(int a, int b) @@ -1035,217 +1035,212 @@ static inline Value add_int32(int a, int b) return Value::fromDouble((double)a * b); } -inline void __qmljs_add(Context *ctx, Value *result, const Value *left, const Value *right) +inline Value __qmljs_add(const Value left, const Value right, Context *ctx) { - if (left->isInteger() && right->isInteger()) - *result = add_int32(left->integerValue(), right->integerValue()); + if (left.isInteger() && right.isInteger()) + return add_int32(left.integerValue(), right.integerValue()); - if (left->isNumber() && right->isNumber()) - *result = Value::fromDouble(left->asDouble() + right->asDouble()); + if (left.isNumber() && right.isNumber()) + return Value::fromDouble(left.asDouble() + right.asDouble()); else - __qmljs_add_helper(ctx, result, left, right); + return __qmljs_add_helper(left, right, ctx); } -inline void __qmljs_sub(Context *ctx, Value *result, const Value *left, const Value *right) +inline Value __qmljs_sub(const Value left, const Value right, Context *ctx) { - double lval = __qmljs_to_number(*left, ctx); - double rval = __qmljs_to_number(*right, ctx); - *result = Value::fromDouble(lval - rval); + double lval = __qmljs_to_number(left, ctx); + double rval = __qmljs_to_number(right, ctx); + return Value::fromDouble(lval - rval); } -inline void __qmljs_mul(Context *ctx, Value *result, const Value *left, const Value *right) +inline Value __qmljs_mul(const Value left, const Value right, Context *ctx) { - double lval = __qmljs_to_number(*left, ctx); - double rval = __qmljs_to_number(*right, ctx); - *result = Value::fromDouble(lval * rval); + double lval = __qmljs_to_number(left, ctx); + double rval = __qmljs_to_number(right, ctx); + return Value::fromDouble(lval * rval); } -inline void __qmljs_div(Context *ctx, Value *result, const Value *left, const Value *right) +inline Value __qmljs_div(const Value left, const Value right, Context *ctx) { - double lval = __qmljs_to_number(*left, ctx); - double rval = __qmljs_to_number(*right, ctx); - *result = Value::fromDouble(lval / rval); + double lval = __qmljs_to_number(left, ctx); + double rval = __qmljs_to_number(right, ctx); + return Value::fromDouble(lval / rval); } -inline void __qmljs_mod(Context *ctx, Value *result, const Value *left, const Value *right) +inline Value __qmljs_mod(const Value left, const Value right, Context *ctx) { - double lval = __qmljs_to_number(*left, ctx); - double rval = __qmljs_to_number(*right, ctx); - *result = Value::fromDouble(fmod(lval, rval)); + double lval = __qmljs_to_number(left, ctx); + double rval = __qmljs_to_number(right, ctx); + return Value::fromDouble(fmod(lval, rval)); } -inline void __qmljs_shl(Context *ctx, Value *result, const Value *left, const Value *right) +inline Value __qmljs_shl(const Value left, const Value right, Context *ctx) { - int lval = __qmljs_to_int32(*left, ctx); - unsigned rval = __qmljs_to_uint32(*right, ctx); - *result = Value::fromDouble(lval << rval); + int lval = __qmljs_to_int32(left, ctx); + unsigned rval = __qmljs_to_uint32(right, ctx); + return Value::fromDouble(lval << rval); } -inline void __qmljs_shr(Context *ctx, Value *result, const Value *left, const Value *right) +inline Value __qmljs_shr(const Value left, const Value right, Context *ctx) { - int lval = __qmljs_to_int32(*left, ctx); - unsigned rval = __qmljs_to_uint32(*right, ctx); - *result = Value::fromDouble(lval >> rval); + int lval = __qmljs_to_int32(left, ctx); + unsigned rval = __qmljs_to_uint32(right, ctx); + return Value::fromDouble(lval >> rval); } -inline void __qmljs_ushr(Context *ctx, Value *result, const Value *left, const Value *right) +inline Value __qmljs_ushr(const Value left, const Value right, Context *ctx) { - unsigned lval = __qmljs_to_uint32(*left, ctx); - unsigned rval = __qmljs_to_uint32(*right, ctx); - *result = Value::fromDouble(lval >> rval); + unsigned lval = __qmljs_to_uint32(left, ctx); + unsigned rval = __qmljs_to_uint32(right, ctx); + return Value::fromDouble(lval >> rval); } -inline void __qmljs_gt(Context *ctx, Value *result, const Value *left, const Value *right) +inline Value __qmljs_gt(const Value left, const Value right, Context *ctx) { - if (left->isInteger() && right->isInteger()) - *result = Value::fromBoolean(left->integerValue() > right->integerValue()); - if (left->isNumber() && right->isNumber()) { - *result = Value::fromBoolean(left->asDouble() > right->asDouble()); + if (left.isInteger() && right.isInteger()) + return Value::fromBoolean(left.integerValue() > right.integerValue()); + if (left.isNumber() && right.isNumber()) { + return Value::fromBoolean(left.asDouble() > right.asDouble()); } else { - *result = __qmljs_compare(ctx, *left, *right, false); + Value result = __qmljs_compare(ctx, left, right, false); - if (result->isUndefined()) - *result = Value::fromBoolean(false); + if (result.isUndefined()) + result = Value::fromBoolean(false); + return result; } } -inline void __qmljs_lt(Context *ctx, Value *result, const Value *left, const Value *right) +inline Value __qmljs_lt(const Value left, const Value right, Context *ctx) { - if (left->isInteger() && right->isInteger()) - *result = Value::fromBoolean(left->integerValue() < right->integerValue()); - if (left->isNumber() && right->isNumber()) { - *result = Value::fromBoolean(left->asDouble() < right->asDouble()); + if (left.isInteger() && right.isInteger()) + return Value::fromBoolean(left.integerValue() < right.integerValue()); + if (left.isNumber() && right.isNumber()) { + return Value::fromBoolean(left.asDouble() < right.asDouble()); } else { - *result = __qmljs_compare(ctx, *left, *right, true); + Value result = __qmljs_compare(ctx, left, right, true); - if (result->isUndefined()) - *result = Value::fromBoolean(false); + if (result.isUndefined()) + result = Value::fromBoolean(false); + return result; } } -inline void __qmljs_ge(Context *ctx, Value *result, const Value *left, const Value *right) +inline Value __qmljs_ge(const Value left, const Value right, Context *ctx) { - if (left->isInteger() && right->isInteger()) - *result = Value::fromBoolean(left->integerValue() >= right->integerValue()); - if (left->isNumber() && right->isNumber()) { - *result = Value::fromBoolean(left->asDouble() >= right->asDouble()); + if (left.isInteger() && right.isInteger()) + return Value::fromBoolean(left.integerValue() >= right.integerValue()); + if (left.isNumber() && right.isNumber()) { + return Value::fromBoolean(left.asDouble() >= right.asDouble()); } else { - *result = __qmljs_compare(ctx, *right, *left, false); + Value result = __qmljs_compare(ctx, right, left, false); - bool r = ! (result->isUndefined() || (result->isBoolean() && result->booleanValue())); - *result = Value::fromBoolean(r); + bool r = ! (result.isUndefined() || (result.isBoolean() && result.booleanValue())); + return Value::fromBoolean(r); } } -inline void __qmljs_le(Context *ctx, Value *result, const Value *left, const Value *right) +inline Value __qmljs_le(const Value left, const Value right, Context *ctx) { - if (left->isInteger() && right->isInteger()) - *result = Value::fromBoolean(left->integerValue() <= right->integerValue()); - if (left->isNumber() && right->isNumber()) { - *result = Value::fromBoolean(left->asDouble() <= right->asDouble()); + if (left.isInteger() && right.isInteger()) + return Value::fromBoolean(left.integerValue() <= right.integerValue()); + if (left.isNumber() && right.isNumber()) { + return Value::fromBoolean(left.asDouble() <= right.asDouble()); } else { - *result = __qmljs_compare(ctx, *right, *left, true); + Value result = __qmljs_compare(ctx, right, left, true); - bool r = ! (result->isUndefined() || (result->isBoolean() && result->booleanValue())); - *result = Value::fromBoolean(r); + bool r = ! (result.isUndefined() || (result.isBoolean() && result.booleanValue())); + return Value::fromBoolean(r); } } -inline void __qmljs_eq(Context *ctx, Value *result, const Value *left, const Value *right) +inline Value __qmljs_eq(const Value left, const Value right, Context *ctx) { - if (left->val == right->val) - *result = Value::fromBoolean(true); - if (left->isNumber() && right->isNumber()) { - *result = Value::fromBoolean(left->asDouble() == right->asDouble()); - } else if (left->isString() && right->isString()) { - *result = Value::fromBoolean(__qmljs_string_equal(ctx, left->stringValue(), right->stringValue())); + if (left.val == right.val) + return Value::fromBoolean(true); + if (left.isNumber() && right.isNumber()) { + return Value::fromBoolean(left.asDouble() == right.asDouble()); + } else if (left.isString() && right.isString()) { + return Value::fromBoolean(__qmljs_string_equal(ctx, left.stringValue(), right.stringValue())); } else { - bool r = __qmljs_equal(ctx, *left, *right); - *result = Value::fromBoolean(r); + bool r = __qmljs_equal(ctx, left, right); + return Value::fromBoolean(r); } } -inline void __qmljs_ne(Context *ctx, Value *result, const Value *left, const Value *right) +inline Value __qmljs_ne(const Value left, const Value right, Context *ctx) { - __qmljs_eq(ctx, result, left, right); - result->int_32 = !(bool)result->int_32; + Value result = __qmljs_eq(left, right, ctx); + result.int_32 = !(bool)result.int_32; + return result; } -inline void __qmljs_se(Context *ctx, Value *result, const Value *left, const Value *right) +inline Value __qmljs_se(const Value left, const Value right, Context *ctx) { - bool r = __qmljs_strict_equal(ctx, *left, *right); - *result = Value::fromBoolean(r); + bool r = __qmljs_strict_equal(ctx, left, right); + return Value::fromBoolean(r); } -inline void __qmljs_sne(Context *ctx, Value *result, const Value *left, const Value *right) +inline Value __qmljs_sne(const Value left, const Value right, Context *ctx) { - bool r = ! __qmljs_strict_equal(ctx, *left, *right); - *result = Value::fromBoolean(r); + bool r = ! __qmljs_strict_equal(ctx, left, right); + return Value::fromBoolean(r); } -inline Bool __qmljs_cmp_gt(Context *ctx, const Value *left, const Value *right) +inline Bool __qmljs_cmp_gt(Context *ctx, const Value left, const Value right) { - Value v; - __qmljs_gt(ctx, &v, left, right); + Value v = __qmljs_gt(left, right, ctx); return v.booleanValue(); } -inline Bool __qmljs_cmp_lt(Context *ctx, const Value *left, const Value *right) +inline Bool __qmljs_cmp_lt(Context *ctx, const Value left, const Value right) { - Value v; - __qmljs_lt(ctx, &v, left, right); + Value v = __qmljs_lt(left, right, ctx); return v.booleanValue(); } -inline Bool __qmljs_cmp_ge(Context *ctx, const Value *left, const Value *right) +inline Bool __qmljs_cmp_ge(Context *ctx, const Value left, const Value right) { - Value v; - __qmljs_ge(ctx, &v, left, right); + Value v = __qmljs_ge(left, right, ctx); return v.booleanValue(); } -inline Bool __qmljs_cmp_le(Context *ctx, const Value *left, const Value *right) +inline Bool __qmljs_cmp_le(Context *ctx, const Value left, const Value right) { - Value v; - __qmljs_le(ctx, &v, left, right); + Value v = __qmljs_le(left, right, ctx); return v.booleanValue(); } -inline Bool __qmljs_cmp_eq(Context *ctx, const Value *left, const Value *right) +inline Bool __qmljs_cmp_eq(Context *ctx, const Value left, const Value right) { - Value v; - __qmljs_eq(ctx, &v, left, right); + Value v = __qmljs_eq(left, right, ctx); return v.booleanValue(); } -inline Bool __qmljs_cmp_ne(Context *ctx, const Value *left, const Value *right) +inline Bool __qmljs_cmp_ne(Context *ctx, const Value left, const Value right) { - Value v; - __qmljs_ne(ctx, &v, left, right); + Value v = __qmljs_ne(left, right, ctx); return v.booleanValue(); } -inline Bool __qmljs_cmp_se(Context *ctx, const Value *left, const Value *right) +inline Bool __qmljs_cmp_se(Context *ctx, const Value left, const Value right) { - return __qmljs_strict_equal(ctx, *left, *right); + return __qmljs_strict_equal(ctx, left, right); } -inline Bool __qmljs_cmp_sne(Context *ctx, const Value *left, const Value *right) +inline Bool __qmljs_cmp_sne(Context *ctx, const Value left, const Value right) { - return ! __qmljs_strict_equal(ctx, *left, *right); + return ! __qmljs_strict_equal(ctx, left, right); } -inline Bool __qmljs_cmp_instanceof(Context *ctx, const Value *left, const Value *right) +inline Bool __qmljs_cmp_instanceof(Context *ctx, const Value left, const Value right) { - Value v; - __qmljs_instanceof(ctx, &v, left, right); + Value v = __qmljs_instanceof(left, right, ctx); return v.booleanValue(); } -inline uint __qmljs_cmp_in(Context *ctx, const Value *left, const Value *right) +inline uint __qmljs_cmp_in(Context *ctx, const Value left, const Value right) { - Value v; - __qmljs_in(ctx, &v, left, right); + Value v = __qmljs_in(left, right, ctx); return v.booleanValue(); } diff --git a/qv4isel_masm.cpp b/qv4isel_masm.cpp index f266886..79e460d 100644 --- a/qv4isel_masm.cpp +++ b/qv4isel_masm.cpp @@ -308,10 +308,11 @@ void InstructionSelection::visitLeave(IR::Leave *) assert(!"TODO"); } +#define setOp(op, opName, operation) \ + do { op = operation; opName = isel_stringIfy(operation); } while (0) + void InstructionSelection::visitMove(IR::Move *s) { - #define setOp(op, opName, operation) \ - do { op = operation; opName = isel_stringIfy(operation); } while (0) if (s->op == IR::OpInvalid) { if (IR::Name *n = s->target->asName()) { @@ -410,7 +411,7 @@ void InstructionSelection::visitMove(IR::Move *s) IR::Temp *l = b->left->asTemp(); IR::Temp *r = b->right->asTemp(); if (l && r) { - void (*op)(Context *, Value *, const Value *, const Value *) = 0; + Value (*op)(const Value, const Value, Context *) = 0; const char* opName = 0; switch ((IR::AluOp) b->op) { @@ -452,7 +453,7 @@ void InstructionSelection::visitMove(IR::Move *s) } if (op) { - generateFunctionCallImp(opName, op, ContextRegister, t, l, r); + generateFunctionCallImp2(t, opName, op, l, r, ContextRegister); } return; } @@ -491,7 +492,7 @@ void InstructionSelection::visitMove(IR::Move *s) // inplace assignment, e.g. x += 1, ++x, ... if (IR::Temp *t = s->target->asTemp()) { if (IR::Temp *t2 = s->source->asTemp()) { - void (*op)(Context *ctx, Value *result, const Value *left,const Value *right) = 0; + Value (*op)(const Value left, const Value right, Context *ctx) = 0; const char *opName = 0; switch (s->op) { case IR::OpBitAnd: setOp(op, opName, __qmljs_bit_and); break; @@ -510,7 +511,7 @@ void InstructionSelection::visitMove(IR::Move *s) break; } if (op) - generateFunctionCallImp(opName, op, ContextRegister, t, t, t2); + generateFunctionCallImp2(t, opName, op, t, t2, ContextRegister); return; } } else if (IR::Name *n = s->target->asName()) { @@ -604,7 +605,6 @@ void InstructionSelection::visitMove(IR::Move *s) qout << endl; assert(!"TODO"); - #undef setOp } void InstructionSelection::visitJump(IR::Jump *s) @@ -646,20 +646,23 @@ void InstructionSelection::visitCJump(IR::CJump *s) IR::Temp *l = b->left->asTemp(); IR::Temp *r = b->right->asTemp(); if (l && r) { + Bool (*op)(Context *ctx, const Value, const Value) = 0; + const char *opName = 0; switch (b->op) { default: Q_UNREACHABLE(); assert(!"todo"); break; - case IR::OpGt: generateFunctionCall(__qmljs_cmp_gt, ContextRegister, l, r); break; - case IR::OpLt: generateFunctionCall(__qmljs_cmp_lt, ContextRegister, l, r); break; - case IR::OpGe: generateFunctionCall(__qmljs_cmp_ge, ContextRegister, l, r); break; - case IR::OpLe: generateFunctionCall(__qmljs_cmp_le, ContextRegister, l, r); break; - case IR::OpEqual: generateFunctionCall(__qmljs_cmp_eq, ContextRegister, l, r); break; - case IR::OpNotEqual: generateFunctionCall(__qmljs_cmp_ne, ContextRegister, l, r); break; - case IR::OpStrictEqual: generateFunctionCall(__qmljs_cmp_se, ContextRegister, l, r); break; - case IR::OpStrictNotEqual: generateFunctionCall(__qmljs_cmp_sne, ContextRegister, l, r); break; - case IR::OpInstanceof: generateFunctionCall(__qmljs_cmp_instanceof, ContextRegister, l, r); break; - case IR::OpIn: generateFunctionCall(__qmljs_cmp_in, ContextRegister, l, r); break; + case IR::OpGt: setOp(op, opName, __qmljs_cmp_gt); break; + case IR::OpLt: setOp(op, opName, __qmljs_cmp_lt); break; + case IR::OpGe: setOp(op, opName, __qmljs_cmp_ge); break; + case IR::OpLe: setOp(op, opName, __qmljs_cmp_le); break; + case IR::OpEqual: setOp(op, opName, __qmljs_cmp_eq); break; + case IR::OpNotEqual: setOp(op, opName, __qmljs_cmp_ne); break; + case IR::OpStrictEqual: setOp(op, opName, __qmljs_cmp_se); break; + case IR::OpStrictNotEqual: setOp(op, opName, __qmljs_cmp_sne); break; + case IR::OpInstanceof: setOp(op, opName, __qmljs_cmp_instanceof); break; + case IR::OpIn: setOp(op, opName, __qmljs_cmp_in); break; } // switch + generateFunctionCall2(ReturnValueRegister, op, ContextRegister, l, r); move(ReturnValueRegister, Gpr0); Jump target = branch32(NotEqual, Gpr0, TrustedImm32(0)); -- 2.7.4