1------------------------------------------------------------------------------ 2-- -- 3-- GNAT RUN-TIME COMPONENTS -- 4-- -- 5-- S Y S T E M . A T O M I C _ C O U N T E R S -- 6-- -- 7-- B o d y -- 8-- -- 9-- Copyright (C) 2011-2013, 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------------------------------------------------------------------------------ 31 32-- This implementation of the package for x86 processor. GCC can't generate 33-- code for atomic builtins for 386 CPU. Only increment/decrement instructions 34-- are supported, thus this implementaton uses machine code insertions to 35-- access the necessary instructions. 36 37with System.Machine_Code; 38 39package body System.Atomic_Counters is 40 41 -- Add comments showing in normal asm language what we generate??? 42 43 --------------- 44 -- Decrement -- 45 --------------- 46 47 function Decrement (Item : in out Atomic_Counter) return Boolean is 48 Aux : Boolean; 49 50 begin 51 System.Machine_Code.Asm 52 (Template => 53 "lock%; decl" & ASCII.HT & "%0" & ASCII.LF & ASCII.HT 54 & "sete %1", 55 Outputs => 56 (Unsigned_32'Asm_Output ("=m", Item.Value), 57 Boolean'Asm_Output ("=qm", Aux)), 58 Inputs => Unsigned_32'Asm_Input ("m", Item.Value), 59 Volatile => True); 60 61 return Aux; 62 end Decrement; 63 64 --------------- 65 -- Increment -- 66 --------------- 67 68 procedure Increment (Item : in out Atomic_Counter) is 69 begin 70 System.Machine_Code.Asm 71 (Template => "lock%; incl" & ASCII.HT & "%0", 72 Outputs => Unsigned_32'Asm_Output ("=m", Item.Value), 73 Inputs => Unsigned_32'Asm_Input ("m", Item.Value), 74 Volatile => True); 75 end Increment; 76 77 ---------------- 78 -- Initialize -- 79 ---------------- 80 81 procedure Initialize (Item : out Atomic_Counter) is 82 begin 83 Item.Value := 1; 84 end Initialize; 85 86 ------------ 87 -- Is_One -- 88 ------------ 89 90 function Is_One (Item : Atomic_Counter) return Boolean is 91 begin 92 return Item.Value = 1; 93 end Is_One; 94 95end System.Atomic_Counters; 96