Atomic operations using extended inline assembler of C32
Well, there's one of these happy moments when I need just to ask someone, and solution comes to my head immediately:

   __asm__ __volatile__( "ll      $t1,     0(%0)": : "r"(&amp;a) );
   __asm__ __volatile__( "xori    $t1,     $t1,     1" );
   __asm__ __volatile__( "sc      $t1,     0(%0)": : "r"(&amp;a) );


I.e. I need to use &amp;a instead of a. Now, generated code is:

104:                    __asm__ __volatile__( "ll      $t1,     0(%0)": : "r"(&amp;a) );
9D001434  27828018   ADDIU V0, GP, -32744
9D001438  C0490000   LL T1, 0(V0)
105:                    __asm__ __volatile__( "xori    $t1,     $t1,     1" );
9D00143C  39290001   XORI T1, T1, 1
106:                    __asm__ __volatile__( "sc      $t1,     0(%0)": : "r"(&amp;a) );
9D001440  E0490000   SC T1, 0(V0)


Which seems to be what I need.
Note: to make it better, we need to use "beqz" instruction in order to loop if SC failed (there's an example in MIPS32 instruction quick reference). But this is another story.

More, at microchip forum user andersm suggested to use GCC's atomic builtins instead of re-inventing the wheel. (But, these builtins add two sync instructions that are useless on PIC32, so, it might make sense to write my own macro)