Chapter Contents |
Previous |
Next |
Inline Machine Code Interface |
This example is a C implementation of the compare
and swap example in IBM System/370 Principles of Operation. Register
conventions have been changed to conform to C usage. (The original example
used registers 6, 7, and 8, which may be allocated to
register
variables in C.)
#include <code.h> #include <genl370.h> #include <ctl370.h> int word; /* the flag word */ char flag = 0x80; /* the bit to be turned on */ /* put word in R0, flag in R14 and */ /* &word in R1. word is loaded only */ /* once to avoid inconsistent results */ /* if it is updated by another processor. */ retry: _ldregs(R0+R1+R14, word, &word, flag << 24); LR(15,0); /* copy word to R15 */ OR(15,14); /* turn on the flag */ CS(0,15,0+b(1)); /* try to update the word*/ if (_cc() != 0) /* try again if swap failed */ goto retry;
This version of the example performs an unnecessary
reload of registers in the unlikely event that CS returns a non-zero condition
code. The unnecessary reload cannot be corrected by attaching the
retry
label to the LR instruction because inserting the label between the call to
_ldregs
and the LR instruction may cause one of the registers loaded
by
_ldregs
to be updated. However, the following code sequence does bypass
the problem for a slight performance improvement in the event that CS returns
a value other than 0.
#include <code.h> #include <genl370.h> #include <ctl370.h> int word; /* the flag word */ char flag = 0x80; /* the bit to be turned on */ /* Put word in R0, flag in R14 and */ /* &word in R1. word is loaded only */ /* once to avoid inconsistent results */ /* if it is updated by another processor. */ _ldregs(R0+R1+R14, word, &word, flag << 24); BALR(2,0); /* set up a base register */ LR(15,0); /* copy word to R15 */ OR(15,14); /* turn on the flag */ CS(0,15,0+b(1)); /* try to update the word */ BCR(7,2); /* try again if swap failed */
Chapter Contents |
Previous |
Next |
Top of Page |
Copyright © 2001 by SAS Institute Inc., Cary, NC, USA. All rights reserved.