cfgexpand: Expand comment on when non-var clobbers can show up
[official-gcc.git] / gcc / ada / libgnat / s-strcom.adb
blobda2b1fb687d45c4d7edd8cde995679101042bb61
1 ------------------------------------------------------------------------------
2 -- --
3 -- GNAT RUN-TIME LIBRARY COMPONENTS --
4 -- --
5 -- S Y S T E M . S T R I N G _ C O M P A R E --
6 -- --
7 -- B o d y --
8 -- --
9 -- Copyright (C) 2002-2024, Free Software Foundation, Inc. --
10 -- --
11 -- GNAT is free software; you can redistribute it and/or modify it under --
12 -- terms of the GNU General Public License as published by the Free Soft- --
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE. --
17 -- --
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
19 -- additional permissions described in the GCC Runtime Library Exception, --
20 -- version 3.1, as published by the Free Software Foundation. --
21 -- --
22 -- You should have received a copy of the GNU General Public License and --
23 -- a copy of the GCC Runtime Library Exception along with this program; --
24 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
25 -- <http://www.gnu.org/licenses/>. --
26 -- --
27 -- GNAT was originally developed by the GNAT team at New York University. --
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
29 -- --
30 ------------------------------------------------------------------------------
32 with Ada.Unchecked_Conversion;
34 package body System.String_Compare is
36 type Word is mod 2 ** 32;
37 -- Used to process operands by words
39 type Big_Words is array (Natural) of Word;
40 type Big_Words_Ptr is access Big_Words;
41 for Big_Words_Ptr'Storage_Size use 0;
42 -- Array type used to access by words
44 type Byte is mod 2 ** 8;
45 -- Used to process operands by bytes
47 type Big_Bytes is array (Natural) of Byte;
48 type Big_Bytes_Ptr is access Big_Bytes;
49 for Big_Bytes_Ptr'Storage_Size use 0;
50 -- Array type used to access by bytes
52 function To_Big_Words is new
53 Ada.Unchecked_Conversion (System.Address, Big_Words_Ptr);
55 function To_Big_Bytes is new
56 Ada.Unchecked_Conversion (System.Address, Big_Bytes_Ptr);
58 -----------------
59 -- Str_Compare --
60 -----------------
62 function Str_Compare
63 (Left : System.Address;
64 Right : System.Address;
65 Left_Len : Natural;
66 Right_Len : Natural) return Integer
68 Compare_Len : constant Natural := Natural'Min (Left_Len, Right_Len);
70 begin
71 -- If operands are non-aligned, or length is too short, go by bytes
73 if ((Left or Right) and 2#11#) /= 0 or else Compare_Len < 4 then
74 return Str_Compare_Bytes (Left, Right, Left_Len, Right_Len);
75 end if;
77 -- Here we can go by words
79 declare
80 LeftP : constant Big_Words_Ptr := To_Big_Words (Left);
81 RightP : constant Big_Words_Ptr := To_Big_Words (Right);
82 Clen4 : constant Natural := Compare_Len / 4 - 1;
83 Clen4F : constant Natural := Clen4 * 4;
85 begin
86 for J in 0 .. Clen4 loop
87 if LeftP (J) /= RightP (J) then
88 return Str_Compare_Bytes
89 (Left + Address (4 * J),
90 Right + Address (4 * J),
91 4, 4);
92 end if;
93 end loop;
95 return Str_Compare_Bytes
96 (Left + Address (Clen4F),
97 Right + Address (Clen4F),
98 Left_Len - Clen4F,
99 Right_Len - Clen4F);
100 end;
101 end Str_Compare;
103 -----------------------
104 -- Str_Compare_Bytes --
105 -----------------------
107 function Str_Compare_Bytes
108 (Left : System.Address;
109 Right : System.Address;
110 Left_Len : Natural;
111 Right_Len : Natural) return Integer
113 Compare_Len : constant Natural := Natural'Min (Left_Len, Right_Len);
115 LeftP : constant Big_Bytes_Ptr := To_Big_Bytes (Left);
116 RightP : constant Big_Bytes_Ptr := To_Big_Bytes (Right);
118 begin
119 for J in 0 .. Compare_Len - 1 loop
120 if LeftP (J) /= RightP (J) then
121 if LeftP (J) > RightP (J) then
122 return +1;
123 else
124 return -1;
125 end if;
126 end if;
127 end loop;
129 if Left_Len = Right_Len then
130 return 0;
131 elsif Left_Len > Right_Len then
132 return +1;
133 else
134 return -1;
135 end if;
136 end Str_Compare_Bytes;
138 end System.String_Compare;