p.From.Reg = regnum(v.Args[1]) // should be CX
                p.To.Type = obj.TYPE_REG
                p.To.Reg = r
-       case ssa.OpAMD64SHLQconst, ssa.OpAMD64SHRQconst, ssa.OpAMD64SARQconst:
+       case ssa.OpAMD64SHLQconst, ssa.OpAMD64SHRQconst, ssa.OpAMD64SARQconst, ssa.OpAMD64XORQconst:
                x := regnum(v.Args[0])
                r := regnum(v)
                if x != r {
                p := Prog(obj.ACALL)
                p.To.Type = obj.TYPE_REG
                p.To.Reg = regnum(v.Args[0])
-       case ssa.OpAMD64XORQconst:
-               p := Prog(x86.AXORQ)
-               p.From.Type = obj.TYPE_CONST
-               p.From.Offset = v.AuxInt
-               p.To.Type = obj.TYPE_REG
-               p.To.Reg = regnum(v.Args[0])
        case ssa.OpAMD64NEGQ, ssa.OpAMD64NEGL, ssa.OpAMD64NEGW, ssa.OpAMD64NEGB:
                p := Prog(v.Op.Asm())
                p.To.Type = obj.TYPE_REG
 
  - Floating point registers
  - Make calls clobber all registers
  - Make liveness analysis non-quadratic.
+ - Handle in-place instructions (like XORQconst) directly:
+   Use XORQ AX, 1 rather than MOVQ AX, BX; XORQ BX, 1.
 
 StackAlloc:
  - Sort variables so all ptr-containing ones are first (so stack