xref: /qemu/tcg/sparc64/tcg-target.h (revision 0e28d0063bbd9e59a981ea2d20f82f30c5d956a8)
18289b279Sblueswir1 /*
28289b279Sblueswir1  * Tiny Code Generator for QEMU
38289b279Sblueswir1  *
48289b279Sblueswir1  * Copyright (c) 2008 Fabrice Bellard
58289b279Sblueswir1  *
68289b279Sblueswir1  * Permission is hereby granted, free of charge, to any person obtaining a copy
78289b279Sblueswir1  * of this software and associated documentation files (the "Software"), to deal
88289b279Sblueswir1  * in the Software without restriction, including without limitation the rights
98289b279Sblueswir1  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
108289b279Sblueswir1  * copies of the Software, and to permit persons to whom the Software is
118289b279Sblueswir1  * furnished to do so, subject to the following conditions:
128289b279Sblueswir1  *
138289b279Sblueswir1  * The above copyright notice and this permission notice shall be included in
148289b279Sblueswir1  * all copies or substantial portions of the Software.
158289b279Sblueswir1  *
168289b279Sblueswir1  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
178289b279Sblueswir1  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
188289b279Sblueswir1  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
198289b279Sblueswir1  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
208289b279Sblueswir1  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
218289b279Sblueswir1  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
228289b279Sblueswir1  * THE SOFTWARE.
238289b279Sblueswir1  */
2414e54f8eSMarkus Armbruster 
2514e54f8eSMarkus Armbruster #ifndef SPARC_TCG_TARGET_H
2614e54f8eSMarkus Armbruster #define SPARC_TCG_TARGET_H
278289b279Sblueswir1 
2878cd7b83SRichard Henderson #define TCG_TARGET_REG_BITS 64
2978cd7b83SRichard Henderson 
30abce5964SRichard Henderson #define TCG_TARGET_INSN_UNIT_SIZE 4
31006f8638SPaolo Bonzini #define TCG_TARGET_TLB_DISPLACEMENT_BITS 32
328289b279Sblueswir1 #define TCG_TARGET_NB_REGS 32
338289b279Sblueswir1 
34771142c2SRichard Henderson typedef enum {
358289b279Sblueswir1     TCG_REG_G0 = 0,
368289b279Sblueswir1     TCG_REG_G1,
378289b279Sblueswir1     TCG_REG_G2,
388289b279Sblueswir1     TCG_REG_G3,
398289b279Sblueswir1     TCG_REG_G4,
408289b279Sblueswir1     TCG_REG_G5,
418289b279Sblueswir1     TCG_REG_G6,
428289b279Sblueswir1     TCG_REG_G7,
438289b279Sblueswir1     TCG_REG_O0,
448289b279Sblueswir1     TCG_REG_O1,
458289b279Sblueswir1     TCG_REG_O2,
468289b279Sblueswir1     TCG_REG_O3,
478289b279Sblueswir1     TCG_REG_O4,
488289b279Sblueswir1     TCG_REG_O5,
498289b279Sblueswir1     TCG_REG_O6,
508289b279Sblueswir1     TCG_REG_O7,
518289b279Sblueswir1     TCG_REG_L0,
528289b279Sblueswir1     TCG_REG_L1,
538289b279Sblueswir1     TCG_REG_L2,
548289b279Sblueswir1     TCG_REG_L3,
558289b279Sblueswir1     TCG_REG_L4,
568289b279Sblueswir1     TCG_REG_L5,
578289b279Sblueswir1     TCG_REG_L6,
588289b279Sblueswir1     TCG_REG_L7,
598289b279Sblueswir1     TCG_REG_I0,
608289b279Sblueswir1     TCG_REG_I1,
618289b279Sblueswir1     TCG_REG_I2,
628289b279Sblueswir1     TCG_REG_I3,
638289b279Sblueswir1     TCG_REG_I4,
648289b279Sblueswir1     TCG_REG_I5,
658289b279Sblueswir1     TCG_REG_I6,
668289b279Sblueswir1     TCG_REG_I7,
67771142c2SRichard Henderson } TCGReg;
688289b279Sblueswir1 
698289b279Sblueswir1 #define TCG_CT_CONST_S11  0x100
708289b279Sblueswir1 #define TCG_CT_CONST_S13  0x200
7189269f6cSRichard Henderson #define TCG_CT_CONST_ZERO 0x400
728289b279Sblueswir1 
738289b279Sblueswir1 /* used for function call generation */
744c3204cbSRichard Henderson #define TCG_REG_CALL_STACK TCG_REG_O6
759b9c37c3SRichard Henderson 
7634b1a49cSRichard Henderson #ifdef __arch64__
774c3204cbSRichard Henderson #define TCG_TARGET_STACK_BIAS           2047
7877fcd093Sblueswir1 #define TCG_TARGET_STACK_ALIGN          16
794c3204cbSRichard Henderson #define TCG_TARGET_CALL_STACK_OFFSET    (128 + 6*8 + TCG_TARGET_STACK_BIAS)
80b3db8758Sblueswir1 #else
814c3204cbSRichard Henderson #define TCG_TARGET_STACK_BIAS           0
8277fcd093Sblueswir1 #define TCG_TARGET_STACK_ALIGN          8
834c3204cbSRichard Henderson #define TCG_TARGET_CALL_STACK_OFFSET    (64 + 4 + 6*4)
84b3db8758Sblueswir1 #endif
85b3db8758Sblueswir1 
8634b1a49cSRichard Henderson #ifdef __arch64__
872bece2c8SRichard Henderson #define TCG_TARGET_EXTEND_ARGS 1
882bece2c8SRichard Henderson #endif
892bece2c8SRichard Henderson 
9090379ca8SRichard Henderson #if defined(__VIS__) && __VIS__ >= 0x300
9190379ca8SRichard Henderson #define use_vis3_instructions  1
9290379ca8SRichard Henderson #else
9390379ca8SRichard Henderson extern bool use_vis3_instructions;
9490379ca8SRichard Henderson #endif
9590379ca8SRichard Henderson 
968289b279Sblueswir1 /* optional instructions */
9725c4d9ccSRichard Henderson #define TCG_TARGET_HAS_div_i32		1
985f9eb025SRichard Henderson #define TCG_TARGET_HAS_rem_i32		0
9925c4d9ccSRichard Henderson #define TCG_TARGET_HAS_rot_i32          0
10025c4d9ccSRichard Henderson #define TCG_TARGET_HAS_ext8s_i32        0
10125c4d9ccSRichard Henderson #define TCG_TARGET_HAS_ext16s_i32       0
10225c4d9ccSRichard Henderson #define TCG_TARGET_HAS_ext8u_i32        0
10325c4d9ccSRichard Henderson #define TCG_TARGET_HAS_ext16u_i32       0
10425c4d9ccSRichard Henderson #define TCG_TARGET_HAS_bswap16_i32      0
10525c4d9ccSRichard Henderson #define TCG_TARGET_HAS_bswap32_i32      0
10625c4d9ccSRichard Henderson #define TCG_TARGET_HAS_neg_i32          1
10725c4d9ccSRichard Henderson #define TCG_TARGET_HAS_not_i32          1
10825c4d9ccSRichard Henderson #define TCG_TARGET_HAS_andc_i32         1
10925c4d9ccSRichard Henderson #define TCG_TARGET_HAS_orc_i32          1
11025c4d9ccSRichard Henderson #define TCG_TARGET_HAS_eqv_i32          0
11125c4d9ccSRichard Henderson #define TCG_TARGET_HAS_nand_i32         0
11225c4d9ccSRichard Henderson #define TCG_TARGET_HAS_nor_i32          0
113*0e28d006SRichard Henderson #define TCG_TARGET_HAS_clz_i32          0
114*0e28d006SRichard Henderson #define TCG_TARGET_HAS_ctz_i32          0
11525c4d9ccSRichard Henderson #define TCG_TARGET_HAS_deposit_i32      0
1167ec8bab3SRichard Henderson #define TCG_TARGET_HAS_extract_i32      0
1177ec8bab3SRichard Henderson #define TCG_TARGET_HAS_sextract_i32     0
118ded37f0dSRichard Henderson #define TCG_TARGET_HAS_movcond_i32      1
119803d805bSRichard Henderson #define TCG_TARGET_HAS_add2_i32         1
120803d805bSRichard Henderson #define TCG_TARGET_HAS_sub2_i32         1
121803d805bSRichard Henderson #define TCG_TARGET_HAS_mulu2_i32        1
122f4c16661SRichard Henderson #define TCG_TARGET_HAS_muls2_i32        1
12303271524SRichard Henderson #define TCG_TARGET_HAS_muluh_i32        0
12403271524SRichard Henderson #define TCG_TARGET_HAS_mulsh_i32        0
1254b5a85c1SRichard Henderson 
126609ad705SRichard Henderson #define TCG_TARGET_HAS_extrl_i64_i32    1
127609ad705SRichard Henderson #define TCG_TARGET_HAS_extrh_i64_i32    1
12825c4d9ccSRichard Henderson #define TCG_TARGET_HAS_div_i64          1
1295f9eb025SRichard Henderson #define TCG_TARGET_HAS_rem_i64          0
13025c4d9ccSRichard Henderson #define TCG_TARGET_HAS_rot_i64          0
13125c4d9ccSRichard Henderson #define TCG_TARGET_HAS_ext8s_i64        0
13225c4d9ccSRichard Henderson #define TCG_TARGET_HAS_ext16s_i64       0
13325c4d9ccSRichard Henderson #define TCG_TARGET_HAS_ext32s_i64       1
13425c4d9ccSRichard Henderson #define TCG_TARGET_HAS_ext8u_i64        0
13525c4d9ccSRichard Henderson #define TCG_TARGET_HAS_ext16u_i64       0
13625c4d9ccSRichard Henderson #define TCG_TARGET_HAS_ext32u_i64       1
13725c4d9ccSRichard Henderson #define TCG_TARGET_HAS_bswap16_i64      0
13825c4d9ccSRichard Henderson #define TCG_TARGET_HAS_bswap32_i64      0
13925c4d9ccSRichard Henderson #define TCG_TARGET_HAS_bswap64_i64      0
14025c4d9ccSRichard Henderson #define TCG_TARGET_HAS_neg_i64          1
14125c4d9ccSRichard Henderson #define TCG_TARGET_HAS_not_i64          1
14225c4d9ccSRichard Henderson #define TCG_TARGET_HAS_andc_i64         1
14325c4d9ccSRichard Henderson #define TCG_TARGET_HAS_orc_i64          1
14425c4d9ccSRichard Henderson #define TCG_TARGET_HAS_eqv_i64          0
14525c4d9ccSRichard Henderson #define TCG_TARGET_HAS_nand_i64         0
14625c4d9ccSRichard Henderson #define TCG_TARGET_HAS_nor_i64          0
147*0e28d006SRichard Henderson #define TCG_TARGET_HAS_clz_i64          0
148*0e28d006SRichard Henderson #define TCG_TARGET_HAS_ctz_i64          0
14925c4d9ccSRichard Henderson #define TCG_TARGET_HAS_deposit_i64      0
1507ec8bab3SRichard Henderson #define TCG_TARGET_HAS_extract_i64      0
1517ec8bab3SRichard Henderson #define TCG_TARGET_HAS_sextract_i64     0
152ded37f0dSRichard Henderson #define TCG_TARGET_HAS_movcond_i64      1
153609ac1e1SRichard Henderson #define TCG_TARGET_HAS_add2_i64         1
154609ac1e1SRichard Henderson #define TCG_TARGET_HAS_sub2_i64         1
155d7156f7cSRichard Henderson #define TCG_TARGET_HAS_mulu2_i64        0
1564d3203fdSRichard Henderson #define TCG_TARGET_HAS_muls2_i64        0
157de8301e5SRichard Henderson #define TCG_TARGET_HAS_muluh_i64        use_vis3_instructions
15803271524SRichard Henderson #define TCG_TARGET_HAS_mulsh_i64        0
159cc6dfecfSRichard Henderson 
1600c554161SRichard Henderson #define TCG_AREG0 TCG_REG_I0
1618289b279Sblueswir1 
162b93949efSRichard Henderson static inline void flush_icache_range(uintptr_t start, uintptr_t stop)
1638289b279Sblueswir1 {
164b93949efSRichard Henderson     uintptr_t p;
165387e4176SRichard Henderson     for (p = start & -8; p < ((stop + 7) & -8); p += 8) {
1668289b279Sblueswir1         __asm__ __volatile__("flush\t%0" : : "r" (p));
1678289b279Sblueswir1     }
168b93949efSRichard Henderson }
169cb9c377fSPaolo Bonzini 
170cb9c377fSPaolo Bonzini #endif
171