A method of obscuring software code including a plurality of instructions, comprising: determining, by a processor, a number N prior instructions to a current instruction; encoding the current instruction based upon a first function, a second function, and the N prior instructions, wherein the second function is based upon the N prior instructions, and wherein the first function is based upon the current instruction and an output of the second function; characterized in that the method further comprises: determining that there are join points in the N prior instructions or the current instruction; when there are join points, at least one of: a) producing mask values for each of prior instructions before a join point, said join point being used to jump to a different point in the software code, wherein a mask is set based upon common bits in parallel instructions prior to the join point, said parallel instructions being instructions that share a parallel location in an execution history; and associating the mask with the current instruction; and b) inserting I NOOP instructions before the join point, wherein I is the number of prior instructions before the join point, and wherein NOOP instructions are instructions that have no effect. determining, by a processor, a number N prior instructions to a current instruction; encoding the current instruction based upon a first function, a second function, and the N prior instructions, wherein the second function is based upon the N prior instructions, and wherein the first function is based upon the current instruction and an output of the second function; characterized in that the method further comprises: determining that there are join points in the N prior instructions or the current instruction; when there are join points, at least one of: a) producing mask values for each of prior instructions before a join point, said join point being used to jump to a different point in the software code, wherein a mask is set based upon common bits in parallel instructions prior to the join point, said parallel instructions being instructions that share a parallel location in an execution history; and associating the mask with the current instruction; and b) inserting I NOOP instructions before the join point, wherein I is the number of prior instructions before the join point, and wherein NOOP instructions are instructions that have no effect. determining that there are join points in the N prior instructions or the current instruction; when there are join points, at least one of: a) producing mask values for each of prior instructions before a join point, said join point being used to jump to a different point in the software code, wherein a mask is set based upon common bits in parallel instructions prior to the join point, said parallel instructions being instructions that share a parallel location in an execution history; and a) producing mask values for each of prior instructions before a join point, said join point being used to jump to a different point in the software code, wherein a mask is set based upon common bits in parallel instructions prior to the join point, said parallel instructions being instructions that share a parallel location in an execution history; and associating the mask with the current instruction; and b) inserting I NOOP instructions before the join point, wherein I is the number of prior instructions before the join point, and wherein NOOP instructions are instructions that have no effect.