SRS is the shadow register set. This speeds up interrupt handling by swapping the context into shadow registers instead of saving on the stack.
Unfortunately the SRS is not implemented on the 32MX1/2 devices ( From memory I think it is on the 32MM, and the larger devices), but the header files haven't been designed to warn you if you try to use them on parts where they don't exist - the SRS constant shouldn't be defined in the header files for these parts
Atomicity :
Using IFSxbits.xxx compiles to a read, mask the flag and write, and therefore non atomic ( interruptable).
Consider this situation
Foreground task uses Timer 1, which it polls for overflow using the T1IF flag.
When it sees it set, it does whatever it needs to do, and clears the flag using IFS0bits.T1IF=0;
This will compile to something like this
temp=IFS0
temp=temp AND NOT <T1 bitmask>
IFS0=temp
This will appear to work just fine. Until that rare event of an interrupt whose flag lives in the same IFS register happening in the same machine cycle as the first read.
Let's say the Interrupt uses T2IF.
FG task reads IFS0 into temp, and at exactly the same time, the T2 interrupt happens
IFS0 now T1IF and T2IF set, and this is copied into temp
The next instruction cycle, the interrupt is serviced, which clears T2IF and returns to FG task
The FG task clears T1IF in temp, but temp also has T2IF still set as it was read before the int happened.
FG task rewrites IFS0 with T2IF set, causing a second, spurious T2 interrupt.
This spurious T2 interrupt may or may not be a problem, depending on your code.
But if it is, and assuming the occurrence is random,and T1 int happens every 10mS, then at 48MHz the probability of it occurring is one in 480,000 T2 interrupts.
Needless to say this can result in those "once in a blue moon" type errors that can be a nightmare to track down. Fairly unlikely to happen with just timer events, but when one of the events is asynchronous ( e.g. serial receive) it is quite possible.
If the foreground task had used IFS0CLR, which is an atomic, non-interruptable operation, this can't happen.
Although it may appear that the interrupt could could safely use a non-atomic operation, it's still a bad idea as at some point you might have a higher priority interrupt, maybe not in this project, but several ones down teh line when you wonder why your old, reliable code has suddenly started misbehaving once every few minutes, hours or days.
This was why I needed to rush out and buy a scope in the middle of doing an install in Hong Kong a couple of years ago. I never saw any problems when testing at home, but once we had a big installation of about 10,000 LED nodes, and a random one of them would blink every few seconds.
Since then I've always used xxxSET and xxxCLR.
There can also be similar issues if you are accessing things like LAT registers in both FG and int code
What's annoying is that if the compiler was smarter, it ought to be able to compile xxxbits.xx=0 into the corresponding xxxCLR operation . Unfortunately Microchip seem to be spending all their time on the shit-show that is Harmony.