1*9880d681SAndroid Build Coastguard Worker// WebAssemblyInstrInfo.td-Describe the WebAssembly Instructions-*- tablegen -*- 2*9880d681SAndroid Build Coastguard Worker// 3*9880d681SAndroid Build Coastguard Worker// The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker// 5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker// 8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker/// 10*9880d681SAndroid Build Coastguard Worker/// \file 11*9880d681SAndroid Build Coastguard Worker/// \brief WebAssembly Instruction definitions. 12*9880d681SAndroid Build Coastguard Worker/// 13*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 16*9880d681SAndroid Build Coastguard Worker// WebAssembly Instruction Predicate Definitions. 17*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerdef HasAddr32 : Predicate<"!Subtarget->hasAddr64()">; 20*9880d681SAndroid Build Coastguard Workerdef HasAddr64 : Predicate<"Subtarget->hasAddr64()">; 21*9880d681SAndroid Build Coastguard Workerdef HasSIMD128 : Predicate<"Subtarget->hasSIMD128()">, 22*9880d681SAndroid Build Coastguard Worker AssemblerPredicate<"FeatureSIMD128", "simd128">; 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 25*9880d681SAndroid Build Coastguard Worker// WebAssembly-specific DAG Node Types. 26*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Workerdef SDT_WebAssemblyCallSeqStart : SDCallSeqStart<[SDTCisVT<0, iPTR>]>; 29*9880d681SAndroid Build Coastguard Workerdef SDT_WebAssemblyCallSeqEnd : 30*9880d681SAndroid Build Coastguard Worker SDCallSeqEnd<[SDTCisVT<0, iPTR>, SDTCisVT<1, iPTR>]>; 31*9880d681SAndroid Build Coastguard Workerdef SDT_WebAssemblyCall0 : SDTypeProfile<0, -1, [SDTCisPtrTy<0>]>; 32*9880d681SAndroid Build Coastguard Workerdef SDT_WebAssemblyCall1 : SDTypeProfile<1, -1, [SDTCisPtrTy<1>]>; 33*9880d681SAndroid Build Coastguard Workerdef SDT_WebAssemblyBrTable : SDTypeProfile<0, -1, [SDTCisPtrTy<0>]>; 34*9880d681SAndroid Build Coastguard Workerdef SDT_WebAssemblyArgument : SDTypeProfile<1, 1, [SDTCisVT<1, i32>]>; 35*9880d681SAndroid Build Coastguard Workerdef SDT_WebAssemblyReturn : SDTypeProfile<0, -1, []>; 36*9880d681SAndroid Build Coastguard Workerdef SDT_WebAssemblyWrapper : SDTypeProfile<1, 1, [SDTCisSameAs<0, 1>, 37*9880d681SAndroid Build Coastguard Worker SDTCisPtrTy<0>]>; 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 40*9880d681SAndroid Build Coastguard Worker// WebAssembly-specific DAG Nodes. 41*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Workerdef WebAssemblycallseq_start : 44*9880d681SAndroid Build Coastguard Worker SDNode<"ISD::CALLSEQ_START", SDT_WebAssemblyCallSeqStart, 45*9880d681SAndroid Build Coastguard Worker [SDNPHasChain, SDNPOutGlue]>; 46*9880d681SAndroid Build Coastguard Workerdef WebAssemblycallseq_end : 47*9880d681SAndroid Build Coastguard Worker SDNode<"ISD::CALLSEQ_END", SDT_WebAssemblyCallSeqEnd, 48*9880d681SAndroid Build Coastguard Worker [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>; 49*9880d681SAndroid Build Coastguard Workerdef WebAssemblycall0 : SDNode<"WebAssemblyISD::CALL0", 50*9880d681SAndroid Build Coastguard Worker SDT_WebAssemblyCall0, 51*9880d681SAndroid Build Coastguard Worker [SDNPHasChain, SDNPVariadic]>; 52*9880d681SAndroid Build Coastguard Workerdef WebAssemblycall1 : SDNode<"WebAssemblyISD::CALL1", 53*9880d681SAndroid Build Coastguard Worker SDT_WebAssemblyCall1, 54*9880d681SAndroid Build Coastguard Worker [SDNPHasChain, SDNPVariadic]>; 55*9880d681SAndroid Build Coastguard Workerdef WebAssemblybr_table : SDNode<"WebAssemblyISD::BR_TABLE", 56*9880d681SAndroid Build Coastguard Worker SDT_WebAssemblyBrTable, 57*9880d681SAndroid Build Coastguard Worker [SDNPHasChain, SDNPVariadic]>; 58*9880d681SAndroid Build Coastguard Workerdef WebAssemblyargument : SDNode<"WebAssemblyISD::ARGUMENT", 59*9880d681SAndroid Build Coastguard Worker SDT_WebAssemblyArgument>; 60*9880d681SAndroid Build Coastguard Workerdef WebAssemblyreturn : SDNode<"WebAssemblyISD::RETURN", 61*9880d681SAndroid Build Coastguard Worker SDT_WebAssemblyReturn, [SDNPHasChain]>; 62*9880d681SAndroid Build Coastguard Workerdef WebAssemblywrapper : SDNode<"WebAssemblyISD::Wrapper", 63*9880d681SAndroid Build Coastguard Worker SDT_WebAssemblyWrapper>; 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 66*9880d681SAndroid Build Coastguard Worker// WebAssembly-specific Operands. 67*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Workerlet OperandNamespace = "WebAssembly" in { 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workerlet OperandType = "OPERAND_BASIC_BLOCK" in 72*9880d681SAndroid Build Coastguard Workerdef bb_op : Operand<OtherVT>; 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Workerlet OperandType = "OPERAND_FP32IMM" in 75*9880d681SAndroid Build Coastguard Workerdef f32imm_op : Operand<f32>; 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Workerlet OperandType = "OPERAND_FP64IMM" in 78*9880d681SAndroid Build Coastguard Workerdef f64imm_op : Operand<f64>; 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerlet OperandType = "OPERAND_P2ALIGN" in { 81*9880d681SAndroid Build Coastguard Workerdef P2Align : Operand<i32> { 82*9880d681SAndroid Build Coastguard Worker let PrintMethod = "printWebAssemblyP2AlignOperand"; 83*9880d681SAndroid Build Coastguard Worker} 84*9880d681SAndroid Build Coastguard Worker} // OperandType = "OPERAND_P2ALIGN" 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker} // OperandNamespace = "WebAssembly" 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 89*9880d681SAndroid Build Coastguard Worker// WebAssembly Instruction Format Definitions. 90*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Workerinclude "WebAssemblyInstrFormats.td" 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 95*9880d681SAndroid Build Coastguard Worker// Additional instructions. 96*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Workermulticlass ARGUMENT<WebAssemblyRegClass vt> { 99*9880d681SAndroid Build Coastguard Worker let hasSideEffects = 1, Uses = [ARGUMENTS], isCodeGenOnly = 1 in 100*9880d681SAndroid Build Coastguard Worker def ARGUMENT_#vt : I<(outs vt:$res), (ins i32imm:$argno), 101*9880d681SAndroid Build Coastguard Worker [(set vt:$res, (WebAssemblyargument timm:$argno))]>; 102*9880d681SAndroid Build Coastguard Worker} 103*9880d681SAndroid Build Coastguard Workerdefm : ARGUMENT<I32>; 104*9880d681SAndroid Build Coastguard Workerdefm : ARGUMENT<I64>; 105*9880d681SAndroid Build Coastguard Workerdefm : ARGUMENT<F32>; 106*9880d681SAndroid Build Coastguard Workerdefm : ARGUMENT<F64>; 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Workerlet Defs = [ARGUMENTS] in { 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker// get_local and set_local are not generated by instruction selection; they 111*9880d681SAndroid Build Coastguard Worker// are implied by virtual register uses and defs. 112*9880d681SAndroid Build Coastguard Workermulticlass LOCAL<WebAssemblyRegClass vt> { 113*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in { 114*9880d681SAndroid Build Coastguard Worker // COPY_LOCAL is not an actual instruction in wasm, but since we allow 115*9880d681SAndroid Build Coastguard Worker // get_local and set_local to be implicit, we can have a COPY_LOCAL which 116*9880d681SAndroid Build Coastguard Worker // is actually a no-op because all the work is done in the implied 117*9880d681SAndroid Build Coastguard Worker // get_local and set_local. 118*9880d681SAndroid Build Coastguard Worker let isAsCheapAsAMove = 1 in 119*9880d681SAndroid Build Coastguard Worker def COPY_LOCAL_#vt : I<(outs vt:$res), (ins vt:$src), [], 120*9880d681SAndroid Build Coastguard Worker "copy_local\t$res, $src">; 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker // TEE_LOCAL is similar to COPY_LOCAL, but writes two copies of its result. 123*9880d681SAndroid Build Coastguard Worker // Typically this would be used to stackify one result and write the other 124*9880d681SAndroid Build Coastguard Worker // result to a local. 125*9880d681SAndroid Build Coastguard Worker let isAsCheapAsAMove = 1 in 126*9880d681SAndroid Build Coastguard Worker def TEE_LOCAL_#vt : I<(outs vt:$res, vt:$also), (ins vt:$src), [], 127*9880d681SAndroid Build Coastguard Worker "tee_local\t$res, $also, $src">; 128*9880d681SAndroid Build Coastguard Worker} // hasSideEffects = 0 129*9880d681SAndroid Build Coastguard Worker} 130*9880d681SAndroid Build Coastguard Workerdefm : LOCAL<I32>; 131*9880d681SAndroid Build Coastguard Workerdefm : LOCAL<I64>; 132*9880d681SAndroid Build Coastguard Workerdefm : LOCAL<F32>; 133*9880d681SAndroid Build Coastguard Workerdefm : LOCAL<F64>; 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Workerlet isMoveImm = 1, isAsCheapAsAMove = 1, isReMaterializable = 1 in { 136*9880d681SAndroid Build Coastguard Workerdef CONST_I32 : I<(outs I32:$res), (ins i32imm:$imm), 137*9880d681SAndroid Build Coastguard Worker [(set I32:$res, imm:$imm)], 138*9880d681SAndroid Build Coastguard Worker "i32.const\t$res, $imm">; 139*9880d681SAndroid Build Coastguard Workerdef CONST_I64 : I<(outs I64:$res), (ins i64imm:$imm), 140*9880d681SAndroid Build Coastguard Worker [(set I64:$res, imm:$imm)], 141*9880d681SAndroid Build Coastguard Worker "i64.const\t$res, $imm">; 142*9880d681SAndroid Build Coastguard Workerdef CONST_F32 : I<(outs F32:$res), (ins f32imm_op:$imm), 143*9880d681SAndroid Build Coastguard Worker [(set F32:$res, fpimm:$imm)], 144*9880d681SAndroid Build Coastguard Worker "f32.const\t$res, $imm">; 145*9880d681SAndroid Build Coastguard Workerdef CONST_F64 : I<(outs F64:$res), (ins f64imm_op:$imm), 146*9880d681SAndroid Build Coastguard Worker [(set F64:$res, fpimm:$imm)], 147*9880d681SAndroid Build Coastguard Worker "f64.const\t$res, $imm">; 148*9880d681SAndroid Build Coastguard Worker} // isMoveImm = 1, isAsCheapAsAMove = 1, isReMaterializable = 1 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Worker} // Defs = [ARGUMENTS] 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (WebAssemblywrapper tglobaladdr:$addr)), 153*9880d681SAndroid Build Coastguard Worker (CONST_I32 tglobaladdr:$addr)>; 154*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (WebAssemblywrapper texternalsym:$addr)), 155*9880d681SAndroid Build Coastguard Worker (CONST_I32 texternalsym:$addr)>; 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 158*9880d681SAndroid Build Coastguard Worker// Additional sets of instructions. 159*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 160*9880d681SAndroid Build Coastguard Worker 161*9880d681SAndroid Build Coastguard Workerinclude "WebAssemblyInstrMemory.td" 162*9880d681SAndroid Build Coastguard Workerinclude "WebAssemblyInstrCall.td" 163*9880d681SAndroid Build Coastguard Workerinclude "WebAssemblyInstrControl.td" 164*9880d681SAndroid Build Coastguard Workerinclude "WebAssemblyInstrInteger.td" 165*9880d681SAndroid Build Coastguard Workerinclude "WebAssemblyInstrConv.td" 166*9880d681SAndroid Build Coastguard Workerinclude "WebAssemblyInstrFloat.td" 167*9880d681SAndroid Build Coastguard Workerinclude "WebAssemblyInstrAtomics.td" 168*9880d681SAndroid Build Coastguard Workerinclude "WebAssemblyInstrSIMD.td" 169