I'm no expert but if you don't have a memory operation somewhere
I doubt you will succeed.
I see
"The first which entering the code only the value of
0 in the carry flag"
are you trying to have a CAS that works only on single-cpu
systems ?
Have you identified a problem with the CAS implementation
used in Solaris ?
-r
____________________________________________________________________________________
Roch Bourbonnais Sun Microsystems, Icnc-Grenoble
Senior Performance Analyst 180, Avenue De L'Europe, 38330,
Montbonnot Saint Martin, France
Performance & Availability Engineering
http://icncweb.france/~rbourbon http://blogs.sun.com/roller/page/roch
[EMAIL PROTECTED] (+33).4.76.18.83.20
Rama Krishna writes:
> Hi,
> Below is the atomic function of compare and swap instruction (CAS) written
> in assembly
> code.
> The following is general description of the function for
> CAS(int *p,int n,int k)
> which does if(*p == n)
> {
> *p = k;
> return 1;
> }
> else
> {
>
> return 0;
> }
> This operation we have to perform atomically, the following is assembly code
> for that one
> temp is the global variable which preserves atomicity.
> My question is that is there any flaw the violates atomicity principle ? Can
> anyone who
> worked before on this please guide us.
> retr = cas(p,i,j,&temp);
>
> int cas(int *p,int i,int j,int *t){
>
> // local parameters are accessed in this way
> // 8(%ebp) ---------- first parameter
> // 12(%ebp)----------- second parameter
> // 16(%ebp)----------- third parameter
> // 20(%ebp)------------Fourthe parameter
> // Fourth parameter is only used for performing the assembly level
> instructions atomically
>
>
> asm(" movl 20(%ebp),%edx"); //moving fourth parameter into the
> edx Remember
> // the fourth parameter consists of
> address
>
> // performing bit test and set atomically using lock
> // intially the (edx) contains zero value at bit 0 A process when
> executes the moves this
> // bit 0 to carry flag and set the corresponding bit in (edx) to 1
> // The first which entering the code only the value of 0 in the carry
> flag the remaining process
> // will see a value of 1 in the carry flag.so jc implies already some
> other process is there in the
> // code
>
> asm("lock bts $0,(%edx)");
> asm(" jc label2");
> //moving of first and second pararmeters into the registers
> asm(" movl 8(%ebp),%ebx");
> asm(" movl 12(%ebp),%ecx"); //after performing CAS operation
> // Comparing if (*p) == i
> asm(" cmp %ecx,(%ebx)");
> asm(" je label1");
> asm(" movl $0,%eax");
> asm(" movl $0,(%edx)");
> asm(" leave");
> asm(" ret ");
> // set (*p) = j and set the temp variable to 0 so that another
> // may perform the operation
> asm("label1: ");
> asm(" movl 16(%ebp),%ecx");
> asm(" movl %ecx ,(%ebx)");
> asm(" movl $0,(%edx)");
> // we are setting the return value in the register %eax
> asm(" movl $1,%eax");
> asm(" leave");
> asm(" ret");
> asm("label2: ");
> asm(" movl $0,%eax");
> asm(" leave");
> asm(" ret");
>
> }//end of cas
>
>
> Rama
> This message posted from opensolaris.org
> _______________________________________________
> perf-discuss mailing list
> [email protected]
_______________________________________________
perf-discuss mailing list
[email protected]