| "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"); |
| } |
| } |