Finish ir.specification entries for remaining instructions
I was looking over the instruction table to try to understand what may need to happen to make it easier for a memelim mark 2 to track memory effects (on object properties and other memory locations), and I made the mistake of documenting StProp and StPropNT (currently unused). This led to finishing the remaining missing entries...
Esse commit está contido em:
+209
-62
@@ -324,9 +324,9 @@ VectorElem
|
||||
Instruction set
|
||||
---------------
|
||||
|
||||
|
||||
1. Checks and Asserts
|
||||
|
||||
|
||||
D:T = CheckType<T> S0:Gen -> L
|
||||
|
||||
Check that the type of the src S0 is T, and if so copy it to D. If
|
||||
@@ -394,16 +394,26 @@ CheckInit S0:Gen -> L
|
||||
|
||||
CheckInitMem S0:PtrToGen S1:ConstInt -> L
|
||||
|
||||
If the value at S0 + S1 has type Uninit, branch to L.
|
||||
If the value at S0 + S1 (in bytes) has type Uninit, branch to L.
|
||||
|
||||
GuardRefs
|
||||
GuardRefs S0:FuncPtr S1:Int S2:Int S3:Int S4:Int S5:Int S6:Int
|
||||
|
||||
Perform reffiness guard checks. Operands:
|
||||
|
||||
S0 - function pointer for the frame
|
||||
S1 - num params expected in the func
|
||||
S2 - type Int, but actually a pointer to the func bitvector
|
||||
S3 - first bit to check, must be a multiple of 64
|
||||
S4 - mask to check (RefDeps::Record::m_mask entires)
|
||||
S5 - values to check (RefDeps::Record::m_vals entires)
|
||||
|
||||
If any of the checks fail, make a fallback jump. (Jump to a service
|
||||
request that will chain to a retranslation of this tracelet.)
|
||||
|
||||
Perform reffiness guard checks. If any fail, make a fallback jump.
|
||||
(Jump to a service request that will chain to a retranslation of
|
||||
this tracelet.)
|
||||
|
||||
2. Arithmetic
|
||||
|
||||
|
||||
D:{Int|Dbl} = OpAdd S0:{Int|Dbl} S1:{Int|Dbl}
|
||||
D:{Int|Dbl} = OpSub S0:{Int|Dbl} S1:{Int|Dbl}
|
||||
D:{Int|Dbl} = OpMul S0:{Int|Dbl} S1:{Int|Dbl}
|
||||
@@ -433,6 +443,7 @@ D:Bool = OpNot S0:Bool
|
||||
|
||||
3. Type conversions
|
||||
|
||||
|
||||
D:Arr = ConvBoolToArr S0:Bool
|
||||
D:Arr = ConvDblToArr S0:Dbl
|
||||
D:Arr = ConvIntToArr S0:Int
|
||||
@@ -473,6 +484,7 @@ D:Str = ConvCellToStr S0:Cell
|
||||
|
||||
4. Boolean predicates
|
||||
|
||||
|
||||
D:Bool = OpGt S0:Gen S1:Gen
|
||||
D:Bool = OpGte S0:Gen S1:Gen
|
||||
D:Bool = OpLt S0:Gen S1:Gen
|
||||
@@ -485,7 +497,7 @@ D:Bool = OpNSame S0:Gen S1:Gen
|
||||
Perform comparisons with PHP semantics on S0 and S1, and put the
|
||||
result in D.
|
||||
|
||||
D:Bool = InstanceOf S0:Cls S1:Cls S2:ConstBool
|
||||
D:Bool = InstanceOf S0:Cls S1:Cls S2:ConstBool
|
||||
|
||||
Sets D based on whether S0 is a descendant of the class, interface,
|
||||
or trait in S1. (Note that this is always false for a trait). S1
|
||||
@@ -519,8 +531,10 @@ D:Bool = IsNTypeMem<T> S0:PtrToGen
|
||||
IsTypeMem (IsNTypeMem) sets D to true iff the value referenced by S0
|
||||
is (not) of type T.
|
||||
|
||||
|
||||
5. Branches
|
||||
|
||||
|
||||
There is a conditional branch instruction for each predicate above,
|
||||
to enable generating efficient compare-and-branch instruction sequences.
|
||||
|
||||
@@ -562,12 +576,6 @@ ExitOnVarEnv S0:FramePtr -> L
|
||||
Loads the VarEnv slot off the ActRec pointed to by S0. If it is
|
||||
non-zero, jumps to the exit-trace label L.
|
||||
|
||||
Marker<bcOff,stackOff,func>
|
||||
|
||||
Record HHBC virtual position information at the position of this
|
||||
instruction. Marker has no executable semantics. The JIT compiler
|
||||
uses this to generate bytecode<->machine code maps.
|
||||
|
||||
Jmp_ [S:T ...] -> L
|
||||
|
||||
Unconditional jump to L. L is the name of a DefLabel instruction.
|
||||
@@ -594,6 +602,7 @@ D:T ... = DefLabel
|
||||
|
||||
6. Reference manipulation
|
||||
|
||||
|
||||
D:Cell = Unbox S0:Gen
|
||||
|
||||
Unbox S0 if it is boxed, and put the resulting Cell in D.
|
||||
@@ -612,8 +621,10 @@ D:PtrToBoxedCell = BoxPtr S0:PtrToGen
|
||||
Boxes the TypeValue that S0 points to if it is not boxed. The result
|
||||
D points to the same TypedValue as S0 but has a more refined type.
|
||||
|
||||
|
||||
7. Loads
|
||||
|
||||
|
||||
Some of the load instructions have an optional label parameter that
|
||||
make the load also perform a runtime type check. A load that has a
|
||||
label parameter present checks that the value it loads has the type T,
|
||||
@@ -710,9 +721,17 @@ D:Home = LdHome S0:StkPtr S1:ConstInt
|
||||
Logically packages the location of a pointer into the VM stack and
|
||||
an offset. S0 will usually be the output of a DefFP.
|
||||
|
||||
D:T = LdConst<T>
|
||||
D:T = LdConst<T,value>
|
||||
|
||||
D:ConstT = DefConst<T>
|
||||
Load a constant value into D. This differs from DefConst in that D
|
||||
will be allocated a register. It is currently used only for the
|
||||
GuardRefs instruction.
|
||||
|
||||
D:ConstT = DefConst<T,value>
|
||||
|
||||
Define a constant value of type T. D is presumed to be globally
|
||||
available and the DefConst instruction will not actually appear in
|
||||
the IR instruction stream.
|
||||
|
||||
D:Cls = LdCls S0:Str S1:ConstCls
|
||||
|
||||
@@ -759,9 +778,24 @@ D:Ctx = GetCtxFwdCall S0:Ctx S1:Func
|
||||
class. If S0 is an object and S1 is not static, this opcode increfs
|
||||
S0 and returns it. If S0 is a Cctx, this opcode returns S0.
|
||||
|
||||
LdClsMethodCache
|
||||
LdClsMethod
|
||||
LdPropAddr
|
||||
D:FuncCls = LdClsMethodCache S0:ConstStr S1:ConstStr S2:ConstNamedEntity*
|
||||
|
||||
Lookup a function and class in the class method targetcache. The
|
||||
sources to this instruction are:
|
||||
|
||||
S0 - class name
|
||||
S1 - method name
|
||||
S2 - the NamedEntity* for the class
|
||||
|
||||
D:Func = LdClsMethod S0:Cls S1:ConstInt
|
||||
|
||||
Load a Func* off of the class method table for S0, at offset S1 (in
|
||||
method slots).
|
||||
|
||||
D:PtrToGen = LdPropAddr S0:Obj S1:ConstInt
|
||||
|
||||
Load the address of the object property for S0 at offset S1 (in
|
||||
bytes) into D.
|
||||
|
||||
D:PtrToGen = LdGblAddr S0:Str -> L
|
||||
|
||||
@@ -822,36 +856,28 @@ D:Func = LdFuncCachedSafe S0:ConstStr [ -> L ]
|
||||
Loads the Func named S0 from the target cache. If the function is not
|
||||
defined, returns null and optionally branches to L.
|
||||
|
||||
D:Func = LdCurFuncPtr
|
||||
|
||||
...
|
||||
|
||||
D:Func& = LdARFuncPtr S0:{StkPtr|FramePtr} S1:ConstInt
|
||||
|
||||
Loads the m_func member of an ActRec. S0 is the base address, and
|
||||
S1 is an offset, such that S0 + S1 points to the base of the ActRec.
|
||||
|
||||
LdFuncCls
|
||||
D:T = LdRaw<T> S0:?? S1:ConstInt
|
||||
|
||||
D:PtrToCell = LdContLocalsPtr S0:Obj
|
||||
"Raw" load from memory---i.e. outside of our type-system.
|
||||
|
||||
Loads a pointer to the embedded local variables of S0 (a Continuation
|
||||
object) into D.
|
||||
|
||||
D:T = LdRaw<T> S0:Ptr S1:ConstInt
|
||||
|
||||
"Raw" load from memory. S0 is the base address, and is an untyped
|
||||
pointer. S1 is a constant from the RawMemSlot::Kind enum, which
|
||||
describes the offset from the base, and the size. The value in D is
|
||||
assumed to be of type T.
|
||||
S0 is the base address, and is an untyped pointer. S1 is a constant
|
||||
from the RawMemSlot::Kind enum, which describes the offset from the
|
||||
base, and the size. The value in D is assumed to be of type T.
|
||||
|
||||
D:BoxedCell = LdStaticLocCached S0:ConstCacheHandle -> L
|
||||
|
||||
Load static local value from the targetcache from handle S0. If the
|
||||
slot is uninitialized, branch to L.
|
||||
|
||||
|
||||
8. Allocation
|
||||
|
||||
|
||||
D:Obj = AllocObj S1:Cls
|
||||
|
||||
Allocates a new object of class S1.
|
||||
@@ -862,12 +888,20 @@ D:Obj = AllocObjFast S1:ConstCls
|
||||
be instantiated (i.e., S1 is not an abstract class, interface, or
|
||||
trait).
|
||||
|
||||
NewArray
|
||||
NewTuple
|
||||
D:Arr = NewArray S0:ConstInt
|
||||
|
||||
Allocate a new array with the expected capacity S0.
|
||||
|
||||
D:Arr = NewTuple S0:ConstInt S1:StkPtr
|
||||
|
||||
Allocate a new array by taking the top S0 elements off the stack
|
||||
given by S1. Note that this instruction assumes it can take the
|
||||
values from the stack without increfing them.
|
||||
|
||||
|
||||
9. Call & Return
|
||||
|
||||
|
||||
D:StkPtr = SpillFrame<numArgs,invName> S0:StkPtr
|
||||
S1:FramePtr
|
||||
S2:Func
|
||||
@@ -987,14 +1021,6 @@ ReleaseVVOrExit S0:FramePtr -> L
|
||||
null, does nothing. If it is an ExtraArgs, deallocates the
|
||||
ExtraArgs structure. Otherwise jumps to the exit-trace label L.
|
||||
|
||||
RaiseError S0:Str
|
||||
|
||||
Raises a fatal error with the text in S0 as its message.
|
||||
|
||||
RaiseWarning S0:Str
|
||||
|
||||
Raises a warning with the text in S0 as its message.
|
||||
|
||||
D:StkPtr = GenericRetDecRefs S0:FramePtr S1:ConstInt
|
||||
|
||||
Does decrefs of all the current function's locals, where S0 is a
|
||||
@@ -1010,11 +1036,25 @@ D:StkPtr = GenericRetDecRefs S0:FramePtr S1:ConstInt
|
||||
|
||||
10. Stores
|
||||
|
||||
|
||||
StMem S0:PtrToGen S1:ConstInt S2:Gen
|
||||
|
||||
Store S2 into the location S0 + S1 (in bytes).
|
||||
|
||||
StMemNT S0:PtrToGen S1:ConstInt S2:Gen
|
||||
|
||||
Store S2 into the location S0 + S1 (in bytes), without storing the
|
||||
type tag.
|
||||
|
||||
StProp S0:Obj S1:Int S2:Gen
|
||||
|
||||
Store S2 into the location S0 + S1 (in bytes).
|
||||
|
||||
StPropNT S0:Obj S1:Int S2:Gen
|
||||
|
||||
Store S2 into the location S0 + S1 (in bytes), without storing the
|
||||
type tag.
|
||||
|
||||
StLoc<localId> S0:FramePtr S1:Gen
|
||||
|
||||
Store S1 to local number localId on the frame pointed to by S0.
|
||||
@@ -1036,7 +1076,13 @@ D:BoxedCell = StRefNT S0:BoxedCell S1:Cell
|
||||
change RefData::m_type. Returns a new value for S0, which will now
|
||||
have the type of S1 after boxing.
|
||||
|
||||
StRaw
|
||||
StRaw S0:?? S1:ConstInt S2:??
|
||||
|
||||
"Raw" store to memory---i.e. outside of our type-system.
|
||||
|
||||
S0 is the base address, and is an untyped pointer. S1 is a constant
|
||||
from the RawMemSlow::Kind enum, which describes the offset from the
|
||||
base, and the size. The value in S2 depends on the value of S1.
|
||||
|
||||
D:StkPtr = SpillStack S0:StkP S1:ConstInt, S2...
|
||||
|
||||
@@ -1059,6 +1105,7 @@ D:StkPtr = SpillStack S0:StkP S1:ConstInt, S2...
|
||||
|
||||
11. Trace exits
|
||||
|
||||
|
||||
SyncABIRegs S0:FramePtr S1:StkPtr
|
||||
|
||||
Ensures the cross-tracelet ABI registers are in a consistent state
|
||||
@@ -1118,13 +1165,22 @@ D:StkPtr = SideExitGuardStk<T,stackOff,takenOff> S0:StkPtr
|
||||
|
||||
12. Refcounting and copies
|
||||
|
||||
Mov
|
||||
|
||||
D:T = Mov S0:T
|
||||
|
||||
Defines D as S0. May imply register-to-register moves at code
|
||||
generation time. Does not imply an incref or any other manipulation
|
||||
of S0.
|
||||
|
||||
D:T* = LdAddr S0:T* S1:ConstInt
|
||||
|
||||
Load address. Returns a pointer to (S0 + S1) with the same type as S0.
|
||||
|
||||
IncRef
|
||||
D:Gen = IncRef S0:Gen
|
||||
|
||||
Increment the reference count of S0, defining D to be S0 to allow
|
||||
the ud-chain to be used to track whether the reference count is
|
||||
consumed or elidable.
|
||||
|
||||
DecRefLoc<localId> S0:FramePtr
|
||||
|
||||
@@ -1164,6 +1220,13 @@ DecRefNZ S0:Gen
|
||||
|
||||
13. Misc
|
||||
|
||||
|
||||
Marker<bcOff,stackOff,func>
|
||||
|
||||
Record HHBC virtual position information at the position of this
|
||||
instruction. Marker has no executable semantics. The JIT compiler
|
||||
uses this to generate bytecode<->machine code maps.
|
||||
|
||||
D:FramePtr = DefFP
|
||||
|
||||
Creates a temporary D representing the current vm frame pointer.
|
||||
@@ -1222,6 +1285,7 @@ Nop
|
||||
|
||||
14. Runtime helpers
|
||||
|
||||
|
||||
VerifyParamCls S0:Cls S1:Cls S2:ConstInt
|
||||
|
||||
Verify parameter type for classes or traits. If S0 does not extend
|
||||
@@ -1262,6 +1326,14 @@ RaiseUndefProp S0:Obj S1:ConstStr
|
||||
|
||||
Raise a notice for an undefined property named S1 on the class of S0.
|
||||
|
||||
RaiseError S0:Str
|
||||
|
||||
Raises a fatal error with the text in S0 as its message.
|
||||
|
||||
RaiseWarning S0:Str
|
||||
|
||||
Raises a warning with the text in S0 as its message.
|
||||
|
||||
D:BoxedCell = StaticLocInit S0:ConstStr S1:FramePtr S2:Cell
|
||||
|
||||
Get boxed value to initialize static local named S0 in frame S1. If
|
||||
@@ -1278,15 +1350,47 @@ D:BoxedCell = StaticLocInitCached S0:ConstStr S1:FramePtr S2:Cell
|
||||
current function is not a closure body or a generator from a
|
||||
closure.
|
||||
|
||||
Print
|
||||
AddElem
|
||||
AddNewElem
|
||||
Concat
|
||||
ArrayAdd
|
||||
DefCls
|
||||
DefFunc
|
||||
AKExists
|
||||
ArrayIdx
|
||||
PrintStr S0:Str
|
||||
PrintInt S1:Int
|
||||
PrintBool S1:Bool
|
||||
|
||||
Print for various types.
|
||||
|
||||
D:Str = Concat S0:Gen S1:Gen
|
||||
|
||||
Concatenate S0 and S1 after converting them to strings in a way that
|
||||
obeys php semantics. (Calling object __toString methods, etc.)
|
||||
TODO(#2438120): split this opcode up.
|
||||
|
||||
D:Arr = AddElemStrKey S0:Arr S1:Str S2:Cell
|
||||
|
||||
Add S2 to the array S0 for the key S1, and return the resulting
|
||||
array.
|
||||
|
||||
D:Arr = AddElemIntKey S0:Arr S1:Int S2:Cell
|
||||
|
||||
Add S2 to the array S0 for the key S1, and return the resulting
|
||||
array.
|
||||
|
||||
D:Arr = AddNewElem S0:Arr S1:Gen
|
||||
|
||||
Add S1 as a new element to the array S0. TODO(#2437059): this is
|
||||
broken.
|
||||
|
||||
D:Arr = ArrayAdd S0:Arr S1:Arr
|
||||
|
||||
Has the effects of the php + operator on the two source arrays.
|
||||
|
||||
D:Bool = AKExists S0:Cell S1:Cell
|
||||
|
||||
Has the effects of array_key_exists(S0, S1). Note that S0 does not
|
||||
need to be an array---if it is an Obj the ArrayAccess API will be
|
||||
used, etc.
|
||||
|
||||
D:Cell = ArrayIdx S0:ConstTCA S1:Arr S2:{Int,Str} S3:Cell
|
||||
|
||||
Checks if the array S1 contains the key S2, and returns the result
|
||||
if found. Otherwise S3 is returned.
|
||||
|
||||
D:Int LdSwitchDblIndex S0:Dbl S1:Int S2:Int
|
||||
D:Int LdSwitchStrIndex S0:Str S1:Int S2:Int
|
||||
@@ -1316,6 +1420,7 @@ InterpOneCF S0:FramePtr S1:StkPtr S2:ConstInt S3:ConstInt
|
||||
|
||||
15. Register allocation
|
||||
|
||||
|
||||
D:T = Spill S0:T
|
||||
|
||||
Stores S0 to a spill location specified by the destination. The
|
||||
@@ -1328,6 +1433,7 @@ D:T = Reload S0:T
|
||||
|
||||
16. Continuations & Closures
|
||||
|
||||
|
||||
D:Obj = CreateCl S0:ConstCls S1:ConstInt S2:FramePtr S3:StkPtr
|
||||
|
||||
Creates an object of class S0 (which must be a subclass of Closure),
|
||||
@@ -1353,8 +1459,24 @@ D:Obj = InlineCreateCont<origFunc,genFunc> S0:{Obj,Null}
|
||||
weaken the use of the frame in CreateCont when inlining an 'outer'
|
||||
generator function.
|
||||
|
||||
FillContLocals
|
||||
FillContThis
|
||||
D:PtrToGen = LdContLocalsPtr S0:Obj
|
||||
|
||||
Loads a pointer to the embedded local variables of S0 (a Continuation
|
||||
object) into D.
|
||||
|
||||
FillContLocals S0:FramePtr S1:ConstFunc S2:ConstFunc S3:Obj
|
||||
|
||||
Fill the locals for the continuation object S3. Copies the values
|
||||
for the locals from the frame S0 to their heap location in the
|
||||
continuation object. S1 is the "original" func, and S2 is the
|
||||
generator function.
|
||||
|
||||
FillContThis S0:Obj S1:PtrToGen S2:ConstInt
|
||||
|
||||
Store the continuation object S0 to the special continuation local
|
||||
used as its $this pointer. S1 should be the result of
|
||||
LdContLocalsPtr, and S2 is the offset to this pointer (in bytes) to
|
||||
the address for $this.
|
||||
|
||||
ContEnter S0:FramePtr S1:TCA S2:ConstInt S3:FramePtr
|
||||
|
||||
@@ -1362,15 +1484,36 @@ ContEnter S0:FramePtr S1:TCA S2:ConstInt S3:FramePtr
|
||||
object. S1 is the address to jump to. S2 is the bytecode offset in the
|
||||
caller to return to when the generator body yields. S3 is the current frame.
|
||||
|
||||
UnlinkContVarEnv
|
||||
LinkContVarEnv
|
||||
ContRaiseCheck
|
||||
ContPreNext
|
||||
ContStartedCheck
|
||||
UnlinkContVarEnv S0:FramePtr
|
||||
|
||||
Part of PackCont. Unlinks the VarEnv associated with the
|
||||
continuation frame S0 from the execution context, if it has one.
|
||||
|
||||
LinkContVarEnv S0:FramePtr
|
||||
|
||||
Part of UnpackCont. Links the VarEnv associated with the
|
||||
continuation into the execution context, if it has one.
|
||||
|
||||
ContRaiseCheck S0:Obj -> L
|
||||
|
||||
Checks whethre the continuation object S0 has raised an exception,
|
||||
and if so branches to the label L.
|
||||
|
||||
ContPreNext S0:Obj -> L
|
||||
|
||||
Performs operations needed for the ContNext hhbc opcode. This
|
||||
includes checking m_done and m_running---if either is not the case
|
||||
branches to the label L.
|
||||
|
||||
ContStartedCheck S0:Obj -> L
|
||||
|
||||
Checks if the continuation object S0 has started, and if not
|
||||
branches to the label L.
|
||||
|
||||
|
||||
17. Debugging and instrumentation
|
||||
|
||||
|
||||
IncStat S0:ConstInt S1:ConstInt S2:ConstBool
|
||||
|
||||
Increment stat counter. S0 is the implementation defined stat counter index,
|
||||
@@ -1400,8 +1543,10 @@ DbgAssertType<T> S0:Cell
|
||||
Assert that S0 is of type T at runtime. If the assertion fails,
|
||||
execution is aborted via a hardware exception.
|
||||
|
||||
|
||||
18. Iterators
|
||||
|
||||
|
||||
D:Bool = IterInit S0:{Arr|Obj} S1:FramePtr S2:ConstInt S3:ConstInt
|
||||
D:Bool = IterInitK S0:{Arr|Obj} S1:FramePtr S2:ConstInt S3:ConstInt S4:ConstInt
|
||||
|
||||
@@ -1440,8 +1585,10 @@ IterFree S0:FramePtr S1:ConstInt
|
||||
Free the iterator variable whose index is given by S1 in the stack
|
||||
frame pointed to by S0.
|
||||
|
||||
|
||||
19. Vector instruction support
|
||||
|
||||
|
||||
D:PtrToCell = DefMIStateBase
|
||||
|
||||
Declares a base register for MInstrState. Currently this is always %rsp.
|
||||
|
||||
@@ -335,9 +335,6 @@ Address CodeGenerator::cgInst(IRInstruction* inst) {
|
||||
#define NOOP_OPCODE(opcode) \
|
||||
void CodeGenerator::cg##opcode(IRInstruction*) {}
|
||||
|
||||
#define PUNT_OPCODE(opcode) \
|
||||
void CodeGenerator::cg##opcode(IRInstruction*) { CG_PUNT(opcode); }
|
||||
|
||||
#define CALL_OPCODE(opcode) \
|
||||
void CodeGenerator::cg##opcode(IRInstruction* i) { cgCallNative(i); }
|
||||
|
||||
@@ -345,8 +342,6 @@ Address CodeGenerator::cgInst(IRInstruction* inst) {
|
||||
CALL_OPCODE(opcode) \
|
||||
CALL_OPCODE(opcode ## Stk)
|
||||
|
||||
PUNT_OPCODE(DefCls)
|
||||
|
||||
NOOP_OPCODE(DefConst)
|
||||
NOOP_OPCODE(DefFP)
|
||||
NOOP_OPCODE(DefSP)
|
||||
@@ -453,7 +448,6 @@ CALL_OPCODE(IssetElem)
|
||||
CALL_OPCODE(EmptyElem)
|
||||
|
||||
#undef NOOP_OPCODE
|
||||
#undef PUNT_OPCODE
|
||||
|
||||
// Thread chain of patch locations using the 4 byte space in each jmp/jcc
|
||||
static void prependPatchAddr(CodegenState& state,
|
||||
@@ -4973,13 +4967,6 @@ void CodeGenerator::cgInterpOneCF(IRInstruction* inst) {
|
||||
m_tx64->emitServiceReq(SRFlags::EmitInA, REQ_RESUME, 0ull);
|
||||
}
|
||||
|
||||
void CodeGenerator::cgDefFunc(IRInstruction* inst) {
|
||||
SSATmp* dst = inst->getDst();
|
||||
SSATmp* func = inst->getSrc(0);
|
||||
cgCallHelper(m_as, (TCA)defFuncHelper, dst, kSyncPoint,
|
||||
ArgGroup(m_regs).ssa(func), DestType::None);
|
||||
}
|
||||
|
||||
void CodeGenerator::cgFillContThis(IRInstruction* inst) {
|
||||
SSATmp* cont = inst->getSrc(0);
|
||||
auto baseReg = m_regs[inst->getSrc(1)].getReg();
|
||||
|
||||
@@ -442,8 +442,7 @@ void HhbcTranslator::emitArrayAdd() {
|
||||
}
|
||||
SSATmp* tr = popC();
|
||||
SSATmp* tl = popC();
|
||||
// the ArrrayAdd helper decrefs its args, so don't decref pop'ed values
|
||||
// TODO task 1805916: verify that ArrayAdd increfs its result
|
||||
// The ArrayAdd helper decrefs its args, so don't decref pop'ed values.
|
||||
push(gen(ArrayAdd, tl, tr));
|
||||
}
|
||||
|
||||
@@ -468,10 +467,10 @@ void HhbcTranslator::emitAddElemC() {
|
||||
}
|
||||
|
||||
void HhbcTranslator::emitAddNewElemC() {
|
||||
// TODO(#2437059): this is broken
|
||||
SSATmp* val = popC();
|
||||
SSATmp* arr = popC();
|
||||
// the AddNewElem helper decrefs its args, so don't decref pop'ed values
|
||||
// TODO task 1805916: verify that NewElem increfs its result
|
||||
// The AddNewElem helper decrefs its args, so don't decref pop'ed values.
|
||||
push(gen(AddNewElem, arr, val));
|
||||
}
|
||||
|
||||
|
||||
@@ -161,7 +161,12 @@ O(CheckLoc, ND, S(FramePtr), E) \
|
||||
O(CheckStk, D(StkPtr), S(StkPtr), E) \
|
||||
O(CastStk, D(StkPtr), S(StkPtr), Mem|N|Er) \
|
||||
O(AssertStk, D(StkPtr), S(StkPtr), E) \
|
||||
O(GuardRefs, ND, SUnk, E) \
|
||||
O(GuardRefs, ND, S(Func) \
|
||||
S(Int) \
|
||||
S(Int) \
|
||||
S(Int) \
|
||||
S(Int) \
|
||||
S(Int), E) \
|
||||
O(AssertLoc, ND, S(FramePtr), E) \
|
||||
O(OverrideLoc, ND, S(FramePtr), E) \
|
||||
O(OpAdd, DArith, S(Int,Dbl) S(Int,Dbl), C) \
|
||||
@@ -294,7 +299,9 @@ O(LdClsCns, DParam, CStr CStr, NF) \
|
||||
O(LookupClsCns, DParam, CStr CStr, E|Refs|Er|N|Mem) \
|
||||
O(LdCns, DParam, CStr, NF) \
|
||||
O(LookupCns, DParam, CStr, E|Refs|Er|N|Mem) \
|
||||
O(LdClsMethodCache, D(FuncCls), SUnk, N|C|E|Refs|Er|Mem) \
|
||||
O(LdClsMethodCache, D(FuncCls), C(Str) \
|
||||
C(Str) \
|
||||
C(NamedEntity), N|C|E|Refs|Er|Mem) \
|
||||
O(LdClsMethodFCache, D(FuncCtx), C(Cls) CStr S(Obj,Cls,Ctx), N|C|E|Er) \
|
||||
O(GetCtxFwdCall, D(Ctx), S(Ctx) S(Func), C) \
|
||||
O(LdClsMethod, D(Func), S(Cls) C(Int), C) \
|
||||
@@ -309,7 +316,7 @@ O(LdFunc, D(Func), S(Str), E|N|CRc|Er) \
|
||||
O(LdFuncCached, D(Func), CStr, N|C|E|Er) \
|
||||
O(LdFuncCachedSafe, D(Func), CStr, C) \
|
||||
O(LdARFuncPtr, D(Func), S(StkPtr,FramePtr) C(Int), C) \
|
||||
O(LdContLocalsPtr, D(PtrToCell), S(Obj), C) \
|
||||
O(LdContLocalsPtr, D(PtrToGen), S(Obj), C) \
|
||||
O(LdSSwitchDestFast, D(TCA), S(Gen), N) \
|
||||
O(LdSSwitchDestSlow, D(TCA), S(Gen), E|N|Refs|Er) \
|
||||
O(LdSwitchDblIndex, D(Int), S(Dbl) S(Int) S(Int), N) \
|
||||
@@ -323,7 +330,7 @@ O(CreateCl, D(Obj), C(Cls) \
|
||||
C(Int) \
|
||||
S(FramePtr) \
|
||||
S(StkPtr), Mem|N) \
|
||||
O(NewArray, D(Arr), C(Int), E|Mem|N|PRc) \
|
||||
O(NewArray, D(Arr), C(Int), N|PRc) \
|
||||
O(NewTuple, D(Arr), C(Int) S(StkPtr), E|Mem|N|PRc|CRc) \
|
||||
O(LdRaw, DParam, SUnk, NF) \
|
||||
O(FreeActRec, D(FramePtr), S(FramePtr), Mem) \
|
||||
@@ -379,7 +386,7 @@ O(DecRefMem, ND, S(PtrToGen) \
|
||||
C(Int), N|E|Mem|CRc|Refs) \
|
||||
O(DecRefNZ, ND, S(Gen), Mem|CRc) \
|
||||
O(DecRefNZOrBranch, ND, S(Gen), Mem|CRc) \
|
||||
O(DefLabel, DMulti, SUnk, E) \
|
||||
O(DefLabel, DMulti, NA, E) \
|
||||
O(Marker, ND, NA, E) \
|
||||
O(DefInlineFP, D(FramePtr), S(StkPtr) S(StkPtr), NF) \
|
||||
O(InlineReturn, ND, S(FramePtr), E) \
|
||||
@@ -411,9 +418,7 @@ O(AddNewElem, D(Arr), SUnk, N|Mem|CRc|PRc) \
|
||||
/* name dstinfo srcinfo flags */ \
|
||||
O(DefCns, D(Bool), C(Str) S(Cell), E|N|Mem|CRc) \
|
||||
O(Concat, D(Str), S(Gen) S(Gen), N|Mem|CRc|PRc|Refs) \
|
||||
O(ArrayAdd, D(Arr), SUnk, N|Mem|CRc|PRc) \
|
||||
O(DefCls, ND, SUnk, C|E|N) \
|
||||
O(DefFunc, ND, SUnk, C|E|N|Er) \
|
||||
O(ArrayAdd, D(Arr), S(Arr) S(Arr), N|Mem|CRc|PRc) \
|
||||
O(AKExists, D(Bool), S(Cell) S(Cell), C|N) \
|
||||
O(InterpOne, D(StkPtr), S(FramePtr) S(StkPtr) \
|
||||
C(Int) C(Int), E|N|Mem|Refs|Er) \
|
||||
@@ -432,7 +437,7 @@ O(FillContLocals, ND, S(FramePtr) \
|
||||
C(Func) \
|
||||
S(Obj), E|N|Mem) \
|
||||
O(FillContThis, ND, S(Obj) \
|
||||
S(PtrToCell) C(Int), E|Mem) \
|
||||
S(PtrToGen) C(Int), E|Mem) \
|
||||
O(ContEnter, ND, S(FramePtr) \
|
||||
S(TCA) C(Int) S(FramePtr), E|Mem) \
|
||||
O(UnlinkContVarEnv, ND, S(FramePtr), E|N|Mem) \
|
||||
@@ -584,9 +589,11 @@ O(EmptyElem, D(Bool), C(TCA) \
|
||||
O(IncStat, ND, C(Int) C(Int) C(Bool), E|Mem) \
|
||||
O(IncStatGrouped, ND, CStr CStr C(Int), E|N|Mem) \
|
||||
O(IncTransCounter, ND, NA, E) \
|
||||
O(ArrayIdx, D(Cell), C(TCA) S(Arr) S(Int,Str) S(Cell), \
|
||||
E|N|CRc|PRc|Refs|Mem) \
|
||||
O(DbgAssertRefCount, ND, SUnk, N|E) \
|
||||
O(ArrayIdx, D(Cell), C(TCA) \
|
||||
S(Arr) \
|
||||
S(Int,Str) \
|
||||
S(Cell), E|N|CRc|PRc|Refs|Mem) \
|
||||
O(DbgAssertRefCount, ND, S(Counted,StaticStr,StaticArr), N|E) \
|
||||
O(DbgAssertPtr, ND, S(PtrToGen), N|E) \
|
||||
O(DbgAssertType, ND, S(Cell), E) \
|
||||
O(Nop, ND, NA, NF) \
|
||||
|
||||
@@ -816,9 +816,6 @@ void LinearScan::computePreColoringHint() {
|
||||
case AKExists:
|
||||
normalHint(2);
|
||||
break;
|
||||
case DefFunc:
|
||||
normalHint(1);
|
||||
break;
|
||||
case OpEq:
|
||||
case OpNeq:
|
||||
case OpSame:
|
||||
|
||||
Referência em uma Nova Issue
Bloquear um usuário