Compaq C
Compaq C User's Guide for OpenVMS Systems
6.2.1.78 __PAL_REMQTILR
This function removes the last entry from a longword queue in an
indivisible manner. This operation is interlocked against similar
operations by other processors or devices in the system. This function
must have write access to the header and queue entries. All parts of
the queue must be memory resident.
This function has the following format:
int __PAL_REMQTILR (void *head, void **removed_entry); /* At tail, interlocked resident */
|
head
A pointer to the queue header. The header must be aligned on a quadword
boundary.
removed_entry
A pointer to the address of the entry removed from the queue.
There are four possible return values:
- --1 if the entry cannot be removed because the secondary interlock
failed
- 0 if the queue was empty
- 1 if the entry was removed and the queue has remaining entries
- 2 if the entry was removed and the queue is now empty
6.2.1.79 __PAL_REMQTIQ
This function removes the last entry from a quadword queue in an
indivisible manner. This operation is interlocked against similar
operations by other processors or devices in the system. This function
must have write access to the header and queue entries.
This function has the following format:
int __PAL_REMQTIQ (void *head, void **removed_entry); /* At tail, interlocked */
|
head
A pointer to the queue header. The header must be aligned on an
octaword boundary.
removed_entry
A pointer to the address of the entry removed from the queue.
There are four possible return values:
- --1 if the entry cannot be removed because the secondary interlock
failed
- 0 if the queue was empty
- 1 if the entry was removed and the queue has remaining entries
- 2 if the entry was removed and the queue is now empty
6.2.1.80 __PAL_REMQTIQR
This function removes the last entry from a quadword queue in an
indivisible manner. This operation is interlocked against similar
operations by other processors or devices in the system. This function
must have write access to the header and queue entries. All parts of
the queue must be memory resident.
This function has the following format:
int __PAL_REMQTIQR (void *head, void **removed_entry); /* At tail, interlocked resident */
|
head
A pointer to the queue header. The header must be aligned on an
octaword boundary.
removed_entry
A pointer to the address of the entry removed from the queue.
There are four possible return values:
- --1 if the entry cannot be removed because the secondary interlock
failed
- 0 if the queue was empty
- 1 if the entry was removed and the queue has remaining entries
- 2 if the entry was removed and the queue is now empty
6.2.1.81 __PAL_REMQUEL
This function removes an entry from a longword queue. This function
must have write access to header and queue entries.
This function has the following format:
int _PAL_REMQUEL (void *entry, void **removed_entry);
|
entry
A pointer to the queue entry to be removed.
removed_entry
A pointer to the address of the entry removed from the queue.
There are three possible return values:
- --1 if the queue was empty
- 0 if the entry was removed and the queue is now empty
- 1 if the entry was removed and the queue has remaining entries
6.2.1.82 __PAL_REMQUEL_D
This function removes an entry from a longword queue deferred. This
function must have write access to header and queue entries.
This function has the following format:
int __PAL_REMQUEL_D (void **entry, void **removed_entry); /* Deferred */
|
entry
A pointer to a pointer to the queue entry to be removed.
removed_entry
A pointer to the address of the entry removed from the queue.
There are three possible return values:
- --1 if the queue was empty
- 0 if the entry was removed and the queue is now empty
- 1 if the entry was removed and the queue has remaining entries
6.2.1.83 __PAL_REMQUEQ
This function removes an entry from a quadword queue. This function
must have write access to header and queue entries.
This function has the following format:
int __PAL_REMQUEQ (void *entry, void **removed_entry);
|
entry
A pointer to the queue entry to be removed.
removed_entry
A pointer to the address of the entry removed from the queue.
There are three possible return values:
- --1 if the queue was empty
- 0 if the entry was removed and the queue is now empty
- 1 if the entry was removed and the queue has remaining entries
6.2.1.84 __PAL_REMQUEQ_D
This function removes an entry from a quadword queue deferred. This
function must have write access to header and queue entries.
This function has the following format:
int __PAL_REMQUEQ_D (void **entry, void **removed_entry); /* Deferred */
|
entry
A pointer to a pointer to the queue entry to be removed.
removed_entry
A pointer to the address of the entry removed from the queue.
There are three possible return values:
- --1 if the queue was empty
- 0 if the entry was removed and the queue is now empty
- 1 if the entry was removed and the queue has remaining entries
6.2.1.85 __PAL_SWPCTX
This function returns ownership of the data structure that contains the
current hardware privileged context (the HWPCB) to the operating system
and passes ownership of the new HWPCB to the processor.
This function has the following format:
void __PAL_SWPCTX (void *address);
|
address
A pointer to the new HWPCB.
6.2.1.86 __PAL_SWASTEN
This function swaps the previous state of the Asynchronous System Trap
(AST) enable bit for the new state. The new state is supplied in bit 0
of new_state_mask. The previous state is returned,
zero-extended.
A check is made to determine if an AST is pending. If the enabling
conditions are present for an AST at the completion of this
instruction, the AST occurs before the next instruction.
This function has the following format:
unsigned int __PAL_SWASTEN (int new_state_mask);
|
new_state_mask
An integer whose 0 bit is the new state of the AST enable bit.
6.2.1.87 __PAL_WR_PS_SW
This function writes the low-order three bits of mask into the
Processor Status software field (PS<SW>).
This function has the following format:
void __PAL_WR_PS_SW (int mask);
|
mask
An integer whose low-order three bits are written into PS<SW>.
6.2.1.88 _POPCNT
The _POPCNT built-in function returns the number of "1" bits (0 to 64)
in its argument. For example, _POPCNT(12) returns 2.
This function has the following format:
int64 _POPCNT (unsigned int64);
|
6.2.1.89 _POPPAR
The _POPPAR built-in function returns 1 if the number of "1" bits in
its argument is odd; otherwise it returns 0. For example, _POPPAR(12)
returns 0.
This function has the following format:
int64 _POPPAR (unsigned int64);
|
6.2.1.90 Read Process Cycle Counter ( __RPCC)
The __RPCC function reads the current process cycle counter.
This function has the following format:
6.2.1.91 Sine ( __SIN)
The __SIN built-in is functionally equivalent to its counterpart,
sin
, in the standard header file
<math.h>
.
Its format is also the same:
#include <math.h>
double __SIN (double x);
|
x
A radian value.
This built-in offers performance improvements because there is less
call overhead associated with its use.
If you include
<math.h>
, the built-in is automatically used for all occurrences of
sin
. To disable the built-in, use
#undef sin
.
6.2.1.92 Single-Precision, Floating-Point Arithmetic Built-in Functions
The following built-in functions provide single-precision,
floating-point chopped arithmetic:
__ADDF_C
|
__ADDS_C
|
__SUBF_C
|
__SUBS_C
|
__MULF_C
|
__MULS_C
|
__DIVF_C
|
__DIVS_C
|
They have the following format:
float __op{F,S}_C (float operand1, float operand2);
|
Where op is one of ADD, SUB, MUL, DIV, and {F,S} represents
VAX or IEEE floating-point arithmetic, respectively.
The result of the arithmetic operation is returned.
6.2.1.93 Test for Bit Clear then Clear Bit Interlocked (__INTERLOCKED_TESTBITCC_QUAD)
The __INTERLOCKED_TESTBITCC_QUAD function performs the following
functions in interlocked fashion:
- Returns the complement of the specified bit before being cleared.
- Clears the bit.
This function has one of the following formats:
int __INTERLOCKED_TESTBITCC_QUAD (volatile void *address, int bit_position);
int __INTERLOCKED_TESTBITCC_QUAD_RETRY (volatile void *address,
int bit_position, int retry, int *status);
|
address
The quadword-aligned base address of the bit field.
bit_position
The position within the field of the bit that you want cleared, in the
range of 0 to 63.
retry
A retry count of type
int
that indicates the number of times the operation is attempted (which is
at least once, even if the retry argument is 0). If the
operation cannot be performed successfully in the specified number of
retries, the function returns without updating the quadword.
status
A pointer to an integer that is set to 0 if the operation did not
succeed within the specified number of retries, and set to 1 if the
operation succeeded.
6.2.1.94 Test for Bit Clear then Clear Bit Interlocked (__TESTBITCCI)
The __TESTBITCCI function performs the following operations in
interlocked fashion:
- Returns the complement of the specified bit before being cleared
- Clears the bit
This function has the following format:
int __TESTBITCCI (void *address, int position, ...);
|
address
The base address of the field.
position
The position within the field of the bit that you want cleared.
...
An optional retry count of type
int
. If specified, the retry count indicates the number of times the
operation is attempted (which will be at least once, even if the count
argument is 0).
6.2.1.95 Test for Bit Set Then Set Bit Interlocked (__INTERLOCKED_TESTBITSS_QUAD)
The __INTERLOCKED_TESTBITSS_QUAD function performs the following
functions in interlocked fashion:
- Returns the value of the specified bit before being set.
- Sets the bit.
This function has one of the following formats:
int __INTERLOCKED_TESTBITSS_QUAD (volatile void *address, int bit_position);
int __INTERLOCKED_TESTBITSS_QUAD_RETRY (volatile void *address,
int expression, int retry, int *status);
|
address
The quadword-aligned base address of the bit field.
bit_position
The position within the field of the bit that you want cleared, in the
range of 0 to 63.
retry
A retry count of type
int
that indicates the number of times the operation is attempted (which is
at least once, even if the retry argument is 0). If the
operation cannot be performed successfully in the specified number of
retries, the function returns without updating the longword.
status
A pointer to an integer that is set to 0 if the operation did not
succeed within the specified number of retries, and set to 1 if the
operation succeeded.
6.2.1.96 Test for Bit Set then Set Bit Interlocked (__TESTBITSSI)
The __TESTBITSSI function performs the following operations in
interlocked fashion:
- Returns the value of the specified bit before being set
- Sets the bit
This function has the following format:
int __TESTBITSSI (void *address, int position, ...);
|
address
The base address of the field.
position
The position within the field of the bit that you want set.
...
An optional retry count of type
int
. If specified, the retry count indicates the number of times the
operation is attempted (which will be at least once, even if the count
argument is 0).
6.2.1.97 _TRAILZ
The _TRAILZ built-in function returns the number of trailing zeros
(counting after the least significant set bit to the least significant
bit position) in its argument. For example, _TRAILZ(2) returns 1, and
_TRAILZ(0) returns 64.
This function has the following format:
int64 _TRAILZ (unsigned int64);
|
6.2.1.98 Trap Barrier Instruction ( __TRAPB)
The __TRAPB function allows software to guarantee that, in a pipeline
implementation, all previous arithmetic instructions will be completed
without incurring any arithmetic traps before any instructions after
the TRAPB instruction are issued.
This function has the following format:
6.2.1.99 Unsigned Quadword Multiply High ( __UMULH)
The __UMULH function performs a quadword multiply high instruction.
This function has the following format:
uint64 __UMULH (uint64 operand1, uint64 operand2);
|
operand1
A 64-bit unsigned integer.
operand2
A 64-bit unsigned integer.
The two operands are multiplied as unsigned integers to produce a
128-bit result. The high-order 64 bits are returned. Note that
uint64
is a
typedef
for the Alpha data type
unsigned __int64
.
6.2.2 Built-In Functions for OpenVMS VAX Systems (VAX ONLY)
The following sections describe the Compaq C built-in functions
available on OpenVMS VAX systems.
The Compaq C built-in functions use enumerated
typedefs
to define possible return values. We recommend that you use the
enumerated types to store and compare return values.
6.2.2.1 Allocate Bytes from Stack ( __ALLOCA)
The __ALLOCA function allocates n bytes from the stack.
This function has the following format:
void *__ALLOCA (unsigned int n);
|
n
The number of bytes to be allocated.
A pointer to the allocated memory is returned.
6.2.2.2 Add Aligned Word Interlocked ( _ADAWI)
The _ADAWI function adds its source operand to the destination. This
function is interlocked against similar operations by other processors
or devices in the system.
The _ADAWI function has the following format:
typedef enum
{ _adawi_sum_neg=--1, _adawi_sum_zero, _adawi_sum_pos} _ADAWI_STATUS;
_ADAWI_STATUS _ADAWI (short __src, short *__dest);
|
__src
The value to be added to the destination.
__dest
A pointer to the destination. The destination must be aligned on a word
boundary. (You can achieve alignment using the
_align
or
__align
storage-class modifier.)
There are three possible return values:
-
adawi_sum_neg
(--1) if the sum when considered to be a signed number is negative
-
adawi_sum_zero
(0) if the sum is 0
-
adawi_sum_pos
(1) if the sum is positive
6.2.2.3 Branch on Bit Clear-Clear Interlocked ( _BBCCI)
The _BBCCI function performs the following functions in interlocked
fashion:
- Returns the complement of the bit specified by the two arguments
- Clears the bit specified by the two arguments
The _BBCCI function has the following format:
typedef enum { _bbcci_oldval_1, _bbcci_oldval_0} _BBCCI_STATUS;
_BBCCI_STATUS _BBCCI (int __position, void *__address);
|
__position
The position of the bit within the field.
__address
The base address of the field.
The return value of
_bbcci_oldval_1
(0) or
_bbcci_oldval_0
(1) is the complement of the value of the specified bit before being
cleared.
6.2.2.4 Branch on Bit Set-Set Interlocked ( _BBSSI)
The _BBSSI function performs the following functions in interlocked
fashion:
- Returns the status of the bit specified by the two arguments
- Sets the bit specified by the two arguments
The _BBSSI function has the following format:
typedef enum { _bbssi_oldval_0, _bbcci_oldval_1} _BBSSI_STATUS;
_BBSSI_STATUS _BBSSI (int __position, void *__address);
|
__position
The position of the bit within the field.
__address
The base address of the field.
The return value of
_bbssi_oldval_0
(0) or
_bbssi_oldval_1
(1) is the value of the specified bit before being set.
6.2.2.5 Find First Clear Bit ( _FFC)
The _FFC function finds the position of the first clear bit in a field.
The bits are tested for clear status starting at bit 0 and extending to
the highest bit in the field.
The _FFC function has the following format:
typedef enum { _ff_bit_not_found, _ff_bit_found} _FF_STATUS;
_FF_STATUS _FFC (int __start, char __size, const void *__base, int *__position);
|
__start
The start position of the field.
__size
The size of the field, in bits. The size must be a value from 0 to 32
bits.
__base
The address of the field.
__position
The address of an integer to receive the position of the clear bit. If
no bit is clear, the integer is set to the position of the first bit
past the last bit tested.
There are two possible return values:
-
_ff_bit_not_found
(0) if all bits in the field are set
-
_ff_bit_found
(1) if a bit with value 0 is found
|