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

fp_cond.S (5656B)


      1/*
      2 * fp_cond.S
      3 *
      4 * Copyright Roman Zippel, 1997.  All rights reserved.
      5 *
      6 * Redistribution and use in source and binary forms, with or without
      7 * modification, are permitted provided that the following conditions
      8 * are met:
      9 * 1. Redistributions of source code must retain the above copyright
     10 *    notice, and the entire permission notice in its entirety,
     11 *    including the disclaimer of warranties.
     12 * 2. Redistributions in binary form must reproduce the above copyright
     13 *    notice, this list of conditions and the following disclaimer in the
     14 *    documentation and/or other materials provided with the distribution.
     15 * 3. The name of the author may not be used to endorse or promote
     16 *    products derived from this software without specific prior
     17 *    written permission.
     18 *
     19 * ALTERNATIVELY, this product may be distributed under the terms of
     20 * the GNU General Public License, in which case the provisions of the GPL are
     21 * required INSTEAD OF the above restrictions.  (This clause is
     22 * necessary due to a potential bad interaction between the GPL and
     23 * the restrictions contained in a BSD-style copyright.)
     24 *
     25 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
     26 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     27 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     28 * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
     29 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     30 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     33 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
     35 * OF THE POSSIBILITY OF SUCH DAMAGE.
     36 */
     37
     38#include "fp_emu.h"
     39#include "fp_decode.h"
     40
     41	.globl	fp_fscc, fp_fbccw, fp_fbccl
     42
     43#ifdef FPU_EMU_DEBUG
     44fp_fnop:
     45	printf	PDECODE,"fnop\n"
     46	jra	fp_end
     47#else
     48#define fp_fnop fp_end
     49#endif
     50
     51fp_fbccw:
     52	tst.w	%d2
     53	jeq	fp_fnop
     54	printf	PDECODE,"fbccw "
     55	fp_get_pc %a0
     56	lea	(-2,%a0,%d2.w),%a0
     57	jra	1f
     58
     59fp_fbccl:
     60	printf	PDECODE,"fbccl "
     61	fp_get_pc %a0
     62	move.l	%d2,%d0
     63	swap	%d0
     64	fp_get_instr_word %d0,fp_err_ua1
     65	lea	(-2,%a0,%d0.l),%a0
     661:	printf	PDECODE,"%x",1,%a0
     67	move.l	%d2,%d0
     68	swap	%d0
     69	jsr	fp_compute_cond
     70	tst.l	%d0
     71	jeq	1f
     72	fp_put_pc %a0,1
     731:	printf	PDECODE,"\n"
     74	jra	fp_end
     75
     76fp_fdbcc:
     77	printf	PDECODE,"fdbcc "
     78	fp_get_pc %a1				| calculate new pc
     79	fp_get_instr_word %d0,fp_err_ua1
     80	add.w	%d0,%a1
     81	fp_decode_addr_reg
     82	printf	PDECODE,"d%d,%x\n",2,%d0,%a1
     83	swap	%d1				| test condition in %d1
     84	tst.w	%d1
     85	jne	2f
     86	move.l	%d0,%d1
     87	jsr	fp_get_data_reg
     88	subq.w	#1,%d0
     89	jcs	1f
     90	fp_put_pc %a1,1
     911:	jsr	fp_put_data_reg
     922:	jra	fp_end
     93
     94| set flags for decode macros for fs<cc>
     95do_fscc=1
     96do_no_pc_mode=1
     97
     98fp_fscc:
     99	printf	PDECODE,"fscc "
    100	move.l	%d2,%d0
    101	jsr	fp_compute_cond
    102	move.w	%d0,%d1
    103	swap	%d1
    104
    105	| decode addressing mode
    106	fp_decode_addr_mode
    107
    108	.long	fp_data, fp_fdbcc
    109	.long	fp_indirect, fp_postinc
    110	.long	fp_predecr, fp_disp16
    111	.long	fp_extmode0, fp_extmode1
    112
    113	| addressing mode: data register direct
    114fp_data:
    115	fp_mode_data_direct
    116	move.w	%d0,%d1			| save register nr
    117	jsr	fp_get_data_reg
    118	swap	%d1
    119	move.b	%d1,%d0
    120	swap	%d1
    121	jsr	fp_put_data_reg
    122	printf	PDECODE,"\n"
    123	jra	fp_end
    124
    125fp_indirect:
    126	fp_mode_addr_indirect
    127	jra	fp_do_scc
    128
    129fp_postinc:
    130	fp_mode_addr_indirect_postinc
    131	jra	fp_do_scc
    132
    133fp_predecr:
    134	fp_mode_addr_indirect_predec
    135	jra	fp_do_scc
    136
    137fp_disp16:
    138	fp_mode_addr_indirect_disp16
    139	jra	fp_do_scc
    140
    141fp_extmode0:
    142	fp_mode_addr_indirect_extmode0
    143	jra	fp_do_scc
    144
    145fp_extmode1:
    146	bfextu	%d2{#13,#3},%d0
    147	jmp	([0f:w,%pc,%d0*4])
    148
    149	.align	4
    1500:
    151	.long	fp_absolute_short, fp_absolute_long
    152	.long	fp_ill, fp_ill		| NOTE: jump here to ftrap.x
    153	.long	fp_ill, fp_ill
    154	.long	fp_ill, fp_ill
    155
    156fp_absolute_short:
    157	fp_mode_abs_short
    158	jra	fp_do_scc
    159
    160fp_absolute_long:
    161	fp_mode_abs_long
    162|	jra	fp_do_scc
    163
    164fp_do_scc:
    165	swap	%d1
    166	putuser.b %d1,(%a0),fp_err_ua1,%a0
    167	printf	PDECODE,"\n"
    168	jra	fp_end
    169
    170
    171#define tst_NAN	btst #24,%d1
    172#define tst_Z	btst #26,%d1
    173#define tst_N	btst #27,%d1
    174
    175fp_compute_cond:
    176	move.l	(FPD_FPSR,FPDATA),%d1
    177	btst	#4,%d0
    178	jeq	1f
    179	tst_NAN
    180	jeq	1f
    181	bset	#15,%d1
    182	bset	#7,%d1
    183	move.l	%d1,(FPD_FPSR,FPDATA)
    1841:	and.w	#0xf,%d0
    185	jmp	([0f:w,%pc,%d0.w*4])
    186
    187	.align	4
    1880:
    189	.long	fp_f  , fp_eq , fp_ogt, fp_oge
    190	.long	fp_olt, fp_ole, fp_ogl, fp_or
    191	.long	fp_un , fp_ueq, fp_ugt, fp_uge
    192	.long	fp_ult, fp_ule, fp_ne , fp_t
    193
    194fp_f:
    195	moveq	#0,%d0
    196	rts
    197
    198fp_eq:
    199	moveq	#0,%d0
    200	tst_Z
    201	jeq	1f
    202	moveq	#-1,%d0
    2031:	rts
    204
    205fp_ogt:
    206	moveq	#0,%d0
    207	tst_NAN
    208	jne	1f
    209	tst_Z
    210	jne	1f
    211	tst_N
    212	jne	1f
    213	moveq	#-1,%d0
    2141:	rts
    215
    216fp_oge:
    217	moveq	#-1,%d0
    218	tst_Z
    219	jne	2f
    220	tst_NAN
    221	jne	1f
    222	tst_N
    223	jeq	2f
    2241:	moveq	#0,%d0
    2252:	rts
    226
    227fp_olt:
    228	moveq	#0,%d0
    229	tst_NAN
    230	jne	1f
    231	tst_Z
    232	jne	1f
    233	tst_N
    234	jeq	1f
    235	moveq	#-1,%d0
    2361:	rts
    237
    238fp_ole:
    239	moveq	#-1,%d0
    240	tst_Z
    241	jne	2f
    242	tst_NAN
    243	jne	1f
    244	tst_N
    245	jne	2f
    2461:	moveq	#0,%d0
    2472:	rts
    248
    249fp_ogl:
    250	moveq	#0,%d0
    251	tst_NAN
    252	jne	1f
    253	tst_Z
    254	jne	1f
    255	moveq	#-1,%d0
    2561:	rts
    257
    258fp_or:
    259	moveq	#0,%d0
    260	tst_NAN
    261	jne	1f
    262	moveq	#-1,%d0
    2631:	rts
    264
    265fp_un:
    266	moveq	#0,%d0
    267	tst_NAN
    268	jeq	1f
    269	moveq	#-1,%d0
    270	rts
    271
    272fp_ueq:
    273	moveq	#-1,%d0
    274	tst_NAN
    275	jne	1f
    276	tst_Z
    277	jne	1f
    278	moveq	#0,%d0
    2791:	rts
    280
    281fp_ugt:
    282	moveq	#-1,%d0
    283	tst_NAN
    284	jne	2f
    285	tst_N
    286	jne	1f
    287	tst_Z
    288	jeq	2f
    2891:	moveq	#0,%d0
    2902:	rts
    291
    292fp_uge:
    293	moveq	#-1,%d0
    294	tst_NAN
    295	jne	1f
    296	tst_Z
    297	jne	1f
    298	tst_N
    299	jeq	1f
    300	moveq	#0,%d0
    3011:	rts
    302
    303fp_ult:
    304	moveq	#-1,%d0
    305	tst_NAN
    306	jne	2f
    307	tst_Z
    308	jne	1f
    309	tst_N
    310	jne	2f
    3111:	moveq	#0,%d0
    3122:	rts
    313
    314fp_ule:
    315	moveq	#-1,%d0
    316	tst_NAN
    317	jne	1f
    318	tst_Z
    319	jne	1f
    320	tst_N
    321	jne	1f
    322	moveq	#0,%d0
    3231:	rts
    324
    325fp_ne:
    326	moveq	#0,%d0
    327	tst_Z
    328	jne	1f
    329	moveq	#-1,%d0
    3301:	rts
    331
    332fp_t:
    333	moveq	#-1,%d0
    334	rts