Log Message
[JSC] Add Air lowering for BitOr and impove BitAnd https://bugs.webkit.org/show_bug.cgi?id=150827
Patch by Benjamin Poulain <bpoul...@apple.com> on 2015-11-03 Reviewed by Filip Pizlo. In this patch: -B3 to Air lowering for BirOr. -Codegen for BitOr. -Strength reduction for BitOr and BitAnd. -Tests for BitAnd and BitOr. -Bug fix: Move64 with a negative value was destroying the top bits. * b3/B3Const32Value.cpp: (JSC::B3::Const32Value::bitAndConstant): (JSC::B3::Const32Value::bitOrConstant): * b3/B3Const32Value.h: * b3/B3Const64Value.cpp: (JSC::B3::Const64Value::bitAndConstant): (JSC::B3::Const64Value::bitOrConstant): * b3/B3Const64Value.h: * b3/B3LowerToAir.cpp: (JSC::B3::Air::LowerToAir::immForMove): (JSC::B3::Air::LowerToAir::immOrTmpForMove): (JSC::B3::Air::LowerToAir::tryOr): (JSC::B3::Air::LowerToAir::tryConst64): (JSC::B3::Air::LowerToAir::tryUpsilon): (JSC::B3::Air::LowerToAir::tryIdentity): (JSC::B3::Air::LowerToAir::tryReturn): (JSC::B3::Air::LowerToAir::immOrTmp): Deleted. * b3/B3LoweringMatcher.patterns: * b3/B3ReduceStrength.cpp: * b3/B3Value.cpp: (JSC::B3::Value::bitAndConstant): (JSC::B3::Value::bitOrConstant): * b3/B3Value.h: * b3/air/AirOpcode.opcodes: * b3/testb3.cpp: (JSC::B3::testReturnConst64): (JSC::B3::testBitAndArgs): (JSC::B3::testBitAndSameArg): (JSC::B3::testBitAndImms): (JSC::B3::testBitAndArgImm): (JSC::B3::testBitAndImmArg): (JSC::B3::testBitAndBitAndArgImmImm): (JSC::B3::testBitAndImmBitAndArgImm): (JSC::B3::testBitAndArgs32): (JSC::B3::testBitAndSameArg32): (JSC::B3::testBitAndImms32): (JSC::B3::testBitAndArgImm32): (JSC::B3::testBitAndImmArg32): (JSC::B3::testBitAndBitAndArgImmImm32): (JSC::B3::testBitAndImmBitAndArgImm32): (JSC::B3::testBitOrArgs): (JSC::B3::testBitOrSameArg): (JSC::B3::testBitOrImms): (JSC::B3::testBitOrArgImm): (JSC::B3::testBitOrImmArg): (JSC::B3::testBitOrBitOrArgImmImm): (JSC::B3::testBitOrImmBitOrArgImm): (JSC::B3::testBitOrArgs32): (JSC::B3::testBitOrSameArg32): (JSC::B3::testBitOrImms32): (JSC::B3::testBitOrArgImm32): (JSC::B3::testBitOrImmArg32): (JSC::B3::testBitOrBitOrArgImmImm32): (JSC::B3::testBitOrImmBitOrArgImm32): (JSC::B3::run):
Modified Paths
- trunk/Source/_javascript_Core/ChangeLog
- trunk/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h
- trunk/Source/_javascript_Core/assembler/X86Assembler.h
- trunk/Source/_javascript_Core/b3/B3Const32Value.cpp
- trunk/Source/_javascript_Core/b3/B3Const32Value.h
- trunk/Source/_javascript_Core/b3/B3Const64Value.cpp
- trunk/Source/_javascript_Core/b3/B3Const64Value.h
- trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp
- trunk/Source/_javascript_Core/b3/B3LoweringMatcher.patterns
- trunk/Source/_javascript_Core/b3/B3ReduceStrength.cpp
- trunk/Source/_javascript_Core/b3/B3Value.cpp
- trunk/Source/_javascript_Core/b3/B3Value.h
- trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes
- trunk/Source/_javascript_Core/b3/testb3.cpp
Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (191982 => 191983)
--- trunk/Source/_javascript_Core/ChangeLog 2015-11-03 23:23:23 UTC (rev 191982)
+++ trunk/Source/_javascript_Core/ChangeLog 2015-11-03 23:24:50 UTC (rev 191983)
@@ -1,3 +1,73 @@
+2015-11-03 Benjamin Poulain <bpoul...@apple.com>
+
+ [JSC] Add Air lowering for BitOr and impove BitAnd
+ https://bugs.webkit.org/show_bug.cgi?id=150827
+
+ Reviewed by Filip Pizlo.
+
+ In this patch:
+ -B3 to Air lowering for BirOr.
+ -Codegen for BitOr.
+ -Strength reduction for BitOr and BitAnd.
+ -Tests for BitAnd and BitOr.
+ -Bug fix: Move64 with a negative value was destroying the top bits.
+
+ * b3/B3Const32Value.cpp:
+ (JSC::B3::Const32Value::bitAndConstant):
+ (JSC::B3::Const32Value::bitOrConstant):
+ * b3/B3Const32Value.h:
+ * b3/B3Const64Value.cpp:
+ (JSC::B3::Const64Value::bitAndConstant):
+ (JSC::B3::Const64Value::bitOrConstant):
+ * b3/B3Const64Value.h:
+ * b3/B3LowerToAir.cpp:
+ (JSC::B3::Air::LowerToAir::immForMove):
+ (JSC::B3::Air::LowerToAir::immOrTmpForMove):
+ (JSC::B3::Air::LowerToAir::tryOr):
+ (JSC::B3::Air::LowerToAir::tryConst64):
+ (JSC::B3::Air::LowerToAir::tryUpsilon):
+ (JSC::B3::Air::LowerToAir::tryIdentity):
+ (JSC::B3::Air::LowerToAir::tryReturn):
+ (JSC::B3::Air::LowerToAir::immOrTmp): Deleted.
+ * b3/B3LoweringMatcher.patterns:
+ * b3/B3ReduceStrength.cpp:
+ * b3/B3Value.cpp:
+ (JSC::B3::Value::bitAndConstant):
+ (JSC::B3::Value::bitOrConstant):
+ * b3/B3Value.h:
+ * b3/air/AirOpcode.opcodes:
+ * b3/testb3.cpp:
+ (JSC::B3::testReturnConst64):
+ (JSC::B3::testBitAndArgs):
+ (JSC::B3::testBitAndSameArg):
+ (JSC::B3::testBitAndImms):
+ (JSC::B3::testBitAndArgImm):
+ (JSC::B3::testBitAndImmArg):
+ (JSC::B3::testBitAndBitAndArgImmImm):
+ (JSC::B3::testBitAndImmBitAndArgImm):
+ (JSC::B3::testBitAndArgs32):
+ (JSC::B3::testBitAndSameArg32):
+ (JSC::B3::testBitAndImms32):
+ (JSC::B3::testBitAndArgImm32):
+ (JSC::B3::testBitAndImmArg32):
+ (JSC::B3::testBitAndBitAndArgImmImm32):
+ (JSC::B3::testBitAndImmBitAndArgImm32):
+ (JSC::B3::testBitOrArgs):
+ (JSC::B3::testBitOrSameArg):
+ (JSC::B3::testBitOrImms):
+ (JSC::B3::testBitOrArgImm):
+ (JSC::B3::testBitOrImmArg):
+ (JSC::B3::testBitOrBitOrArgImmImm):
+ (JSC::B3::testBitOrImmBitOrArgImm):
+ (JSC::B3::testBitOrArgs32):
+ (JSC::B3::testBitOrSameArg32):
+ (JSC::B3::testBitOrImms32):
+ (JSC::B3::testBitOrArgImm32):
+ (JSC::B3::testBitOrImmArg32):
+ (JSC::B3::testBitOrBitOrArgImmImm32):
+ (JSC::B3::testBitOrImmBitOrArgImm32):
+ (JSC::B3::run):
+
2015-11-03 Saam barati <sbar...@apple.com>
Rewrite "const" as "var" for iTunes/iBooks on the Mac
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h (191982 => 191983)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h 2015-11-03 23:23:23 UTC (rev 191982)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h 2015-11-03 23:24:50 UTC (rev 191983)
@@ -1052,6 +1052,11 @@
m_assembler.xchgq_rr(reg1, reg2);
}
+ void signExtend32ToPtr(TrustedImm32 imm, RegisterID dest)
+ {
+ m_assembler.mov_i32r(imm.m_value, dest);
+ }
+
void signExtend32ToPtr(RegisterID src, RegisterID dest)
{
m_assembler.movsxd_rr(src, dest);
Modified: trunk/Source/_javascript_Core/assembler/X86Assembler.h (191982 => 191983)
--- trunk/Source/_javascript_Core/assembler/X86Assembler.h 2015-11-03 23:23:23 UTC (rev 191982)
+++ trunk/Source/_javascript_Core/assembler/X86Assembler.h 2015-11-03 23:24:50 UTC (rev 191983)
@@ -1492,6 +1492,12 @@
m_formatter.oneByteOp64(OP_MOV_EAXIv, dst);
m_formatter.immediate64(imm);
}
+
+ void mov_i32r(int32_t imm, RegisterID dst)
+ {
+ m_formatter.oneByteOp64(OP_GROUP11_EvIz, GROUP11_MOV, dst);
+ m_formatter.immediate32(imm);
+ }
void movsxd_rr(RegisterID src, RegisterID dst)
{
Modified: trunk/Source/_javascript_Core/b3/B3Const32Value.cpp (191982 => 191983)
--- trunk/Source/_javascript_Core/b3/B3Const32Value.cpp 2015-11-03 23:23:23 UTC (rev 191982)
+++ trunk/Source/_javascript_Core/b3/B3Const32Value.cpp 2015-11-03 23:24:50 UTC (rev 191983)
@@ -61,6 +61,20 @@
return proc.add<Const32Value>(origin(), m_value - other->asInt32());
}
+Value* Const32Value::bitAndConstant(Procedure& proc, Value* other) const
+{
+ if (!other->hasInt32())
+ return nullptr;
+ return proc.add<Const32Value>(origin(), m_value & other->asInt32());
+}
+
+Value* Const32Value::bitOrConstant(Procedure& proc, Value* other) const
+{
+ if (!other->hasInt32())
+ return nullptr;
+ return proc.add<Const32Value>(origin(), m_value | other->asInt32());
+}
+
Value* Const32Value::equalConstant(Procedure& proc, Value* other) const
{
if (!other->hasInt32())
Modified: trunk/Source/_javascript_Core/b3/B3Const32Value.h (191982 => 191983)
--- trunk/Source/_javascript_Core/b3/B3Const32Value.h 2015-11-03 23:23:23 UTC (rev 191982)
+++ trunk/Source/_javascript_Core/b3/B3Const32Value.h 2015-11-03 23:24:50 UTC (rev 191983)
@@ -44,6 +44,8 @@
Value* addConstant(Procedure&, int32_t other) const override;
Value* addConstant(Procedure&, Value* other) const override;
Value* subConstant(Procedure&, Value* other) const override;
+ Value* bitAndConstant(Procedure&, Value* other) const override;
+ Value* bitOrConstant(Procedure&, Value* other) const override;
Value* equalConstant(Procedure&, Value* other) const override;
Value* notEqualConstant(Procedure&, Value* other) const override;
Modified: trunk/Source/_javascript_Core/b3/B3Const64Value.cpp (191982 => 191983)
--- trunk/Source/_javascript_Core/b3/B3Const64Value.cpp 2015-11-03 23:23:23 UTC (rev 191982)
+++ trunk/Source/_javascript_Core/b3/B3Const64Value.cpp 2015-11-03 23:24:50 UTC (rev 191983)
@@ -61,6 +61,20 @@
return proc.add<Const64Value>(origin(), m_value - other->asInt64());
}
+Value* Const64Value::bitAndConstant(Procedure& proc, Value* other) const
+{
+ if (!other->hasInt64())
+ return nullptr;
+ return proc.add<Const64Value>(origin(), m_value & other->asInt64());
+}
+
+Value* Const64Value::bitOrConstant(Procedure& proc, Value* other) const
+{
+ if (!other->hasInt64())
+ return nullptr;
+ return proc.add<Const64Value>(origin(), m_value | other->asInt64());
+}
+
Value* Const64Value::equalConstant(Procedure& proc, Value* other) const
{
if (!other->hasInt64())
Modified: trunk/Source/_javascript_Core/b3/B3Const64Value.h (191982 => 191983)
--- trunk/Source/_javascript_Core/b3/B3Const64Value.h 2015-11-03 23:23:23 UTC (rev 191982)
+++ trunk/Source/_javascript_Core/b3/B3Const64Value.h 2015-11-03 23:24:50 UTC (rev 191983)
@@ -44,6 +44,8 @@
Value* addConstant(Procedure&, int32_t other) const override;
Value* addConstant(Procedure&, Value* other) const override;
Value* subConstant(Procedure&, Value* other) const override;
+ Value* bitAndConstant(Procedure&, Value* other) const override;
+ Value* bitOrConstant(Procedure&, Value* other) const override;
Value* equalConstant(Procedure&, Value* other) const override;
Value* notEqualConstant(Procedure&, Value* other) const override;
Modified: trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp (191982 => 191983)
--- trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp 2015-11-03 23:23:23 UTC (rev 191982)
+++ trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp 2015-11-03 23:24:50 UTC (rev 191983)
@@ -654,6 +654,21 @@
}
}
+ bool tryOr(Value* left, Value* right)
+ {
+ switch (left->type()) {
+ case Int32:
+ appendBinOp<Or32, Commutative>(left, right);
+ return true;
+ case Int64:
+ appendBinOp<Or64, Commutative>(left, right);
+ return true;
+ default:
+ // FIXME: Implement more types!
+ return false;
+ }
+ }
+
bool tryShl(Value* value, Value* amount)
{
Air::Opcode opcode = value->type() == Int32 ? Lshift32 : Lshift64;
Modified: trunk/Source/_javascript_Core/b3/B3LoweringMatcher.patterns (191982 => 191983)
--- trunk/Source/_javascript_Core/b3/B3LoweringMatcher.patterns 2015-11-03 23:23:23 UTC (rev 191982)
+++ trunk/Source/_javascript_Core/b3/B3LoweringMatcher.patterns 2015-11-03 23:24:50 UTC (rev 191983)
@@ -33,6 +33,7 @@
Add = Add(left, right)
Sub = Sub(left, right)
And = BitAnd(left, right)
+Or = BitOr(left, right)
Shl = Shl(value, amount)
Modified: trunk/Source/_javascript_Core/b3/B3ReduceStrength.cpp (191982 => 191983)
--- trunk/Source/_javascript_Core/b3/B3ReduceStrength.cpp 2015-11-03 23:23:23 UTC (rev 191982)
+++ trunk/Source/_javascript_Core/b3/B3ReduceStrength.cpp 2015-11-03 23:24:50 UTC (rev 191983)
@@ -137,6 +137,104 @@
break;
+ case BitAnd:
+ handleCommutativity();
+
+ // Turn this: BitAnd(constant1, constant2)
+ // Into this: constant1 & constant2
+ if (Value* constantBitAnd = m_value->child(0)->bitAndConstant(m_proc, m_value->child(1))) {
+ replaceWithNewValue(constantBitAnd);
+ break;
+ }
+
+ // Turn this: BitAnd(BitAnd(value, constant1), constant2)
+ // Into this: BitAnd(value, constant1 & constant2).
+ if (m_value->child(0)->opcode() == BitAnd) {
+ Value* newConstant = m_value->child(1)->bitAndConstant(m_proc, m_value->child(0)->child(1));
+ if (newConstant) {
+ m_insertionSet.insertValue(m_index, newConstant);
+ m_value->child(0) = m_value->child(0)->child(0);
+ m_value->child(1) = newConstant;
+ m_changed = true;
+ }
+ }
+
+ // Turn this: BitAnd(valueX, valueX)
+ // Into this: valueX.
+ if (m_value->child(0) == m_value->child(1)) {
+ m_value->replaceWithIdentity(m_value->child(0));
+ m_changed = true;
+ break;
+ }
+
+ // Turn this: BitAnd(value, zero-constant)
+ // Into this: zero-constant.
+ if (m_value->child(1)->isInt(0)) {
+ m_value->replaceWithIdentity(m_value->child(1));
+ m_changed = true;
+ break;
+ }
+
+ // Turn this: BitAnd(value, all-ones)
+ // Into this: value.
+ if ((m_value->type() == Int64 && m_value->child(1)->isInt(0xffffffffffffffff))
+ || (m_value->type() == Int32 && m_value->child(1)->isInt(0xffffffff))) {
+ m_value->replaceWithIdentity(m_value->child(0));
+ m_changed = true;
+ break;
+ }
+
+ break;
+
+ case BitOr:
+ handleCommutativity();
+
+ // Turn this: BitOr(constant1, constant2)
+ // Into this: constant1 | constant2
+ if (Value* constantBitAnd = m_value->child(0)->bitOrConstant(m_proc, m_value->child(1))) {
+ replaceWithNewValue(constantBitAnd);
+ break;
+ }
+
+ // Turn this: BitAnd(BitAnd(value, constant1), constant2)
+ // Into this: BitAnd(value, constant1 & constant2).
+ if (m_value->child(0)->opcode() == BitOr) {
+ Value* newConstant = m_value->child(1)->bitOrConstant(m_proc, m_value->child(0)->child(1));
+ if (newConstant) {
+ m_insertionSet.insertValue(m_index, newConstant);
+ m_value->child(0) = m_value->child(0)->child(0);
+ m_value->child(1) = newConstant;
+ m_changed = true;
+ }
+ }
+
+ // Turn this: BitOr(valueX, valueX)
+ // Into this: valueX.
+ if (m_value->child(0) == m_value->child(1)) {
+ m_value->replaceWithIdentity(m_value->child(0));
+ m_changed = true;
+ break;
+ }
+
+ // Turn this: BitOr(value, zero-constant)
+ // Into this: value.
+ if (m_value->child(1)->isInt(0)) {
+ m_value->replaceWithIdentity(m_value->child(0));
+ m_changed = true;
+ break;
+ }
+
+ // Turn this: BitOr(value, all-ones)
+ // Into this: all-ones.
+ if ((m_value->type() == Int64 && m_value->child(1)->isInt(0xffffffffffffffff))
+ || (m_value->type() == Int32 && m_value->child(1)->isInt(0xffffffff))) {
+ m_value->replaceWithIdentity(m_value->child(1));
+ m_changed = true;
+ break;
+ }
+
+ break;
+
case Load8Z:
case Load8S:
case Load16Z:
Modified: trunk/Source/_javascript_Core/b3/B3Value.cpp (191982 => 191983)
--- trunk/Source/_javascript_Core/b3/B3Value.cpp 2015-11-03 23:23:23 UTC (rev 191982)
+++ trunk/Source/_javascript_Core/b3/B3Value.cpp 2015-11-03 23:24:50 UTC (rev 191983)
@@ -127,6 +127,16 @@
return nullptr;
}
+Value* Value::bitAndConstant(Procedure&, Value*) const
+{
+ return nullptr;
+}
+
+Value* Value::bitOrConstant(Procedure&, Value*) const
+{
+ return nullptr;
+}
+
Value* Value::equalConstant(Procedure&, Value*) const
{
return nullptr;
Modified: trunk/Source/_javascript_Core/b3/B3Value.h (191982 => 191983)
--- trunk/Source/_javascript_Core/b3/B3Value.h 2015-11-03 23:23:23 UTC (rev 191982)
+++ trunk/Source/_javascript_Core/b3/B3Value.h 2015-11-03 23:24:50 UTC (rev 191983)
@@ -112,6 +112,8 @@
virtual Value* addConstant(Procedure&, int32_t other) const;
virtual Value* addConstant(Procedure&, Value* other) const;
virtual Value* subConstant(Procedure&, Value* other) const;
+ virtual Value* bitAndConstant(Procedure&, Value* other) const;
+ virtual Value* bitOrConstant(Procedure&, Value* other) const;
virtual Value* equalConstant(Procedure&, Value* other) const;
virtual Value* notEqualConstant(Procedure&, Value* other) const;
Modified: trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes (191982 => 191983)
--- trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes 2015-11-03 23:23:23 UTC (rev 191982)
+++ trunk/Source/_javascript_Core/b3/air/AirOpcode.opcodes 2015-11-03 23:24:50 UTC (rev 191983)
@@ -107,6 +107,17 @@
Tmp*, Tmp
Imm, Tmp
+Or32 U:G, UD:G
+ Tmp, Tmp
+ Imm, Tmp
+ Tmp, Addr
+ Addr, Tmp
+ Imm, Addr
+
+Or64 U:G, UD:G
+ Tmp, Tmp
+ Imm, Tmp
+
Lshift64 U:G, UD:G
Tmp*, Tmp
Imm, Tmp
@@ -121,7 +132,7 @@
# means movePtr.
Move U:G, D:G
Tmp, Tmp
- Imm, Tmp
+ Imm, Tmp as signExtend32ToPtr
Imm64, Tmp
Addr, Tmp as loadPtr # This means that "Move Addr, Tmp" is code-generated as "load" not "move".
Index, Tmp as loadPtr
Modified: trunk/Source/_javascript_Core/b3/testb3.cpp (191982 => 191983)
--- trunk/Source/_javascript_Core/b3/testb3.cpp 2015-11-03 23:23:23 UTC (rev 191982)
+++ trunk/Source/_javascript_Core/b3/testb3.cpp 2015-11-03 23:24:50 UTC (rev 191983)
@@ -120,6 +120,17 @@
CHECK(compileAndRun<int>(proc, argument) == argument);
}
+void testReturnConst64(int64_t value)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Const64Value>(proc, Origin(), value));
+
+ CHECK(compileAndRun<int64_t>(proc) == value);
+}
+
void testAddArgs(int a, int b)
{
Procedure proc;
@@ -272,6 +283,461 @@
CHECK(compileAndRun<int>(proc, b) == a - b);
}
+void testBitAndArgs(int64_t a, int64_t b)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, BitAnd, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR1)));
+
+ CHECK(compileAndRun<int64_t>(proc, a, b) == (a & b));
+}
+
+void testBitAndSameArg(int64_t a)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ Value* argument = root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0);
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, BitAnd, Origin(),
+ argument,
+ argument));
+
+ CHECK(compileAndRun<int64_t>(proc, a) == a);
+}
+
+void testBitAndImms(int64_t a, int64_t b)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, BitAnd, Origin(),
+ root->appendNew<Const64Value>(proc, Origin(), a),
+ root->appendNew<Const64Value>(proc, Origin(), b)));
+
+ CHECK(compileAndRun<int64_t>(proc) == (a & b));
+}
+
+void testBitAndArgImm(int64_t a, int64_t b)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, BitAnd, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0),
+ root->appendNew<Const64Value>(proc, Origin(), b)));
+
+ CHECK(compileAndRun<int64_t>(proc, a) == (a & b));
+}
+
+void testBitAndImmArg(int64_t a, int64_t b)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, BitAnd, Origin(),
+ root->appendNew<Const64Value>(proc, Origin(), a),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0)));
+
+ CHECK(compileAndRun<int64_t>(proc, b) == (a & b));
+}
+
+void testBitAndBitAndArgImmImm(int64_t a, int64_t b, int64_t c)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ Value* innerBitAnd = root->appendNew<Value>(
+ proc, BitAnd, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0),
+ root->appendNew<Const64Value>(proc, Origin(), b));
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, BitAnd, Origin(),
+ innerBitAnd,
+ root->appendNew<Const64Value>(proc, Origin(), c)));
+
+ CHECK(compileAndRun<int64_t>(proc, a) == ((a & b) & c));
+}
+
+void testBitAndImmBitAndArgImm(int64_t a, int64_t b, int64_t c)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ Value* innerBitAnd = root->appendNew<Value>(
+ proc, BitAnd, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0),
+ root->appendNew<Const64Value>(proc, Origin(), c));
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, BitAnd, Origin(),
+ root->appendNew<Const64Value>(proc, Origin(), a),
+ innerBitAnd));
+
+ CHECK(compileAndRun<int64_t>(proc, b) == (a & (b & c)));
+}
+
+void testBitAndArgs32(int a, int b)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, BitAnd, Origin(),
+ root->appendNew<Value>(
+ proc, Trunc, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0)),
+ root->appendNew<Value>(
+ proc, Trunc, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR1))));
+
+ CHECK(compileAndRun<int>(proc, a, b) == (a & b));
+}
+
+void testBitAndSameArg32(int a)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ Value* argument = root->appendNew<Value>(proc, Trunc, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0));
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, BitAnd, Origin(),
+ argument,
+ argument));
+
+ CHECK(compileAndRun<int>(proc, a) == a);
+}
+
+void testBitAndImms32(int a, int b)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, BitAnd, Origin(),
+ root->appendNew<Const32Value>(proc, Origin(), a),
+ root->appendNew<Const32Value>(proc, Origin(), b)));
+
+ CHECK(compileAndRun<int>(proc) == (a & b));
+}
+
+void testBitAndArgImm32(int a, int b)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, BitAnd, Origin(),
+ root->appendNew<Value>(
+ proc, Trunc, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0)),
+ root->appendNew<Const32Value>(proc, Origin(), b)));
+
+ CHECK(compileAndRun<int>(proc, a) == (a & b));
+}
+
+void testBitAndImmArg32(int a, int b)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, BitAnd, Origin(),
+ root->appendNew<Const32Value>(proc, Origin(), a),
+ root->appendNew<Value>(
+ proc, Trunc, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0))));
+
+ CHECK(compileAndRun<int>(proc, b) == (a & b));
+}
+
+void testBitAndBitAndArgImmImm32(int a, int b, int c)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ Value* innerBitAnd = root->appendNew<Value>(
+ proc, BitAnd, Origin(),
+ root->appendNew<Value>(
+ proc, Trunc, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0)),
+ root->appendNew<Const32Value>(proc, Origin(), b));
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, BitAnd, Origin(),
+ innerBitAnd,
+ root->appendNew<Const32Value>(proc, Origin(), c)));
+
+ CHECK(compileAndRun<int>(proc, a) == ((a & b) & c));
+}
+
+void testBitAndImmBitAndArgImm32(int a, int b, int c)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ Value* innerBitAnd = root->appendNew<Value>(
+ proc, BitAnd, Origin(),
+ root->appendNew<Value>(
+ proc, Trunc, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0)),
+ root->appendNew<Const32Value>(proc, Origin(), c));
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, BitAnd, Origin(),
+ root->appendNew<Const32Value>(proc, Origin(), a),
+ innerBitAnd));
+
+ CHECK(compileAndRun<int>(proc, b) == (a & (b & c)));
+}
+
+void testBitOrArgs(int64_t a, int64_t b)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, BitOr, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR1)));
+
+ CHECK(compileAndRun<int64_t>(proc, a, b) == (a | b));
+}
+
+void testBitOrSameArg(int64_t a)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ Value* argument = root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0);
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, BitOr, Origin(),
+ argument,
+ argument));
+
+ CHECK(compileAndRun<int64_t>(proc, a) == a);
+}
+
+void testBitOrImms(int64_t a, int64_t b)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, BitOr, Origin(),
+ root->appendNew<Const64Value>(proc, Origin(), a),
+ root->appendNew<Const64Value>(proc, Origin(), b)));
+
+ CHECK(compileAndRun<int64_t>(proc) == (a | b));
+}
+
+void testBitOrArgImm(int64_t a, int64_t b)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, BitOr, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0),
+ root->appendNew<Const64Value>(proc, Origin(), b)));
+
+ CHECK(compileAndRun<int64_t>(proc, a) == (a | b));
+}
+
+void testBitOrImmArg(int64_t a, int64_t b)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, BitOr, Origin(),
+ root->appendNew<Const64Value>(proc, Origin(), a),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0)));
+
+ CHECK(compileAndRun<int64_t>(proc, b) == (a | b));
+}
+
+void testBitOrBitOrArgImmImm(int64_t a, int64_t b, int64_t c)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ Value* innerBitOr = root->appendNew<Value>(
+ proc, BitOr, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0),
+ root->appendNew<Const64Value>(proc, Origin(), b));
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, BitOr, Origin(),
+ innerBitOr,
+ root->appendNew<Const64Value>(proc, Origin(), c)));
+
+ CHECK(compileAndRun<int64_t>(proc, a) == ((a | b) | c));
+}
+
+void testBitOrImmBitOrArgImm(int64_t a, int64_t b, int64_t c)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ Value* innerBitOr = root->appendNew<Value>(
+ proc, BitOr, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0),
+ root->appendNew<Const64Value>(proc, Origin(), c));
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, BitOr, Origin(),
+ root->appendNew<Const64Value>(proc, Origin(), a),
+ innerBitOr));
+
+ CHECK(compileAndRun<int64_t>(proc, b) == (a | (b | c)));
+}
+
+void testBitOrArgs32(int a, int b)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, BitOr, Origin(),
+ root->appendNew<Value>(
+ proc, Trunc, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0)),
+ root->appendNew<Value>(
+ proc, Trunc, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR1))));
+
+ CHECK(compileAndRun<int>(proc, a, b) == (a | b));
+}
+
+void testBitOrSameArg32(int a)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ Value* argument = root->appendNew<Value>(
+ proc, Trunc, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0));
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, BitOr, Origin(),
+ argument,
+ argument));
+
+ CHECK(compileAndRun<int>(proc, a) == a);
+}
+
+void testBitOrImms32(int a, int b)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, BitOr, Origin(),
+ root->appendNew<Const32Value>(proc, Origin(), a),
+ root->appendNew<Const32Value>(proc, Origin(), b)));
+
+ CHECK(compileAndRun<int>(proc) == (a | b));
+}
+
+void testBitOrArgImm32(int a, int b)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, BitOr, Origin(),
+ root->appendNew<Value>(
+ proc, Trunc, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0)),
+ root->appendNew<Const32Value>(proc, Origin(), b)));
+
+ CHECK(compileAndRun<int>(proc, a) == (a | b));
+}
+
+void testBitOrImmArg32(int a, int b)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, BitOr, Origin(),
+ root->appendNew<Const32Value>(proc, Origin(), a),
+ root->appendNew<Value>(
+ proc, Trunc, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0))));
+
+ CHECK(compileAndRun<int>(proc, b) == (a | b));
+}
+
+void testBitOrBitOrArgImmImm32(int a, int b, int c)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ Value* innerBitOr = root->appendNew<Value>(
+ proc, BitOr, Origin(),
+ root->appendNew<Value>(
+ proc, Trunc, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0)),
+ root->appendNew<Const32Value>(proc, Origin(), b));
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, BitOr, Origin(),
+ innerBitOr,
+ root->appendNew<Const32Value>(proc, Origin(), c)));
+
+ CHECK(compileAndRun<int>(proc, a) == ((a | b) | c));
+}
+
+void testBitOrImmBitOrArgImm32(int a, int b, int c)
+{
+ Procedure proc;
+ BasicBlock* root = proc.addBlock();
+ Value* innerBitOr = root->appendNew<Value>(
+ proc, BitOr, Origin(),
+ root->appendNew<Value>(
+ proc, Trunc, Origin(),
+ root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0)),
+ root->appendNew<Const32Value>(proc, Origin(), c));
+ root->appendNew<ControlValue>(
+ proc, Return, Origin(),
+ root->appendNew<Value>(
+ proc, BitOr, Origin(),
+ root->appendNew<Const32Value>(proc, Origin(), a),
+ innerBitOr));
+
+ CHECK(compileAndRun<int>(proc, b) == (a | (b | c)));
+}
+
void testStore(int value)
{
Procedure proc;
@@ -1250,6 +1716,8 @@
RUN(test42());
RUN(testLoad42());
RUN(testArg(43));
+ RUN(testReturnConst64(5));
+ RUN(testReturnConst64(-42));
RUN(testAddArgs(1, 1));
RUN(testAddArgs(1, 2));
@@ -1289,6 +1757,112 @@
RUN(testSubImmArg32(13, -42));
RUN(testSubImmArg32(-13, 42));
+ RUN(testBitAndArgs(43, 43));
+ RUN(testBitAndArgs(43, 0));
+ RUN(testBitAndArgs(10, 3));
+ RUN(testBitAndArgs(42, 0xffffffffffffffff));
+ RUN(testBitAndSameArg(43));
+ RUN(testBitAndSameArg(0));
+ RUN(testBitAndSameArg(3));
+ RUN(testBitAndSameArg(0xffffffffffffffff));
+ RUN(testBitAndImms(43, 43));
+ RUN(testBitAndImms(43, 0));
+ RUN(testBitAndImms(10, 3));
+ RUN(testBitAndImms(42, 0xffffffffffffffff));
+ RUN(testBitAndArgImm(43, 43));
+ RUN(testBitAndArgImm(43, 0));
+ RUN(testBitAndArgImm(10, 3));
+ RUN(testBitAndArgImm(42, 0xffffffffffffffff));
+ RUN(testBitAndImmArg(43, 43));
+ RUN(testBitAndImmArg(43, 0));
+ RUN(testBitAndImmArg(10, 3));
+ RUN(testBitAndImmArg(42, 0xffffffffffffffff));
+ RUN(testBitAndBitAndArgImmImm(2, 7, 3));
+ RUN(testBitAndBitAndArgImmImm(1, 6, 6));
+ RUN(testBitAndBitAndArgImmImm(0xffff, 24, 7));
+ RUN(testBitAndImmBitAndArgImm(7, 2, 3));
+ RUN(testBitAndImmBitAndArgImm(6, 1, 6));
+ RUN(testBitAndImmBitAndArgImm(24, 0xffff, 7));
+ RUN(testBitAndArgs32(43, 43));
+ RUN(testBitAndArgs32(43, 0));
+ RUN(testBitAndArgs32(10, 3));
+ RUN(testBitAndArgs32(42, 0xffffffff));
+ RUN(testBitAndSameArg32(43));
+ RUN(testBitAndSameArg32(0));
+ RUN(testBitAndSameArg32(3));
+ RUN(testBitAndSameArg32(0xffffffff));
+ RUN(testBitAndImms32(43, 43));
+ RUN(testBitAndImms32(43, 0));
+ RUN(testBitAndImms32(10, 3));
+ RUN(testBitAndImms32(42, 0xffffffff));
+ RUN(testBitAndArgImm32(43, 43));
+ RUN(testBitAndArgImm32(43, 0));
+ RUN(testBitAndArgImm32(10, 3));
+ RUN(testBitAndArgImm32(42, 0xffffffff));
+ RUN(testBitAndImmArg32(43, 43));
+ RUN(testBitAndImmArg32(43, 0));
+ RUN(testBitAndImmArg32(10, 3));
+ RUN(testBitAndImmArg32(42, 0xffffffff));
+ RUN(testBitAndBitAndArgImmImm32(2, 7, 3));
+ RUN(testBitAndBitAndArgImmImm32(1, 6, 6));
+ RUN(testBitAndBitAndArgImmImm32(0xffff, 24, 7));
+ RUN(testBitAndImmBitAndArgImm32(7, 2, 3));
+ RUN(testBitAndImmBitAndArgImm32(6, 1, 6));
+ RUN(testBitAndImmBitAndArgImm32(24, 0xffff, 7));
+
+ RUN(testBitOrArgs(43, 43));
+ RUN(testBitOrArgs(43, 0));
+ RUN(testBitOrArgs(10, 3));
+ RUN(testBitOrArgs(42, 0xffffffffffffffff));
+ RUN(testBitOrSameArg(43));
+ RUN(testBitOrSameArg(0));
+ RUN(testBitOrSameArg(3));
+ RUN(testBitOrSameArg(0xffffffffffffffff));
+ RUN(testBitOrImms(43, 43));
+ RUN(testBitOrImms(43, 0));
+ RUN(testBitOrImms(10, 3));
+ RUN(testBitOrImms(42, 0xffffffffffffffff));
+ RUN(testBitOrArgImm(43, 43));
+ RUN(testBitOrArgImm(43, 0));
+ RUN(testBitOrArgImm(10, 3));
+ RUN(testBitOrArgImm(42, 0xffffffffffffffff));
+ RUN(testBitOrImmArg(43, 43));
+ RUN(testBitOrImmArg(43, 0));
+ RUN(testBitOrImmArg(10, 3));
+ RUN(testBitOrImmArg(42, 0xffffffffffffffff));
+ RUN(testBitOrBitOrArgImmImm(2, 7, 3));
+ RUN(testBitOrBitOrArgImmImm(1, 6, 6));
+ RUN(testBitOrBitOrArgImmImm(0xffff, 24, 7));
+ RUN(testBitOrImmBitOrArgImm(7, 2, 3));
+ RUN(testBitOrImmBitOrArgImm(6, 1, 6));
+ RUN(testBitOrImmBitOrArgImm(24, 0xffff, 7));
+ RUN(testBitOrArgs32(43, 43));
+ RUN(testBitOrArgs32(43, 0));
+ RUN(testBitOrArgs32(10, 3));
+ RUN(testBitOrArgs32(42, 0xffffffff));
+ RUN(testBitOrSameArg32(43));
+ RUN(testBitOrSameArg32(0));
+ RUN(testBitOrSameArg32(3));
+ RUN(testBitOrSameArg32(0xffffffff));
+ RUN(testBitOrImms32(43, 43));
+ RUN(testBitOrImms32(43, 0));
+ RUN(testBitOrImms32(10, 3));
+ RUN(testBitOrImms32(42, 0xffffffff));
+ RUN(testBitOrArgImm32(43, 43));
+ RUN(testBitOrArgImm32(43, 0));
+ RUN(testBitOrArgImm32(10, 3));
+ RUN(testBitOrArgImm32(42, 0xffffffff));
+ RUN(testBitOrImmArg32(43, 43));
+ RUN(testBitOrImmArg32(43, 0));
+ RUN(testBitOrImmArg32(10, 3));
+ RUN(testBitOrImmArg32(42, 0xffffffff));
+ RUN(testBitOrBitOrArgImmImm32(2, 7, 3));
+ RUN(testBitOrBitOrArgImmImm32(1, 6, 6));
+ RUN(testBitOrBitOrArgImmImm32(0xffff, 24, 7));
+ RUN(testBitOrImmBitOrArgImm32(7, 2, 3));
+ RUN(testBitOrImmBitOrArgImm32(6, 1, 6));
+ RUN(testBitOrImmBitOrArgImm32(24, 0xffff, 7));
+
RUN(testStore(44));
RUN(testStoreConstant(49));
RUN(testStoreConstantPtr(49));
_______________________________________________ webkit-changes mailing list webkit-changes@lists.webkit.org https://lists.webkit.org/mailman/listinfo/webkit-changes