Changes between Version 8 and Version 9 of GcnInstrsSmem


Ignore:
Timestamp:
11/24/17 18:00:31 (6 years ago)
Author:
trac
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • GcnInstrsSmem

    v8 v9  
    22{{{
    33#!html
    4 <h2>GCN ISA SMEM instructions (GCN 1.2)</h2>
     4<h2>GCN ISA SMEM instructions (GCN 1.2/1.4)</h2>
    55<p>The encoding of the SMEM instructions needs 8 bytes (2 dwords). List of fields:</p>
    66<table>
     
    572572<h3>Instruction set</h3>
    573573<p>Alphabetically sorted instruction list:</p>
     574<h4>S_ATOMIC_ADD</h4>
     575<p>Opcode: 130 (0x82) only for GCN 1.4<br />
     576Syntax: S_ATOMIC_ADD SDATA, SBASE(2), OFFSET<br />
     577Description: Add SDATA to value from memory address, and store result to memory address.
     578If GLC flag is set then return previous value from memory address to SDATA,
     579otherwise keep SDATA value. Operation is atomic.<br />
     580Operation:<br />
     581<code>UINT32* VM = (UINT32*)((SMEM + (OFFSET &amp; ~3))
     582UINT32 P = *VM; *VM = *VM + SDATA; SDATA = (GLC) ? P : SDATA // atomic</code></p>
     583<h4>S_ATOMIC_ADD_X2</h4>
     584<p>Opcode: 162 (0xa2) only for GCN 1.4<br />
     585Syntax: S_ATOMIC_ADD_X2 SDATA(2), SBASE(2), OFFSET<br />
     586Description: Add 64-bit SDATA to 64-bit value from memory address,
     587and store result to memory address.
     588If GLC flag is set then return previous value from memory address to SDATA,
     589otherwise keep SDATA value. Operation is atomic.<br />
     590Operation:<br />
     591<code>UINT64* VM = (UINT64*)((SMEM + (OFFSET &amp; ~3))
     592UINT64 P = *VM; *VM = *VM + SDATA; SDATA = (GLC) ? P : SDATA // atomic</code></p>
     593<h4>S_ATOMIC_AND</h4>
     594<p>Opcode: 136 (0x88) only for GCN 1.4<br />
     595Syntax: S_ATOMIC_AND SDATA, SBASE(2), OFFSET<br />
     596Description: Do bitwise AND on SDATA and value from memory address,
     597and store result to memory address.
     598If GLC flag is set then return previous value from memory address to SDATA,
     599otherwise keep SDATA value. Operation is atomic.<br />
     600Operation:<br />
     601<code>UINT32* VM = (UINT32*)((SMEM + (OFFSET &amp; ~3))
     602UINT32 P = *VM; *VM = *VM &amp; SDATA; SDATA = (GLC) ? P : SDATA // atomic</code></p>
     603<h4>S_ATOMIC_AND_X2</h4>
     604<p>Opcode: 168 (0xa8) only for GCN 1.4<br />
     605Syntax: S_ATOMIC_AND_X2 SDATA(2), SBASE(2), OFFSET<br />
     606Description: Do bitwise AND on 64-bit SDATA and 64-bit value from memory address,
     607and store result to memory address.
     608If GLC flag is set then return previous value from memory address to SDATA,
     609otherwise keep SDATA value. Operation is atomic.<br />
     610Operation:<br />
     611<code>UINT64* VM = (UINT64*)((SMEM + (OFFSET &amp; ~3))
     612UINT64 P = *VM; *VM = *VM &amp; SDATA; SDATA = (GLC) ? P : SDATA // atomic</code></p>
     613<h4>S_ATOMIC_CMPSWAP</h4>
     614<p>Opcode: 129 (0x81) only for GCN 1.4<br />
     615Syntax: S_ATOMIC_CMPSWAP SDATA(2), SBASE(2), OFFSET<br />
     616Description: Store lower SDATA dword into memory address if previous value
     617from memory address is equal SDATA&gt;&gt;32, otherwise keep old value from memory address.
     618If GLC flag is set then return previous value from memory address to SDATA,
     619otherwise keep SDATA value. Operation is atomic.<br />
     620Operation:<br />
     621<code>UINT32* VM = (UINT32*)((SMEM + (OFFSET &amp; ~3))
     622UINT32 P = *VM; *VM = *VM = *VM==(SDATA&gt;&gt;32) ? SDATA&amp;0xffffffff : *VM // atomic
     623SDATA = (GLC) ? P : SDATA // atomic</code></p>
     624<h4>S_ATOMIC_CMPSWAP_X2</h4>
     625<p>Opcode: 161 (0xa1) only for GCN 1.4<br />
     626Syntax: S_ATOMIC_CMPSWAP_X2 SDATA(4), SBASE(2), OFFSET<br />
     627Description: Store lower SDATA quadword into memory address if previous value
     628from memory address is equal last SDATA quadword,
     629otherwise keep old value from memory address.
     630If GLC flag is set then return previous value from memory address to SDATA,
     631otherwise keep SDATA value. Operation is atomic.<br />
     632Operation:<br />
     633<code>UINT64* VM = (UINT64*)((SMEM + (OFFSET &amp; ~3))
     634UINT64 P = *VM; *VM = *VM = *VM==(SDATA[2:3]) ? SDATA[0:1] : *VM // atomic
     635SDATA = (GLC) ? P : SDATA // atomic</code></p>
     636<h4>S_ATOMIC_DEC</h4>
     637<p>Opcode: 140 (0x8c) only for GCN 1.4<br />
     638Syntax: S_ATOMIC_DEC SDATA, SBASE(2), OFFSET<br />
     639Description: Compare value from memory address and if less or equal than SDATA
     640and this value is not zero, then decrement value from memory address,
     641otherwise store SDATA to memory address.
     642If GLC flag is set then return previous value from memory address to SDATA,
     643otherwise keep SDATA value. Operation is atomic.<br />
     644Operation:<br />
     645<code>UINT32* VM = (UINT32*)((SMEM + (OFFSET &amp; ~3))
     646UINT32 P = *VM; *VM = (*VM &lt;= VDATA &amp;&amp; *VM!=0) ? *VM-1 : VDATA; // atomic
     647SDATA = (GLC) ? P : SDATA // atomic</code></p>
     648<h4>S_ATOMIC_DEC_X2</h4>
     649<p>Opcode: 172 (0xac) only for GCN 1.4<br />
     650Syntax: S_ATOMIC_DEC_X2 SDATA, SBASE(2), OFFSET<br />
     651Description: Compare 64-bit value from memory address and if less or equal than
     65264-bit SDATA and this value is not zero, then decrement value from memory address,
     653otherwise store SDATA to memory address.
     654If GLC flag is set then return previous value from memory address to SDATA,
     655otherwise keep SDATA value. Operation is atomic.<br />
     656Operation:<br />
     657<code>UINT64* VM = (UINT64*)((SMEM + (OFFSET &amp; ~3))
     658UINT64 P = *VM; *VM = (*VM &lt;= VDATA &amp;&amp; *VM!=0) ? *VM-1 : VDATA; // atomic
     659SDATA = (GLC) ? P : SDATA // atomic</code></p>
     660<h4>S_ATOMIC_INC</h4>
     661<p>Opcode: 139 (0x8b) only for GCN 1.4<br />
     662Syntax: S_ATOMIC_INC SDATA, SBASE(2), OFFSET<br />
     663Description: Compare value from memory address and if less than SDATA,
     664then increment value from memory address, otherwise store zero to memory address.
     665If GLC flag is set then return previous value from memory address to SDATA,
     666otherwise keep SDATA value. Operation is atomic.<br />
     667Operation:<br />
     668<code>UINT32* VM = (UINT32*)((SMEM + (OFFSET &amp; ~3))
     669UINT32 P = *VM; *VM = (*VM &lt; SDATA) ? *VM+1 : 0; SDATA = (GLC) ? P : SDATA // atomic</code></p>
     670<h4>S_ATOMIC_INC_X2</h4>
     671<p>Opcode: 171 (0xab) only for GCN 1.4<br />
     672Syntax: S_ATOMIC_INC_X2 SDATA(2), SBASE(2), OFFSET<br />
     673Description: Compare 64-bit value from memory address and if less than 64-bit SDATA,
     674then increment value from memory address, otherwise store zero to memory address.
     675If GLC flag is set then return previous value from memory address to SDATA,
     676otherwise keep SDATA value. Operation is atomic.<br />
     677Operation:<br />
     678<code>UINT64* VM = (UINT64*)((SMEM + (OFFSET &amp; ~3))
     679UINT64 P = *VM; *VM = (*VM &lt; SDATA) ? *VM+1 : 0; SDATA = (GLC) ? P : SDATA // atomic</code></p>
     680<h4>S_ATOMIC_OR</h4>
     681<p>Opcode: 137 (0x89) only for GCN 1.4<br />
     682Syntax: S_ATOMIC_OR SDATA, SBASE(2), OFFSET<br />
     683Description: Do bitwise OR on SDATA and value from memory address,
     684and store result to memory address.
     685If GLC flag is set then return previous value from memory address to SDATA,
     686otherwise keep SDATA value. Operation is atomic.<br />
     687Operation:<br />
     688<code>UINT32* VM = (UINT32*)((SMEM + (OFFSET &amp; ~3))
     689UINT32 P = *VM; *VM = *VM | SDATA; SDATA = (GLC) ? P : SDATA // atomic</code></p>
     690<h4>S_ATOMIC_OR_X2</h4>
     691<p>Opcode: 169 (0xa9) only for GCN 1.4<br />
     692Syntax: S_ATOMIC_OR_X2 SDATA(2), SBASE(2), OFFSET<br />
     693Description: Do bitwise OR on 64-bit SDATA and 64-bit value from memory address,
     694and store result to memory address.
     695If GLC flag is set then return previous value from memory address to SDATA,
     696otherwise keep SDATA value. Operation is atomic.<br />
     697Operation:<br />
     698<code>UINT64* VM = (UINT64*)((SMEM + (OFFSET &amp; ~3))
     699UINT64 P = *VM; *VM = *VM | SDATA; SDATA = (GLC) ? P : SDATA // atomic</code></p>
     700<h4>S_ATOMIC_SMAX</h4>
     701<p>Opcode: 134 (0x86) only for GCN 1.4<br />
     702Syntax: S_ATOMIC_SMAX SDATA, SBASE(2), OFFSET<br />
     703Description: Choose largest signed 32-bit value from SDATA and from memory address,
     704and store result to this memory address.
     705If GLC flag is set then return previous value from memory address to SDATA,
     706otherwise keep SDATA value. Operation is atomic.<br />
     707Operation:<br />
     708<code>INT32* VM = (INT32*)((SMEM + (OFFSET &amp; ~3))
     709INT32 P = *VM; *VM = MAX(*VM, (INT32)SDATA); SDATA = (GLC) ? P : SDATA // atomic</code></p>
     710<h4>S_ATOMIC_SMAX_X2</h4>
     711<p>Opcode: 166 (0x86) only for GCN 1.4<br />
     712Syntax: S_ATOMIC_SMAX_X2 SDATA(2), SBASE(2), OFFSET<br />
     713Description: Choose largest signed 64-bit value from SDATA and from memory address,
     714and store result to this memory address.
     715If GLC flag is set then return previous value from memory address to SDATA,
     716otherwise keep SDATA value. Operation is atomic.<br />
     717Operation:<br />
     718<code>INT64* VM = (INT64*)((SMEM + (OFFSET &amp; ~3))
     719INT64 P = *VM; *VM = MAX(*VM, (INT64)SDATA); SDATA = (GLC) ? P : SDATA // atomic</code></p>
     720<h4>S_ATOMIC_SMIN</h4>
     721<p>Opcode: 132 (0x84) only for GCN 1.4<br />
     722Syntax: S_ATOMIC_SMIN SDATA, SBASE(2), OFFSET<br />
     723Description: Choose smallest signed 32-bit value from SDATA and from memory address,
     724and store result to this memory address.
     725If GLC flag is set then return previous value from memory address to SDATA,
     726otherwise keep SDATA value. Operation is atomic.<br />
     727Operation:<br />
     728<code>INT32* VM = (INT32*)((SMEM + (OFFSET &amp; ~3))
     729INT32 P = *VM; *VM = MIN(*VM, (INT32)SDATA); SDATA = (GLC) ? P : SDATA // atomic</code></p>
     730<h4>S_ATOMIC_SMIN_X2</h4>
     731<p>Opcode: 164 (0xa4) only for GCN 1.4<br />
     732Syntax: S_ATOMIC_SMIN_X2 SDATA(2), SBASE(2), OFFSET<br />
     733Description: Choose smallest signed 64-bit value from SDATA and from memory address,
     734and store result to this memory address.
     735If GLC flag is set then return previous value from memory address to SDATA,
     736otherwise keep SDATA value. Operation is atomic.<br />
     737Operation:<br />
     738<code>INT64* VM = (INT64*)((SMEM + (OFFSET &amp; ~3))
     739INT64 P = *VM; *VM = MIN(*VM, (INT64)SDATA); SDATA = (GLC) ? P : SDATA // atomic</code></p>
     740<h4>S_ATOMIC_SUB</h4>
     741<p>Opcode: 131 (0x83) only for GCN 1.4<br />
     742Syntax: S_ATOMIC_SUB SDATA, SBASE(2), OFFSET<br />
     743Description: Subtract SDATA from value from memory address,
     744and store result to memory address.
     745If GLC flag is set then return previous value from memory address to SDATA,
     746otherwise keep SDATA value. Operation is atomic.<br />
     747Operation:<br />
     748<code>UINT32* VM = (UINT32*)((SMEM + (OFFSET &amp; ~3))
     749UINT32 P = *VM; *VM = *VM - SDATA; SDATA = (GLC) ? P : SDATA // atomic</code></p>
     750<h4>S_ATOMIC_SUB_X2</h4>
     751<p>Opcode: 163 (0xa3) only for GCN 1.4<br />
     752Syntax: S_ATOMIC_SUB_X2 SDATA(2), SBASE(2), OFFSET<br />
     753Description: Subtract 64-bit SDATA from 64-bit value from memory address,
     754and store result to memory address.
     755If GLC flag is set then return previous value from memory address to SDATA,
     756otherwise keep SDATA value. Operation is atomic.<br />
     757Operation:<br />
     758<code>UINT64* VM = (UINT64*)((SMEM + (OFFSET &amp; ~3))
     759UINT64 P = *VM; *VM = *VM - SDATA; SDATA = (GLC) ? P : SDATA // atomic</code></p>
     760<h4>S_ATOMIC_SWAP</h4>
     761<p>Opcode: 128 (0x80) only for GCN 1.4<br />
     762Syntax: S_ATOMIC_SWAP SDATA, SBASE(2), OFFSET<br />
     763Description: Store SDATA into memory address.
     764If GLC flag is set then return previous value from memory address to SDATA,
     765otherwise keep SDATA value. Operation is atomic.<br />
     766Operation:<br />
     767<code>UINT32* VM = (UINT32*)((SMEM + (OFFSET &amp; ~3))
     768UINT32 P = *VM; *VM = SDATA; SDATA = (GLC) ? P : SDATA // atomic</code></p>
     769<h4>S_ATOMIC_SWAP_X2</h4>
     770<p>Opcode: 160 (0xa0) only for GCN 1.4<br />
     771Syntax: S_ATOMIC_SWAP_X2 SDATA(2), SBASE(2), OFFSET<br />
     772Description: Store 64-bit SDATA into memory address.
     773If GLC flag is set then return previous value from memory address to SDATA,
     774otherwise keep SDATA value. Operation is atomic.<br />
     775Operation:<br />
     776<code>UINT64* VM = (UINT64*)((SMEM + (OFFSET &amp; ~3))
     777UINT64 P = *VM; *VM = SDATA; SDATA = (GLC) ? P : SDATA // atomic</code></p>
     778<h4>S_ATOMIC_UMAX</h4>
     779<p>Opcode: 135 (0x87) only for GCN 1.4<br />
     780Syntax: S_ATOMIC_UMAX SDATA, SBASE(2), OFFSET<br />
     781Description: Choose largest unsigned 32-bit value from SDATA and from memory address,
     782and store result to this memory address.
     783If GLC flag is set then return previous value from memory address to SDATA,
     784otherwise keep SDATA value. Operation is atomic.<br />
     785Operation:<br />
     786<code>UINT32* VM = (UINT32*)((SMEM + (OFFSET &amp; ~3))
     787UINT32 P = *VM; *VM = MAX(*VM, SDATA); SDATA = (GLC) ? P : SDATA // atomic</code></p>
     788<h4>S_ATOMIC_UMAX_X2</h4>
     789<p>Opcode: 167 (0xa7) only for GCN 1.4<br />
     790Syntax: S_ATOMIC_UMAX_X2 SDATA(2), SBASE(2), OFFSET<br />
     791Description: Choose largest unsigned 64-bit value from SDATA and from memory address,
     792and store result to this memory address.
     793If GLC flag is set then return previous value from memory address to SDATA,
     794otherwise keep SDATA value. Operation is atomic.<br />
     795Operation:<br />
     796<code>UINT64* VM = (UINT64*)((SMEM + (OFFSET &amp; ~3))
     797UINT64 P = *VM; *VM = MAX(*VM, SDATA); SDATA = (GLC) ? P : SDATA // atomic</code></p>
     798<h4>S_ATOMIC_UMIN</h4>
     799<p>Opcode: 133 (0x85) only for GCN 1.4<br />
     800Syntax: S_ATOMIC_UMIN SDATA, SBASE(2), OFFSET<br />
     801Description: Choose smallest unsigned 32-bit value from SDATA and from memory address,
     802and store result to this memory address.
     803If GLC flag is set then return previous value from memory address to SDATA,
     804otherwise keep SDATA value. Operation is atomic.<br />
     805Operation:<br />
     806<code>UINT32* VM = (UINT32*)((SMEM + (OFFSET &amp; ~3))
     807UINT32 P = *VM; *VM = MIN(*VM, SDATA); SDATA = (GLC) ? P : SDATA // atomic</code></p>
     808<h4>S_ATOMIC_UMIN_X2</h4>
     809<p>Opcode: 165 (0xa5) only for GCN 1.4<br />
     810Syntax: S_ATOMIC_UMIN_X2 SDATA(2), SBASE(2), OFFSET<br />
     811Description: Choose smallest unsigned 64-bit value from SDATA and from memory address,
     812and store result to this memory address.
     813If GLC flag is set then return previous value from memory address to SDATA,
     814otherwise keep SDATA value. Operation is atomic.<br />
     815Operation:<br />
     816<code>UINT64* VM = (UINT64*)((SMEM + (OFFSET &amp; ~3))
     817UINT64 P = *VM; *VM = MIN(*VM, SDATA); SDATA = (GLC) ? P : SDATA // atomic</code></p>
     818<h4>S_ATOMIC_XOR</h4>
     819<p>Opcode: 138 (0x8a) only for GCN 1.4<br />
     820Syntax: S_ATOMIC_XOR SDATA, SBASE(2), OFFSET<br />
     821Description: Do bitwise XOR on SDATA and value from memory address,
     822and store result to memory address.
     823If GLC flag is set then return previous value from memory address to SDATA,
     824otherwise keep SDATA value. Operation is atomic.<br />
     825Operation:<br />
     826<code>UINT32* VM = (UINT32*)((SMEM + (OFFSET &amp; ~3))
     827UINT32 P = *VM; *VM = *VM ^ SDATA; SDATA = (GLC) ? P : SDATA // atomic</code></p>
     828<h4>S_ATOMIC_XOR_X2</h4>
     829<p>Opcode: 170 (0xaa) only for GCN 1.4<br />
     830Syntax: S_ATOMIC_XOR_X2 SDATA(2), SBASE(2), OFFSET<br />
     831Description: Do bitwise XOR on 64-bit SDATA and 64-bit value from memory address,
     832and store result to memory address.
     833If GLC flag is set then return previous value from memory address to SDATA,
     834otherwise keep SDATA value. Operation is atomic.<br />
     835Operation:<br />
     836<code>UINT64* VM = (UINT64*)((SMEM + (OFFSET &amp; ~3))
     837UINT64 P = *VM; *VM = *VM ^ SDATA; SDATA = (GLC) ? P : SDATA // atomic</code></p>
    574838<h4>S_BUFFER_LOAD_DWORD</h4>
    575839<p>Opcode: 8 (0x8)<br />