ack/mach/i86/ce/EM_table

1147 lines
20 KiB
Plaintext
Raw Normal View History

1988-11-08 14:09:24 +00:00
#define PUSH_POP_OPT TRUE
/******************************************************************************/
/* */
/* Group 1 : load instructions */
/* */
/******************************************************************************/
C_loc ==> "mov ax, $1";
"push ax".
C_ldc ==> C_loc( $1>>16);
C_loc( $1).
C_lol ==> "push $1(bp)".
C_loe.. ==> "push ($1+$2)".
C_lil ==> "mov bx, $1(bp)";
"push (bx)".
C_lof ==> "pop bx";
"push $1(bx)".
C_lal ==> "lea ax, $1(bp)";
"push ax".
C_lae.. ==> "mov ax, $1+$2";
"push ax".
C_lxl
$1 == 0 ==> "push bp".
$1 == 1 ==> "push 4(bp)".
default ==> "mov cx, $1-1";
"mov bx, 4(bp)";
"1: mov bx, 4(bx)";
"loop 1b";
"push bx".
C_lxa
$1 == 0 ==> "lea ax, 4(bp)";
"push ax".
$1 == 1 ==> "mov ax, 4(bp)";
"add ax, 4";
"push ax".
default ==> "mov cx, $1-1";
"mov bx, 4(bp)";
"1: mov bx, 4(bx)";
"loop 1b";
"add bx, 4";
"push bx".
C_loi
$1 == 1 ==> "pop bx";
"xor ax, ax";
"movb al, (bx)";
"push ax".
$1 == 2 ==> "pop bx";
"push (bx)".
$1 == 4 ==> "pop bx";
"push 2(bx)";
"push (bx)".
default ==> "pop bx";
"mov cx, $1";
"call .loi".
C_los
$1 == 2 ==> "pop cx";
"pop bx";
"call .loi".
default ==> arg_error( "C_los", $1).
C_los_narg ==> "pop ax";
"cmp ax, 2";
"jne .unknown";
"pop cx";
"pop bx";
"call .loi".
C_ldl ==> "push $1+2(bp)";
"push $1(bp)".
C_lde.. ==> "push ($1+$2+2)";
"push ($1+$2)".
C_ldf ==> "pop bx";
"push $1+2(bx)";
"push $1(bx)".
C_lpi ==> "mov ax, $1";
"push ax".
/******************************************************************************/
/* */
/* Group 2 : store instructions */
/* */
/******************************************************************************/
C_stl ==> "pop $1(bp)".
C_ste.. ==> "pop ($1+$2)".
C_sil ==> "mov bx, $1(bp)";
"pop (bx)".
C_stf ==> "pop bx";
"pop $1(bx)".
C_sti
$1 == 1 ==> "pop bx";
"pop ax";
"movb (bx), al".
$1 == 2 ==> "pop bx";
"pop (bx)".
$1 == 4 ==> "pop bx";
"pop (bx)";
"pop 2(bx)".
default ==> "pop bx";
"mov cx, $1";
"call .sti".
C_sts
$1 == 2 ==> "pop cx";
"pop bx";
"call .sti".
default ==> arg_error( "C_sts", $1).
C_sts_narg ==> "pop ax";
"cmp ax, 2";
"jne .unknown";
"pop cx";
"pop bx";
"call .sti".
C_sdl ==> "pop $1(bp)";
"pop $1+2(bp)".
C_sde.. ==> "pop ($1+$2)";
"pop ($1+$2+2)".
C_sdf ==> "pop bx";
"pop $1(bx)";
"pop $1+2(bx)".
/******************************************************************************/
/* */
/* Group 3 : integer arithmetic */
/* */
/******************************************************************************/
C_adi
$1 == 2 ==> "pop ax";
"pop bx";
"add ax, bx";
"push ax".
$1 == 4 ==> "pop ax";
"pop bx";
"pop cx";
"pop dx";
"add ax, cx";
"adc bx, dx";
"push bx";
"push ax".
default ==> "pop ax";
"mov cx, $1";
"call .adi";
"push ax".
C_adi_narg ==> "pop cx";
"pop ax";
"call .adi";
"push ax".
C_sbi
$1 == 2 ==> "pop bx";
"pop ax";
"sub ax, bx";
"push ax".
$1 == 4 ==> "pop ax";
"pop bx";
"pop cx";
"pop dx";
"sub cx, ax";
"sbb dx, bx";
"push dx";
"push cx".
default ==> "pop ax";
"mov cx, $1";
"call .sbi";
"push ax".
C_sbi_narg ==> "pop cx";
"pop ax";
"call .sbi";
"push ax".
C_mli
$1 == 2 ==> "pop ax";
"pop bx";
"mul bx";
"push ax".
$1 == 4 ==> "pop ax";
"pop dx";
"call .mli4";
"push dx";
"push ax".
default ==> arg_error( "C_mli", $1).
C_mli_narg ==> "pop ax";
"call .mli".
C_dvi
$1 == 2 ==> "pop bx";
"pop ax";
"cwd";
"idiv bx";
"push ax".
$1 == 4 ==> "call .dvi4";
"push dx";
"push ax".
default ==> arg_error( "C_dvi", $1).
C_dvi_narg ==> "pop ax";
"call .dvi".
C_rmi
$1 == 2 ==> "pop bx";
"pop ax";
"cwd";
"idiv bx";
"push dx".
$1 == 4 ==> "call .rmi4";
"push dx";
"push ax".
default ==> arg_error( "C_rmi", $1).
C_rmi_narg ==> "pop ax";
"call .rmi".
C_ngi
$1 == 2 ==> "pop ax";
"neg ax";
"push ax".
$1 == 4 ==> "pop bx";
"pop ax";
"neg ax";
"neg bx";
"sbb ax, 0";
"push ax";
"push bx".
default ==> "mov ax, $1";
"call .ngi".
C_ngi_narg ==> "pop ax";
"call .ngi".
C_sli
$1 == 2 ==> "pop cx";
"pop ax";
"sal ax, cl";
"push ax".
default ==> "mov ax, $1";
"call .sli".
C_sli_narg ==> "pop ax";
"call .sli".
C_sri
$1 == 2 ==> "pop cx";
"pop ax";
"sar ax, cl";
"push ax".
default ==> "mov ax, $1";
"call .sri".
C_sri_narg ==> "pop ax";
"call .sri".
/******************************************************************************/
/* */
/* Group 4 : Unsigned arithmetic */
/* */
/******************************************************************************/
C_adu ==> C_adi( $1).
C_adu_narg ==> C_adi_narg().
C_sbu ==> C_sbi( $1).
C_sbu_narg ==> C_sbi_narg().
C_mlu ==> C_mli( $1).
C_mlu_narg ==> C_mli_narg().
C_dvu
$1 == 2 ==> "pop bx";
"pop ax";
"xor dx, dx";
"div bx";
"push ax".
$1 == 4 ==> "call .dvu4";
"push dx";
"push ax".
default ==> "mov ax, $1";
"call .dvu".
C_dvu_narg ==> "pop ax";
"call .dvu".
C_rmu
$1 == 2 ==> "pop bx";
"pop ax";
"xor dx, dx";
"div bx";
"push dx".
$1 == 4 ==> "call .dvu4";
"push dx";
"push ax".
default ==> "mov ax, $1";
"call .rmu".
C_rmu_narg ==> "pop ax";
"call .rmu".
C_slu ==> C_sli( $1).
C_slu_narg ==> C_sli_narg().
C_sru
$1 == 2 ==> "pop cx";
"pop ax";
"shr ax, cl";
"push ax".
$1 == 4 ==> "pop cx";
"pop bx";
"pop ax";
"1 : shr ax, 1";
"rcr bx, 1";
"loop 1b";
"push ax";
"push bx".
default ==> arg_error( "C_sru", $1).
/******************************************************************************/
/* */
/* Group 5 : Floating point arithmetic */
/* */
/******************************************************************************/
/******************************************************************************/
/* */
/* Group 6 : Pointer arithmetic */
/* */
/******************************************************************************/
C_adp
#ifndef PEEPHOLE_OPT
$1 == 0 ==> .
#endif
$1 == 1 ==> "pop ax";
"inc ax";
"push ax".
$1 == -1 ==> "pop ax";
"dec ax";
"push ax".
default ==> "pop ax";
"add ax, $1";
"push ax".
C_ads
$1 == 2 ==> "pop ax";
"pop bx";
"add ax, bx";
"push ax".
default ==> arg_error( "C_ads", $1).
C_ads_narg ==> "pop ax";
"cmp ax, 2";
"jne .unknown";
"pop ax";
"pop bx";
"add ax, bx";
"push ax".
C_sbs
$1 == 2 ==> "pop bx";
"pop ax";
"sub ax, bx";
"push ax".
default ==> arg_error( "C_sbs", $1).
C_sbs_narg ==> "pop ax";
"cmp ax, 2";
"jne .unknown";
"pop bx";
"pop ax";
"sub ax, bx";
"push ax".
/******************************************************************************/
/* */
/* Group 7 : Increment/decrement/zero */
/* */
/******************************************************************************/
C_inc ==> "pop ax";
"inc ax";
"push ax".
C_inl ==> "inc $1(bp)".
C_ine.. ==> "inc ($1+$2)".
C_dec ==> "pop ax";
"dec ax";
"push ax".
C_del ==> "dec $1(bp)".
C_dee.. ==> "dec ($1+$2)".
C_zrl ==> "mov $1(bp), 0".
C_zre.. ==> "mov ($1+$2), 0".
C_zer
$1 == 2 ==> "xor ax, ax";
"push ax".
$1 == 4 ==> "xor ax, ax";
"push ax";
"push ax".
$1 == 6 ==> "xor ax, ax";
"push ax";
"push ax";
"push ax".
$1 == 8 ==> "xor ax, ax";
"push ax";
"push ax";
"push ax";
"push ax".
$1 % 2 == 0 ==> "mov cx, $1/2";
"xor ax, ax";
"1: push ax";
"loop 1b".
default ==> arg_error( "C_zer", $1).
C_zer_narg ==> "pop cx";
"sar cx, 1";
"xor ax, ax";
"1: push ax";
"loop 1b".
/******************************************************************************/
/* */
/* Group 8 : Convert */
/* */
/******************************************************************************/
C_cii ==> "pop cx";
"pop dx";
"pop ax";
"call .cii";
"push ax".
C_cui ==> C_cuu().
C_ciu ==> C_cuu().
C_cuu ==> "pop cx";
"pop dx";
"pop ax";
"call .cuu";
"push ax".
/******************************************************************************/
/* */
/* Group 9 : Logical */
/* */
/******************************************************************************/
C_and
$1 == 2 ==> "pop ax";
"pop bx";
"and ax, bx";
"push ax".
$1 == 4 ==> "pop ax";
"pop bx";
"pop cx";
"pop dx";
"and ax, cx";
"and bx, dx";
"push bx";
"push ax".
default ==> "mov cx, $1";
"call .and".
C_and_narg ==> "pop cx";
"call .and".
C_ior
$1 == 2 ==> "pop ax";
"pop bx";
"or ax, bx";
"push ax".
$1 == 4 ==> "pop ax";
"pop bx";
"pop cx";
"pop dx";
"or ax, cx";
"or bx, dx";
"push bx";
"push ax".
default ==> "mov cx, $1";
"call .ior".
C_ior_narg ==> "pop cx";
"call .ior".
C_xor
$1 == 2 ==> "pop ax";
"pop bx";
"xor ax, bx";
"push ax".
$1 == 4 ==> "pop ax";
"pop bx";
"pop cx";
"pop dx";
"xor ax, cx";
"xor bx, dx";
"push bx";
"push ax".
default ==> "mov cx, $1";
"call .xor".
C_xor_narg ==> "pop cx";
"call .xor".
C_com
$1 == 2 ==> "pop ax";
"not ax";
"push ax".
$1 == 4 ==> "pop ax";
"pop bx";
"not ax";
"not bx";
"push bx";
"push ax".
default ==> "mov cx, $1";
"call .com".
C_com_narg ==> "pop cx";
"call .com".
C_rol
$1 == 2 ==> "pop cx";
"pop ax";
"rol ax, cl";
"push ax".
default ==> "mov cx, $1";
"call .rol".
C_rol_narg ==> "pop cx";
"call .rol".
C_ror
$1 == 2 ==> "pop cx";
"pop ax";
"ror ax, cl";
"push ax".
default ==> "mov cx, $1";
"call .ror".
C_ror_narg ==> "pop cx";
"call .ror".
/******************************************************************************/
/* */
/* Group 10 : Sets */
/* */
/******************************************************************************/
C_inn
$1 == 2 ==> "pop cx";
"pop ax";
"shr ax, cl";
"and ax, 1";
"push ax".
default ==> "pop ax";
"mov cx, $1";
"call .inn";
"push ax".
C_inn_narg ==> "pop cx";
"pop ax";
"call .inn";
"push ax".
C_set
$1 == 2 ==> "pop cx";
"mov ax, 1";
"shl ax, cl";
"push ax".
default ==> "pop ax";
"mov cx, $1";
"call .set".
C_set_narg ==> "pop cx";
"pop ax";
"call .set".
/******************************************************************************/
/* */
/* Group 11 : Array */
/* */
/******************************************************************************/
C_lar
$1 == 2 ==> "pop bx";
"pop ax";
"call .lar2".
default ==> arg_error( "C_lar", $1).
C_lar_narg ==> "call .ilar".
C_sar
$1 == 2 ==> "pop bx";
"pop ax";
"call .sar2".
default ==> arg_error( "C_sar", $1).
C_sar_narg ==> "call .isar".
C_aar
$1 == 2 ==> "pop bx";
"pop ax";
"pop cx";
"sub ax, (bx)";
"mul 4(bx)";
"add ax, cx";
"push ax".
default ==> arg_error( "C_aar", $1).
C_aar_narg ==> "call .iaar";
"push bx".
/******************************************************************************/
/* */
/* Group 12 : Compare */
/* */
/******************************************************************************/
C_cmi
$1 == 2 ==> /* bug : C_sbi( (arith) 2). */
"pop bx";
"pop cx";
"xor ax, ax";
"cmp cx, bx";
"je 2f";
"jl 1f";
"inc ax";
"jmp 2f";
"1: dec ax";
"2: push ax".
$1 == 4 ==> "call .cmi4";
"push ax".
default ==> arg_error( "C_cmi", $1).
C_cmu
$1 == 2 ==> C_cmp().
$1 == 4 ==> "call .cmu4";
"push ax".
default ==> arg_error( "C_cmu", $1).
C_cms
$1 == 2 ==> C_sbi( (arith) 2).
$1 == 4 ==> "pop ax";
"pop bx";
"pop cx";
"pop dx";
"sub cx, ax";
"sbb dx, bx";
"jne 1f";
"or dx, cx";
"1: push dx".
default ==> "mov cx, $1";
"call .cms";
"push cx".
C_cms_narg ==> "pop cx";
"call .cms";
"push cx".
C_cmp ==> "pop bx";
"pop cx";
"xor ax, ax";
"cmp cx, bx";
"je 2f";
"jb 1f";
"inc ax";
"jmp 2f";
"1: dec ax";
"2: push ax".
C_tlt ==> "pop ax";
"xor bx, bx";
"test ax, ax";
"jge 1f";
"inc bx";
"1: push bx".
C_tle ==> "pop ax";
"xor bx, bx";
"test ax, ax";
"jg 1f";
"inc bx";
"1: push bx".
C_teq ==> "pop ax";
"xor bx, bx";
"test ax, ax";
"jne 1f";
"inc bx";
"1: push bx".
C_tne ==> "pop ax";
"xor bx, bx";
"test ax, ax";
"je 1f";
"inc bx";
"1: push bx".
C_tge ==> "pop ax";
"xor bx, bx";
"test ax, ax";
"jl 1f";
"inc bx";
"1: push bx".
C_tgt ==> "pop ax";
"xor bx, bx";
"test ax, ax";
"jle 1f";
"inc bx";
"1: push bx".
/******************************************************************************/
/* */
/* Group 13 : Branch */
/* */
/******************************************************************************/
C_bra ==> "jmp $1".
C_blt ==> "pop ax";
"pop bx";
"cmp bx, ax";
"jl $1".
C_ble ==> "pop ax";
"pop bx";
"cmp bx, ax";
"jle $1".
C_beq ==> "pop ax";
"pop bx";
"cmp bx, ax";
"je $1".
C_bne ==> "pop ax";
"pop bx";
"cmp bx, ax";
"jne $1".
C_bge ==> "pop ax";
"pop bx";
"cmp bx, ax";
"jge $1".
C_bgt ==> "pop ax";
"pop bx";
"cmp bx, ax";
"jg $1".
C_zlt ==> "pop ax";
"test ax, ax";
"jl $1".
C_zle ==> "pop ax";
"test ax, ax";
"jle $1".
C_zeq ==> "pop ax";
"test ax, ax";
"je $1".
C_zne ==> "pop ax";
"test ax, ax";
"jne $1".
C_zge ==> "pop ax";
"test ax, ax";
"jge $1".
C_zgt ==> "pop ax";
"test ax, ax";
"jg $1".
/******************************************************************************/
/* */
/* Group 14 : Procedure call instructions */
/* */
/******************************************************************************/
C_cai ==> "pop bx";
"call bx".
C_cal ==> "call $1".
C_lfr
$1 == 2 ==> "push ax".
$1 == 4 ==> "push dx";
"push ax".
$1 == 6 ==> "call .lfr6".
$1 == 8 ==> "call .lfr8".
default ==> arg_error( "C_lfr", $1).
C_ret
$1 == 0 ==> "mov sp, bp";
"pop bp";
"ret".
$1 == 2 ==> "pop ax";
"mov sp, bp";
"pop bp";
"ret".
$1 == 4 ==> "pop ax";
"pop dx";
"mov sp, bp";
"pop bp";
"ret".
$1 == 6 ==> "call .ret6";
"mov sp, bp";
"pop bp";
"ret".
$1 == 8 ==> "call .ret8";
"mov sp, bp";
"pop bp";
"ret".
default ==> arg_error( "C_ret", $1).
/******************************************************************************/
/* */
/* Group 15 : Miscellaneous instructions */
/* */
/******************************************************************************/
C_asp
$1 == 2 ==> "pop bx".
$1 == 4 ==> "pop bx";
"pop bx".
$1 == -2 ==> "push ax".
default ==> "add sp, $1".
C_ass
$1 == 2 ==> "pop ax";
"add sp, ax".
default ==> arg_error( "C_ass", $1).
C_ass_narg ==> "pop ax";
"cmp ax, 2";
"jne .unknown";
"pop ax";
"add sp, ax".
C_blm
$1 % 2 == 0 ==> "mov cx, $1/2";
"call .blm".
default ==> arg_error( "C_blm", $1).
C_bls
$1 == 2 ==> "pop cx";
"sar cx,1";
"call .blm".
default ==> arg_error( "C_bls", $1).
C_bls_narg ==> "pop ax";
"cmp ax, 2";
"jne .unknown";
"pop cx";
"sar cx, 1";
"call .blm".
C_csa
$1 == 2 ==> "pop bx";
"pop ax";
"jmp .csa2".
default ==> arg_error( "C_csa", $1).
C_csa_narg ==> "pop ax";
"cmp ax, 2";
"jne .unknown";
"pop bx";
"pop ax";
"jmp .csa2".
C_csb
$1 == 2 ==> "pop bx";
"pop ax";
"jmp .csb2".
default ==> arg_error( "C_csb", $1).
C_csb_narg ==> "pop ax";
"cmp ax, 2";
"jne .unknown";
"pop bx";
"pop ax";
"jmp .csb2".
C_dch ==> "mov bp, (bp)".
C_dup
$1 == 2 ==> "pop ax";
"push ax";
"push ax".
$1 == 4 ==> "pop ax";
"pop bx";
"push bx";
"push ax";
"push bx";
"push ax".
default ==> "mov cx, $1";
"call .dup".
C_dus
$1 == 2 ==> "pop cx";
"call .dup".
default ==> arg_error( "C_dus", $1).
C_dus_narg ==> "pop ax";
"cmp ax, 2";
"jne .unknown";
"pop cx";
"call .dup".
C_exg ==> "mov cx, $1";
"call .exg".
C_exg_narg ==> "pop cx";
"call .exg".
C_fil.. ==> "mov (hol0+4), $1+$2".
C_gto.. ==> "mov bx, $1+$2";
"call .gto".
C_lim ==> "push (.ignmask)".
C_lin ==> "mov (hol0), $1".
C_lni ==> "inc (hol0)".
C_lor
$1 == 0 ==> "push bp".
$1 == 1 ==> "mov ax, sp";
"push ax".
$1 == 2 ==> "push (.reghp)".
default ==> arg_error( "C_lor", $1).
C_lpb ==> "add bp, 4".
C_mon ==> "pop ax";
"call .mon".
C_nop ==> "call .nop".
C_rck
$1 == 2 ==> "pop bx";
"pop ax";
"call .rck";
"push ax".
default ==> arg_error( "C_rck", $1).
C_rck_narg ==> "pop ax";
"cmp ax, 2";
"jne .unknown";
"pop bx";
"pop ax";
"call .rck";
"push ax".
C_rtt ==> C_ret( (arith) 0).
C_sig ==> "pop ax";
"xchg (.trppc), ax";
"push ax".
C_sim ==> "pop (.ignmask)".
C_str
$1 == 0 ==> "pop bp".
$1 == 1 ==> "pop sp".
$1 == 2 ==> "pop (.reghp)".
default ==> arg_error( "C_str", $1).
C_trp ==> "pop ax";
"call .trp".
/******************************************************************************/
/* */
/* Storage-routines */
/* */
/******************************************************************************/
..icon
$2 == 1 ==> gen1( (ONE_BYTE) atoi( $1)).
$2 == 2 ==> gen2( (TWO_BYTES) atoi( $1)).
$2 == 4 ==> gen4( (FOUR_BYTES) atol( $1)).
default ==> arg_error( "..icon", $1).
..ucon
$2 == 1 ==> gen1( (ONE_BYTE) atoi( $1)).
$2 == 2 ==> gen2( (TWO_BYTES) atoi( $1)).
$2 == 4 ==> gen4( (FOUR_BYTES) atol( $1)).
default ==> arg_error( "..ucon", $1).
/******************************************************************************/
/* */
/* Extra-routines */
/* */
/******************************************************************************/
#ifdef PUSH_POP_OPT
C_df_ilb ==> clean_push_buf();
symbol_definition( $1);
set_local_visible( $1).
#endif
jump ==> "jmp $1".
prolog ==> "push bp";
"mov bp, sp".
locals
$1 == 0 ==> .
$1 == 2 ==> "push ax".
$1 == 4 ==> "push ax";
"push ax".
default ==> "sub sp, $1".