aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorOlivier Hainque <hainque@adacore.com>2006-10-31 18:58:30 +0100
committerArnaud Charlet <charlet@gcc.gnu.org>2006-10-31 18:58:30 +0100
commitbae7876b4d3c0e1c5532b00f744a86d1f31d403e (patch)
treec7717f2cdc96f51106ff1ce02d2cd57e31863522 /gcc
parent3f1ede06fc28db443347a22c579551d926e626d6 (diff)
downloadgcc-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.adb53
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;
------------