You are marking out an interesting point, rather ignored in general observations.
We may say that there had been soon two strains in fixed word-length machines: One that prefixed address contents by one or more flags to taint the data regarding its type or kind (as in "<fixed-length taint>((<instruction>[<operand>])|<data>)", where "taint" may indicate data versus instruction, binary versus decimal, a flag to indicate a decision, etc) and, on the other hand, a more generalized form of "(<fixed-length instruction><operand>)|<data>", where a fixed length instruction represents a serial selector to a hierarchically structured function table and interpretation of the type of the content of any address was left to context. While the latter model lends itself to self-modifying programs more easily (with dedicated instructions to address either just the instruction part or just the operand exclusively and simple increments of instructions to perform pointer arithmetics), which soon became the prevalent standard before the advent of B registers and/or stacks, we eventually saw a return of tainting (both on the machine- and the OS-level) to ensure program and data integrity ...
We may say that there had been soon two strains in fixed word-length machines: One that prefixed address contents by one or more flags to taint the data regarding its type or kind (as in "<fixed-length taint>((<instruction>[<operand>])|<data>)", where "taint" may indicate data versus instruction, binary versus decimal, a flag to indicate a decision, etc) and, on the other hand, a more generalized form of "(<fixed-length instruction><operand>)|<data>", where a fixed length instruction represents a serial selector to a hierarchically structured function table and interpretation of the type of the content of any address was left to context. While the latter model lends itself to self-modifying programs more easily (with dedicated instructions to address either just the instruction part or just the operand exclusively and simple increments of instructions to perform pointer arithmetics), which soon became the prevalent standard before the advent of B registers and/or stacks, we eventually saw a return of tainting (both on the machine- and the OS-level) to ensure program and data integrity ...