5.2 Saturation support

One important point of MMX is the support of saturated operations. If a operation would cause an overflow, the value stays at the highest or lowest possible value for the data type: If you use byte values you get normally 250+12=6. This is very annoying when doing color manipulations or changing audio samples, when you have to do a word add and check if the value is greater than 255. The solution is saturation: 250+12 gives 255. Saturated operations are supported by the MMX unit. If you want to use them, you have simple turn the switch saturation on: $saturation+

Here is an example:

Program SaturationDemo;  
{  
  example for saturation, scales data (for example audio)  
  with 1.5 with rounding to negative infinity  
}  
uses mmx;  
 
var  
   audio1 : tmmxword;  
   i: smallint;  
 
const  
   helpdata1 : tmmxword = ($c000,$c000,$c000,$c000);  
   helpdata2 : tmmxword = ($8000,$8000,$8000,$8000);  
 
begin  
   { audio1 contains four 16 bit audio samples }  
{$mmx+}  
   { convert it to $8000 is defined as zero, multiply data with 0.75 }  
   audio1:=(audio1+helpdata2)*(helpdata1);  
{$saturation+}  
   { avoid overflows (all values>$ffff becomes $ffff) }  
   audio1:=(audio1+helpdata2)-helpdata2;  
{$saturation-}  
   { now mupltily with 2 and change to integer }  
   for i:=0 to 3 do  
     audio1[i] := audio1[i] shl 1;  
   audio1:=audio1-helpdata2;  
{$mmx-}  
end.