cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

perf_asm.S (25455B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2
      3/*    low-level asm for "intrigue" (PA8500-8700 CPU perf counters)
      4 * 
      5 *    Copyright (C) 2001 Randolph Chung <tausq at parisc-linux.org>
      6 *    Copyright (C) 2001 Hewlett-Packard (Grant Grundler)
      7 */
      8
      9#include <asm/assembly.h>
     10
     11#include <linux/init.h>
     12#include <linux/linkage.h>
     13
     14#ifdef CONFIG_64BIT
     15	.level		2.0w
     16#endif /* CONFIG_64BIT */
     17
     18#define MTDIAG_1(gr)    .word 0x14201840 + gr*0x10000
     19#define MTDIAG_2(gr)    .word 0x14401840 + gr*0x10000
     20#define MFDIAG_1(gr)    .word 0x142008A0 + gr
     21#define MFDIAG_2(gr)    .word 0x144008A0 + gr
     22#define STDIAG(dr)      .word 0x14000AA0 + dr*0x200000
     23#define SFDIAG(dr)      .word 0x14000BA0 + dr*0x200000
     24#define DR2_SLOW_RET    53
     25
     26
     27;
     28; Enable the performance counters
     29;
     30; The coprocessor only needs to be enabled when
     31; starting/stopping the coprocessor with the pmenb/pmdis.
     32;
     33	.text
     34
     35ENTRY(perf_intrigue_enable_perf_counters)
     36	.proc
     37	.callinfo  frame=0,NO_CALLS
     38	.entry
     39
     40	ldi     0x20,%r25                ; load up perfmon bit
     41	mfctl   ccr,%r26                 ; get coprocessor register
     42	or      %r25,%r26,%r26             ; set bit
     43	mtctl   %r26,ccr                 ; turn on performance coprocessor
     44	pmenb                           ; enable performance monitor
     45	ssm     0,0                     ; dummy op to ensure completion
     46	sync                            ; follow ERS
     47	andcm   %r26,%r25,%r26             ; clear bit now 
     48	mtctl   %r26,ccr                 ; turn off performance coprocessor
     49	nop                             ; NOPs as specified in ERS
     50	nop
     51	nop
     52	nop
     53	nop
     54	nop
     55	nop
     56	bve    (%r2)
     57	nop
     58	.exit
     59	.procend
     60ENDPROC(perf_intrigue_enable_perf_counters)
     61
     62ENTRY(perf_intrigue_disable_perf_counters)
     63	.proc
     64	.callinfo  frame=0,NO_CALLS
     65	.entry
     66	ldi     0x20,%r25                ; load up perfmon bit
     67	mfctl   ccr,%r26                 ; get coprocessor register
     68	or      %r25,%r26,%r26             ; set bit
     69	mtctl   %r26,ccr                 ; turn on performance coprocessor
     70	pmdis                           ; disable performance monitor
     71	ssm     0,0                     ; dummy op to ensure completion
     72	andcm   %r26,%r25,%r26             ; clear bit now 
     73	bve    (%r2)
     74	mtctl   %r26,ccr                 ; turn off performance coprocessor
     75	.exit
     76	.procend
     77ENDPROC(perf_intrigue_disable_perf_counters)
     78
     79;***********************************************************************
     80;*
     81;* Name: perf_rdr_shift_in_W
     82;*
     83;* Description:
     84;*	This routine shifts data in from the RDR in arg0 and returns
     85;*	the result in ret0.  If the RDR is <= 64 bits in length, it
     86;*	is shifted shifted backup immediately.  This is to compensate
     87;*	for RDR10 which has bits that preclude PDC stack operations
     88;*	when they are in the wrong state.
     89;*
     90;* Arguments:
     91;*	arg0 : rdr to be read
     92;*	arg1 : bit length of rdr
     93;*
     94;* Returns:
     95;*	ret0 = next 64 bits of rdr data from staging register
     96;*
     97;* Register usage:
     98;*	arg0 : rdr to be read
     99;*	arg1 : bit length of rdr
    100;*	%r24  - original DR2 value
    101;*	%r1   - scratch
    102;*  %r29  - scratch
    103;*
    104;* Returns:
    105;*	ret0 = RDR data (right justified)
    106;*
    107;***********************************************************************
    108
    109ENTRY(perf_rdr_shift_in_W)
    110	.proc
    111	.callinfo frame=0,NO_CALLS
    112	.entry
    113;
    114; read(shift in) the RDR.
    115;
    116
    117; NOTE: The PCX-W ERS states that DR2_SLOW_RET must be set before any
    118; shifting is done, from or to, remote diagnose registers.
    119;
    120
    121	depdi,z		1,DR2_SLOW_RET,1,%r29
    122	MFDIAG_2	(24)
    123	or		    %r24,%r29,%r29
    124	MTDIAG_2	(29)			; set DR2_SLOW_RET
    125
    126	nop
    127	nop
    128	nop
    129	nop
    130
    131;
    132; Cacheline start (32-byte cacheline)
    133;
    134	nop
    135	nop
    136	nop
    137	extrd,u		arg1,63,6,%r1	; setup shift amount by bits to move 
    138
    139	mtsar		%r1
    140	shladd		arg0,2,%r0,%r1	; %r1 = 4 * RDR number
    141	blr  		%r1,%r0		; branch to 8-instruction sequence
    142	nop
    143
    144;
    145; Cacheline start (32-byte cacheline)
    146;
    147
    148	;
    149	; RDR 0 sequence
    150	;
    151	SFDIAG		(0)
    152	ssm		    0,0
    153	MFDIAG_1	(28)
    154	shrpd		ret0,%r0,%sar,%r1
    155	MTDIAG_1	(1)			; mtdiag %dr1, %r1 
    156	STDIAG		(0)
    157	ssm		    0,0
    158	b,n         perf_rdr_shift_in_W_leave
    159
    160	;
    161	; RDR 1 sequence
    162	;
    163	sync
    164	ssm		    0,0
    165	SFDIAG		(1)
    166	ssm		    0,0
    167	MFDIAG_1	(28)
    168	ssm		    0,0
    169	b,n         perf_rdr_shift_in_W_leave
    170	nop
    171
    172	;
    173	; RDR 2 read sequence
    174	;
    175	SFDIAG		(2)
    176	ssm		    0,0
    177	MFDIAG_1	(28)
    178	shrpd		ret0,%r0,%sar,%r1
    179	MTDIAG_1	(1)
    180	STDIAG		(2)
    181	ssm		    0,0
    182	b,n         perf_rdr_shift_in_W_leave
    183
    184	;
    185	; RDR 3 read sequence
    186	;
    187	b,n         perf_rdr_shift_in_W_leave
    188	nop
    189	nop
    190	nop
    191	nop
    192	nop
    193	nop
    194	nop
    195
    196	;
    197	; RDR 4 read sequence
    198	;
    199	sync
    200	ssm		0,0
    201	SFDIAG		(4)
    202	ssm		0,0
    203	MFDIAG_1	(28)
    204	b,n         perf_rdr_shift_in_W_leave
    205	ssm		0,0
    206	nop
    207
    208	; 
    209	; RDR 5 read sequence
    210	;
    211	sync
    212	ssm		0,0
    213	SFDIAG		(5)
    214	ssm		0,0
    215	MFDIAG_1	(28)
    216	b,n         perf_rdr_shift_in_W_leave
    217	ssm		0,0
    218	nop
    219
    220	;
    221	; RDR 6 read sequence
    222	;
    223	sync
    224	ssm		0,0
    225	SFDIAG		(6)
    226	ssm		0,0
    227	MFDIAG_1	(28)
    228	b,n         perf_rdr_shift_in_W_leave
    229	ssm		0,0
    230	nop
    231
    232	;
    233	; RDR 7 read sequence
    234	;
    235	b,n         perf_rdr_shift_in_W_leave
    236	nop
    237	nop
    238	nop
    239	nop
    240	nop
    241	nop
    242	nop
    243
    244	;
    245	; RDR 8 read sequence
    246	;
    247	b,n         perf_rdr_shift_in_W_leave
    248	nop
    249	nop
    250	nop
    251	nop
    252	nop
    253	nop
    254	nop
    255
    256	;
    257	; RDR 9 read sequence
    258	;
    259	b,n         perf_rdr_shift_in_W_leave
    260	nop
    261	nop
    262	nop
    263	nop
    264	nop
    265	nop
    266	nop
    267
    268	;
    269	; RDR 10 read sequence
    270	;
    271	SFDIAG		(10)
    272	ssm		0,0
    273	MFDIAG_1	(28)
    274	shrpd		ret0,%r0,%sar,%r1
    275	MTDIAG_1	(1)
    276	STDIAG		(10)
    277	ssm		0,0
    278	b,n         perf_rdr_shift_in_W_leave
    279
    280	;
    281	; RDR 11 read sequence
    282	;
    283	SFDIAG		(11)
    284	ssm		0,0
    285	MFDIAG_1	(28)
    286	shrpd		ret0,%r0,%sar,%r1
    287	MTDIAG_1	(1)
    288	STDIAG		(11)
    289	ssm		0,0
    290	b,n         perf_rdr_shift_in_W_leave
    291
    292	;
    293	; RDR 12 read sequence
    294	;
    295	b,n         perf_rdr_shift_in_W_leave
    296	nop
    297	nop
    298	nop
    299	nop
    300	nop
    301	nop
    302	nop
    303
    304	;
    305	; RDR 13 read sequence
    306	;
    307	sync
    308	ssm		0,0
    309	SFDIAG		(13)
    310	ssm		0,0
    311	MFDIAG_1	(28)
    312	b,n         perf_rdr_shift_in_W_leave
    313	ssm		0,0
    314	nop
    315
    316	;
    317	; RDR 14 read sequence
    318	;
    319	SFDIAG		(14)
    320	ssm		0,0
    321	MFDIAG_1	(28)
    322	shrpd		ret0,%r0,%sar,%r1
    323	MTDIAG_1	(1)
    324	STDIAG		(14)
    325	ssm		0,0
    326	b,n         perf_rdr_shift_in_W_leave
    327
    328	;
    329	; RDR 15 read sequence
    330	;
    331	sync
    332	ssm		0,0
    333	SFDIAG		(15)
    334	ssm		0,0
    335	MFDIAG_1	(28)
    336	ssm		0,0
    337	b,n         perf_rdr_shift_in_W_leave
    338	nop
    339
    340	;
    341	; RDR 16 read sequence
    342	;
    343	sync
    344	ssm		0,0
    345	SFDIAG		(16)
    346	ssm		0,0
    347	MFDIAG_1	(28)
    348	b,n         perf_rdr_shift_in_W_leave
    349	ssm		0,0
    350	nop
    351
    352	;
    353	; RDR 17 read sequence
    354	;
    355	SFDIAG		(17)
    356	ssm		0,0
    357	MFDIAG_1	(28)
    358	shrpd		ret0,%r0,%sar,%r1
    359	MTDIAG_1	(1)
    360	STDIAG		(17)
    361	ssm		0,0
    362	b,n         perf_rdr_shift_in_W_leave
    363
    364	;
    365	; RDR 18 read sequence
    366	;
    367	SFDIAG		(18)
    368	ssm		0,0
    369	MFDIAG_1	(28)
    370	shrpd		ret0,%r0,%sar,%r1
    371	MTDIAG_1	(1)
    372	STDIAG		(18)
    373	ssm		0,0
    374	b,n         perf_rdr_shift_in_W_leave
    375
    376	;
    377	; RDR 19 read sequence
    378	;
    379	b,n         perf_rdr_shift_in_W_leave
    380	nop
    381	nop
    382	nop
    383	nop
    384	nop
    385	nop
    386	nop
    387
    388	;
    389	; RDR 20 read sequence
    390	;
    391	sync
    392	ssm		0,0
    393	SFDIAG		(20)
    394	ssm		0,0
    395	MFDIAG_1	(28)
    396	b,n         perf_rdr_shift_in_W_leave
    397	ssm		0,0
    398	nop
    399
    400	;
    401	; RDR 21 read sequence
    402	;
    403	sync
    404	ssm		0,0
    405	SFDIAG		(21)
    406	ssm		0,0
    407	MFDIAG_1	(28)
    408	b,n         perf_rdr_shift_in_W_leave
    409	ssm		0,0
    410	nop
    411
    412	;
    413	; RDR 22 read sequence
    414	;
    415	sync
    416	ssm		0,0
    417	SFDIAG		(22)
    418	ssm		0,0
    419	MFDIAG_1	(28)
    420	b,n         perf_rdr_shift_in_W_leave
    421	ssm		0,0
    422	nop
    423
    424	;
    425	; RDR 23 read sequence
    426	;
    427	sync
    428	ssm		0,0
    429	SFDIAG		(23)
    430	ssm		0,0
    431	MFDIAG_1	(28)
    432	b,n         perf_rdr_shift_in_W_leave
    433	ssm		0,0
    434	nop
    435
    436	;
    437	; RDR 24 read sequence
    438	;
    439	sync
    440	ssm		0,0
    441	SFDIAG		(24)
    442	ssm		0,0
    443	MFDIAG_1	(28)
    444	b,n         perf_rdr_shift_in_W_leave
    445	ssm		0,0
    446	nop
    447
    448	;
    449	; RDR 25 read sequence
    450	;
    451	sync
    452	ssm		0,0
    453	SFDIAG		(25)
    454	ssm		0,0
    455	MFDIAG_1	(28)
    456	b,n         perf_rdr_shift_in_W_leave
    457	ssm		0,0
    458	nop
    459
    460	;
    461	; RDR 26 read sequence
    462	;
    463	SFDIAG		(26)
    464	ssm		0,0
    465	MFDIAG_1	(28)
    466	shrpd		ret0,%r0,%sar,%r1
    467	MTDIAG_1	(1)
    468	STDIAG		(26)
    469	ssm		0,0
    470	b,n         perf_rdr_shift_in_W_leave
    471
    472	;
    473	; RDR 27 read sequence
    474	;
    475	SFDIAG		(27)
    476	ssm		0,0
    477	MFDIAG_1	(28)
    478	shrpd		ret0,%r0,%sar,%r1
    479	MTDIAG_1	(1)
    480	STDIAG		(27)
    481	ssm		0,0
    482	b,n         perf_rdr_shift_in_W_leave
    483
    484	;
    485	; RDR 28 read sequence
    486	;
    487	sync
    488	ssm		0,0
    489	SFDIAG		(28)
    490	ssm		0,0
    491	MFDIAG_1	(28)
    492	b,n         perf_rdr_shift_in_W_leave
    493	ssm		0,0
    494	nop
    495
    496	;
    497	; RDR 29 read sequence
    498	;
    499	sync
    500	ssm		0,0
    501	SFDIAG		(29)
    502	ssm		0,0
    503	MFDIAG_1	(28)
    504	b,n         perf_rdr_shift_in_W_leave
    505	ssm		0,0
    506	nop
    507
    508	;
    509	; RDR 30 read sequence
    510	;
    511	SFDIAG		(30)
    512	ssm		0,0
    513	MFDIAG_1	(28)
    514	shrpd		ret0,%r0,%sar,%r1
    515	MTDIAG_1	(1)
    516	STDIAG		(30)
    517	ssm		0,0
    518	b,n         perf_rdr_shift_in_W_leave
    519
    520	;
    521	; RDR 31 read sequence
    522	;
    523	sync
    524	ssm		0,0
    525	SFDIAG		(31)
    526	ssm		0,0
    527	MFDIAG_1	(28)
    528	nop
    529	ssm		0,0
    530	nop
    531
    532	;
    533	; Fallthrough
    534	;
    535
    536perf_rdr_shift_in_W_leave:
    537	bve		    (%r2)
    538	.exit
    539	MTDIAG_2	(24)			; restore DR2
    540	.procend
    541ENDPROC(perf_rdr_shift_in_W)
    542
    543
    544;***********************************************************************
    545;*
    546;* Name: perf_rdr_shift_out_W
    547;*
    548;* Description:
    549;*	This routine moves data to the RDR's.  The double-word that
    550;*	arg1 points to is loaded and moved into the staging register.
    551;*	Then the STDIAG instruction for the RDR # in arg0 is called
    552;*	to move the data to the RDR.
    553;*
    554;* Arguments:
    555;*	arg0 = rdr number
    556;*	arg1 = 64-bit value to write
    557;*	%r24 - DR2 | DR2_SLOW_RET
    558;*	%r23 - original DR2 value
    559;*
    560;* Returns:
    561;*	None
    562;*
    563;* Register usage:
    564;*
    565;***********************************************************************
    566
    567ENTRY(perf_rdr_shift_out_W)
    568	.proc
    569	.callinfo frame=0,NO_CALLS
    570	.entry
    571;
    572; NOTE: The PCX-W ERS states that DR2_SLOW_RET must be set before any
    573; shifting is done, from or to, the remote diagnose registers.
    574;
    575
    576	depdi,z		1,DR2_SLOW_RET,1,%r24
    577	MFDIAG_2	(23)
    578	or		%r24,%r23,%r24
    579	MTDIAG_2	(24)		; set DR2_SLOW_RET
    580	MTDIAG_1	(25)		; data to the staging register
    581	shladd		arg0,2,%r0,%r1	; %r1 = 4 * RDR number
    582	blr		    %r1,%r0	; branch to 8-instruction sequence
    583	nop
    584
    585	;
    586	; RDR 0 write sequence
    587	;
    588	sync				; RDR 0 write sequence
    589	ssm		0,0
    590	STDIAG		(0)
    591	ssm		0,0
    592	b,n         perf_rdr_shift_out_W_leave
    593	nop
    594	ssm		0,0
    595	nop
    596
    597	;
    598	; RDR 1 write sequence
    599	;
    600	sync
    601	ssm		0,0
    602	STDIAG		(1)
    603	ssm		0,0
    604	b,n         perf_rdr_shift_out_W_leave
    605	nop
    606	ssm		0,0
    607	nop
    608
    609	;
    610	; RDR 2 write sequence
    611	;
    612	sync
    613	ssm		0,0
    614	STDIAG		(2)
    615	ssm		0,0
    616	b,n         perf_rdr_shift_out_W_leave
    617	nop
    618	ssm		0,0
    619	nop
    620
    621	;
    622	; RDR 3 write sequence
    623	;
    624	sync
    625	ssm		0,0
    626	STDIAG		(3)
    627	ssm		0,0
    628	b,n         perf_rdr_shift_out_W_leave
    629	nop
    630	ssm		0,0
    631	nop
    632
    633	;
    634	; RDR 4 write sequence
    635	;
    636	sync
    637	ssm		0,0
    638	STDIAG		(4)
    639	ssm		0,0
    640	b,n         perf_rdr_shift_out_W_leave
    641	nop
    642	ssm		0,0
    643	nop
    644
    645	;
    646	; RDR 5 write sequence
    647	;
    648	sync
    649	ssm		0,0
    650	STDIAG		(5)
    651	ssm		0,0
    652	b,n         perf_rdr_shift_out_W_leave
    653	nop
    654	ssm		0,0
    655	nop
    656
    657	;
    658	; RDR 6 write sequence
    659	;
    660	sync
    661	ssm		0,0
    662	STDIAG		(6)
    663	ssm		0,0
    664	b,n         perf_rdr_shift_out_W_leave
    665	nop
    666	ssm		0,0
    667	nop
    668
    669	;
    670	; RDR 7 write sequence
    671	;
    672	sync
    673	ssm		0,0
    674	STDIAG		(7)
    675	ssm		0,0
    676	b,n         perf_rdr_shift_out_W_leave
    677	nop
    678	ssm		0,0
    679	nop
    680
    681	;
    682	; RDR 8 write sequence
    683	;
    684	sync
    685	ssm		0,0
    686	STDIAG		(8)
    687	ssm		0,0
    688	b,n         perf_rdr_shift_out_W_leave
    689	nop
    690	ssm		0,0
    691	nop
    692
    693	;
    694	; RDR 9 write sequence
    695	;
    696	sync
    697	ssm		0,0
    698	STDIAG		(9)
    699	ssm		0,0
    700	b,n         perf_rdr_shift_out_W_leave
    701	nop
    702	ssm		0,0
    703	nop
    704
    705	;
    706	; RDR 10 write sequence
    707	;
    708	sync
    709	ssm		0,0
    710	STDIAG		(10)
    711	STDIAG		(26)
    712	ssm		0,0
    713	b,n         perf_rdr_shift_out_W_leave
    714	ssm		0,0
    715	nop
    716
    717	;
    718	; RDR 11 write sequence
    719	;
    720	sync
    721	ssm		0,0
    722	STDIAG		(11)
    723	STDIAG		(27)
    724	ssm		0,0
    725	b,n         perf_rdr_shift_out_W_leave
    726	ssm		0,0
    727	nop
    728
    729	;
    730	; RDR 12 write sequence
    731	;
    732	sync
    733	ssm		0,0
    734	STDIAG		(12)
    735	ssm		0,0
    736	b,n         perf_rdr_shift_out_W_leave
    737	nop
    738	ssm		0,0
    739	nop
    740
    741	;
    742	; RDR 13 write sequence
    743	;
    744	sync
    745	ssm		0,0
    746	STDIAG		(13)
    747	ssm		0,0
    748	b,n         perf_rdr_shift_out_W_leave
    749	nop
    750	ssm		0,0
    751	nop
    752
    753	;
    754	; RDR 14 write sequence
    755	;
    756	sync
    757	ssm		0,0
    758	STDIAG		(14)
    759	ssm		0,0
    760	b,n         perf_rdr_shift_out_W_leave
    761	nop
    762	ssm		0,0
    763	nop
    764
    765	;
    766	; RDR 15 write sequence
    767	;
    768	sync
    769	ssm		0,0
    770	STDIAG		(15)
    771	ssm		0,0
    772	b,n         perf_rdr_shift_out_W_leave
    773	nop
    774	ssm		0,0
    775	nop
    776
    777	;
    778	; RDR 16 write sequence
    779	;
    780	sync
    781	ssm		0,0
    782	STDIAG		(16)
    783	ssm		0,0
    784	b,n         perf_rdr_shift_out_W_leave
    785	nop
    786	ssm		0,0
    787	nop
    788
    789	;
    790	; RDR 17 write sequence
    791	;
    792	sync
    793	ssm		0,0
    794	STDIAG		(17)
    795	ssm		0,0
    796	b,n         perf_rdr_shift_out_W_leave
    797	nop
    798	ssm		0,0
    799	nop
    800
    801	;
    802	; RDR 18 write sequence
    803	;
    804	sync
    805	ssm		0,0
    806	STDIAG		(18)
    807	ssm		0,0
    808	b,n         perf_rdr_shift_out_W_leave
    809	nop
    810	ssm		0,0
    811	nop
    812
    813	;
    814	; RDR 19 write sequence
    815	;
    816	sync
    817	ssm		0,0
    818	STDIAG		(19)
    819	ssm		0,0
    820	b,n         perf_rdr_shift_out_W_leave
    821	nop
    822	ssm		0,0
    823	nop
    824
    825	;
    826	; RDR 20 write sequence
    827	;
    828	sync
    829	ssm		0,0
    830	STDIAG		(20)
    831	ssm		0,0
    832	b,n         perf_rdr_shift_out_W_leave
    833	nop
    834	ssm		0,0
    835	nop
    836
    837	;
    838	; RDR 21 write sequence
    839	;
    840	sync
    841	ssm		0,0
    842	STDIAG		(21)
    843	ssm		0,0
    844	b,n         perf_rdr_shift_out_W_leave
    845	nop
    846	ssm		0,0
    847	nop
    848
    849	;
    850	; RDR 22 write sequence
    851	;
    852	sync
    853	ssm		0,0
    854	STDIAG		(22)
    855	ssm		0,0
    856	b,n         perf_rdr_shift_out_W_leave
    857	nop
    858	ssm		0,0
    859	nop
    860
    861	;
    862	; RDR 23 write sequence
    863	;
    864	sync
    865	ssm		0,0
    866	STDIAG		(23)
    867	ssm		0,0
    868	b,n         perf_rdr_shift_out_W_leave
    869	nop
    870	ssm		0,0
    871	nop
    872
    873	;
    874	; RDR 24 write sequence
    875	;
    876	sync
    877	ssm		0,0
    878	STDIAG		(24)
    879	ssm		0,0
    880	b,n         perf_rdr_shift_out_W_leave
    881	nop
    882	ssm		0,0
    883	nop
    884
    885	;
    886	; RDR 25 write sequence
    887	;
    888	sync
    889	ssm		0,0
    890	STDIAG		(25)
    891	ssm		0,0
    892	b,n         perf_rdr_shift_out_W_leave
    893	nop
    894	ssm		0,0
    895	nop
    896
    897	;
    898	; RDR 26 write sequence
    899	;
    900	sync
    901	ssm		0,0
    902	STDIAG		(10)
    903	STDIAG		(26)
    904	ssm		0,0
    905	b,n         perf_rdr_shift_out_W_leave
    906	ssm		0,0
    907	nop
    908
    909	;
    910	; RDR 27 write sequence
    911	;
    912	sync
    913	ssm		0,0
    914	STDIAG		(11)
    915	STDIAG		(27)
    916	ssm		0,0
    917	b,n         perf_rdr_shift_out_W_leave
    918	ssm		0,0
    919	nop
    920
    921	;
    922	; RDR 28 write sequence
    923	;
    924	sync
    925	ssm		0,0
    926	STDIAG		(28)
    927	ssm		0,0
    928	b,n         perf_rdr_shift_out_W_leave
    929	nop
    930	ssm		0,0
    931	nop
    932
    933	;
    934	; RDR 29 write sequence
    935	;
    936	sync
    937	ssm		0,0
    938	STDIAG		(29)
    939	ssm		0,0
    940	b,n         perf_rdr_shift_out_W_leave
    941	nop
    942	ssm		0,0
    943	nop
    944
    945	;
    946	; RDR 30 write sequence
    947	;
    948	sync
    949	ssm		0,0
    950	STDIAG		(30)
    951	ssm		0,0
    952	b,n         perf_rdr_shift_out_W_leave
    953	nop
    954	ssm		0,0
    955	nop
    956
    957	;
    958	; RDR 31 write sequence
    959	;
    960	sync
    961	ssm		0,0
    962	STDIAG		(31)
    963	ssm		0,0
    964	b,n         perf_rdr_shift_out_W_leave
    965	nop
    966	ssm		0,0
    967	nop
    968
    969perf_rdr_shift_out_W_leave:
    970	bve		(%r2)
    971	.exit
    972	MTDIAG_2	(23)			; restore DR2
    973	.procend
    974ENDPROC(perf_rdr_shift_out_W)
    975
    976
    977;***********************************************************************
    978;*
    979;* Name: rdr_shift_in_U
    980;*
    981;* Description:
    982;*	This routine shifts data in from the RDR in arg0 and returns
    983;*	the result in ret0.  If the RDR is <= 64 bits in length, it
    984;*	is shifted shifted backup immediately.  This is to compensate
    985;*	for RDR10 which has bits that preclude PDC stack operations
    986;*	when they are in the wrong state.
    987;*
    988;* Arguments:
    989;*	arg0 : rdr to be read
    990;*	arg1 : bit length of rdr
    991;*
    992;* Returns:
    993;*	ret0 = next 64 bits of rdr data from staging register
    994;*
    995;* Register usage:
    996;*	arg0 : rdr to be read						                        
    997;*	arg1 : bit length of rdr					                        
    998;*	%r24 - original DR2 value
    999;*	%r23 - DR2 | DR2_SLOW_RET
   1000;*	%r1  - scratch
   1001;*
   1002;***********************************************************************
   1003
   1004ENTRY(perf_rdr_shift_in_U)
   1005	.proc
   1006	.callinfo frame=0,NO_CALLS
   1007	.entry
   1008
   1009; read(shift in) the RDR.
   1010;
   1011; NOTE: The PCX-U ERS states that DR2_SLOW_RET must be set before any
   1012; shifting is done, from or to, remote diagnose registers.
   1013
   1014	depdi,z		1,DR2_SLOW_RET,1,%r29
   1015	MFDIAG_2	(24)
   1016	or			%r24,%r29,%r29
   1017	MTDIAG_2	(29)			; set DR2_SLOW_RET
   1018
   1019	nop
   1020	nop
   1021	nop
   1022	nop
   1023
   1024;
   1025; Start of next 32-byte cacheline
   1026;
   1027	nop
   1028	nop
   1029	nop
   1030	extrd,u		arg1,63,6,%r1
   1031
   1032	mtsar		%r1
   1033	shladd		arg0,2,%r0,%r1	; %r1 = 4 * RDR number
   1034	blr 		%r1,%r0		; branch to 8-instruction sequence
   1035	nop
   1036
   1037;
   1038; Start of next 32-byte cacheline
   1039;
   1040	SFDIAG		(0)		; RDR 0 read sequence
   1041	ssm		0,0
   1042	MFDIAG_1	(28)
   1043	shrpd		ret0,%r0,%sar,%r1
   1044	MTDIAG_1	(1)
   1045	STDIAG		(0)
   1046	ssm		0,0
   1047	b,n         perf_rdr_shift_in_U_leave
   1048
   1049	SFDIAG		(1)		; RDR 1 read sequence
   1050	ssm		0,0
   1051	MFDIAG_1	(28)
   1052	shrpd		ret0,%r0,%sar,%r1
   1053	MTDIAG_1	(1)
   1054	STDIAG		(1)
   1055	ssm		0,0
   1056	b,n         perf_rdr_shift_in_U_leave
   1057
   1058	sync				; RDR 2 read sequence
   1059	ssm		0,0
   1060	SFDIAG		(4)
   1061	ssm		0,0
   1062	MFDIAG_1	(28)
   1063	b,n         perf_rdr_shift_in_U_leave
   1064	ssm		0,0
   1065	nop
   1066
   1067	sync				; RDR 3 read sequence
   1068	ssm		0,0
   1069	SFDIAG		(3)
   1070	ssm		0,0
   1071	MFDIAG_1	(28)
   1072	b,n         perf_rdr_shift_in_U_leave
   1073	ssm		0,0
   1074	nop
   1075
   1076	sync				; RDR 4 read sequence
   1077	ssm		0,0
   1078	SFDIAG		(4)
   1079	ssm		0,0
   1080	MFDIAG_1	(28)
   1081	b,n         perf_rdr_shift_in_U_leave
   1082	ssm		0,0
   1083	nop
   1084
   1085	sync				; RDR 5 read sequence
   1086	ssm		0,0
   1087	SFDIAG		(5)
   1088	ssm		0,0
   1089	MFDIAG_1	(28)
   1090	b,n         perf_rdr_shift_in_U_leave
   1091	ssm		0,0
   1092	nop
   1093
   1094	sync				; RDR 6 read sequence
   1095	ssm		0,0
   1096	SFDIAG		(6)
   1097	ssm		0,0
   1098	MFDIAG_1	(28)
   1099	b,n         perf_rdr_shift_in_U_leave
   1100	ssm		0,0
   1101	nop
   1102
   1103	sync				; RDR 7 read sequence
   1104	ssm		0,0
   1105	SFDIAG		(7)
   1106	ssm		0,0
   1107	MFDIAG_1	(28)
   1108	b,n         perf_rdr_shift_in_U_leave
   1109	ssm		0,0
   1110	nop
   1111
   1112	b,n         perf_rdr_shift_in_U_leave
   1113	nop
   1114	nop
   1115	nop
   1116	nop
   1117	nop
   1118	nop
   1119	nop
   1120
   1121	SFDIAG		(9)		; RDR 9 read sequence
   1122	ssm		0,0
   1123	MFDIAG_1	(28)
   1124	shrpd		ret0,%r0,%sar,%r1
   1125	MTDIAG_1	(1)
   1126	STDIAG		(9)
   1127	ssm		0,0
   1128	b,n         perf_rdr_shift_in_U_leave
   1129
   1130	SFDIAG		(10)		; RDR 10 read sequence
   1131	ssm		0,0
   1132	MFDIAG_1	(28)
   1133	shrpd		ret0,%r0,%sar,%r1
   1134	MTDIAG_1	(1)
   1135	STDIAG		(10)
   1136	ssm		0,0
   1137	b,n         perf_rdr_shift_in_U_leave
   1138
   1139	SFDIAG		(11)		; RDR 11 read sequence
   1140	ssm		0,0
   1141	MFDIAG_1	(28)
   1142	shrpd		ret0,%r0,%sar,%r1
   1143	MTDIAG_1	(1)
   1144	STDIAG		(11)
   1145	ssm		0,0
   1146	b,n         perf_rdr_shift_in_U_leave
   1147
   1148	SFDIAG		(12)		; RDR 12 read sequence
   1149	ssm		0,0
   1150	MFDIAG_1	(28)
   1151	shrpd		ret0,%r0,%sar,%r1
   1152	MTDIAG_1	(1)
   1153	STDIAG		(12)
   1154	ssm		0,0
   1155	b,n         perf_rdr_shift_in_U_leave
   1156
   1157	SFDIAG		(13)		; RDR 13 read sequence
   1158	ssm		0,0
   1159	MFDIAG_1	(28)
   1160	shrpd		ret0,%r0,%sar,%r1
   1161	MTDIAG_1	(1)
   1162	STDIAG		(13)
   1163	ssm		0,0
   1164	b,n         perf_rdr_shift_in_U_leave
   1165
   1166	SFDIAG		(14)		; RDR 14 read sequence
   1167	ssm		0,0
   1168	MFDIAG_1	(28)
   1169	shrpd		ret0,%r0,%sar,%r1
   1170	MTDIAG_1	(1)
   1171	STDIAG		(14)
   1172	ssm		0,0
   1173	b,n         perf_rdr_shift_in_U_leave
   1174
   1175	SFDIAG		(15)		; RDR 15 read sequence
   1176	ssm		0,0
   1177	MFDIAG_1	(28)
   1178	shrpd		ret0,%r0,%sar,%r1
   1179	MTDIAG_1	(1)
   1180	STDIAG		(15)
   1181	ssm		0,0
   1182	b,n         perf_rdr_shift_in_U_leave
   1183
   1184	sync				; RDR 16 read sequence
   1185	ssm		0,0
   1186	SFDIAG		(16)
   1187	ssm		0,0
   1188	MFDIAG_1	(28)
   1189	b,n         perf_rdr_shift_in_U_leave
   1190	ssm		0,0
   1191	nop
   1192
   1193	SFDIAG		(17)		; RDR 17 read sequence
   1194	ssm		0,0
   1195	MFDIAG_1	(28)
   1196	shrpd		ret0,%r0,%sar,%r1
   1197	MTDIAG_1	(1)
   1198	STDIAG		(17)
   1199	ssm		0,0
   1200	b,n         perf_rdr_shift_in_U_leave
   1201
   1202	SFDIAG		(18)		; RDR 18 read sequence
   1203	ssm		0,0
   1204	MFDIAG_1	(28)
   1205	shrpd		ret0,%r0,%sar,%r1
   1206	MTDIAG_1	(1)
   1207	STDIAG		(18)
   1208	ssm		0,0
   1209	b,n         perf_rdr_shift_in_U_leave
   1210
   1211	b,n         perf_rdr_shift_in_U_leave
   1212	nop
   1213	nop
   1214	nop
   1215	nop
   1216	nop
   1217	nop
   1218	nop
   1219
   1220	sync				; RDR 20 read sequence
   1221	ssm		0,0
   1222	SFDIAG		(20)
   1223	ssm		0,0
   1224	MFDIAG_1	(28)
   1225	b,n         perf_rdr_shift_in_U_leave
   1226	ssm		0,0
   1227	nop
   1228
   1229	sync				; RDR 21 read sequence
   1230	ssm		0,0
   1231	SFDIAG		(21)
   1232	ssm		0,0
   1233	MFDIAG_1	(28)
   1234	b,n         perf_rdr_shift_in_U_leave
   1235	ssm		0,0
   1236	nop
   1237
   1238	sync				; RDR 22 read sequence
   1239	ssm		0,0
   1240	SFDIAG		(22)
   1241	ssm		0,0
   1242	MFDIAG_1	(28)
   1243	b,n         perf_rdr_shift_in_U_leave
   1244	ssm		0,0
   1245	nop
   1246
   1247	sync				; RDR 23 read sequence
   1248	ssm		0,0
   1249	SFDIAG		(23)
   1250	ssm		0,0
   1251	MFDIAG_1	(28)
   1252	b,n         perf_rdr_shift_in_U_leave
   1253	ssm		0,0
   1254	nop
   1255
   1256	sync				; RDR 24 read sequence
   1257	ssm		0,0
   1258	SFDIAG		(24)
   1259	ssm		0,0
   1260	MFDIAG_1	(28)
   1261	b,n         perf_rdr_shift_in_U_leave
   1262	ssm		0,0
   1263	nop
   1264
   1265	sync				; RDR 25 read sequence
   1266	ssm		0,0
   1267	SFDIAG		(25)
   1268	ssm		0,0
   1269	MFDIAG_1	(28)
   1270	b,n         perf_rdr_shift_in_U_leave
   1271	ssm		0,0
   1272	nop
   1273
   1274	SFDIAG		(26)		; RDR 26 read sequence
   1275	ssm		0,0
   1276	MFDIAG_1	(28)
   1277	shrpd		ret0,%r0,%sar,%r1
   1278	MTDIAG_1	(1)
   1279	STDIAG		(26)
   1280	ssm		0,0
   1281	b,n         perf_rdr_shift_in_U_leave
   1282
   1283	SFDIAG		(27)		; RDR 27 read sequence
   1284	ssm		0,0
   1285	MFDIAG_1	(28)
   1286	shrpd		ret0,%r0,%sar,%r1
   1287	MTDIAG_1	(1)
   1288	STDIAG		(27)
   1289	ssm		0,0
   1290	b,n         perf_rdr_shift_in_U_leave
   1291
   1292	sync				; RDR 28 read sequence
   1293	ssm		0,0
   1294	SFDIAG		(28)
   1295	ssm		0,0
   1296	MFDIAG_1	(28)
   1297	b,n         perf_rdr_shift_in_U_leave
   1298	ssm		0,0
   1299	nop
   1300
   1301	b,n         perf_rdr_shift_in_U_leave
   1302	nop
   1303	nop
   1304	nop
   1305	nop
   1306	nop
   1307	nop
   1308	nop
   1309
   1310	SFDIAG		(30)		; RDR 30 read sequence
   1311	ssm		0,0
   1312	MFDIAG_1	(28)
   1313	shrpd		ret0,%r0,%sar,%r1
   1314	MTDIAG_1	(1)
   1315	STDIAG		(30)
   1316	ssm		0,0
   1317	b,n         perf_rdr_shift_in_U_leave
   1318
   1319	SFDIAG		(31)		; RDR 31 read sequence
   1320	ssm		0,0
   1321	MFDIAG_1	(28)
   1322	shrpd		ret0,%r0,%sar,%r1
   1323	MTDIAG_1	(1)
   1324	STDIAG		(31)
   1325	ssm		0,0
   1326	b,n         perf_rdr_shift_in_U_leave
   1327	nop
   1328
   1329perf_rdr_shift_in_U_leave:
   1330	bve		    (%r2)
   1331	.exit
   1332	MTDIAG_2	(24)			; restore DR2
   1333	.procend
   1334ENDPROC(perf_rdr_shift_in_U)
   1335
   1336;***********************************************************************
   1337;*
   1338;* Name: rdr_shift_out_U
   1339;*
   1340;* Description:
   1341;*	This routine moves data to the RDR's.  The double-word that
   1342;*	arg1 points to is loaded and moved into the staging register.
   1343;*	Then the STDIAG instruction for the RDR # in arg0 is called
   1344;*	to move the data to the RDR.
   1345;*
   1346;* Arguments:
   1347;*	arg0 = rdr target
   1348;*	arg1 = buffer pointer
   1349;*
   1350;* Returns:
   1351;*	None
   1352;*
   1353;* Register usage:
   1354;*	arg0 = rdr target
   1355;*	arg1 = buffer pointer
   1356;*	%r24 - DR2 | DR2_SLOW_RET
   1357;*	%r23 - original DR2 value
   1358;*
   1359;***********************************************************************
   1360
   1361ENTRY(perf_rdr_shift_out_U)
   1362	.proc
   1363	.callinfo frame=0,NO_CALLS
   1364	.entry
   1365
   1366;
   1367; NOTE: The PCX-U ERS states that DR2_SLOW_RET must be set before any
   1368; shifting is done, from or to, the remote diagnose registers.
   1369;
   1370
   1371	depdi,z		1,DR2_SLOW_RET,1,%r24
   1372	MFDIAG_2	(23)
   1373	or		%r24,%r23,%r24
   1374	MTDIAG_2	(24)		; set DR2_SLOW_RET
   1375
   1376	MTDIAG_1	(25)		; data to the staging register
   1377	shladd		arg0,2,%r0,%r1	; %r1 = 4 * RDR number
   1378	blr		%r1,%r0		; branch to 8-instruction sequence
   1379	nop
   1380
   1381;
   1382; 32-byte cachline aligned
   1383;
   1384
   1385	sync				; RDR 0 write sequence
   1386	ssm		0,0
   1387	STDIAG		(0)
   1388	ssm		0,0
   1389	b,n         perf_rdr_shift_out_U_leave
   1390	nop
   1391	ssm		0,0
   1392	nop
   1393
   1394	sync				; RDR 1 write sequence
   1395	ssm		0,0
   1396	STDIAG		(1)
   1397	ssm		0,0
   1398	b,n         perf_rdr_shift_out_U_leave
   1399	nop
   1400	ssm		0,0
   1401	nop
   1402
   1403	sync				; RDR 2 write sequence
   1404	ssm		0,0
   1405	STDIAG		(2)
   1406	ssm		0,0
   1407	b,n         perf_rdr_shift_out_U_leave
   1408	nop
   1409	ssm		0,0
   1410	nop
   1411
   1412	sync				; RDR 3 write sequence
   1413	ssm		0,0
   1414	STDIAG		(3)
   1415	ssm		0,0
   1416	b,n         perf_rdr_shift_out_U_leave
   1417	nop
   1418	ssm		0,0
   1419	nop
   1420
   1421	sync				; RDR 4 write sequence
   1422	ssm		0,0
   1423	STDIAG		(4)
   1424	ssm		0,0
   1425	b,n         perf_rdr_shift_out_U_leave
   1426	nop
   1427	ssm		0,0
   1428	nop
   1429
   1430	sync				; RDR 5 write sequence
   1431	ssm		0,0
   1432	STDIAG		(5)
   1433	ssm		0,0
   1434	b,n         perf_rdr_shift_out_U_leave
   1435	nop
   1436	ssm		0,0
   1437	nop
   1438
   1439	sync				; RDR 6 write sequence
   1440	ssm		0,0
   1441	STDIAG		(6)
   1442	ssm		0,0
   1443	b,n         perf_rdr_shift_out_U_leave
   1444	nop
   1445	ssm		0,0
   1446	nop
   1447
   1448	sync				; RDR 7 write sequence
   1449	ssm		0,0
   1450	STDIAG		(7)
   1451	ssm		0,0
   1452	b,n         perf_rdr_shift_out_U_leave
   1453	nop
   1454	ssm		0,0
   1455	nop
   1456
   1457	sync				; RDR 8 write sequence
   1458	ssm		0,0
   1459	STDIAG		(8)
   1460	ssm		0,0
   1461	b,n         perf_rdr_shift_out_U_leave
   1462	nop
   1463	ssm		0,0
   1464	nop
   1465
   1466	sync				; RDR 9 write sequence
   1467	ssm		0,0
   1468	STDIAG		(9)
   1469	ssm		0,0
   1470	b,n         perf_rdr_shift_out_U_leave
   1471	nop
   1472	ssm		0,0
   1473	nop
   1474
   1475	sync				; RDR 10 write sequence
   1476	ssm		0,0
   1477	STDIAG		(10)
   1478	ssm		0,0
   1479	b,n         perf_rdr_shift_out_U_leave
   1480	nop
   1481	ssm		0,0
   1482	nop
   1483
   1484	sync				; RDR 11 write sequence
   1485	ssm		0,0
   1486	STDIAG		(11)
   1487	ssm		0,0
   1488	b,n         perf_rdr_shift_out_U_leave
   1489	nop
   1490	ssm		0,0
   1491	nop
   1492
   1493	sync				; RDR 12 write sequence
   1494	ssm		0,0
   1495	STDIAG		(12)
   1496	ssm		0,0
   1497	b,n         perf_rdr_shift_out_U_leave
   1498	nop
   1499	ssm		0,0
   1500	nop
   1501
   1502	sync				; RDR 13 write sequence
   1503	ssm		0,0
   1504	STDIAG		(13)
   1505	ssm		0,0
   1506	b,n         perf_rdr_shift_out_U_leave
   1507	nop
   1508	ssm		0,0
   1509	nop
   1510
   1511	sync				; RDR 14 write sequence
   1512	ssm		0,0
   1513	STDIAG		(14)
   1514	ssm		0,0
   1515	b,n         perf_rdr_shift_out_U_leave
   1516	nop
   1517	ssm		0,0
   1518	nop
   1519
   1520	sync				; RDR 15 write sequence
   1521	ssm		0,0
   1522	STDIAG		(15)
   1523	ssm		0,0
   1524	b,n         perf_rdr_shift_out_U_leave
   1525	nop
   1526	ssm		0,0
   1527	nop
   1528
   1529	sync				; RDR 16 write sequence
   1530	ssm		0,0
   1531	STDIAG		(16)
   1532	ssm		0,0
   1533	b,n         perf_rdr_shift_out_U_leave
   1534	nop
   1535	ssm		0,0
   1536	nop
   1537
   1538	sync				; RDR 17 write sequence
   1539	ssm		0,0
   1540	STDIAG		(17)
   1541	ssm		0,0
   1542	b,n         perf_rdr_shift_out_U_leave
   1543	nop
   1544	ssm		0,0
   1545	nop
   1546
   1547	sync				; RDR 18 write sequence
   1548	ssm		0,0
   1549	STDIAG		(18)
   1550	ssm		0,0
   1551	b,n         perf_rdr_shift_out_U_leave
   1552	nop
   1553	ssm		0,0
   1554	nop
   1555
   1556	sync				; RDR 19 write sequence
   1557	ssm		0,0
   1558	STDIAG		(19)
   1559	ssm		0,0
   1560	b,n         perf_rdr_shift_out_U_leave
   1561	nop
   1562	ssm		0,0
   1563	nop
   1564
   1565	sync				; RDR 20 write sequence
   1566	ssm		0,0
   1567	STDIAG		(20)
   1568	ssm		0,0
   1569	b,n         perf_rdr_shift_out_U_leave
   1570	nop
   1571	ssm		0,0
   1572	nop
   1573
   1574	sync				; RDR 21 write sequence
   1575	ssm		0,0
   1576	STDIAG		(21)
   1577	ssm		0,0
   1578	b,n         perf_rdr_shift_out_U_leave
   1579	nop
   1580	ssm		0,0
   1581	nop
   1582
   1583	sync				; RDR 22 write sequence
   1584	ssm		0,0
   1585	STDIAG		(22)
   1586	ssm		0,0
   1587	b,n         perf_rdr_shift_out_U_leave
   1588	nop
   1589	ssm		0,0
   1590	nop
   1591
   1592	sync				; RDR 23 write sequence
   1593	ssm		0,0
   1594	STDIAG		(23)
   1595	ssm		0,0
   1596	b,n         perf_rdr_shift_out_U_leave
   1597	nop
   1598	ssm		0,0
   1599	nop
   1600
   1601	sync				; RDR 24 write sequence
   1602	ssm		0,0
   1603	STDIAG		(24)
   1604	ssm		0,0
   1605	b,n         perf_rdr_shift_out_U_leave
   1606	nop
   1607	ssm		0,0
   1608	nop
   1609
   1610	sync				; RDR 25 write sequence
   1611	ssm		0,0
   1612	STDIAG		(25)
   1613	ssm		0,0
   1614	b,n         perf_rdr_shift_out_U_leave
   1615	nop
   1616	ssm		0,0
   1617	nop
   1618
   1619	sync				; RDR 26 write sequence
   1620	ssm		0,0
   1621	STDIAG		(26)
   1622	ssm		0,0
   1623	b,n         perf_rdr_shift_out_U_leave
   1624	nop
   1625	ssm		0,0
   1626	nop
   1627
   1628	sync				; RDR 27 write sequence
   1629	ssm		0,0
   1630	STDIAG		(27)
   1631	ssm		0,0
   1632	b,n         perf_rdr_shift_out_U_leave
   1633	nop
   1634	ssm		0,0
   1635	nop
   1636
   1637	sync				; RDR 28 write sequence
   1638	ssm		0,0
   1639	STDIAG		(28)
   1640	ssm		0,0
   1641	b,n         perf_rdr_shift_out_U_leave
   1642	nop
   1643	ssm		0,0
   1644	nop
   1645
   1646	sync				; RDR 29 write sequence
   1647	ssm		0,0
   1648	STDIAG		(29)
   1649	ssm		0,0
   1650	b,n         perf_rdr_shift_out_U_leave
   1651	nop
   1652	ssm		0,0
   1653	nop
   1654
   1655	sync				; RDR 30 write sequence
   1656	ssm		0,0
   1657	STDIAG		(30)
   1658	ssm		0,0
   1659	b,n         perf_rdr_shift_out_U_leave
   1660	nop
   1661	ssm		0,0
   1662	nop
   1663
   1664	sync				; RDR 31 write sequence
   1665	ssm		0,0
   1666	STDIAG		(31)
   1667	ssm		0,0
   1668	b,n         perf_rdr_shift_out_U_leave
   1669	nop
   1670	ssm		0,0
   1671	nop
   1672
   1673perf_rdr_shift_out_U_leave:
   1674	bve		(%r2)
   1675	.exit
   1676	MTDIAG_2	(23)			; restore DR2
   1677	.procend
   1678ENDPROC(perf_rdr_shift_out_U)
   1679