1656 lines
50 KiB
JavaScript
1656 lines
50 KiB
JavaScript
"use strict";
|
|
// Generated by opcode_generator.rb from JavaScriptCore/b3/air/AirOpcode.opcodes -- do not edit!
|
|
const Nop = Symbol("Nop");
|
|
const Add32 = Symbol("Add32");
|
|
const Add8 = Symbol("Add8");
|
|
const Add16 = Symbol("Add16");
|
|
const Add64 = Symbol("Add64");
|
|
const AddDouble = Symbol("AddDouble");
|
|
const AddFloat = Symbol("AddFloat");
|
|
const Sub32 = Symbol("Sub32");
|
|
const Sub64 = Symbol("Sub64");
|
|
const SubDouble = Symbol("SubDouble");
|
|
const SubFloat = Symbol("SubFloat");
|
|
const Neg32 = Symbol("Neg32");
|
|
const Neg64 = Symbol("Neg64");
|
|
const NegateDouble = Symbol("NegateDouble");
|
|
const Mul32 = Symbol("Mul32");
|
|
const Mul64 = Symbol("Mul64");
|
|
const MultiplyAdd32 = Symbol("MultiplyAdd32");
|
|
const MultiplyAdd64 = Symbol("MultiplyAdd64");
|
|
const MultiplySub32 = Symbol("MultiplySub32");
|
|
const MultiplySub64 = Symbol("MultiplySub64");
|
|
const MultiplyNeg32 = Symbol("MultiplyNeg32");
|
|
const MultiplyNeg64 = Symbol("MultiplyNeg64");
|
|
const Div32 = Symbol("Div32");
|
|
const Div64 = Symbol("Div64");
|
|
const MulDouble = Symbol("MulDouble");
|
|
const MulFloat = Symbol("MulFloat");
|
|
const DivDouble = Symbol("DivDouble");
|
|
const DivFloat = Symbol("DivFloat");
|
|
const X86ConvertToDoubleWord32 = Symbol("X86ConvertToDoubleWord32");
|
|
const X86ConvertToQuadWord64 = Symbol("X86ConvertToQuadWord64");
|
|
const X86Div32 = Symbol("X86Div32");
|
|
const X86Div64 = Symbol("X86Div64");
|
|
const Lea = Symbol("Lea");
|
|
const And32 = Symbol("And32");
|
|
const And64 = Symbol("And64");
|
|
const AndDouble = Symbol("AndDouble");
|
|
const AndFloat = Symbol("AndFloat");
|
|
const XorDouble = Symbol("XorDouble");
|
|
const XorFloat = Symbol("XorFloat");
|
|
const Lshift32 = Symbol("Lshift32");
|
|
const Lshift64 = Symbol("Lshift64");
|
|
const Rshift32 = Symbol("Rshift32");
|
|
const Rshift64 = Symbol("Rshift64");
|
|
const Urshift32 = Symbol("Urshift32");
|
|
const Urshift64 = Symbol("Urshift64");
|
|
const Or32 = Symbol("Or32");
|
|
const Or64 = Symbol("Or64");
|
|
const Xor32 = Symbol("Xor32");
|
|
const Xor64 = Symbol("Xor64");
|
|
const Not32 = Symbol("Not32");
|
|
const Not64 = Symbol("Not64");
|
|
const AbsDouble = Symbol("AbsDouble");
|
|
const AbsFloat = Symbol("AbsFloat");
|
|
const CeilDouble = Symbol("CeilDouble");
|
|
const CeilFloat = Symbol("CeilFloat");
|
|
const FloorDouble = Symbol("FloorDouble");
|
|
const FloorFloat = Symbol("FloorFloat");
|
|
const SqrtDouble = Symbol("SqrtDouble");
|
|
const SqrtFloat = Symbol("SqrtFloat");
|
|
const ConvertInt32ToDouble = Symbol("ConvertInt32ToDouble");
|
|
const ConvertInt64ToDouble = Symbol("ConvertInt64ToDouble");
|
|
const ConvertInt32ToFloat = Symbol("ConvertInt32ToFloat");
|
|
const ConvertInt64ToFloat = Symbol("ConvertInt64ToFloat");
|
|
const CountLeadingZeros32 = Symbol("CountLeadingZeros32");
|
|
const CountLeadingZeros64 = Symbol("CountLeadingZeros64");
|
|
const ConvertDoubleToFloat = Symbol("ConvertDoubleToFloat");
|
|
const ConvertFloatToDouble = Symbol("ConvertFloatToDouble");
|
|
const Move = Symbol("Move");
|
|
const Swap32 = Symbol("Swap32");
|
|
const Swap64 = Symbol("Swap64");
|
|
const Move32 = Symbol("Move32");
|
|
const StoreZero32 = Symbol("StoreZero32");
|
|
const SignExtend32ToPtr = Symbol("SignExtend32ToPtr");
|
|
const ZeroExtend8To32 = Symbol("ZeroExtend8To32");
|
|
const SignExtend8To32 = Symbol("SignExtend8To32");
|
|
const ZeroExtend16To32 = Symbol("ZeroExtend16To32");
|
|
const SignExtend16To32 = Symbol("SignExtend16To32");
|
|
const MoveFloat = Symbol("MoveFloat");
|
|
const MoveDouble = Symbol("MoveDouble");
|
|
const MoveZeroToDouble = Symbol("MoveZeroToDouble");
|
|
const Move64ToDouble = Symbol("Move64ToDouble");
|
|
const Move32ToFloat = Symbol("Move32ToFloat");
|
|
const MoveDoubleTo64 = Symbol("MoveDoubleTo64");
|
|
const MoveFloatTo32 = Symbol("MoveFloatTo32");
|
|
const Load8 = Symbol("Load8");
|
|
const Store8 = Symbol("Store8");
|
|
const Load8SignedExtendTo32 = Symbol("Load8SignedExtendTo32");
|
|
const Load16 = Symbol("Load16");
|
|
const Load16SignedExtendTo32 = Symbol("Load16SignedExtendTo32");
|
|
const Store16 = Symbol("Store16");
|
|
const Compare32 = Symbol("Compare32");
|
|
const Compare64 = Symbol("Compare64");
|
|
const Test32 = Symbol("Test32");
|
|
const Test64 = Symbol("Test64");
|
|
const CompareDouble = Symbol("CompareDouble");
|
|
const CompareFloat = Symbol("CompareFloat");
|
|
const Branch8 = Symbol("Branch8");
|
|
const Branch32 = Symbol("Branch32");
|
|
const Branch64 = Symbol("Branch64");
|
|
const BranchTest8 = Symbol("BranchTest8");
|
|
const BranchTest32 = Symbol("BranchTest32");
|
|
const BranchTest64 = Symbol("BranchTest64");
|
|
const BranchDouble = Symbol("BranchDouble");
|
|
const BranchFloat = Symbol("BranchFloat");
|
|
const BranchAdd32 = Symbol("BranchAdd32");
|
|
const BranchAdd64 = Symbol("BranchAdd64");
|
|
const BranchMul32 = Symbol("BranchMul32");
|
|
const BranchMul64 = Symbol("BranchMul64");
|
|
const BranchSub32 = Symbol("BranchSub32");
|
|
const BranchSub64 = Symbol("BranchSub64");
|
|
const BranchNeg32 = Symbol("BranchNeg32");
|
|
const BranchNeg64 = Symbol("BranchNeg64");
|
|
const MoveConditionally32 = Symbol("MoveConditionally32");
|
|
const MoveConditionally64 = Symbol("MoveConditionally64");
|
|
const MoveConditionallyTest32 = Symbol("MoveConditionallyTest32");
|
|
const MoveConditionallyTest64 = Symbol("MoveConditionallyTest64");
|
|
const MoveConditionallyDouble = Symbol("MoveConditionallyDouble");
|
|
const MoveConditionallyFloat = Symbol("MoveConditionallyFloat");
|
|
const MoveDoubleConditionally32 = Symbol("MoveDoubleConditionally32");
|
|
const MoveDoubleConditionally64 = Symbol("MoveDoubleConditionally64");
|
|
const MoveDoubleConditionallyTest32 = Symbol("MoveDoubleConditionallyTest32");
|
|
const MoveDoubleConditionallyTest64 = Symbol("MoveDoubleConditionallyTest64");
|
|
const MoveDoubleConditionallyDouble = Symbol("MoveDoubleConditionallyDouble");
|
|
const MoveDoubleConditionallyFloat = Symbol("MoveDoubleConditionallyFloat");
|
|
const Jump = Symbol("Jump");
|
|
const Ret32 = Symbol("Ret32");
|
|
const Ret64 = Symbol("Ret64");
|
|
const RetFloat = Symbol("RetFloat");
|
|
const RetDouble = Symbol("RetDouble");
|
|
const Oops = Symbol("Oops");
|
|
const Shuffle = Symbol("Shuffle");
|
|
const Patch = Symbol("Patch");
|
|
const CCall = Symbol("CCall");
|
|
const ColdCCall = Symbol("ColdCCall");
|
|
function Inst_forEachArg(inst, func)
|
|
{
|
|
let replacement;
|
|
switch (inst.opcode) {
|
|
case Nop:
|
|
break;
|
|
break;
|
|
case Add32:
|
|
switch (inst.args.length) {
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 32);
|
|
inst.visitArg(2, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.UseZDef, GP, 32);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case Add8:
|
|
inst.visitArg(0, func, Arg.Use, GP, 8);
|
|
inst.visitArg(1, func, Arg.UseDef, GP, 8);
|
|
break;
|
|
break;
|
|
case Add16:
|
|
inst.visitArg(0, func, Arg.Use, GP, 16);
|
|
inst.visitArg(1, func, Arg.UseDef, GP, 16);
|
|
break;
|
|
break;
|
|
case Add64:
|
|
switch (inst.args.length) {
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, GP, 64);
|
|
inst.visitArg(1, func, Arg.UseDef, GP, 64);
|
|
break;
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, GP, 64);
|
|
inst.visitArg(1, func, Arg.Use, GP, 64);
|
|
inst.visitArg(2, func, Arg.Def, GP, 64);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case AddDouble:
|
|
switch (inst.args.length) {
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, FP, 64);
|
|
inst.visitArg(1, func, Arg.Use, FP, 64);
|
|
inst.visitArg(2, func, Arg.Def, FP, 64);
|
|
break;
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, FP, 64);
|
|
inst.visitArg(1, func, Arg.UseDef, FP, 64);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case AddFloat:
|
|
switch (inst.args.length) {
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, FP, 32);
|
|
inst.visitArg(1, func, Arg.Use, FP, 32);
|
|
inst.visitArg(2, func, Arg.Def, FP, 32);
|
|
break;
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, FP, 32);
|
|
inst.visitArg(1, func, Arg.UseDef, FP, 32);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case Sub32:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.UseZDef, GP, 32);
|
|
break;
|
|
break;
|
|
case Sub64:
|
|
inst.visitArg(0, func, Arg.Use, GP, 64);
|
|
inst.visitArg(1, func, Arg.UseDef, GP, 64);
|
|
break;
|
|
break;
|
|
case SubDouble:
|
|
switch (inst.args.length) {
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, FP, 64);
|
|
inst.visitArg(1, func, Arg.Use, FP, 64);
|
|
inst.visitArg(2, func, Arg.Def, FP, 64);
|
|
break;
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, FP, 64);
|
|
inst.visitArg(1, func, Arg.UseDef, FP, 64);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case SubFloat:
|
|
switch (inst.args.length) {
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, FP, 32);
|
|
inst.visitArg(1, func, Arg.Use, FP, 32);
|
|
inst.visitArg(2, func, Arg.Def, FP, 32);
|
|
break;
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, FP, 32);
|
|
inst.visitArg(1, func, Arg.UseDef, FP, 32);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case Neg32:
|
|
inst.visitArg(0, func, Arg.UseZDef, GP, 32);
|
|
break;
|
|
break;
|
|
case Neg64:
|
|
inst.visitArg(0, func, Arg.UseDef, GP, 64);
|
|
break;
|
|
break;
|
|
case NegateDouble:
|
|
inst.visitArg(0, func, Arg.Use, FP, 64);
|
|
inst.visitArg(1, func, Arg.Def, FP, 64);
|
|
break;
|
|
break;
|
|
case Mul32:
|
|
switch (inst.args.length) {
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.UseZDef, GP, 32);
|
|
break;
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 32);
|
|
inst.visitArg(2, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case Mul64:
|
|
switch (inst.args.length) {
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, GP, 64);
|
|
inst.visitArg(1, func, Arg.UseDef, GP, 64);
|
|
break;
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, GP, 64);
|
|
inst.visitArg(1, func, Arg.Use, GP, 64);
|
|
inst.visitArg(2, func, Arg.Def, GP, 64);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case MultiplyAdd32:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 32);
|
|
inst.visitArg(2, func, Arg.Use, GP, 32);
|
|
inst.visitArg(3, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
break;
|
|
case MultiplyAdd64:
|
|
inst.visitArg(0, func, Arg.Use, GP, 64);
|
|
inst.visitArg(1, func, Arg.Use, GP, 64);
|
|
inst.visitArg(2, func, Arg.Use, GP, 64);
|
|
inst.visitArg(3, func, Arg.Def, GP, 64);
|
|
break;
|
|
break;
|
|
case MultiplySub32:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 32);
|
|
inst.visitArg(2, func, Arg.Use, GP, 32);
|
|
inst.visitArg(3, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
break;
|
|
case MultiplySub64:
|
|
inst.visitArg(0, func, Arg.Use, GP, 64);
|
|
inst.visitArg(1, func, Arg.Use, GP, 64);
|
|
inst.visitArg(2, func, Arg.Use, GP, 64);
|
|
inst.visitArg(3, func, Arg.Def, GP, 64);
|
|
break;
|
|
break;
|
|
case MultiplyNeg32:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 32);
|
|
inst.visitArg(2, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
break;
|
|
case MultiplyNeg64:
|
|
inst.visitArg(0, func, Arg.Use, GP, 64);
|
|
inst.visitArg(1, func, Arg.Use, GP, 64);
|
|
inst.visitArg(2, func, Arg.ZDef, GP, 64);
|
|
break;
|
|
break;
|
|
case Div32:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 32);
|
|
inst.visitArg(2, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
break;
|
|
case Div64:
|
|
inst.visitArg(0, func, Arg.Use, GP, 64);
|
|
inst.visitArg(1, func, Arg.Use, GP, 64);
|
|
inst.visitArg(2, func, Arg.Def, GP, 64);
|
|
break;
|
|
break;
|
|
case MulDouble:
|
|
switch (inst.args.length) {
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, FP, 64);
|
|
inst.visitArg(1, func, Arg.Use, FP, 64);
|
|
inst.visitArg(2, func, Arg.Def, FP, 64);
|
|
break;
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, FP, 64);
|
|
inst.visitArg(1, func, Arg.UseDef, FP, 64);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case MulFloat:
|
|
switch (inst.args.length) {
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, FP, 32);
|
|
inst.visitArg(1, func, Arg.Use, FP, 32);
|
|
inst.visitArg(2, func, Arg.Def, FP, 32);
|
|
break;
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, FP, 32);
|
|
inst.visitArg(1, func, Arg.UseDef, FP, 32);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case DivDouble:
|
|
switch (inst.args.length) {
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, FP, 64);
|
|
inst.visitArg(1, func, Arg.Use, FP, 32);
|
|
inst.visitArg(2, func, Arg.Def, FP, 64);
|
|
break;
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, FP, 64);
|
|
inst.visitArg(1, func, Arg.UseDef, FP, 64);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case DivFloat:
|
|
switch (inst.args.length) {
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, FP, 32);
|
|
inst.visitArg(1, func, Arg.Use, FP, 32);
|
|
inst.visitArg(2, func, Arg.Def, FP, 32);
|
|
break;
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, FP, 32);
|
|
inst.visitArg(1, func, Arg.UseDef, FP, 32);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case X86ConvertToDoubleWord32:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
break;
|
|
case X86ConvertToQuadWord64:
|
|
inst.visitArg(0, func, Arg.Use, GP, 64);
|
|
inst.visitArg(1, func, Arg.Def, GP, 64);
|
|
break;
|
|
break;
|
|
case X86Div32:
|
|
inst.visitArg(0, func, Arg.UseZDef, GP, 32);
|
|
inst.visitArg(1, func, Arg.UseZDef, GP, 32);
|
|
inst.visitArg(2, func, Arg.Use, GP, 32);
|
|
break;
|
|
break;
|
|
case X86Div64:
|
|
inst.visitArg(0, func, Arg.UseZDef, GP, 64);
|
|
inst.visitArg(1, func, Arg.UseZDef, GP, 64);
|
|
inst.visitArg(2, func, Arg.Use, GP, 64);
|
|
break;
|
|
break;
|
|
case Lea:
|
|
inst.visitArg(0, func, Arg.UseAddr, GP, Ptr);
|
|
inst.visitArg(1, func, Arg.Def, GP, Ptr);
|
|
break;
|
|
break;
|
|
case And32:
|
|
switch (inst.args.length) {
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 32);
|
|
inst.visitArg(2, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.UseZDef, GP, 32);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case And64:
|
|
switch (inst.args.length) {
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, GP, 64);
|
|
inst.visitArg(1, func, Arg.Use, GP, 64);
|
|
inst.visitArg(2, func, Arg.Def, GP, 64);
|
|
break;
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, GP, 64);
|
|
inst.visitArg(1, func, Arg.UseDef, GP, 64);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case AndDouble:
|
|
switch (inst.args.length) {
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, FP, 64);
|
|
inst.visitArg(1, func, Arg.Use, FP, 64);
|
|
inst.visitArg(2, func, Arg.Def, FP, 64);
|
|
break;
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, FP, 64);
|
|
inst.visitArg(1, func, Arg.UseDef, FP, 64);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case AndFloat:
|
|
switch (inst.args.length) {
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, FP, 32);
|
|
inst.visitArg(1, func, Arg.Use, FP, 32);
|
|
inst.visitArg(2, func, Arg.Def, FP, 32);
|
|
break;
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, FP, 32);
|
|
inst.visitArg(1, func, Arg.UseDef, FP, 32);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case XorDouble:
|
|
switch (inst.args.length) {
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, FP, 64);
|
|
inst.visitArg(1, func, Arg.Use, FP, 64);
|
|
inst.visitArg(2, func, Arg.Def, FP, 64);
|
|
break;
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, FP, 64);
|
|
inst.visitArg(1, func, Arg.UseDef, FP, 64);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case XorFloat:
|
|
switch (inst.args.length) {
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, FP, 32);
|
|
inst.visitArg(1, func, Arg.Use, FP, 32);
|
|
inst.visitArg(2, func, Arg.Def, FP, 32);
|
|
break;
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, FP, 32);
|
|
inst.visitArg(1, func, Arg.UseDef, FP, 32);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case Lshift32:
|
|
switch (inst.args.length) {
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 32);
|
|
inst.visitArg(2, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.UseZDef, GP, 32);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case Lshift64:
|
|
switch (inst.args.length) {
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, GP, 64);
|
|
inst.visitArg(1, func, Arg.Use, GP, 64);
|
|
inst.visitArg(2, func, Arg.ZDef, GP, 64);
|
|
break;
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, GP, 64);
|
|
inst.visitArg(1, func, Arg.UseDef, GP, 64);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case Rshift32:
|
|
switch (inst.args.length) {
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 32);
|
|
inst.visitArg(2, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.UseZDef, GP, 32);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case Rshift64:
|
|
switch (inst.args.length) {
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, GP, 64);
|
|
inst.visitArg(1, func, Arg.Use, GP, 64);
|
|
inst.visitArg(2, func, Arg.ZDef, GP, 64);
|
|
break;
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, GP, 64);
|
|
inst.visitArg(1, func, Arg.UseDef, GP, 64);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case Urshift32:
|
|
switch (inst.args.length) {
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 32);
|
|
inst.visitArg(2, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.UseZDef, GP, 32);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case Urshift64:
|
|
switch (inst.args.length) {
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, GP, 64);
|
|
inst.visitArg(1, func, Arg.Use, GP, 64);
|
|
inst.visitArg(2, func, Arg.ZDef, GP, 64);
|
|
break;
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, GP, 64);
|
|
inst.visitArg(1, func, Arg.UseDef, GP, 64);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case Or32:
|
|
switch (inst.args.length) {
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 32);
|
|
inst.visitArg(2, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.UseZDef, GP, 32);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case Or64:
|
|
switch (inst.args.length) {
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, GP, 64);
|
|
inst.visitArg(1, func, Arg.Use, GP, 64);
|
|
inst.visitArg(2, func, Arg.Def, GP, 64);
|
|
break;
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, GP, 64);
|
|
inst.visitArg(1, func, Arg.UseDef, GP, 64);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case Xor32:
|
|
switch (inst.args.length) {
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 32);
|
|
inst.visitArg(2, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.UseZDef, GP, 32);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case Xor64:
|
|
switch (inst.args.length) {
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, GP, 64);
|
|
inst.visitArg(1, func, Arg.Use, GP, 64);
|
|
inst.visitArg(2, func, Arg.Def, GP, 64);
|
|
break;
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, GP, 64);
|
|
inst.visitArg(1, func, Arg.UseDef, GP, 64);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case Not32:
|
|
switch (inst.args.length) {
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
case 1:
|
|
inst.visitArg(0, func, Arg.UseZDef, GP, 32);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case Not64:
|
|
switch (inst.args.length) {
|
|
case 2:
|
|
inst.visitArg(0, func, Arg.Use, GP, 64);
|
|
inst.visitArg(1, func, Arg.Def, GP, 64);
|
|
break;
|
|
case 1:
|
|
inst.visitArg(0, func, Arg.UseDef, GP, 64);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case AbsDouble:
|
|
inst.visitArg(0, func, Arg.Use, FP, 64);
|
|
inst.visitArg(1, func, Arg.Def, FP, 64);
|
|
break;
|
|
break;
|
|
case AbsFloat:
|
|
inst.visitArg(0, func, Arg.Use, FP, 32);
|
|
inst.visitArg(1, func, Arg.Def, FP, 32);
|
|
break;
|
|
break;
|
|
case CeilDouble:
|
|
inst.visitArg(0, func, Arg.Use, FP, 64);
|
|
inst.visitArg(1, func, Arg.Def, FP, 64);
|
|
break;
|
|
break;
|
|
case CeilFloat:
|
|
inst.visitArg(0, func, Arg.Use, FP, 32);
|
|
inst.visitArg(1, func, Arg.Def, FP, 32);
|
|
break;
|
|
break;
|
|
case FloorDouble:
|
|
inst.visitArg(0, func, Arg.Use, FP, 64);
|
|
inst.visitArg(1, func, Arg.Def, FP, 64);
|
|
break;
|
|
break;
|
|
case FloorFloat:
|
|
inst.visitArg(0, func, Arg.Use, FP, 32);
|
|
inst.visitArg(1, func, Arg.Def, FP, 32);
|
|
break;
|
|
break;
|
|
case SqrtDouble:
|
|
inst.visitArg(0, func, Arg.Use, FP, 64);
|
|
inst.visitArg(1, func, Arg.Def, FP, 64);
|
|
break;
|
|
break;
|
|
case SqrtFloat:
|
|
inst.visitArg(0, func, Arg.Use, FP, 32);
|
|
inst.visitArg(1, func, Arg.Def, FP, 32);
|
|
break;
|
|
break;
|
|
case ConvertInt32ToDouble:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Def, FP, 64);
|
|
break;
|
|
break;
|
|
case ConvertInt64ToDouble:
|
|
inst.visitArg(0, func, Arg.Use, GP, 64);
|
|
inst.visitArg(1, func, Arg.Def, FP, 64);
|
|
break;
|
|
break;
|
|
case ConvertInt32ToFloat:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Def, FP, 32);
|
|
break;
|
|
break;
|
|
case ConvertInt64ToFloat:
|
|
inst.visitArg(0, func, Arg.Use, GP, 64);
|
|
inst.visitArg(1, func, Arg.Def, FP, 32);
|
|
break;
|
|
break;
|
|
case CountLeadingZeros32:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
break;
|
|
case CountLeadingZeros64:
|
|
inst.visitArg(0, func, Arg.Use, GP, 64);
|
|
inst.visitArg(1, func, Arg.Def, GP, 64);
|
|
break;
|
|
break;
|
|
case ConvertDoubleToFloat:
|
|
inst.visitArg(0, func, Arg.Use, FP, 64);
|
|
inst.visitArg(1, func, Arg.Def, FP, 32);
|
|
break;
|
|
break;
|
|
case ConvertFloatToDouble:
|
|
inst.visitArg(0, func, Arg.Use, FP, 32);
|
|
inst.visitArg(1, func, Arg.Def, FP, 64);
|
|
break;
|
|
break;
|
|
case Move:
|
|
inst.visitArg(0, func, Arg.Use, GP, Ptr);
|
|
inst.visitArg(1, func, Arg.Def, GP, Ptr);
|
|
break;
|
|
break;
|
|
case Swap32:
|
|
inst.visitArg(0, func, Arg.UseDef, GP, 32);
|
|
inst.visitArg(1, func, Arg.UseDef, GP, 32);
|
|
break;
|
|
break;
|
|
case Swap64:
|
|
inst.visitArg(0, func, Arg.UseDef, GP, 64);
|
|
inst.visitArg(1, func, Arg.UseDef, GP, 64);
|
|
break;
|
|
break;
|
|
case Move32:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
break;
|
|
case StoreZero32:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
break;
|
|
break;
|
|
case SignExtend32ToPtr:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Def, GP, Ptr);
|
|
break;
|
|
break;
|
|
case ZeroExtend8To32:
|
|
inst.visitArg(0, func, Arg.Use, GP, 8);
|
|
inst.visitArg(1, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
break;
|
|
case SignExtend8To32:
|
|
inst.visitArg(0, func, Arg.Use, GP, 8);
|
|
inst.visitArg(1, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
break;
|
|
case ZeroExtend16To32:
|
|
inst.visitArg(0, func, Arg.Use, GP, 16);
|
|
inst.visitArg(1, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
break;
|
|
case SignExtend16To32:
|
|
inst.visitArg(0, func, Arg.Use, GP, 16);
|
|
inst.visitArg(1, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
break;
|
|
case MoveFloat:
|
|
inst.visitArg(0, func, Arg.Use, FP, 32);
|
|
inst.visitArg(1, func, Arg.Def, FP, 32);
|
|
break;
|
|
break;
|
|
case MoveDouble:
|
|
inst.visitArg(0, func, Arg.Use, FP, 64);
|
|
inst.visitArg(1, func, Arg.Def, FP, 64);
|
|
break;
|
|
break;
|
|
case MoveZeroToDouble:
|
|
inst.visitArg(0, func, Arg.Def, FP, 64);
|
|
break;
|
|
break;
|
|
case Move64ToDouble:
|
|
inst.visitArg(0, func, Arg.Use, GP, 64);
|
|
inst.visitArg(1, func, Arg.Def, FP, 64);
|
|
break;
|
|
break;
|
|
case Move32ToFloat:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Def, FP, 32);
|
|
break;
|
|
break;
|
|
case MoveDoubleTo64:
|
|
inst.visitArg(0, func, Arg.Use, FP, 64);
|
|
inst.visitArg(1, func, Arg.Def, GP, 64);
|
|
break;
|
|
break;
|
|
case MoveFloatTo32:
|
|
inst.visitArg(0, func, Arg.Use, FP, 32);
|
|
inst.visitArg(1, func, Arg.Def, GP, 32);
|
|
break;
|
|
break;
|
|
case Load8:
|
|
inst.visitArg(0, func, Arg.Use, GP, 8);
|
|
inst.visitArg(1, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
break;
|
|
case Store8:
|
|
inst.visitArg(0, func, Arg.Use, GP, 8);
|
|
inst.visitArg(1, func, Arg.Def, GP, 8);
|
|
break;
|
|
break;
|
|
case Load8SignedExtendTo32:
|
|
inst.visitArg(0, func, Arg.Use, GP, 8);
|
|
inst.visitArg(1, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
break;
|
|
case Load16:
|
|
inst.visitArg(0, func, Arg.Use, GP, 16);
|
|
inst.visitArg(1, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
break;
|
|
case Load16SignedExtendTo32:
|
|
inst.visitArg(0, func, Arg.Use, GP, 16);
|
|
inst.visitArg(1, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
break;
|
|
case Store16:
|
|
inst.visitArg(0, func, Arg.Use, GP, 16);
|
|
inst.visitArg(1, func, Arg.Def, GP, 16);
|
|
break;
|
|
break;
|
|
case Compare32:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 32);
|
|
inst.visitArg(2, func, Arg.Use, GP, 32);
|
|
inst.visitArg(3, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
break;
|
|
case Compare64:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 64);
|
|
inst.visitArg(2, func, Arg.Use, GP, 64);
|
|
inst.visitArg(3, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
break;
|
|
case Test32:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 32);
|
|
inst.visitArg(2, func, Arg.Use, GP, 32);
|
|
inst.visitArg(3, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
break;
|
|
case Test64:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 64);
|
|
inst.visitArg(2, func, Arg.Use, GP, 64);
|
|
inst.visitArg(3, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
break;
|
|
case CompareDouble:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, FP, 64);
|
|
inst.visitArg(2, func, Arg.Use, FP, 64);
|
|
inst.visitArg(3, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
break;
|
|
case CompareFloat:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, FP, 32);
|
|
inst.visitArg(2, func, Arg.Use, FP, 32);
|
|
inst.visitArg(3, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
break;
|
|
case Branch8:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 8);
|
|
inst.visitArg(2, func, Arg.Use, GP, 8);
|
|
break;
|
|
break;
|
|
case Branch32:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 32);
|
|
inst.visitArg(2, func, Arg.Use, GP, 32);
|
|
break;
|
|
break;
|
|
case Branch64:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 64);
|
|
inst.visitArg(2, func, Arg.Use, GP, 64);
|
|
break;
|
|
break;
|
|
case BranchTest8:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 8);
|
|
inst.visitArg(2, func, Arg.Use, GP, 8);
|
|
break;
|
|
break;
|
|
case BranchTest32:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 32);
|
|
inst.visitArg(2, func, Arg.Use, GP, 32);
|
|
break;
|
|
break;
|
|
case BranchTest64:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 64);
|
|
inst.visitArg(2, func, Arg.Use, GP, 64);
|
|
break;
|
|
break;
|
|
case BranchDouble:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, FP, 64);
|
|
inst.visitArg(2, func, Arg.Use, FP, 64);
|
|
break;
|
|
break;
|
|
case BranchFloat:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, FP, 32);
|
|
inst.visitArg(2, func, Arg.Use, FP, 32);
|
|
break;
|
|
break;
|
|
case BranchAdd32:
|
|
switch (inst.args.length) {
|
|
case 4:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 32);
|
|
inst.visitArg(2, func, Arg.Use, GP, 32);
|
|
inst.visitArg(3, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 32);
|
|
inst.visitArg(2, func, Arg.UseZDef, GP, 32);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case BranchAdd64:
|
|
switch (inst.args.length) {
|
|
case 4:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 64);
|
|
inst.visitArg(2, func, Arg.Use, GP, 64);
|
|
inst.visitArg(3, func, Arg.ZDef, GP, 64);
|
|
break;
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 64);
|
|
inst.visitArg(2, func, Arg.UseDef, GP, 64);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case BranchMul32:
|
|
switch (inst.args.length) {
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 32);
|
|
inst.visitArg(2, func, Arg.UseZDef, GP, 32);
|
|
break;
|
|
case 4:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 32);
|
|
inst.visitArg(2, func, Arg.Use, GP, 32);
|
|
inst.visitArg(3, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
case 6:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 32);
|
|
inst.visitArg(2, func, Arg.Use, GP, 32);
|
|
inst.visitArg(3, func, Arg.Scratch, GP, 32);
|
|
inst.visitArg(4, func, Arg.Scratch, GP, 32);
|
|
inst.visitArg(5, func, Arg.ZDef, GP, 32);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case BranchMul64:
|
|
switch (inst.args.length) {
|
|
case 3:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 64);
|
|
inst.visitArg(2, func, Arg.UseZDef, GP, 64);
|
|
break;
|
|
case 6:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 64);
|
|
inst.visitArg(2, func, Arg.Use, GP, 64);
|
|
inst.visitArg(3, func, Arg.Scratch, GP, 64);
|
|
inst.visitArg(4, func, Arg.Scratch, GP, 64);
|
|
inst.visitArg(5, func, Arg.ZDef, GP, 64);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case BranchSub32:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 32);
|
|
inst.visitArg(2, func, Arg.UseZDef, GP, 32);
|
|
break;
|
|
break;
|
|
case BranchSub64:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 64);
|
|
inst.visitArg(2, func, Arg.UseDef, GP, 64);
|
|
break;
|
|
break;
|
|
case BranchNeg32:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.UseZDef, GP, 32);
|
|
break;
|
|
break;
|
|
case BranchNeg64:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.UseZDef, GP, 64);
|
|
break;
|
|
break;
|
|
case MoveConditionally32:
|
|
switch (inst.args.length) {
|
|
case 5:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 32);
|
|
inst.visitArg(2, func, Arg.Use, GP, 32);
|
|
inst.visitArg(3, func, Arg.Use, GP, Ptr);
|
|
inst.visitArg(4, func, Arg.UseDef, GP, Ptr);
|
|
break;
|
|
case 6:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 32);
|
|
inst.visitArg(2, func, Arg.Use, GP, 32);
|
|
inst.visitArg(3, func, Arg.Use, GP, Ptr);
|
|
inst.visitArg(4, func, Arg.Use, GP, Ptr);
|
|
inst.visitArg(5, func, Arg.Def, GP, Ptr);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case MoveConditionally64:
|
|
switch (inst.args.length) {
|
|
case 5:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 64);
|
|
inst.visitArg(2, func, Arg.Use, GP, 64);
|
|
inst.visitArg(3, func, Arg.Use, GP, Ptr);
|
|
inst.visitArg(4, func, Arg.UseDef, GP, Ptr);
|
|
break;
|
|
case 6:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 64);
|
|
inst.visitArg(2, func, Arg.Use, GP, 64);
|
|
inst.visitArg(3, func, Arg.Use, GP, Ptr);
|
|
inst.visitArg(4, func, Arg.Use, GP, Ptr);
|
|
inst.visitArg(5, func, Arg.Def, GP, Ptr);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case MoveConditionallyTest32:
|
|
switch (inst.args.length) {
|
|
case 5:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 32);
|
|
inst.visitArg(2, func, Arg.Use, GP, 32);
|
|
inst.visitArg(3, func, Arg.Use, GP, Ptr);
|
|
inst.visitArg(4, func, Arg.UseDef, GP, Ptr);
|
|
break;
|
|
case 6:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 32);
|
|
inst.visitArg(2, func, Arg.Use, GP, 32);
|
|
inst.visitArg(3, func, Arg.Use, GP, Ptr);
|
|
inst.visitArg(4, func, Arg.Use, GP, Ptr);
|
|
inst.visitArg(5, func, Arg.Def, GP, Ptr);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case MoveConditionallyTest64:
|
|
switch (inst.args.length) {
|
|
case 5:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 64);
|
|
inst.visitArg(2, func, Arg.Use, GP, 64);
|
|
inst.visitArg(3, func, Arg.Use, GP, Ptr);
|
|
inst.visitArg(4, func, Arg.UseDef, GP, Ptr);
|
|
break;
|
|
case 6:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 32);
|
|
inst.visitArg(2, func, Arg.Use, GP, 32);
|
|
inst.visitArg(3, func, Arg.Use, GP, Ptr);
|
|
inst.visitArg(4, func, Arg.Use, GP, Ptr);
|
|
inst.visitArg(5, func, Arg.Def, GP, Ptr);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case MoveConditionallyDouble:
|
|
switch (inst.args.length) {
|
|
case 6:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, FP, 64);
|
|
inst.visitArg(2, func, Arg.Use, FP, 64);
|
|
inst.visitArg(3, func, Arg.Use, GP, Ptr);
|
|
inst.visitArg(4, func, Arg.Use, GP, Ptr);
|
|
inst.visitArg(5, func, Arg.Def, GP, Ptr);
|
|
break;
|
|
case 5:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, FP, 64);
|
|
inst.visitArg(2, func, Arg.Use, FP, 64);
|
|
inst.visitArg(3, func, Arg.Use, GP, Ptr);
|
|
inst.visitArg(4, func, Arg.UseDef, GP, Ptr);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case MoveConditionallyFloat:
|
|
switch (inst.args.length) {
|
|
case 6:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, FP, 32);
|
|
inst.visitArg(2, func, Arg.Use, FP, 32);
|
|
inst.visitArg(3, func, Arg.Use, GP, Ptr);
|
|
inst.visitArg(4, func, Arg.Use, GP, Ptr);
|
|
inst.visitArg(5, func, Arg.Def, GP, Ptr);
|
|
break;
|
|
case 5:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, FP, 32);
|
|
inst.visitArg(2, func, Arg.Use, FP, 32);
|
|
inst.visitArg(3, func, Arg.Use, GP, Ptr);
|
|
inst.visitArg(4, func, Arg.UseDef, GP, Ptr);
|
|
break;
|
|
default:
|
|
throw new Error("Bad overload");
|
|
break;
|
|
}
|
|
break;
|
|
case MoveDoubleConditionally32:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 32);
|
|
inst.visitArg(2, func, Arg.Use, GP, 32);
|
|
inst.visitArg(3, func, Arg.Use, FP, 64);
|
|
inst.visitArg(4, func, Arg.Use, FP, 64);
|
|
inst.visitArg(5, func, Arg.Def, FP, 64);
|
|
break;
|
|
break;
|
|
case MoveDoubleConditionally64:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 64);
|
|
inst.visitArg(2, func, Arg.Use, GP, 64);
|
|
inst.visitArg(3, func, Arg.Use, FP, 64);
|
|
inst.visitArg(4, func, Arg.Use, FP, 64);
|
|
inst.visitArg(5, func, Arg.Def, FP, 64);
|
|
break;
|
|
break;
|
|
case MoveDoubleConditionallyTest32:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 32);
|
|
inst.visitArg(2, func, Arg.Use, GP, 32);
|
|
inst.visitArg(3, func, Arg.Use, FP, 64);
|
|
inst.visitArg(4, func, Arg.Use, FP, 64);
|
|
inst.visitArg(5, func, Arg.Def, FP, 64);
|
|
break;
|
|
break;
|
|
case MoveDoubleConditionallyTest64:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, GP, 64);
|
|
inst.visitArg(2, func, Arg.Use, GP, 64);
|
|
inst.visitArg(3, func, Arg.Use, FP, 64);
|
|
inst.visitArg(4, func, Arg.Use, FP, 64);
|
|
inst.visitArg(5, func, Arg.Def, FP, 64);
|
|
break;
|
|
break;
|
|
case MoveDoubleConditionallyDouble:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, FP, 64);
|
|
inst.visitArg(2, func, Arg.Use, FP, 64);
|
|
inst.visitArg(3, func, Arg.Use, FP, 64);
|
|
inst.visitArg(4, func, Arg.Use, FP, 64);
|
|
inst.visitArg(5, func, Arg.Def, FP, 64);
|
|
break;
|
|
break;
|
|
case MoveDoubleConditionallyFloat:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
inst.visitArg(1, func, Arg.Use, FP, 32);
|
|
inst.visitArg(2, func, Arg.Use, FP, 32);
|
|
inst.visitArg(3, func, Arg.Use, FP, 64);
|
|
inst.visitArg(4, func, Arg.Use, FP, 64);
|
|
inst.visitArg(5, func, Arg.Def, FP, 64);
|
|
break;
|
|
break;
|
|
case Jump:
|
|
break;
|
|
break;
|
|
case Ret32:
|
|
inst.visitArg(0, func, Arg.Use, GP, 32);
|
|
break;
|
|
break;
|
|
case Ret64:
|
|
inst.visitArg(0, func, Arg.Use, GP, 64);
|
|
break;
|
|
break;
|
|
case RetFloat:
|
|
inst.visitArg(0, func, Arg.Use, FP, 32);
|
|
break;
|
|
break;
|
|
case RetDouble:
|
|
inst.visitArg(0, func, Arg.Use, FP, 64);
|
|
break;
|
|
break;
|
|
case Oops:
|
|
break;
|
|
break;
|
|
case Shuffle:
|
|
ShuffleCustom.forEachArg(inst, func);
|
|
break;
|
|
case Patch:
|
|
PatchCustom.forEachArg(inst, func);
|
|
break;
|
|
case CCall:
|
|
CCallCustom.forEachArg(inst, func);
|
|
break;
|
|
case ColdCCall:
|
|
ColdCCallCustom.forEachArg(inst, func);
|
|
break;
|
|
default:
|
|
throw "Bad opcode";
|
|
}
|
|
}
|
|
function Inst_hasNonArgEffects(inst)
|
|
{
|
|
switch (inst.opcode) {
|
|
case Branch8:
|
|
case Branch32:
|
|
case Branch64:
|
|
case BranchTest8:
|
|
case BranchTest32:
|
|
case BranchTest64:
|
|
case BranchDouble:
|
|
case BranchFloat:
|
|
case BranchAdd32:
|
|
case BranchAdd64:
|
|
case BranchMul32:
|
|
case BranchMul64:
|
|
case BranchSub32:
|
|
case BranchSub64:
|
|
case BranchNeg32:
|
|
case BranchNeg64:
|
|
case Jump:
|
|
case Ret32:
|
|
case Ret64:
|
|
case RetFloat:
|
|
case RetDouble:
|
|
case Oops:
|
|
return true;
|
|
case Shuffle:
|
|
return ShuffleCustom.hasNonArgNonControlEffects(inst);
|
|
case Patch:
|
|
return PatchCustom.hasNonArgNonControlEffects(inst);
|
|
case CCall:
|
|
return CCallCustom.hasNonArgNonControlEffects(inst);
|
|
case ColdCCall:
|
|
return ColdCCallCustom.hasNonArgNonControlEffects(inst);
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
function opcodeCode(opcode)
|
|
{
|
|
switch (opcode) {
|
|
case AbsDouble:
|
|
return 0
|
|
case AbsFloat:
|
|
return 1
|
|
case Add16:
|
|
return 2
|
|
case Add32:
|
|
return 3
|
|
case Add64:
|
|
return 4
|
|
case Add8:
|
|
return 5
|
|
case AddDouble:
|
|
return 6
|
|
case AddFloat:
|
|
return 7
|
|
case And32:
|
|
return 8
|
|
case And64:
|
|
return 9
|
|
case AndDouble:
|
|
return 10
|
|
case AndFloat:
|
|
return 11
|
|
case Branch32:
|
|
return 12
|
|
case Branch64:
|
|
return 13
|
|
case Branch8:
|
|
return 14
|
|
case BranchAdd32:
|
|
return 15
|
|
case BranchAdd64:
|
|
return 16
|
|
case BranchDouble:
|
|
return 17
|
|
case BranchFloat:
|
|
return 18
|
|
case BranchMul32:
|
|
return 19
|
|
case BranchMul64:
|
|
return 20
|
|
case BranchNeg32:
|
|
return 21
|
|
case BranchNeg64:
|
|
return 22
|
|
case BranchSub32:
|
|
return 23
|
|
case BranchSub64:
|
|
return 24
|
|
case BranchTest32:
|
|
return 25
|
|
case BranchTest64:
|
|
return 26
|
|
case BranchTest8:
|
|
return 27
|
|
case CCall:
|
|
return 28
|
|
case CeilDouble:
|
|
return 29
|
|
case CeilFloat:
|
|
return 30
|
|
case ColdCCall:
|
|
return 31
|
|
case Compare32:
|
|
return 32
|
|
case Compare64:
|
|
return 33
|
|
case CompareDouble:
|
|
return 34
|
|
case CompareFloat:
|
|
return 35
|
|
case ConvertDoubleToFloat:
|
|
return 36
|
|
case ConvertFloatToDouble:
|
|
return 37
|
|
case ConvertInt32ToDouble:
|
|
return 38
|
|
case ConvertInt32ToFloat:
|
|
return 39
|
|
case ConvertInt64ToDouble:
|
|
return 40
|
|
case ConvertInt64ToFloat:
|
|
return 41
|
|
case CountLeadingZeros32:
|
|
return 42
|
|
case CountLeadingZeros64:
|
|
return 43
|
|
case Div32:
|
|
return 44
|
|
case Div64:
|
|
return 45
|
|
case DivDouble:
|
|
return 46
|
|
case DivFloat:
|
|
return 47
|
|
case FloorDouble:
|
|
return 48
|
|
case FloorFloat:
|
|
return 49
|
|
case Jump:
|
|
return 50
|
|
case Lea:
|
|
return 51
|
|
case Load16:
|
|
return 52
|
|
case Load16SignedExtendTo32:
|
|
return 53
|
|
case Load8:
|
|
return 54
|
|
case Load8SignedExtendTo32:
|
|
return 55
|
|
case Lshift32:
|
|
return 56
|
|
case Lshift64:
|
|
return 57
|
|
case Move:
|
|
return 58
|
|
case Move32:
|
|
return 59
|
|
case Move32ToFloat:
|
|
return 60
|
|
case Move64ToDouble:
|
|
return 61
|
|
case MoveConditionally32:
|
|
return 62
|
|
case MoveConditionally64:
|
|
return 63
|
|
case MoveConditionallyDouble:
|
|
return 64
|
|
case MoveConditionallyFloat:
|
|
return 65
|
|
case MoveConditionallyTest32:
|
|
return 66
|
|
case MoveConditionallyTest64:
|
|
return 67
|
|
case MoveDouble:
|
|
return 68
|
|
case MoveDoubleConditionally32:
|
|
return 69
|
|
case MoveDoubleConditionally64:
|
|
return 70
|
|
case MoveDoubleConditionallyDouble:
|
|
return 71
|
|
case MoveDoubleConditionallyFloat:
|
|
return 72
|
|
case MoveDoubleConditionallyTest32:
|
|
return 73
|
|
case MoveDoubleConditionallyTest64:
|
|
return 74
|
|
case MoveDoubleTo64:
|
|
return 75
|
|
case MoveFloat:
|
|
return 76
|
|
case MoveFloatTo32:
|
|
return 77
|
|
case MoveZeroToDouble:
|
|
return 78
|
|
case Mul32:
|
|
return 79
|
|
case Mul64:
|
|
return 80
|
|
case MulDouble:
|
|
return 81
|
|
case MulFloat:
|
|
return 82
|
|
case MultiplyAdd32:
|
|
return 83
|
|
case MultiplyAdd64:
|
|
return 84
|
|
case MultiplyNeg32:
|
|
return 85
|
|
case MultiplyNeg64:
|
|
return 86
|
|
case MultiplySub32:
|
|
return 87
|
|
case MultiplySub64:
|
|
return 88
|
|
case Neg32:
|
|
return 89
|
|
case Neg64:
|
|
return 90
|
|
case NegateDouble:
|
|
return 91
|
|
case Nop:
|
|
return 92
|
|
case Not32:
|
|
return 93
|
|
case Not64:
|
|
return 94
|
|
case Oops:
|
|
return 95
|
|
case Or32:
|
|
return 96
|
|
case Or64:
|
|
return 97
|
|
case Patch:
|
|
return 98
|
|
case Ret32:
|
|
return 99
|
|
case Ret64:
|
|
return 100
|
|
case RetDouble:
|
|
return 101
|
|
case RetFloat:
|
|
return 102
|
|
case Rshift32:
|
|
return 103
|
|
case Rshift64:
|
|
return 104
|
|
case Shuffle:
|
|
return 105
|
|
case SignExtend16To32:
|
|
return 106
|
|
case SignExtend32ToPtr:
|
|
return 107
|
|
case SignExtend8To32:
|
|
return 108
|
|
case SqrtDouble:
|
|
return 109
|
|
case SqrtFloat:
|
|
return 110
|
|
case Store16:
|
|
return 111
|
|
case Store8:
|
|
return 112
|
|
case StoreZero32:
|
|
return 113
|
|
case Sub32:
|
|
return 114
|
|
case Sub64:
|
|
return 115
|
|
case SubDouble:
|
|
return 116
|
|
case SubFloat:
|
|
return 117
|
|
case Swap32:
|
|
return 118
|
|
case Swap64:
|
|
return 119
|
|
case Test32:
|
|
return 120
|
|
case Test64:
|
|
return 121
|
|
case Urshift32:
|
|
return 122
|
|
case Urshift64:
|
|
return 123
|
|
case X86ConvertToDoubleWord32:
|
|
return 124
|
|
case X86ConvertToQuadWord64:
|
|
return 125
|
|
case X86Div32:
|
|
return 126
|
|
case X86Div64:
|
|
return 127
|
|
case Xor32:
|
|
return 128
|
|
case Xor64:
|
|
return 129
|
|
case XorDouble:
|
|
return 130
|
|
case XorFloat:
|
|
return 131
|
|
case ZeroExtend16To32:
|
|
return 132
|
|
case ZeroExtend8To32:
|
|
return 133
|
|
default:
|
|
throw new Error("bad opcode");
|
|
}
|
|
}
|