rem: r3 = eqv(a,r2);
add: r3 = ~(a^r2);
context: static void __dsp_donecallback(void *task){	u8 buffer[64] ATTRIBUTE_ALIGN(32);	u8 status;	s32 ret;	u32 chn,len,key;	u32 workarea,val;	card_block *card = NULL;#ifdef _CARD_DEBUG	printf("__dsp_donecallback(%p)\n",task);#endif	chn = 0;	while(chn<EXI_CHANNEL_2) {		card = &cardmap[chn];		if(&card->dsp_task==task) break;		chn++;	}	if(chn>=EXI_CHANNEL_2) return;	workarea = (u32)card->workarea;	workarea = ((workarea+47)&~0x1f);	key = ((u32*)workarea)[8];	val = (key^card->cipher)&~0xffff;	len = __card_dummylen();	if(__card_readarrayunlock(chn,val,buffer,len,1)<0) {		EXI_Unlock(chn);		__card_mountcallback(chn,CARD_ERROR_NOCARD);		return;	}		val = exnor(card->cipher,((len+card->latency+4)<<3)+1);	{		u32 a,b,c,r1,r2,r3;		a = (val<<23);		b = (val<<15);		c = (val<<7);		r1 = (val^c);		r2 = (b^r1);		r3 = eqv(a,r2);		//~(a^r2)		r1 = (val|(r3>>31));		card->cipher = r1;	}	val = ((key<<16)^card->cipher)&~0xffff;	len = __card_dummylen();	if(__card_readarrayunlock(chn,val,buffer,len,1)<0) {		EXI_Unlock(chn);		__card_mountcallback(chn,CARD_ERROR_NOCARD);		return;	}	ret = __card_readstatus(chn,&status);	if(EXI_Probe(chn)==0) {		EXI_Unlock(chn);		__card_mountcallback(chn,CARD_ERROR_NOCARD);		return;	}	if(!ret && !(status&CARD_STATUS_UNLOCKED)) {		EXI_Unlock(chn);		ret = CARD_ERROR_IOERROR;	}	__card_mountcallback(chn,ret);}