calldatacopy(0,0,0x20); // store 1st 32 bytes of calldata in memorycalldata_first_half =mload(0x00); // load 1st 32 bytes of calldata onto the stackcalldatacopy(0,0x20,0x20); // store 2nd 32 bytes of calldata in memorycalldata_second_half =mload(0x00) // load 2nd 32 bytes of calldata onto the stackfirst_computation = calldata_first_half &0xF0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0;second_computation = first_computation | calldata_second_half;if (second_computation ==0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB) {jump(0x5D);}
first_computation can be zeroed out if calldata_first_half contains only 0x00, so we only have to worry about the second half of calldata.
Recall that 0 | 1 == 1, a generalization of that is 0x0000... | x == x. In order to get first_computation | calldata_second_half == 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB, we can simply let `calldata_second_half = 0xABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB.