-- B o d y --
-- (Soft Binding Version) --
-- --
--- Copyright (C) 2004-2005, Free Software Foundation, Inc. --
+-- Copyright (C) 2004-2006, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
---------
function lvx (A : c_long; B : c_ptr) return LL_VSI is
- EA : Integer_Address;
- begin
- EA := Bound_Align (Integer_Address (A) + To_Integer (B), 16);
+ -- Simulate the altivec unit behavior regarding what Effective Address
+ -- is accessed, stripping off the input address least significant bits
+ -- wrt to vector alignment.
- declare
- D : LL_VSI;
- for D'Address use To_Address (EA);
- begin
- return D;
- end;
+ -- On targets where VECTOR_ALIGNMENT is less than the vector size (16),
+ -- an address within a vector is not necessarily rounded back at the
+ -- vector start address. Besides, rounding on 16 makes no sense on such
+ -- targets because the address of a properly aligned vector (that is,
+ -- a proper multiple of VECTOR_ALIGNMENT) could be affected, which we
+ -- want never to happen.
+
+ EA : constant System.Address :=
+ To_Address
+ (Bound_Align
+ (Integer_Address (A) + To_Integer (B), VECTOR_ALIGNMENT));
+
+ D : LL_VSI;
+ for D'Address use EA;
+
+ begin
+ return D;
end lvx;
-----------
----------
procedure stvx (A : LL_VSI; B : c_int; C : c_ptr) is
- EA : Integer_Address;
- begin
- EA := Bound_Align (Integer_Address (B) + To_Integer (C), 16);
+ -- Simulate the altivec unit behavior regarding what Effective Address
+ -- is accessed, stripping off the input address least significant bits
+ -- wrt to vector alignment (see comment in lvx for further details).
- declare
- D : LL_VSI;
- for D'Address use To_Address (EA);
- begin
- D := A;
- end;
+ EA : constant System.Address :=
+ To_Address
+ (Bound_Align
+ (Integer_Address (B) + To_Integer (C), VECTOR_ALIGNMENT));
+
+ D : LL_VSI;
+ for D'Address use EA;
+
+ begin
+ D := A;
end stvx;
------------