diff options
author | Olivier Hainque <hainque@adacore.com> | 2006-10-31 18:58:30 +0100 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2006-10-31 18:58:30 +0100 |
commit | bae7876b4d3c0e1c5532b00f744a86d1f31d403e (patch) | |
tree | c7717f2cdc96f51106ff1ce02d2cd57e31863522 /gcc | |
parent | 3f1ede06fc28db443347a22c579551d926e626d6 (diff) | |
download | gcc-bae7876b4d3c0e1c5532b00f744a86d1f31d403e.zip gcc-bae7876b4d3c0e1c5532b00f744a86d1f31d403e.tar.gz gcc-bae7876b4d3c0e1c5532b00f744a86d1f31d403e.tar.bz2 |
g-alleve.adb (lvx, stvx): Ceil-Round the Effective Address to the closest multiple of VECTOR_ALIGNMENT...
2006-10-31 Olivier Hainque <hainque@adacore.com>
* g-alleve.adb (lvx, stvx): Ceil-Round the Effective Address to the
closest multiple of VECTOR_ALIGNMENT and not the closest multiple of 16.
From-SVN: r118272
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/g-alleve.adb | 53 |
1 files changed, 34 insertions, 19 deletions
diff --git a/gcc/ada/g-alleve.adb b/gcc/ada/g-alleve.adb index 2da8697..3f760e4 100644 --- a/gcc/ada/g-alleve.adb +++ b/gcc/ada/g-alleve.adb @@ -7,7 +7,7 @@ -- 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- -- @@ -2818,17 +2818,28 @@ package body GNAT.Altivec.Low_Level_Vectors is --------- 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; ----------- @@ -4407,17 +4418,21 @@ package body GNAT.Altivec.Low_Level_Vectors is ---------- 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; ------------ |