Encoding:

POOL32A

000000

rt

rs

rd

0

0000

FORK

100111

6

5

5

5

4

6

Format:

FORK rd, rs, rt

microMIPS, MIPS MT

Allocate and Schedule a New Thread

Purpose:

Allocate and Schedule a New Thread

To cause a thread context to be allocated and associated with a new instruction stream.

Description: NewThread's GPR[rd] = GPR[rt], NewThread's TCRestart = GPR[rs]

The FORK instruction causes a free dynamically allocatable thread context (TC) to be allocated and activated on the issuing VPE. It takes two operand values from GPRs. The rs value is used as the starting fetch address and execution mode for the new thread. The rt value is copied into GPR rd of the new TC. The TCStatus register of the new TC is set up as a function of the FORKing TC as described in Section 6.12. If theUserLocal register is implemented, the

UserLocal value ofthe FORKing TC is also copied to the new TC. The newly allocated TC will begin executing instructions according to the implemented scheduling policy if and when multi-threaded execution is otherwise enabled.

Restrictions:

If no free, non-halted, dynamically allocatable TC is available forthe fork, a Thread Exception is raised forthe

FORK instruction, with the VPEControl.EXCPT CP0 register field set to 1 to indicate the Thread Overflow case.

Processors which implement only a single TC per VPE may implement FORK by simply raising the Thread Exception and indicating the Overflow.

Any exceptions associated with the virtual address passed in rs will be taken by the new thread of execution.

Operation:

success = 0
for t in 0...MVPConf0PTC
   if TC[t].TCBindCurVPE = TCBindCurVPE then
      if (TC[t].TCStatusDA = 1)
         and (TC[t].TCHaltH = 0)
         and (TC[t].TCStatusA = 0)
         and (success = 0) then
             TC[t].TCRestart = GPR[rs]
             TC[t].GPR[rd] = GPR[rt]
                if (Config3ULRI = 1) then
                   TC[t].UserLocal = UserLocal
                endif
             activated = 1
             priorcu = TC[t].TCStatusTCU3..TCU0
             priormx = TC[t].TCStatusTMX
             priorixmt = TC[t].TCStatusIXMT
             TC[t].TCStatus = priorcu || priormx || StatusFR || 05 || 1 || ImpDep4
                              || 1 || 0 || activated|| StatusKSU || priorixmt
                              || 02 || TCStatusTASID
             success = 1
      endif
   endif
endfor
if success = 0
   VPEControlEXCPT = 1
   SignalException(Thread)
endif

Exceptions:

Reserved Instruction

Thread