int pte, int ptr, int scratch, enum label_id lid)
 {
        int t = scratch >= 0 ? scratch : pte;
+       int cur = pte;
 
        if (cpu_has_rixi) {
                if (use_bbit_insns()) {
                        uasm_il_bbit0(p, r, pte, ilog2(_PAGE_PRESENT), lid);
                        uasm_i_nop(p);
                } else {
-                       uasm_i_srl(p, t, pte, _PAGE_PRESENT_SHIFT);
-                       uasm_i_andi(p, t, t, 1);
+                       if (_PAGE_PRESENT_SHIFT) {
+                               uasm_i_srl(p, t, cur, _PAGE_PRESENT_SHIFT);
+                               cur = t;
+                       }
+                       uasm_i_andi(p, t, cur, 1);
                        uasm_il_beqz(p, r, t, lid);
                        if (pte == t)
                                /* You lose the SMP race :-(*/
                                iPTE_LW(p, pte, ptr);
                }
        } else {
-               uasm_i_srl(p, t, pte, _PAGE_PRESENT_SHIFT);
-               uasm_i_andi(p, t, t,
+               if (_PAGE_PRESENT_SHIFT) {
+                       uasm_i_srl(p, t, cur, _PAGE_PRESENT_SHIFT);
+                       cur = t;
+               }
+               uasm_i_andi(p, t, cur,
                        (_PAGE_PRESENT | _PAGE_READ) >> _PAGE_PRESENT_SHIFT);
                uasm_i_xori(p, t, t,
                        (_PAGE_PRESENT | _PAGE_READ) >> _PAGE_PRESENT_SHIFT);
                   enum label_id lid)
 {
        int t = scratch >= 0 ? scratch : pte;
+       int cur = pte;
 
-       uasm_i_srl(p, t, pte, _PAGE_PRESENT_SHIFT);
-       uasm_i_andi(p, t, t,
+       if (_PAGE_PRESENT_SHIFT) {
+               uasm_i_srl(p, t, cur, _PAGE_PRESENT_SHIFT);
+               cur = t;
+       }
+       uasm_i_andi(p, t, cur,
                    (_PAGE_PRESENT | _PAGE_WRITE) >> _PAGE_PRESENT_SHIFT);
        uasm_i_xori(p, t, t,
                    (_PAGE_PRESENT | _PAGE_WRITE) >> _PAGE_PRESENT_SHIFT);