2 * Tiny Code Generator for QEMU
4 * Copyright (c) 2009 Ulrich Hecht <uli@suse.de>
5 * Copyright (c) 2009 Alexander Graf <agraf@suse.de>
6 * Copyright (c) 2010 Richard Henderson <rth@twiddle.net>
8 * Permission is hereby granted, free of charge, to any person obtaining a copy
9 * of this software and associated documentation files (the "Software"), to deal
10 * in the Software without restriction, including without limitation the rights
11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 * copies of the Software, and to permit persons to whom the Software is
13 * furnished to do so, subject to the following conditions:
15 * The above copyright notice and this permission notice shall be included in
16 * all copies or substantial portions of the Software.
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27 /* We only support generating code for 64-bit mode. */
28 #if TCG_TARGET_REG_BITS != 64
29 #error "unsupported code generation mode"
32 /* ??? The translation blocks produced by TCG are generally small enough to
33 be entirely reachable with a 16-bit displacement. Leaving the option for
34 a 32-bit displacement here Just In Case. */
35 #define USE_LONG_BRANCHES 0
37 #define TCG_CT_CONST_32 0x0100
38 #define TCG_CT_CONST_NEG 0x0200
39 #define TCG_CT_CONST_ADDI 0x0400
40 #define TCG_CT_CONST_MULI 0x0800
41 #define TCG_CT_CONST_ANDI 0x1000
42 #define TCG_CT_CONST_ORI 0x2000
43 #define TCG_CT_CONST_XORI 0x4000
44 #define TCG_CT_CONST_CMPI 0x8000
46 /* Several places within the instruction set 0 means "no register"
47 rather than TCG_REG_R0. */
48 #define TCG_REG_NONE 0
50 /* A scratch register that may be be used throughout the backend. */
51 #define TCG_TMP0 TCG_REG_R14
53 #ifdef CONFIG_USE_GUEST_BASE
54 #define TCG_GUEST_BASE_REG TCG_REG_R13
56 #define TCG_GUEST_BASE_REG TCG_REG_R0
64 /* All of the following instructions are prefixed with their instruction
65 format, and are defined as 8- or 16-bit quantities, even when the two
66 halves of the 16-bit quantity may appear 32 bits apart in the insn.
67 This makes it easy to copy the values from the tables in Appendix B. */
68 typedef enum S390Opcode
{
222 #define LD_SIGNED 0x04
223 #define LD_UINT8 0x00
224 #define LD_INT8 (LD_UINT8 | LD_SIGNED)
225 #define LD_UINT16 0x01
226 #define LD_INT16 (LD_UINT16 | LD_SIGNED)
227 #define LD_UINT32 0x02
228 #define LD_INT32 (LD_UINT32 | LD_SIGNED)
229 #define LD_UINT64 0x03
230 #define LD_INT64 (LD_UINT64 | LD_SIGNED)
233 static const char * const tcg_target_reg_names
[TCG_TARGET_NB_REGS
] = {
234 "%r0", "%r1", "%r2", "%r3", "%r4", "%r5", "%r6", "%r7",
235 "%r8", "%r9", "%r10" "%r11" "%r12" "%r13" "%r14" "%r15"
239 /* Since R6 is a potential argument register, choose it last of the
240 call-saved registers. Likewise prefer the call-clobbered registers
241 in reverse order to maximize the chance of avoiding the arguments. */
242 static const int tcg_target_reg_alloc_order
[] = {
260 static const int tcg_target_call_iarg_regs
[] = {
268 static const int tcg_target_call_oarg_regs
[] = {
276 #define S390_CC_NE (S390_CC_LT | S390_CC_GT)
277 #define S390_CC_LE (S390_CC_LT | S390_CC_EQ)
278 #define S390_CC_GE (S390_CC_GT | S390_CC_EQ)
279 #define S390_CC_NEVER 0
280 #define S390_CC_ALWAYS 15
282 /* Condition codes that result from a COMPARE and COMPARE LOGICAL. */
283 static const uint8_t tcg_cond_to_s390_cond
[] = {
284 [TCG_COND_EQ
] = S390_CC_EQ
,
285 [TCG_COND_NE
] = S390_CC_NE
,
286 [TCG_COND_LT
] = S390_CC_LT
,
287 [TCG_COND_LE
] = S390_CC_LE
,
288 [TCG_COND_GT
] = S390_CC_GT
,
289 [TCG_COND_GE
] = S390_CC_GE
,
290 [TCG_COND_LTU
] = S390_CC_LT
,
291 [TCG_COND_LEU
] = S390_CC_LE
,
292 [TCG_COND_GTU
] = S390_CC_GT
,
293 [TCG_COND_GEU
] = S390_CC_GE
,
296 /* Condition codes that result from a LOAD AND TEST. Here, we have no
297 unsigned instruction variation, however since the test is vs zero we
298 can re-map the outcomes appropriately. */
299 static const uint8_t tcg_cond_to_ltr_cond
[] = {
300 [TCG_COND_EQ
] = S390_CC_EQ
,
301 [TCG_COND_NE
] = S390_CC_NE
,
302 [TCG_COND_LT
] = S390_CC_LT
,
303 [TCG_COND_LE
] = S390_CC_LE
,
304 [TCG_COND_GT
] = S390_CC_GT
,
305 [TCG_COND_GE
] = S390_CC_GE
,
306 [TCG_COND_LTU
] = S390_CC_NEVER
,
307 [TCG_COND_LEU
] = S390_CC_EQ
,
308 [TCG_COND_GTU
] = S390_CC_NE
,
309 [TCG_COND_GEU
] = S390_CC_ALWAYS
,
312 #ifdef CONFIG_SOFTMMU
314 #include "exec/softmmu_defs.h"
316 /* helper signature: helper_ld_mmu(CPUState *env, target_ulong addr,
318 static const void * const qemu_ld_helpers
[4] = {
325 /* helper signature: helper_st_mmu(CPUState *env, target_ulong addr,
326 uintxx_t val, int mmu_idx) */
327 static const void * const qemu_st_helpers
[4] = {
335 static uint8_t *tb_ret_addr
;
337 /* A list of relevant facilities used by this translator. Some of these
338 are required for proper operation, and these are checked at startup. */
340 #define FACILITY_ZARCH_ACTIVE (1ULL << (63 - 2))
341 #define FACILITY_LONG_DISP (1ULL << (63 - 18))
342 #define FACILITY_EXT_IMM (1ULL << (63 - 21))
343 #define FACILITY_GEN_INST_EXT (1ULL << (63 - 34))
345 static uint64_t facilities
;
347 static void patch_reloc(uint8_t *code_ptr
, int type
,
348 tcg_target_long value
, tcg_target_long addend
)
350 tcg_target_long code_ptr_tl
= (tcg_target_long
)code_ptr
;
351 tcg_target_long pcrel2
;
353 /* ??? Not the usual definition of "addend". */
354 pcrel2
= (value
- (code_ptr_tl
+ addend
)) >> 1;
358 assert(pcrel2
== (int16_t)pcrel2
);
359 *(int16_t *)code_ptr
= pcrel2
;
362 assert(pcrel2
== (int32_t)pcrel2
);
363 *(int32_t *)code_ptr
= pcrel2
;
371 /* parse target specific constraints */
372 static int target_parse_constraint(TCGArgConstraint
*ct
, const char **pct_str
)
374 const char *ct_str
= *pct_str
;
377 case 'r': /* all registers */
378 ct
->ct
|= TCG_CT_REG
;
379 tcg_regset_set32(ct
->u
.regs
, 0, 0xffff);
381 case 'R': /* not R0 */
382 ct
->ct
|= TCG_CT_REG
;
383 tcg_regset_set32(ct
->u
.regs
, 0, 0xffff);
384 tcg_regset_reset_reg(ct
->u
.regs
, TCG_REG_R0
);
386 case 'L': /* qemu_ld/st constraint */
387 ct
->ct
|= TCG_CT_REG
;
388 tcg_regset_set32(ct
->u
.regs
, 0, 0xffff);
389 tcg_regset_reset_reg (ct
->u
.regs
, TCG_REG_R2
);
390 tcg_regset_reset_reg (ct
->u
.regs
, TCG_REG_R3
);
392 case 'a': /* force R2 for division */
393 ct
->ct
|= TCG_CT_REG
;
394 tcg_regset_clear(ct
->u
.regs
);
395 tcg_regset_set_reg(ct
->u
.regs
, TCG_REG_R2
);
397 case 'b': /* force R3 for division */
398 ct
->ct
|= TCG_CT_REG
;
399 tcg_regset_clear(ct
->u
.regs
);
400 tcg_regset_set_reg(ct
->u
.regs
, TCG_REG_R3
);
402 case 'N': /* force immediate negate */
403 ct
->ct
|= TCG_CT_CONST_NEG
;
405 case 'W': /* force 32-bit ("word") immediate */
406 ct
->ct
|= TCG_CT_CONST_32
;
409 ct
->ct
|= TCG_CT_CONST_ADDI
;
412 ct
->ct
|= TCG_CT_CONST_MULI
;
415 ct
->ct
|= TCG_CT_CONST_ANDI
;
418 ct
->ct
|= TCG_CT_CONST_ORI
;
421 ct
->ct
|= TCG_CT_CONST_XORI
;
424 ct
->ct
|= TCG_CT_CONST_CMPI
;
435 /* Immediates to be used with logical AND. This is an optimization only,
436 since a full 64-bit immediate AND can always be performed with 4 sequential
437 NI[LH][LH] instructions. What we're looking for is immediates that we
438 can load efficiently, and the immediate load plus the reg-reg AND is
439 smaller than the sequential NI's. */
441 static int tcg_match_andi(int ct
, tcg_target_ulong val
)
445 if (facilities
& FACILITY_EXT_IMM
) {
446 if (ct
& TCG_CT_CONST_32
) {
447 /* All 32-bit ANDs can be performed with 1 48-bit insn. */
451 /* Zero-extensions. */
452 if (val
== 0xff || val
== 0xffff || val
== 0xffffffff) {
456 if (ct
& TCG_CT_CONST_32
) {
458 } else if (val
== 0xffffffff) {
463 /* Try all 32-bit insns that can perform it in one go. */
464 for (i
= 0; i
< 4; i
++) {
465 tcg_target_ulong mask
= ~(0xffffull
<< i
*16);
466 if ((val
& mask
) == mask
) {
471 /* Look for 16-bit values performing the mask. These are better
472 to load with LLI[LH][LH]. */
473 for (i
= 0; i
< 4; i
++) {
474 tcg_target_ulong mask
= 0xffffull
<< i
*16;
475 if ((val
& mask
) == val
) {
480 /* Look for 32-bit values performing the 64-bit mask. These
481 are better to load with LLI[LH]F, or if extended immediates
482 not available, with a pair of LLI insns. */
483 if ((ct
& TCG_CT_CONST_32
) == 0) {
484 if (val
<= 0xffffffff || (val
& 0xffffffff) == 0) {
492 /* Immediates to be used with logical OR. This is an optimization only,
493 since a full 64-bit immediate OR can always be performed with 4 sequential
494 OI[LH][LH] instructions. What we're looking for is immediates that we
495 can load efficiently, and the immediate load plus the reg-reg OR is
496 smaller than the sequential OI's. */
498 static int tcg_match_ori(int ct
, tcg_target_long val
)
500 if (facilities
& FACILITY_EXT_IMM
) {
501 if (ct
& TCG_CT_CONST_32
) {
502 /* All 32-bit ORs can be performed with 1 48-bit insn. */
507 /* Look for negative values. These are best to load with LGHI. */
509 if (val
== (int16_t)val
) {
512 if (facilities
& FACILITY_EXT_IMM
) {
513 if (val
== (int32_t)val
) {
522 /* Immediates to be used with logical XOR. This is almost, but not quite,
523 only an optimization. XOR with immediate is only supported with the
524 extended-immediate facility. That said, there are a few patterns for
525 which it is better to load the value into a register first. */
527 static int tcg_match_xori(int ct
, tcg_target_long val
)
529 if ((facilities
& FACILITY_EXT_IMM
) == 0) {
533 if (ct
& TCG_CT_CONST_32
) {
534 /* All 32-bit XORs can be performed with 1 48-bit insn. */
538 /* Look for negative values. These are best to load with LGHI. */
539 if (val
< 0 && val
== (int32_t)val
) {
546 /* Imediates to be used with comparisons. */
548 static int tcg_match_cmpi(int ct
, tcg_target_long val
)
550 if (facilities
& FACILITY_EXT_IMM
) {
551 /* The COMPARE IMMEDIATE instruction is available. */
552 if (ct
& TCG_CT_CONST_32
) {
553 /* We have a 32-bit immediate and can compare against anything. */
556 /* ??? We have no insight here into whether the comparison is
557 signed or unsigned. The COMPARE IMMEDIATE insn uses a 32-bit
558 signed immediate, and the COMPARE LOGICAL IMMEDIATE insn uses
559 a 32-bit unsigned immediate. If we were to use the (semi)
560 obvious "val == (int32_t)val" we would be enabling unsigned
561 comparisons vs very large numbers. The only solution is to
562 take the intersection of the ranges. */
563 /* ??? Another possible solution is to simply lie and allow all
564 constants here and force the out-of-range values into a temp
565 register in tgen_cmp when we have knowledge of the actual
566 comparison code in use. */
567 return val
>= 0 && val
<= 0x7fffffff;
570 /* Only the LOAD AND TEST instruction is available. */
575 /* Test if a constant matches the constraint. */
576 static int tcg_target_const_match(tcg_target_long val
,
577 const TCGArgConstraint
*arg_ct
)
581 if (ct
& TCG_CT_CONST
) {
585 /* Handle the modifiers. */
586 if (ct
& TCG_CT_CONST_NEG
) {
589 if (ct
& TCG_CT_CONST_32
) {
593 /* The following are mutually exclusive. */
594 if (ct
& TCG_CT_CONST_ADDI
) {
595 /* Immediates that may be used with add. If we have the
596 extended-immediates facility then we have ADD IMMEDIATE
597 with signed and unsigned 32-bit, otherwise we have only
598 ADD HALFWORD IMMEDIATE with a signed 16-bit. */
599 if (facilities
& FACILITY_EXT_IMM
) {
600 return val
== (int32_t)val
|| val
== (uint32_t)val
;
602 return val
== (int16_t)val
;
604 } else if (ct
& TCG_CT_CONST_MULI
) {
605 /* Immediates that may be used with multiply. If we have the
606 general-instruction-extensions, then we have MULTIPLY SINGLE
607 IMMEDIATE with a signed 32-bit, otherwise we have only
608 MULTIPLY HALFWORD IMMEDIATE, with a signed 16-bit. */
609 if (facilities
& FACILITY_GEN_INST_EXT
) {
610 return val
== (int32_t)val
;
612 return val
== (int16_t)val
;
614 } else if (ct
& TCG_CT_CONST_ANDI
) {
615 return tcg_match_andi(ct
, val
);
616 } else if (ct
& TCG_CT_CONST_ORI
) {
617 return tcg_match_ori(ct
, val
);
618 } else if (ct
& TCG_CT_CONST_XORI
) {
619 return tcg_match_xori(ct
, val
);
620 } else if (ct
& TCG_CT_CONST_CMPI
) {
621 return tcg_match_cmpi(ct
, val
);
627 /* Emit instructions according to the given instruction format. */
629 static void tcg_out_insn_RR(TCGContext
*s
, S390Opcode op
, TCGReg r1
, TCGReg r2
)
631 tcg_out16(s
, (op
<< 8) | (r1
<< 4) | r2
);
634 static void tcg_out_insn_RRE(TCGContext
*s
, S390Opcode op
,
635 TCGReg r1
, TCGReg r2
)
637 tcg_out32(s
, (op
<< 16) | (r1
<< 4) | r2
);
640 static void tcg_out_insn_RI(TCGContext
*s
, S390Opcode op
, TCGReg r1
, int i2
)
642 tcg_out32(s
, (op
<< 16) | (r1
<< 20) | (i2
& 0xffff));
645 static void tcg_out_insn_RIL(TCGContext
*s
, S390Opcode op
, TCGReg r1
, int i2
)
647 tcg_out16(s
, op
| (r1
<< 4));
651 static void tcg_out_insn_RS(TCGContext
*s
, S390Opcode op
, TCGReg r1
,
652 TCGReg b2
, TCGReg r3
, int disp
)
654 tcg_out32(s
, (op
<< 24) | (r1
<< 20) | (r3
<< 16) | (b2
<< 12)
658 static void tcg_out_insn_RSY(TCGContext
*s
, S390Opcode op
, TCGReg r1
,
659 TCGReg b2
, TCGReg r3
, int disp
)
661 tcg_out16(s
, (op
& 0xff00) | (r1
<< 4) | r3
);
662 tcg_out32(s
, (op
& 0xff) | (b2
<< 28)
663 | ((disp
& 0xfff) << 16) | ((disp
& 0xff000) >> 4));
666 #define tcg_out_insn_RX tcg_out_insn_RS
667 #define tcg_out_insn_RXY tcg_out_insn_RSY
669 /* Emit an opcode with "type-checking" of the format. */
670 #define tcg_out_insn(S, FMT, OP, ...) \
671 glue(tcg_out_insn_,FMT)(S, glue(glue(FMT,_),OP), ## __VA_ARGS__)
674 /* emit 64-bit shifts */
675 static void tcg_out_sh64(TCGContext
* s
, S390Opcode op
, TCGReg dest
,
676 TCGReg src
, TCGReg sh_reg
, int sh_imm
)
678 tcg_out_insn_RSY(s
, op
, dest
, sh_reg
, src
, sh_imm
);
681 /* emit 32-bit shifts */
682 static void tcg_out_sh32(TCGContext
* s
, S390Opcode op
, TCGReg dest
,
683 TCGReg sh_reg
, int sh_imm
)
685 tcg_out_insn_RS(s
, op
, dest
, sh_reg
, 0, sh_imm
);
688 static void tcg_out_mov(TCGContext
*s
, TCGType type
, TCGReg dst
, TCGReg src
)
691 if (type
== TCG_TYPE_I32
) {
692 tcg_out_insn(s
, RR
, LR
, dst
, src
);
694 tcg_out_insn(s
, RRE
, LGR
, dst
, src
);
699 /* load a register with an immediate value */
700 static void tcg_out_movi(TCGContext
*s
, TCGType type
,
701 TCGReg ret
, tcg_target_long sval
)
703 static const S390Opcode lli_insns
[4] = {
704 RI_LLILL
, RI_LLILH
, RI_LLIHL
, RI_LLIHH
707 tcg_target_ulong uval
= sval
;
710 if (type
== TCG_TYPE_I32
) {
711 uval
= (uint32_t)sval
;
712 sval
= (int32_t)sval
;
715 /* Try all 32-bit insns that can load it in one go. */
716 if (sval
>= -0x8000 && sval
< 0x8000) {
717 tcg_out_insn(s
, RI
, LGHI
, ret
, sval
);
721 for (i
= 0; i
< 4; i
++) {
722 tcg_target_long mask
= 0xffffull
<< i
*16;
723 if ((uval
& mask
) == uval
) {
724 tcg_out_insn_RI(s
, lli_insns
[i
], ret
, uval
>> i
*16);
729 /* Try all 48-bit insns that can load it in one go. */
730 if (facilities
& FACILITY_EXT_IMM
) {
731 if (sval
== (int32_t)sval
) {
732 tcg_out_insn(s
, RIL
, LGFI
, ret
, sval
);
735 if (uval
<= 0xffffffff) {
736 tcg_out_insn(s
, RIL
, LLILF
, ret
, uval
);
739 if ((uval
& 0xffffffff) == 0) {
740 tcg_out_insn(s
, RIL
, LLIHF
, ret
, uval
>> 31 >> 1);
745 /* Try for PC-relative address load. */
746 if ((sval
& 1) == 0) {
747 intptr_t off
= (sval
- (intptr_t)s
->code_ptr
) >> 1;
748 if (off
== (int32_t)off
) {
749 tcg_out_insn(s
, RIL
, LARL
, ret
, off
);
754 /* If extended immediates are not present, then we may have to issue
755 several instructions to load the low 32 bits. */
756 if (!(facilities
& FACILITY_EXT_IMM
)) {
757 /* A 32-bit unsigned value can be loaded in 2 insns. And given
758 that the lli_insns loop above did not succeed, we know that
759 both insns are required. */
760 if (uval
<= 0xffffffff) {
761 tcg_out_insn(s
, RI
, LLILL
, ret
, uval
);
762 tcg_out_insn(s
, RI
, IILH
, ret
, uval
>> 16);
766 /* If all high bits are set, the value can be loaded in 2 or 3 insns.
767 We first want to make sure that all the high bits get set. With
768 luck the low 16-bits can be considered negative to perform that for
769 free, otherwise we load an explicit -1. */
770 if (sval
>> 31 >> 1 == -1) {
772 tcg_out_insn(s
, RI
, LGHI
, ret
, uval
);
774 tcg_out_insn(s
, RI
, LGHI
, ret
, -1);
775 tcg_out_insn(s
, RI
, IILL
, ret
, uval
);
777 tcg_out_insn(s
, RI
, IILH
, ret
, uval
>> 16);
782 /* If we get here, both the high and low parts have non-zero bits. */
784 /* Recurse to load the lower 32-bits. */
785 tcg_out_movi(s
, TCG_TYPE_I64
, ret
, uval
& 0xffffffff);
787 /* Insert data into the high 32-bits. */
788 uval
= uval
>> 31 >> 1;
789 if (facilities
& FACILITY_EXT_IMM
) {
790 if (uval
< 0x10000) {
791 tcg_out_insn(s
, RI
, IIHL
, ret
, uval
);
792 } else if ((uval
& 0xffff) == 0) {
793 tcg_out_insn(s
, RI
, IIHH
, ret
, uval
>> 16);
795 tcg_out_insn(s
, RIL
, IIHF
, ret
, uval
);
799 tcg_out_insn(s
, RI
, IIHL
, ret
, uval
);
801 if (uval
& 0xffff0000) {
802 tcg_out_insn(s
, RI
, IIHH
, ret
, uval
>> 16);
808 /* Emit a load/store type instruction. Inputs are:
809 DATA: The register to be loaded or stored.
810 BASE+OFS: The effective address.
811 OPC_RX: If the operation has an RX format opcode (e.g. STC), otherwise 0.
812 OPC_RXY: The RXY format opcode for the operation (e.g. STCY). */
814 static void tcg_out_mem(TCGContext
*s
, S390Opcode opc_rx
, S390Opcode opc_rxy
,
815 TCGReg data
, TCGReg base
, TCGReg index
,
818 if (ofs
< -0x80000 || ofs
>= 0x80000) {
819 /* Combine the low 16 bits of the offset with the actual load insn;
820 the high 48 bits must come from an immediate load. */
821 tcg_out_movi(s
, TCG_TYPE_PTR
, TCG_TMP0
, ofs
& ~0xffff);
824 /* If we were already given an index register, add it in. */
825 if (index
!= TCG_REG_NONE
) {
826 tcg_out_insn(s
, RRE
, AGR
, TCG_TMP0
, index
);
831 if (opc_rx
&& ofs
>= 0 && ofs
< 0x1000) {
832 tcg_out_insn_RX(s
, opc_rx
, data
, base
, index
, ofs
);
834 tcg_out_insn_RXY(s
, opc_rxy
, data
, base
, index
, ofs
);
839 /* load data without address translation or endianness conversion */
840 static inline void tcg_out_ld(TCGContext
*s
, TCGType type
, TCGReg data
,
841 TCGReg base
, tcg_target_long ofs
)
843 if (type
== TCG_TYPE_I32
) {
844 tcg_out_mem(s
, RX_L
, RXY_LY
, data
, base
, TCG_REG_NONE
, ofs
);
846 tcg_out_mem(s
, 0, RXY_LG
, data
, base
, TCG_REG_NONE
, ofs
);
850 static inline void tcg_out_st(TCGContext
*s
, TCGType type
, TCGReg data
,
851 TCGReg base
, tcg_target_long ofs
)
853 if (type
== TCG_TYPE_I32
) {
854 tcg_out_mem(s
, RX_ST
, RXY_STY
, data
, base
, TCG_REG_NONE
, ofs
);
856 tcg_out_mem(s
, 0, RXY_STG
, data
, base
, TCG_REG_NONE
, ofs
);
860 /* load data from an absolute host address */
861 static void tcg_out_ld_abs(TCGContext
*s
, TCGType type
, TCGReg dest
, void *abs
)
863 tcg_target_long addr
= (tcg_target_long
)abs
;
865 if (facilities
& FACILITY_GEN_INST_EXT
) {
866 tcg_target_long disp
= (addr
- (tcg_target_long
)s
->code_ptr
) >> 1;
867 if (disp
== (int32_t)disp
) {
868 if (type
== TCG_TYPE_I32
) {
869 tcg_out_insn(s
, RIL
, LRL
, dest
, disp
);
871 tcg_out_insn(s
, RIL
, LGRL
, dest
, disp
);
877 tcg_out_movi(s
, TCG_TYPE_PTR
, dest
, addr
& ~0xffff);
878 tcg_out_ld(s
, type
, dest
, dest
, addr
& 0xffff);
881 static void tgen_ext8s(TCGContext
*s
, TCGType type
, TCGReg dest
, TCGReg src
)
883 if (facilities
& FACILITY_EXT_IMM
) {
884 tcg_out_insn(s
, RRE
, LGBR
, dest
, src
);
888 if (type
== TCG_TYPE_I32
) {
890 tcg_out_sh32(s
, RS_SLL
, dest
, TCG_REG_NONE
, 24);
892 tcg_out_sh64(s
, RSY_SLLG
, dest
, src
, TCG_REG_NONE
, 24);
894 tcg_out_sh32(s
, RS_SRA
, dest
, TCG_REG_NONE
, 24);
896 tcg_out_sh64(s
, RSY_SLLG
, dest
, src
, TCG_REG_NONE
, 56);
897 tcg_out_sh64(s
, RSY_SRAG
, dest
, dest
, TCG_REG_NONE
, 56);
901 static void tgen_ext8u(TCGContext
*s
, TCGType type
, TCGReg dest
, TCGReg src
)
903 if (facilities
& FACILITY_EXT_IMM
) {
904 tcg_out_insn(s
, RRE
, LLGCR
, dest
, src
);
909 tcg_out_movi(s
, type
, TCG_TMP0
, 0xff);
912 tcg_out_movi(s
, type
, dest
, 0xff);
914 if (type
== TCG_TYPE_I32
) {
915 tcg_out_insn(s
, RR
, NR
, dest
, src
);
917 tcg_out_insn(s
, RRE
, NGR
, dest
, src
);
921 static void tgen_ext16s(TCGContext
*s
, TCGType type
, TCGReg dest
, TCGReg src
)
923 if (facilities
& FACILITY_EXT_IMM
) {
924 tcg_out_insn(s
, RRE
, LGHR
, dest
, src
);
928 if (type
== TCG_TYPE_I32
) {
930 tcg_out_sh32(s
, RS_SLL
, dest
, TCG_REG_NONE
, 16);
932 tcg_out_sh64(s
, RSY_SLLG
, dest
, src
, TCG_REG_NONE
, 16);
934 tcg_out_sh32(s
, RS_SRA
, dest
, TCG_REG_NONE
, 16);
936 tcg_out_sh64(s
, RSY_SLLG
, dest
, src
, TCG_REG_NONE
, 48);
937 tcg_out_sh64(s
, RSY_SRAG
, dest
, dest
, TCG_REG_NONE
, 48);
941 static void tgen_ext16u(TCGContext
*s
, TCGType type
, TCGReg dest
, TCGReg src
)
943 if (facilities
& FACILITY_EXT_IMM
) {
944 tcg_out_insn(s
, RRE
, LLGHR
, dest
, src
);
949 tcg_out_movi(s
, type
, TCG_TMP0
, 0xffff);
952 tcg_out_movi(s
, type
, dest
, 0xffff);
954 if (type
== TCG_TYPE_I32
) {
955 tcg_out_insn(s
, RR
, NR
, dest
, src
);
957 tcg_out_insn(s
, RRE
, NGR
, dest
, src
);
961 static inline void tgen_ext32s(TCGContext
*s
, TCGReg dest
, TCGReg src
)
963 tcg_out_insn(s
, RRE
, LGFR
, dest
, src
);
966 static inline void tgen_ext32u(TCGContext
*s
, TCGReg dest
, TCGReg src
)
968 tcg_out_insn(s
, RRE
, LLGFR
, dest
, src
);
971 static inline void tgen32_addi(TCGContext
*s
, TCGReg dest
, int32_t val
)
973 if (val
== (int16_t)val
) {
974 tcg_out_insn(s
, RI
, AHI
, dest
, val
);
976 tcg_out_insn(s
, RIL
, AFI
, dest
, val
);
980 static inline void tgen64_addi(TCGContext
*s
, TCGReg dest
, int64_t val
)
982 if (val
== (int16_t)val
) {
983 tcg_out_insn(s
, RI
, AGHI
, dest
, val
);
984 } else if (val
== (int32_t)val
) {
985 tcg_out_insn(s
, RIL
, AGFI
, dest
, val
);
986 } else if (val
== (uint32_t)val
) {
987 tcg_out_insn(s
, RIL
, ALGFI
, dest
, val
);
994 static void tgen64_andi(TCGContext
*s
, TCGReg dest
, tcg_target_ulong val
)
996 static const S390Opcode ni_insns
[4] = {
997 RI_NILL
, RI_NILH
, RI_NIHL
, RI_NIHH
999 static const S390Opcode nif_insns
[2] = {
1005 /* Look for no-op. */
1010 /* Look for the zero-extensions. */
1011 if (val
== 0xffffffff) {
1012 tgen_ext32u(s
, dest
, dest
);
1016 if (facilities
& FACILITY_EXT_IMM
) {
1018 tgen_ext8u(s
, TCG_TYPE_I64
, dest
, dest
);
1021 if (val
== 0xffff) {
1022 tgen_ext16u(s
, TCG_TYPE_I64
, dest
, dest
);
1026 /* Try all 32-bit insns that can perform it in one go. */
1027 for (i
= 0; i
< 4; i
++) {
1028 tcg_target_ulong mask
= ~(0xffffull
<< i
*16);
1029 if ((val
& mask
) == mask
) {
1030 tcg_out_insn_RI(s
, ni_insns
[i
], dest
, val
>> i
*16);
1035 /* Try all 48-bit insns that can perform it in one go. */
1036 if (facilities
& FACILITY_EXT_IMM
) {
1037 for (i
= 0; i
< 2; i
++) {
1038 tcg_target_ulong mask
= ~(0xffffffffull
<< i
*32);
1039 if ((val
& mask
) == mask
) {
1040 tcg_out_insn_RIL(s
, nif_insns
[i
], dest
, val
>> i
*32);
1046 /* Perform the AND via sequential modifications to the high and low
1047 parts. Do this via recursion to handle 16-bit vs 32-bit masks in
1049 tgen64_andi(s
, dest
, val
| 0xffffffff00000000ull
);
1050 tgen64_andi(s
, dest
, val
| 0x00000000ffffffffull
);
1052 /* With no extended-immediate facility, just emit the sequence. */
1053 for (i
= 0; i
< 4; i
++) {
1054 tcg_target_ulong mask
= 0xffffull
<< i
*16;
1055 if ((val
& mask
) != mask
) {
1056 tcg_out_insn_RI(s
, ni_insns
[i
], dest
, val
>> i
*16);
1062 static void tgen64_ori(TCGContext
*s
, TCGReg dest
, tcg_target_ulong val
)
1064 static const S390Opcode oi_insns
[4] = {
1065 RI_OILL
, RI_OILH
, RI_OIHL
, RI_OIHH
1067 static const S390Opcode nif_insns
[2] = {
1073 /* Look for no-op. */
1078 if (facilities
& FACILITY_EXT_IMM
) {
1079 /* Try all 32-bit insns that can perform it in one go. */
1080 for (i
= 0; i
< 4; i
++) {
1081 tcg_target_ulong mask
= (0xffffull
<< i
*16);
1082 if ((val
& mask
) != 0 && (val
& ~mask
) == 0) {
1083 tcg_out_insn_RI(s
, oi_insns
[i
], dest
, val
>> i
*16);
1088 /* Try all 48-bit insns that can perform it in one go. */
1089 for (i
= 0; i
< 2; i
++) {
1090 tcg_target_ulong mask
= (0xffffffffull
<< i
*32);
1091 if ((val
& mask
) != 0 && (val
& ~mask
) == 0) {
1092 tcg_out_insn_RIL(s
, nif_insns
[i
], dest
, val
>> i
*32);
1097 /* Perform the OR via sequential modifications to the high and
1098 low parts. Do this via recursion to handle 16-bit vs 32-bit
1099 masks in each half. */
1100 tgen64_ori(s
, dest
, val
& 0x00000000ffffffffull
);
1101 tgen64_ori(s
, dest
, val
& 0xffffffff00000000ull
);
1103 /* With no extended-immediate facility, we don't need to be so
1104 clever. Just iterate over the insns and mask in the constant. */
1105 for (i
= 0; i
< 4; i
++) {
1106 tcg_target_ulong mask
= (0xffffull
<< i
*16);
1107 if ((val
& mask
) != 0) {
1108 tcg_out_insn_RI(s
, oi_insns
[i
], dest
, val
>> i
*16);
1114 static void tgen64_xori(TCGContext
*s
, TCGReg dest
, tcg_target_ulong val
)
1116 /* Perform the xor by parts. */
1117 if (val
& 0xffffffff) {
1118 tcg_out_insn(s
, RIL
, XILF
, dest
, val
);
1120 if (val
> 0xffffffff) {
1121 tcg_out_insn(s
, RIL
, XIHF
, dest
, val
>> 31 >> 1);
1125 static int tgen_cmp(TCGContext
*s
, TCGType type
, TCGCond c
, TCGReg r1
,
1126 TCGArg c2
, int c2const
)
1128 bool is_unsigned
= is_unsigned_cond(c
);
1131 if (type
== TCG_TYPE_I32
) {
1132 tcg_out_insn(s
, RR
, LTR
, r1
, r1
);
1134 tcg_out_insn(s
, RRE
, LTGR
, r1
, r1
);
1136 return tcg_cond_to_ltr_cond
[c
];
1139 if (type
== TCG_TYPE_I32
) {
1140 tcg_out_insn(s
, RIL
, CLFI
, r1
, c2
);
1142 tcg_out_insn(s
, RIL
, CLGFI
, r1
, c2
);
1145 if (type
== TCG_TYPE_I32
) {
1146 tcg_out_insn(s
, RIL
, CFI
, r1
, c2
);
1148 tcg_out_insn(s
, RIL
, CGFI
, r1
, c2
);
1154 if (type
== TCG_TYPE_I32
) {
1155 tcg_out_insn(s
, RR
, CLR
, r1
, c2
);
1157 tcg_out_insn(s
, RRE
, CLGR
, r1
, c2
);
1160 if (type
== TCG_TYPE_I32
) {
1161 tcg_out_insn(s
, RR
, CR
, r1
, c2
);
1163 tcg_out_insn(s
, RRE
, CGR
, r1
, c2
);
1167 return tcg_cond_to_s390_cond
[c
];
1170 static void tgen_setcond(TCGContext
*s
, TCGType type
, TCGCond c
,
1171 TCGReg dest
, TCGReg r1
, TCGArg c2
, int c2const
)
1173 int cc
= tgen_cmp(s
, type
, c
, r1
, c2
, c2const
);
1175 /* Emit: r1 = 1; if (cc) goto over; r1 = 0; over: */
1176 tcg_out_movi(s
, type
, dest
, 1);
1177 tcg_out_insn(s
, RI
, BRC
, cc
, (4 + 4) >> 1);
1178 tcg_out_movi(s
, type
, dest
, 0);
1181 static void tgen_gotoi(TCGContext
*s
, int cc
, tcg_target_long dest
)
1183 tcg_target_long off
= (dest
- (tcg_target_long
)s
->code_ptr
) >> 1;
1184 if (off
> -0x8000 && off
< 0x7fff) {
1185 tcg_out_insn(s
, RI
, BRC
, cc
, off
);
1186 } else if (off
== (int32_t)off
) {
1187 tcg_out_insn(s
, RIL
, BRCL
, cc
, off
);
1189 tcg_out_movi(s
, TCG_TYPE_PTR
, TCG_TMP0
, dest
);
1190 tcg_out_insn(s
, RR
, BCR
, cc
, TCG_TMP0
);
1194 static void tgen_branch(TCGContext
*s
, int cc
, int labelno
)
1196 TCGLabel
* l
= &s
->labels
[labelno
];
1198 tgen_gotoi(s
, cc
, l
->u
.value
);
1199 } else if (USE_LONG_BRANCHES
) {
1200 tcg_out16(s
, RIL_BRCL
| (cc
<< 4));
1201 tcg_out_reloc(s
, s
->code_ptr
, R_390_PC32DBL
, labelno
, -2);
1204 tcg_out16(s
, RI_BRC
| (cc
<< 4));
1205 tcg_out_reloc(s
, s
->code_ptr
, R_390_PC16DBL
, labelno
, -2);
1210 static void tgen_compare_branch(TCGContext
*s
, S390Opcode opc
, int cc
,
1211 TCGReg r1
, TCGReg r2
, int labelno
)
1213 TCGLabel
* l
= &s
->labels
[labelno
];
1214 tcg_target_long off
;
1217 off
= (l
->u
.value
- (tcg_target_long
)s
->code_ptr
) >> 1;
1219 /* We need to keep the offset unchanged for retranslation. */
1220 off
= ((int16_t *)s
->code_ptr
)[1];
1221 tcg_out_reloc(s
, s
->code_ptr
+ 2, R_390_PC16DBL
, labelno
, -2);
1224 tcg_out16(s
, (opc
& 0xff00) | (r1
<< 4) | r2
);
1226 tcg_out16(s
, cc
<< 12 | (opc
& 0xff));
1229 static void tgen_compare_imm_branch(TCGContext
*s
, S390Opcode opc
, int cc
,
1230 TCGReg r1
, int i2
, int labelno
)
1232 TCGLabel
* l
= &s
->labels
[labelno
];
1233 tcg_target_long off
;
1236 off
= (l
->u
.value
- (tcg_target_long
)s
->code_ptr
) >> 1;
1238 /* We need to keep the offset unchanged for retranslation. */
1239 off
= ((int16_t *)s
->code_ptr
)[1];
1240 tcg_out_reloc(s
, s
->code_ptr
+ 2, R_390_PC16DBL
, labelno
, -2);
1243 tcg_out16(s
, (opc
& 0xff00) | (r1
<< 4) | cc
);
1245 tcg_out16(s
, (i2
<< 8) | (opc
& 0xff));
1248 static void tgen_brcond(TCGContext
*s
, TCGType type
, TCGCond c
,
1249 TCGReg r1
, TCGArg c2
, int c2const
, int labelno
)
1253 if (facilities
& FACILITY_GEN_INST_EXT
) {
1254 bool is_unsigned
= (c
> TCG_COND_GT
);
1258 cc
= tcg_cond_to_s390_cond
[c
];
1261 opc
= (type
== TCG_TYPE_I32
1262 ? (is_unsigned
? RIE_CLRJ
: RIE_CRJ
)
1263 : (is_unsigned
? RIE_CLGRJ
: RIE_CGRJ
));
1264 tgen_compare_branch(s
, opc
, cc
, r1
, c2
, labelno
);
1268 /* COMPARE IMMEDIATE AND BRANCH RELATIVE has an 8-bit immediate field.
1269 If the immediate we've been given does not fit that range, we'll
1270 fall back to separate compare and branch instructions using the
1271 larger comparison range afforded by COMPARE IMMEDIATE. */
1272 if (type
== TCG_TYPE_I32
) {
1275 in_range
= (uint32_t)c2
== (uint8_t)c2
;
1278 in_range
= (int32_t)c2
== (int8_t)c2
;
1283 in_range
= (uint64_t)c2
== (uint8_t)c2
;
1286 in_range
= (int64_t)c2
== (int8_t)c2
;
1290 tgen_compare_imm_branch(s
, opc
, cc
, r1
, c2
, labelno
);
1295 cc
= tgen_cmp(s
, type
, c
, r1
, c2
, c2const
);
1296 tgen_branch(s
, cc
, labelno
);
1299 static void tgen_calli(TCGContext
*s
, tcg_target_long dest
)
1301 tcg_target_long off
= (dest
- (tcg_target_long
)s
->code_ptr
) >> 1;
1302 if (off
== (int32_t)off
) {
1303 tcg_out_insn(s
, RIL
, BRASL
, TCG_REG_R14
, off
);
1305 tcg_out_movi(s
, TCG_TYPE_PTR
, TCG_TMP0
, dest
);
1306 tcg_out_insn(s
, RR
, BASR
, TCG_REG_R14
, TCG_TMP0
);
1310 static void tcg_out_qemu_ld_direct(TCGContext
*s
, int opc
, TCGReg data
,
1311 TCGReg base
, TCGReg index
, int disp
)
1313 #ifdef TARGET_WORDS_BIGENDIAN
1314 const int bswap
= 0;
1316 const int bswap
= 1;
1320 tcg_out_insn(s
, RXY
, LLGC
, data
, base
, index
, disp
);
1323 tcg_out_insn(s
, RXY
, LGB
, data
, base
, index
, disp
);
1327 /* swapped unsigned halfword load with upper bits zeroed */
1328 tcg_out_insn(s
, RXY
, LRVH
, data
, base
, index
, disp
);
1329 tgen_ext16u(s
, TCG_TYPE_I64
, data
, data
);
1331 tcg_out_insn(s
, RXY
, LLGH
, data
, base
, index
, disp
);
1336 /* swapped sign-extended halfword load */
1337 tcg_out_insn(s
, RXY
, LRVH
, data
, base
, index
, disp
);
1338 tgen_ext16s(s
, TCG_TYPE_I64
, data
, data
);
1340 tcg_out_insn(s
, RXY
, LGH
, data
, base
, index
, disp
);
1345 /* swapped unsigned int load with upper bits zeroed */
1346 tcg_out_insn(s
, RXY
, LRV
, data
, base
, index
, disp
);
1347 tgen_ext32u(s
, data
, data
);
1349 tcg_out_insn(s
, RXY
, LLGF
, data
, base
, index
, disp
);
1354 /* swapped sign-extended int load */
1355 tcg_out_insn(s
, RXY
, LRV
, data
, base
, index
, disp
);
1356 tgen_ext32s(s
, data
, data
);
1358 tcg_out_insn(s
, RXY
, LGF
, data
, base
, index
, disp
);
1363 tcg_out_insn(s
, RXY
, LRVG
, data
, base
, index
, disp
);
1365 tcg_out_insn(s
, RXY
, LG
, data
, base
, index
, disp
);
1373 static void tcg_out_qemu_st_direct(TCGContext
*s
, int opc
, TCGReg data
,
1374 TCGReg base
, TCGReg index
, int disp
)
1376 #ifdef TARGET_WORDS_BIGENDIAN
1377 const int bswap
= 0;
1379 const int bswap
= 1;
1383 if (disp
>= 0 && disp
< 0x1000) {
1384 tcg_out_insn(s
, RX
, STC
, data
, base
, index
, disp
);
1386 tcg_out_insn(s
, RXY
, STCY
, data
, base
, index
, disp
);
1391 tcg_out_insn(s
, RXY
, STRVH
, data
, base
, index
, disp
);
1392 } else if (disp
>= 0 && disp
< 0x1000) {
1393 tcg_out_insn(s
, RX
, STH
, data
, base
, index
, disp
);
1395 tcg_out_insn(s
, RXY
, STHY
, data
, base
, index
, disp
);
1400 tcg_out_insn(s
, RXY
, STRV
, data
, base
, index
, disp
);
1401 } else if (disp
>= 0 && disp
< 0x1000) {
1402 tcg_out_insn(s
, RX
, ST
, data
, base
, index
, disp
);
1404 tcg_out_insn(s
, RXY
, STY
, data
, base
, index
, disp
);
1409 tcg_out_insn(s
, RXY
, STRVG
, data
, base
, index
, disp
);
1411 tcg_out_insn(s
, RXY
, STG
, data
, base
, index
, disp
);
1419 #if defined(CONFIG_SOFTMMU)
1420 static void tgen64_andi_tmp(TCGContext
*s
, TCGReg dest
, tcg_target_ulong val
)
1422 if (tcg_match_andi(0, val
)) {
1423 tcg_out_movi(s
, TCG_TYPE_I64
, TCG_TMP0
, val
);
1424 tcg_out_insn(s
, RRE
, NGR
, dest
, TCG_TMP0
);
1426 tgen64_andi(s
, dest
, val
);
1430 static void tcg_prepare_qemu_ldst(TCGContext
* s
, TCGReg data_reg
,
1431 TCGReg addr_reg
, int mem_index
, int opc
,
1432 uint16_t **label2_ptr_p
, int is_store
)
1434 const TCGReg arg0
= TCG_REG_R2
;
1435 const TCGReg arg1
= TCG_REG_R3
;
1436 int s_bits
= opc
& 3;
1437 uint16_t *label1_ptr
;
1438 tcg_target_long ofs
;
1440 if (TARGET_LONG_BITS
== 32) {
1441 tgen_ext32u(s
, arg0
, addr_reg
);
1443 tcg_out_mov(s
, TCG_TYPE_I64
, arg0
, addr_reg
);
1446 tcg_out_sh64(s
, RSY_SRLG
, arg1
, addr_reg
, TCG_REG_NONE
,
1447 TARGET_PAGE_BITS
- CPU_TLB_ENTRY_BITS
);
1449 tgen64_andi_tmp(s
, arg0
, TARGET_PAGE_MASK
| ((1 << s_bits
) - 1));
1450 tgen64_andi_tmp(s
, arg1
, (CPU_TLB_SIZE
- 1) << CPU_TLB_ENTRY_BITS
);
1453 ofs
= offsetof(CPUArchState
, tlb_table
[mem_index
][0].addr_write
);
1455 ofs
= offsetof(CPUArchState
, tlb_table
[mem_index
][0].addr_read
);
1457 assert(ofs
< 0x80000);
1459 if (TARGET_LONG_BITS
== 32) {
1460 tcg_out_mem(s
, RX_C
, RXY_CY
, arg0
, arg1
, TCG_AREG0
, ofs
);
1462 tcg_out_mem(s
, 0, RXY_CG
, arg0
, arg1
, TCG_AREG0
, ofs
);
1465 if (TARGET_LONG_BITS
== 32) {
1466 tgen_ext32u(s
, arg0
, addr_reg
);
1468 tcg_out_mov(s
, TCG_TYPE_I64
, arg0
, addr_reg
);
1471 label1_ptr
= (uint16_t*)s
->code_ptr
;
1473 /* je label1 (offset will be patched in later) */
1474 tcg_out_insn(s
, RI
, BRC
, S390_CC_EQ
, 0);
1476 /* call load/store helper */
1478 /* Make sure to zero-extend the value to the full register
1479 for the calling convention. */
1482 tgen_ext8u(s
, TCG_TYPE_I64
, arg1
, data_reg
);
1485 tgen_ext16u(s
, TCG_TYPE_I64
, arg1
, data_reg
);
1488 tgen_ext32u(s
, arg1
, data_reg
);
1491 tcg_out_mov(s
, TCG_TYPE_I64
, arg1
, data_reg
);
1496 tcg_out_movi(s
, TCG_TYPE_I32
, TCG_REG_R4
, mem_index
);
1497 /* XXX/FIXME: suboptimal */
1498 tcg_out_mov(s
, TCG_TYPE_I64
, tcg_target_call_iarg_regs
[3],
1499 tcg_target_call_iarg_regs
[2]);
1500 tcg_out_mov(s
, TCG_TYPE_I64
, tcg_target_call_iarg_regs
[2],
1501 tcg_target_call_iarg_regs
[1]);
1502 tcg_out_mov(s
, TCG_TYPE_I64
, tcg_target_call_iarg_regs
[1],
1503 tcg_target_call_iarg_regs
[0]);
1504 tcg_out_mov(s
, TCG_TYPE_I64
, tcg_target_call_iarg_regs
[0],
1506 tgen_calli(s
, (tcg_target_ulong
)qemu_st_helpers
[s_bits
]);
1508 tcg_out_movi(s
, TCG_TYPE_I32
, arg1
, mem_index
);
1509 /* XXX/FIXME: suboptimal */
1510 tcg_out_mov(s
, TCG_TYPE_I64
, tcg_target_call_iarg_regs
[2],
1511 tcg_target_call_iarg_regs
[1]);
1512 tcg_out_mov(s
, TCG_TYPE_I64
, tcg_target_call_iarg_regs
[1],
1513 tcg_target_call_iarg_regs
[0]);
1514 tcg_out_mov(s
, TCG_TYPE_I64
, tcg_target_call_iarg_regs
[0],
1516 tgen_calli(s
, (tcg_target_ulong
)qemu_ld_helpers
[s_bits
]);
1518 /* sign extension */
1521 tgen_ext8s(s
, TCG_TYPE_I64
, data_reg
, arg0
);
1524 tgen_ext16s(s
, TCG_TYPE_I64
, data_reg
, arg0
);
1527 tgen_ext32s(s
, data_reg
, arg0
);
1530 /* unsigned -> just copy */
1531 tcg_out_mov(s
, TCG_TYPE_I64
, data_reg
, arg0
);
1536 /* jump to label2 (end) */
1537 *label2_ptr_p
= (uint16_t*)s
->code_ptr
;
1539 tcg_out_insn(s
, RI
, BRC
, S390_CC_ALWAYS
, 0);
1541 /* this is label1, patch branch */
1542 *(label1_ptr
+ 1) = ((unsigned long)s
->code_ptr
-
1543 (unsigned long)label1_ptr
) >> 1;
1545 ofs
= offsetof(CPUArchState
, tlb_table
[mem_index
][0].addend
);
1546 assert(ofs
< 0x80000);
1548 tcg_out_mem(s
, 0, RXY_AG
, arg0
, arg1
, TCG_AREG0
, ofs
);
1551 static void tcg_finish_qemu_ldst(TCGContext
* s
, uint16_t *label2_ptr
)
1554 *(label2_ptr
+ 1) = ((unsigned long)s
->code_ptr
-
1555 (unsigned long)label2_ptr
) >> 1;
1558 static void tcg_prepare_user_ldst(TCGContext
*s
, TCGReg
*addr_reg
,
1559 TCGReg
*index_reg
, tcg_target_long
*disp
)
1561 if (TARGET_LONG_BITS
== 32) {
1562 tgen_ext32u(s
, TCG_TMP0
, *addr_reg
);
1563 *addr_reg
= TCG_TMP0
;
1565 if (GUEST_BASE
< 0x80000) {
1566 *index_reg
= TCG_REG_NONE
;
1569 *index_reg
= TCG_GUEST_BASE_REG
;
1573 #endif /* CONFIG_SOFTMMU */
1575 /* load data with address translation (if applicable)
1576 and endianness conversion */
1577 static void tcg_out_qemu_ld(TCGContext
* s
, const TCGArg
* args
, int opc
)
1579 TCGReg addr_reg
, data_reg
;
1580 #if defined(CONFIG_SOFTMMU)
1582 uint16_t *label2_ptr
;
1585 tcg_target_long disp
;
1591 #if defined(CONFIG_SOFTMMU)
1594 tcg_prepare_qemu_ldst(s
, data_reg
, addr_reg
, mem_index
,
1595 opc
, &label2_ptr
, 0);
1597 tcg_out_qemu_ld_direct(s
, opc
, data_reg
, TCG_REG_R2
, TCG_REG_NONE
, 0);
1599 tcg_finish_qemu_ldst(s
, label2_ptr
);
1601 tcg_prepare_user_ldst(s
, &addr_reg
, &index_reg
, &disp
);
1602 tcg_out_qemu_ld_direct(s
, opc
, data_reg
, addr_reg
, index_reg
, disp
);
1606 static void tcg_out_qemu_st(TCGContext
* s
, const TCGArg
* args
, int opc
)
1608 TCGReg addr_reg
, data_reg
;
1609 #if defined(CONFIG_SOFTMMU)
1611 uint16_t *label2_ptr
;
1614 tcg_target_long disp
;
1620 #if defined(CONFIG_SOFTMMU)
1623 tcg_prepare_qemu_ldst(s
, data_reg
, addr_reg
, mem_index
,
1624 opc
, &label2_ptr
, 1);
1626 tcg_out_qemu_st_direct(s
, opc
, data_reg
, TCG_REG_R2
, TCG_REG_NONE
, 0);
1628 tcg_finish_qemu_ldst(s
, label2_ptr
);
1630 tcg_prepare_user_ldst(s
, &addr_reg
, &index_reg
, &disp
);
1631 tcg_out_qemu_st_direct(s
, opc
, data_reg
, addr_reg
, index_reg
, disp
);
1635 # define OP_32_64(x) \
1636 case glue(glue(INDEX_op_,x),_i32): \
1637 case glue(glue(INDEX_op_,x),_i64)
1639 static inline void tcg_out_op(TCGContext
*s
, TCGOpcode opc
,
1640 const TCGArg
*args
, const int *const_args
)
1645 case INDEX_op_exit_tb
:
1647 tcg_out_movi(s
, TCG_TYPE_PTR
, TCG_REG_R2
, args
[0]);
1648 tgen_gotoi(s
, S390_CC_ALWAYS
, (unsigned long)tb_ret_addr
);
1651 case INDEX_op_goto_tb
:
1652 if (s
->tb_jmp_offset
) {
1655 /* load address stored at s->tb_next + args[0] */
1656 tcg_out_ld_abs(s
, TCG_TYPE_PTR
, TCG_TMP0
, s
->tb_next
+ args
[0]);
1658 tcg_out_insn(s
, RR
, BCR
, S390_CC_ALWAYS
, TCG_TMP0
);
1660 s
->tb_next_offset
[args
[0]] = s
->code_ptr
- s
->code_buf
;
1664 if (const_args
[0]) {
1665 tgen_calli(s
, args
[0]);
1667 tcg_out_insn(s
, RR
, BASR
, TCG_REG_R14
, args
[0]);
1671 case INDEX_op_mov_i32
:
1672 tcg_out_mov(s
, TCG_TYPE_I32
, args
[0], args
[1]);
1674 case INDEX_op_movi_i32
:
1675 tcg_out_movi(s
, TCG_TYPE_I32
, args
[0], args
[1]);
1679 /* ??? LLC (RXY format) is only present with the extended-immediate
1680 facility, whereas LLGC is always present. */
1681 tcg_out_mem(s
, 0, RXY_LLGC
, args
[0], args
[1], TCG_REG_NONE
, args
[2]);
1685 /* ??? LB is no smaller than LGB, so no point to using it. */
1686 tcg_out_mem(s
, 0, RXY_LGB
, args
[0], args
[1], TCG_REG_NONE
, args
[2]);
1690 /* ??? LLH (RXY format) is only present with the extended-immediate
1691 facility, whereas LLGH is always present. */
1692 tcg_out_mem(s
, 0, RXY_LLGH
, args
[0], args
[1], TCG_REG_NONE
, args
[2]);
1695 case INDEX_op_ld16s_i32
:
1696 tcg_out_mem(s
, RX_LH
, RXY_LHY
, args
[0], args
[1], TCG_REG_NONE
, args
[2]);
1699 case INDEX_op_ld_i32
:
1700 tcg_out_ld(s
, TCG_TYPE_I32
, args
[0], args
[1], args
[2]);
1704 tcg_out_mem(s
, RX_STC
, RXY_STCY
, args
[0], args
[1],
1705 TCG_REG_NONE
, args
[2]);
1709 tcg_out_mem(s
, RX_STH
, RXY_STHY
, args
[0], args
[1],
1710 TCG_REG_NONE
, args
[2]);
1713 case INDEX_op_st_i32
:
1714 tcg_out_st(s
, TCG_TYPE_I32
, args
[0], args
[1], args
[2]);
1717 case INDEX_op_add_i32
:
1718 if (const_args
[2]) {
1719 tgen32_addi(s
, args
[0], args
[2]);
1721 tcg_out_insn(s
, RR
, AR
, args
[0], args
[2]);
1724 case INDEX_op_sub_i32
:
1725 if (const_args
[2]) {
1726 tgen32_addi(s
, args
[0], -args
[2]);
1728 tcg_out_insn(s
, RR
, SR
, args
[0], args
[2]);
1732 case INDEX_op_and_i32
:
1733 if (const_args
[2]) {
1734 tgen64_andi(s
, args
[0], args
[2] | 0xffffffff00000000ull
);
1736 tcg_out_insn(s
, RR
, NR
, args
[0], args
[2]);
1739 case INDEX_op_or_i32
:
1740 if (const_args
[2]) {
1741 tgen64_ori(s
, args
[0], args
[2] & 0xffffffff);
1743 tcg_out_insn(s
, RR
, OR
, args
[0], args
[2]);
1746 case INDEX_op_xor_i32
:
1747 if (const_args
[2]) {
1748 tgen64_xori(s
, args
[0], args
[2] & 0xffffffff);
1750 tcg_out_insn(s
, RR
, XR
, args
[0], args
[2]);
1754 case INDEX_op_neg_i32
:
1755 tcg_out_insn(s
, RR
, LCR
, args
[0], args
[1]);
1758 case INDEX_op_mul_i32
:
1759 if (const_args
[2]) {
1760 if ((int32_t)args
[2] == (int16_t)args
[2]) {
1761 tcg_out_insn(s
, RI
, MHI
, args
[0], args
[2]);
1763 tcg_out_insn(s
, RIL
, MSFI
, args
[0], args
[2]);
1766 tcg_out_insn(s
, RRE
, MSR
, args
[0], args
[2]);
1770 case INDEX_op_div2_i32
:
1771 tcg_out_insn(s
, RR
, DR
, TCG_REG_R2
, args
[4]);
1773 case INDEX_op_divu2_i32
:
1774 tcg_out_insn(s
, RRE
, DLR
, TCG_REG_R2
, args
[4]);
1777 case INDEX_op_shl_i32
:
1780 if (const_args
[2]) {
1781 tcg_out_sh32(s
, op
, args
[0], TCG_REG_NONE
, args
[2]);
1783 tcg_out_sh32(s
, op
, args
[0], args
[2], 0);
1786 case INDEX_op_shr_i32
:
1789 case INDEX_op_sar_i32
:
1793 case INDEX_op_rotl_i32
:
1794 /* ??? Using tcg_out_sh64 here for the format; it is a 32-bit rol. */
1795 if (const_args
[2]) {
1796 tcg_out_sh64(s
, RSY_RLL
, args
[0], args
[1], TCG_REG_NONE
, args
[2]);
1798 tcg_out_sh64(s
, RSY_RLL
, args
[0], args
[1], args
[2], 0);
1801 case INDEX_op_rotr_i32
:
1802 if (const_args
[2]) {
1803 tcg_out_sh64(s
, RSY_RLL
, args
[0], args
[1],
1804 TCG_REG_NONE
, (32 - args
[2]) & 31);
1806 tcg_out_insn(s
, RR
, LCR
, TCG_TMP0
, args
[2]);
1807 tcg_out_sh64(s
, RSY_RLL
, args
[0], args
[1], TCG_TMP0
, 0);
1811 case INDEX_op_ext8s_i32
:
1812 tgen_ext8s(s
, TCG_TYPE_I32
, args
[0], args
[1]);
1814 case INDEX_op_ext16s_i32
:
1815 tgen_ext16s(s
, TCG_TYPE_I32
, args
[0], args
[1]);
1817 case INDEX_op_ext8u_i32
:
1818 tgen_ext8u(s
, TCG_TYPE_I32
, args
[0], args
[1]);
1820 case INDEX_op_ext16u_i32
:
1821 tgen_ext16u(s
, TCG_TYPE_I32
, args
[0], args
[1]);
1825 /* The TCG bswap definition requires bits 0-47 already be zero.
1826 Thus we don't need the G-type insns to implement bswap16_i64. */
1827 tcg_out_insn(s
, RRE
, LRVR
, args
[0], args
[1]);
1828 tcg_out_sh32(s
, RS_SRL
, args
[0], TCG_REG_NONE
, 16);
1831 tcg_out_insn(s
, RRE
, LRVR
, args
[0], args
[1]);
1834 case INDEX_op_add2_i32
:
1835 /* ??? Make use of ALFI. */
1836 tcg_out_insn(s
, RR
, ALR
, args
[0], args
[4]);
1837 tcg_out_insn(s
, RRE
, ALCR
, args
[1], args
[5]);
1839 case INDEX_op_sub2_i32
:
1840 /* ??? Make use of SLFI. */
1841 tcg_out_insn(s
, RR
, SLR
, args
[0], args
[4]);
1842 tcg_out_insn(s
, RRE
, SLBR
, args
[1], args
[5]);
1846 tgen_branch(s
, S390_CC_ALWAYS
, args
[0]);
1849 case INDEX_op_brcond_i32
:
1850 tgen_brcond(s
, TCG_TYPE_I32
, args
[2], args
[0],
1851 args
[1], const_args
[1], args
[3]);
1853 case INDEX_op_setcond_i32
:
1854 tgen_setcond(s
, TCG_TYPE_I32
, args
[3], args
[0], args
[1],
1855 args
[2], const_args
[2]);
1858 case INDEX_op_qemu_ld8u
:
1859 tcg_out_qemu_ld(s
, args
, LD_UINT8
);
1861 case INDEX_op_qemu_ld8s
:
1862 tcg_out_qemu_ld(s
, args
, LD_INT8
);
1864 case INDEX_op_qemu_ld16u
:
1865 tcg_out_qemu_ld(s
, args
, LD_UINT16
);
1867 case INDEX_op_qemu_ld16s
:
1868 tcg_out_qemu_ld(s
, args
, LD_INT16
);
1870 case INDEX_op_qemu_ld32
:
1871 /* ??? Technically we can use a non-extending instruction. */
1872 tcg_out_qemu_ld(s
, args
, LD_UINT32
);
1874 case INDEX_op_qemu_ld64
:
1875 tcg_out_qemu_ld(s
, args
, LD_UINT64
);
1878 case INDEX_op_qemu_st8
:
1879 tcg_out_qemu_st(s
, args
, LD_UINT8
);
1881 case INDEX_op_qemu_st16
:
1882 tcg_out_qemu_st(s
, args
, LD_UINT16
);
1884 case INDEX_op_qemu_st32
:
1885 tcg_out_qemu_st(s
, args
, LD_UINT32
);
1887 case INDEX_op_qemu_st64
:
1888 tcg_out_qemu_st(s
, args
, LD_UINT64
);
1891 case INDEX_op_mov_i64
:
1892 tcg_out_mov(s
, TCG_TYPE_I64
, args
[0], args
[1]);
1894 case INDEX_op_movi_i64
:
1895 tcg_out_movi(s
, TCG_TYPE_I64
, args
[0], args
[1]);
1898 case INDEX_op_ld16s_i64
:
1899 tcg_out_mem(s
, 0, RXY_LGH
, args
[0], args
[1], TCG_REG_NONE
, args
[2]);
1901 case INDEX_op_ld32u_i64
:
1902 tcg_out_mem(s
, 0, RXY_LLGF
, args
[0], args
[1], TCG_REG_NONE
, args
[2]);
1904 case INDEX_op_ld32s_i64
:
1905 tcg_out_mem(s
, 0, RXY_LGF
, args
[0], args
[1], TCG_REG_NONE
, args
[2]);
1907 case INDEX_op_ld_i64
:
1908 tcg_out_ld(s
, TCG_TYPE_I64
, args
[0], args
[1], args
[2]);
1911 case INDEX_op_st32_i64
:
1912 tcg_out_st(s
, TCG_TYPE_I32
, args
[0], args
[1], args
[2]);
1914 case INDEX_op_st_i64
:
1915 tcg_out_st(s
, TCG_TYPE_I64
, args
[0], args
[1], args
[2]);
1918 case INDEX_op_add_i64
:
1919 if (const_args
[2]) {
1920 tgen64_addi(s
, args
[0], args
[2]);
1922 tcg_out_insn(s
, RRE
, AGR
, args
[0], args
[2]);
1925 case INDEX_op_sub_i64
:
1926 if (const_args
[2]) {
1927 tgen64_addi(s
, args
[0], -args
[2]);
1929 tcg_out_insn(s
, RRE
, SGR
, args
[0], args
[2]);
1933 case INDEX_op_and_i64
:
1934 if (const_args
[2]) {
1935 tgen64_andi(s
, args
[0], args
[2]);
1937 tcg_out_insn(s
, RRE
, NGR
, args
[0], args
[2]);
1940 case INDEX_op_or_i64
:
1941 if (const_args
[2]) {
1942 tgen64_ori(s
, args
[0], args
[2]);
1944 tcg_out_insn(s
, RRE
, OGR
, args
[0], args
[2]);
1947 case INDEX_op_xor_i64
:
1948 if (const_args
[2]) {
1949 tgen64_xori(s
, args
[0], args
[2]);
1951 tcg_out_insn(s
, RRE
, XGR
, args
[0], args
[2]);
1955 case INDEX_op_neg_i64
:
1956 tcg_out_insn(s
, RRE
, LCGR
, args
[0], args
[1]);
1958 case INDEX_op_bswap64_i64
:
1959 tcg_out_insn(s
, RRE
, LRVGR
, args
[0], args
[1]);
1962 case INDEX_op_mul_i64
:
1963 if (const_args
[2]) {
1964 if (args
[2] == (int16_t)args
[2]) {
1965 tcg_out_insn(s
, RI
, MGHI
, args
[0], args
[2]);
1967 tcg_out_insn(s
, RIL
, MSGFI
, args
[0], args
[2]);
1970 tcg_out_insn(s
, RRE
, MSGR
, args
[0], args
[2]);
1974 case INDEX_op_div2_i64
:
1975 /* ??? We get an unnecessary sign-extension of the dividend
1976 into R3 with this definition, but as we do in fact always
1977 produce both quotient and remainder using INDEX_op_div_i64
1978 instead requires jumping through even more hoops. */
1979 tcg_out_insn(s
, RRE
, DSGR
, TCG_REG_R2
, args
[4]);
1981 case INDEX_op_divu2_i64
:
1982 tcg_out_insn(s
, RRE
, DLGR
, TCG_REG_R2
, args
[4]);
1985 case INDEX_op_shl_i64
:
1988 if (const_args
[2]) {
1989 tcg_out_sh64(s
, op
, args
[0], args
[1], TCG_REG_NONE
, args
[2]);
1991 tcg_out_sh64(s
, op
, args
[0], args
[1], args
[2], 0);
1994 case INDEX_op_shr_i64
:
1997 case INDEX_op_sar_i64
:
2001 case INDEX_op_rotl_i64
:
2002 if (const_args
[2]) {
2003 tcg_out_sh64(s
, RSY_RLLG
, args
[0], args
[1],
2004 TCG_REG_NONE
, args
[2]);
2006 tcg_out_sh64(s
, RSY_RLLG
, args
[0], args
[1], args
[2], 0);
2009 case INDEX_op_rotr_i64
:
2010 if (const_args
[2]) {
2011 tcg_out_sh64(s
, RSY_RLLG
, args
[0], args
[1],
2012 TCG_REG_NONE
, (64 - args
[2]) & 63);
2014 /* We can use the smaller 32-bit negate because only the
2015 low 6 bits are examined for the rotate. */
2016 tcg_out_insn(s
, RR
, LCR
, TCG_TMP0
, args
[2]);
2017 tcg_out_sh64(s
, RSY_RLLG
, args
[0], args
[1], TCG_TMP0
, 0);
2021 case INDEX_op_ext8s_i64
:
2022 tgen_ext8s(s
, TCG_TYPE_I64
, args
[0], args
[1]);
2024 case INDEX_op_ext16s_i64
:
2025 tgen_ext16s(s
, TCG_TYPE_I64
, args
[0], args
[1]);
2027 case INDEX_op_ext32s_i64
:
2028 tgen_ext32s(s
, args
[0], args
[1]);
2030 case INDEX_op_ext8u_i64
:
2031 tgen_ext8u(s
, TCG_TYPE_I64
, args
[0], args
[1]);
2033 case INDEX_op_ext16u_i64
:
2034 tgen_ext16u(s
, TCG_TYPE_I64
, args
[0], args
[1]);
2036 case INDEX_op_ext32u_i64
:
2037 tgen_ext32u(s
, args
[0], args
[1]);
2040 case INDEX_op_add2_i64
:
2041 /* ??? Make use of ALGFI and SLGFI. */
2042 tcg_out_insn(s
, RRE
, ALGR
, args
[0], args
[4]);
2043 tcg_out_insn(s
, RRE
, ALCGR
, args
[1], args
[5]);
2045 case INDEX_op_sub2_i64
:
2046 /* ??? Make use of ALGFI and SLGFI. */
2047 tcg_out_insn(s
, RRE
, SLGR
, args
[0], args
[4]);
2048 tcg_out_insn(s
, RRE
, SLBGR
, args
[1], args
[5]);
2051 case INDEX_op_brcond_i64
:
2052 tgen_brcond(s
, TCG_TYPE_I64
, args
[2], args
[0],
2053 args
[1], const_args
[1], args
[3]);
2055 case INDEX_op_setcond_i64
:
2056 tgen_setcond(s
, TCG_TYPE_I64
, args
[3], args
[0], args
[1],
2057 args
[2], const_args
[2]);
2060 case INDEX_op_qemu_ld32u
:
2061 tcg_out_qemu_ld(s
, args
, LD_UINT32
);
2063 case INDEX_op_qemu_ld32s
:
2064 tcg_out_qemu_ld(s
, args
, LD_INT32
);
2068 fprintf(stderr
,"unimplemented opc 0x%x\n",opc
);
2073 static const TCGTargetOpDef s390_op_defs
[] = {
2074 { INDEX_op_exit_tb
, { } },
2075 { INDEX_op_goto_tb
, { } },
2076 { INDEX_op_call
, { "ri" } },
2077 { INDEX_op_br
, { } },
2079 { INDEX_op_mov_i32
, { "r", "r" } },
2080 { INDEX_op_movi_i32
, { "r" } },
2082 { INDEX_op_ld8u_i32
, { "r", "r" } },
2083 { INDEX_op_ld8s_i32
, { "r", "r" } },
2084 { INDEX_op_ld16u_i32
, { "r", "r" } },
2085 { INDEX_op_ld16s_i32
, { "r", "r" } },
2086 { INDEX_op_ld_i32
, { "r", "r" } },
2087 { INDEX_op_st8_i32
, { "r", "r" } },
2088 { INDEX_op_st16_i32
, { "r", "r" } },
2089 { INDEX_op_st_i32
, { "r", "r" } },
2091 { INDEX_op_add_i32
, { "r", "0", "rWI" } },
2092 { INDEX_op_sub_i32
, { "r", "0", "rWNI" } },
2093 { INDEX_op_mul_i32
, { "r", "0", "rK" } },
2095 { INDEX_op_div2_i32
, { "b", "a", "0", "1", "r" } },
2096 { INDEX_op_divu2_i32
, { "b", "a", "0", "1", "r" } },
2098 { INDEX_op_and_i32
, { "r", "0", "rWA" } },
2099 { INDEX_op_or_i32
, { "r", "0", "rWO" } },
2100 { INDEX_op_xor_i32
, { "r", "0", "rWX" } },
2102 { INDEX_op_neg_i32
, { "r", "r" } },
2104 { INDEX_op_shl_i32
, { "r", "0", "Ri" } },
2105 { INDEX_op_shr_i32
, { "r", "0", "Ri" } },
2106 { INDEX_op_sar_i32
, { "r", "0", "Ri" } },
2108 { INDEX_op_rotl_i32
, { "r", "r", "Ri" } },
2109 { INDEX_op_rotr_i32
, { "r", "r", "Ri" } },
2111 { INDEX_op_ext8s_i32
, { "r", "r" } },
2112 { INDEX_op_ext8u_i32
, { "r", "r" } },
2113 { INDEX_op_ext16s_i32
, { "r", "r" } },
2114 { INDEX_op_ext16u_i32
, { "r", "r" } },
2116 { INDEX_op_bswap16_i32
, { "r", "r" } },
2117 { INDEX_op_bswap32_i32
, { "r", "r" } },
2119 { INDEX_op_add2_i32
, { "r", "r", "0", "1", "r", "r" } },
2120 { INDEX_op_sub2_i32
, { "r", "r", "0", "1", "r", "r" } },
2122 { INDEX_op_brcond_i32
, { "r", "rWC" } },
2123 { INDEX_op_setcond_i32
, { "r", "r", "rWC" } },
2125 { INDEX_op_qemu_ld8u
, { "r", "L" } },
2126 { INDEX_op_qemu_ld8s
, { "r", "L" } },
2127 { INDEX_op_qemu_ld16u
, { "r", "L" } },
2128 { INDEX_op_qemu_ld16s
, { "r", "L" } },
2129 { INDEX_op_qemu_ld32
, { "r", "L" } },
2130 { INDEX_op_qemu_ld64
, { "r", "L" } },
2132 { INDEX_op_qemu_st8
, { "L", "L" } },
2133 { INDEX_op_qemu_st16
, { "L", "L" } },
2134 { INDEX_op_qemu_st32
, { "L", "L" } },
2135 { INDEX_op_qemu_st64
, { "L", "L" } },
2137 { INDEX_op_mov_i64
, { "r", "r" } },
2138 { INDEX_op_movi_i64
, { "r" } },
2140 { INDEX_op_ld8u_i64
, { "r", "r" } },
2141 { INDEX_op_ld8s_i64
, { "r", "r" } },
2142 { INDEX_op_ld16u_i64
, { "r", "r" } },
2143 { INDEX_op_ld16s_i64
, { "r", "r" } },
2144 { INDEX_op_ld32u_i64
, { "r", "r" } },
2145 { INDEX_op_ld32s_i64
, { "r", "r" } },
2146 { INDEX_op_ld_i64
, { "r", "r" } },
2148 { INDEX_op_st8_i64
, { "r", "r" } },
2149 { INDEX_op_st16_i64
, { "r", "r" } },
2150 { INDEX_op_st32_i64
, { "r", "r" } },
2151 { INDEX_op_st_i64
, { "r", "r" } },
2153 { INDEX_op_add_i64
, { "r", "0", "rI" } },
2154 { INDEX_op_sub_i64
, { "r", "0", "rNI" } },
2155 { INDEX_op_mul_i64
, { "r", "0", "rK" } },
2157 { INDEX_op_div2_i64
, { "b", "a", "0", "1", "r" } },
2158 { INDEX_op_divu2_i64
, { "b", "a", "0", "1", "r" } },
2160 { INDEX_op_and_i64
, { "r", "0", "rA" } },
2161 { INDEX_op_or_i64
, { "r", "0", "rO" } },
2162 { INDEX_op_xor_i64
, { "r", "0", "rX" } },
2164 { INDEX_op_neg_i64
, { "r", "r" } },
2166 { INDEX_op_shl_i64
, { "r", "r", "Ri" } },
2167 { INDEX_op_shr_i64
, { "r", "r", "Ri" } },
2168 { INDEX_op_sar_i64
, { "r", "r", "Ri" } },
2170 { INDEX_op_rotl_i64
, { "r", "r", "Ri" } },
2171 { INDEX_op_rotr_i64
, { "r", "r", "Ri" } },
2173 { INDEX_op_ext8s_i64
, { "r", "r" } },
2174 { INDEX_op_ext8u_i64
, { "r", "r" } },
2175 { INDEX_op_ext16s_i64
, { "r", "r" } },
2176 { INDEX_op_ext16u_i64
, { "r", "r" } },
2177 { INDEX_op_ext32s_i64
, { "r", "r" } },
2178 { INDEX_op_ext32u_i64
, { "r", "r" } },
2180 { INDEX_op_bswap16_i64
, { "r", "r" } },
2181 { INDEX_op_bswap32_i64
, { "r", "r" } },
2182 { INDEX_op_bswap64_i64
, { "r", "r" } },
2184 { INDEX_op_add2_i64
, { "r", "r", "0", "1", "r", "r" } },
2185 { INDEX_op_sub2_i64
, { "r", "r", "0", "1", "r", "r" } },
2187 { INDEX_op_brcond_i64
, { "r", "rC" } },
2188 { INDEX_op_setcond_i64
, { "r", "r", "rC" } },
2190 { INDEX_op_qemu_ld32u
, { "r", "L" } },
2191 { INDEX_op_qemu_ld32s
, { "r", "L" } },
2196 /* ??? Linux kernels provide an AUXV entry AT_HWCAP that provides most of
2197 this information. However, getting at that entry is not easy this far
2198 away from main. Our options are: start searching from environ, but
2199 that fails as soon as someone does a setenv in between. Read the data
2200 from /proc/self/auxv. Or do the probing ourselves. The only thing
2201 extra that AT_HWCAP gives us is HWCAP_S390_HIGH_GPRS, which indicates
2202 that the kernel saves all 64-bits of the registers around traps while
2203 in 31-bit mode. But this is true of all "recent" kernels (ought to dig
2204 back and see from when this might not be true). */
2208 static volatile sig_atomic_t got_sigill
;
2210 static void sigill_handler(int sig
)
2215 static void query_facilities(void)
2217 struct sigaction sa_old
, sa_new
;
2218 register int r0
__asm__("0");
2219 register void *r1
__asm__("1");
2222 memset(&sa_new
, 0, sizeof(sa_new
));
2223 sa_new
.sa_handler
= sigill_handler
;
2224 sigaction(SIGILL
, &sa_new
, &sa_old
);
2226 /* First, try STORE FACILITY LIST EXTENDED. If this is present, then
2227 we need not do any more probing. Unfortunately, this itself is an
2228 extension and the original STORE FACILITY LIST instruction is
2229 kernel-only, storing its results at absolute address 200. */
2232 asm volatile(".word 0xb2b0,0x1000"
2233 : "=r"(r0
) : "0"(0), "r"(r1
) : "memory", "cc");
2236 /* STORE FACILITY EXTENDED is not available. Probe for one of each
2237 kind of instruction that we're interested in. */
2238 /* ??? Possibly some of these are in practice never present unless
2239 the store-facility-extended facility is also present. But since
2240 that isn't documented it's just better to probe for each. */
2242 /* Test for z/Architecture. Required even in 31-bit mode. */
2245 asm volatile(".word 0xb908,0x0000" : "=r"(r0
) : : "cc");
2247 facilities
|= FACILITY_ZARCH_ACTIVE
;
2250 /* Test for long displacement. */
2254 asm volatile(".word 0xe300,0x1000,0x0058"
2255 : "=r"(r0
) : "r"(r1
) : "cc");
2257 facilities
|= FACILITY_LONG_DISP
;
2260 /* Test for extended immediates. */
2263 asm volatile(".word 0xc209,0x0000,0x0000" : : : "cc");
2265 facilities
|= FACILITY_EXT_IMM
;
2268 /* Test for general-instructions-extension. */
2271 asm volatile(".word 0xc201,0x0000,0x0001");
2273 facilities
|= FACILITY_GEN_INST_EXT
;
2277 sigaction(SIGILL
, &sa_old
, NULL
);
2279 /* The translator currently uses these extensions unconditionally.
2280 Pruning this back to the base ESA/390 architecture doesn't seem
2281 worthwhile, since even the KVM target requires z/Arch. */
2283 if ((facilities
& FACILITY_ZARCH_ACTIVE
) == 0) {
2284 fprintf(stderr
, "TCG: z/Arch facility is required.\n");
2285 fprintf(stderr
, "TCG: Boot with a 64-bit enabled kernel.\n");
2288 if ((facilities
& FACILITY_LONG_DISP
) == 0) {
2289 fprintf(stderr
, "TCG: long-displacement facility is required.\n");
2293 /* So far there's just enough support for 31-bit mode to let the
2294 compile succeed. This is good enough to run QEMU with KVM. */
2295 if (sizeof(void *) != 8) {
2296 fprintf(stderr
, "TCG: 31-bit mode is not supported.\n");
2305 static void tcg_target_init(TCGContext
*s
)
2307 #if !defined(CONFIG_USER_ONLY)
2309 if ((1 << CPU_TLB_ENTRY_BITS
) != sizeof(CPUTLBEntry
)) {
2316 tcg_regset_set32(tcg_target_available_regs
[TCG_TYPE_I32
], 0, 0xffff);
2317 tcg_regset_set32(tcg_target_available_regs
[TCG_TYPE_I64
], 0, 0xffff);
2319 tcg_regset_clear(tcg_target_call_clobber_regs
);
2320 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R0
);
2321 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R1
);
2322 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R2
);
2323 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R3
);
2324 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R4
);
2325 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R5
);
2326 /* The return register can be considered call-clobbered. */
2327 tcg_regset_set_reg(tcg_target_call_clobber_regs
, TCG_REG_R14
);
2329 tcg_regset_clear(s
->reserved_regs
);
2330 tcg_regset_set_reg(s
->reserved_regs
, TCG_TMP0
);
2331 /* XXX many insns can't be used with R0, so we better avoid it for now */
2332 tcg_regset_set_reg(s
->reserved_regs
, TCG_REG_R0
);
2333 tcg_regset_set_reg(s
->reserved_regs
, TCG_REG_CALL_STACK
);
2335 tcg_add_target_add_op_defs(s390_op_defs
);
2338 static void tcg_target_qemu_prologue(TCGContext
*s
)
2340 tcg_target_long frame_size
;
2342 /* stmg %r6,%r15,48(%r15) (save registers) */
2343 tcg_out_insn(s
, RXY
, STMG
, TCG_REG_R6
, TCG_REG_R15
, TCG_REG_R15
, 48);
2345 /* aghi %r15,-frame_size */
2346 frame_size
= TCG_TARGET_CALL_STACK_OFFSET
;
2347 frame_size
+= TCG_STATIC_CALL_ARGS_SIZE
;
2348 frame_size
+= CPU_TEMP_BUF_NLONGS
* sizeof(long);
2349 tcg_out_insn(s
, RI
, AGHI
, TCG_REG_R15
, -frame_size
);
2351 tcg_set_frame(s
, TCG_REG_CALL_STACK
,
2352 TCG_STATIC_CALL_ARGS_SIZE
+ TCG_TARGET_CALL_STACK_OFFSET
,
2353 CPU_TEMP_BUF_NLONGS
* sizeof(long));
2355 if (GUEST_BASE
>= 0x80000) {
2356 tcg_out_movi(s
, TCG_TYPE_PTR
, TCG_GUEST_BASE_REG
, GUEST_BASE
);
2357 tcg_regset_set_reg(s
->reserved_regs
, TCG_GUEST_BASE_REG
);
2360 tcg_out_mov(s
, TCG_TYPE_PTR
, TCG_AREG0
, tcg_target_call_iarg_regs
[0]);
2361 /* br %r3 (go to TB) */
2362 tcg_out_insn(s
, RR
, BCR
, S390_CC_ALWAYS
, tcg_target_call_iarg_regs
[1]);
2364 tb_ret_addr
= s
->code_ptr
;
2366 /* lmg %r6,%r15,fs+48(%r15) (restore registers) */
2367 tcg_out_insn(s
, RXY
, LMG
, TCG_REG_R6
, TCG_REG_R15
, TCG_REG_R15
,
2370 /* br %r14 (return) */
2371 tcg_out_insn(s
, RR
, BCR
, S390_CC_ALWAYS
, TCG_REG_R14
);