require '_h2ph_pre.ph';

unless(defined(&_RASOPS_MASKS_H_)) {
    eval 'sub _RASOPS_MASKS_H_ () {1;}' unless defined(&_RASOPS_MASKS_H_);
    require 'sys/types.ph';
    require 'machine/endian.ph';
    if((defined(&BYTE_ORDER) ? &BYTE_ORDER : 0) == (defined(&BIG_ENDIAN) ? &BIG_ENDIAN : 0)) {
	eval 'sub MBL {
	    local($x,$y) = @_;
    	    eval q((($y) > 31? 0: ($x) >> ($y)));
	}' unless defined(&MBL);
	eval 'sub MBR {
	    local($x,$y) = @_;
    	    eval q((($y) > 31? 0: ($x) << ($y)));
	}' unless defined(&MBR);
	eval 'sub MBE {
	    local($x) = @_;
    	    eval q(($x));
	}' unless defined(&MBE);
    } else {
	eval 'sub MBL {
	    local($x,$y) = @_;
    	    eval q((($y) > 31? 0:  &MBE( &MBE($x) << ($y))));
	}' unless defined(&MBL);
	eval 'sub MBR {
	    local($x,$y) = @_;
    	    eval q((($y) > 31? 0:  &MBE( &MBE($x) >> ($y))));
	}' unless defined(&MBR);
	eval 'sub MBE {
	    local($x) = @_;
    	    eval q(( ((($x) & 0xff) << 24) | ((($x) & 0xff00) << 8) | ((($x) & 0xff0000) >> 8) | ((($x) & 0xff000000) >> 24) ));
	}' unless defined(&MBE);
    }
    eval 'sub GETBITS {
        local($sp, $x, $w, $dw) = @_;
	    eval q( &do { $dw =  &MBL(*($sp), ($x));  &if ((($x) + ($w)) > 32) $dw |= ( &MBR(($sp)[1], 32- ($x))); }  &while(0););
    }' unless defined(&GETBITS);
    eval 'sub PUTBITS {
        local($sw, $x, $w, $dp) = @_;
	    eval q( &do { \'int\'  &n = ($x) + ($w) - 32;  &if ( &n <= 0) {  &n =  $rasops_pmask[$x & 31][$w & 31]; *($dp) = (*($dp) & ~ &n) | ( &MBR($sw, $x) &  &n); }  &else { *($dp) = (*($dp) &  $rasops_rmask[$x]) | ( &MBR(($sw), $x)); ($dp)[1] = (($dp)[1] &  $rasops_rmask[ &n]) | ( &MBL($sw, 32-($x)) &  $rasops_lmask[ &n]); } }  &while(0););
    }' unless defined(&PUTBITS);
}
1;
