You can subscribe to this list here.
| 2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
(122) |
Nov
(152) |
Dec
(69) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2003 |
Jan
(6) |
Feb
(25) |
Mar
(73) |
Apr
(82) |
May
(24) |
Jun
(25) |
Jul
(10) |
Aug
(11) |
Sep
(10) |
Oct
(54) |
Nov
(203) |
Dec
(182) |
| 2004 |
Jan
(307) |
Feb
(305) |
Mar
(430) |
Apr
(312) |
May
(187) |
Jun
(342) |
Jul
(487) |
Aug
(637) |
Sep
(336) |
Oct
(373) |
Nov
(441) |
Dec
(210) |
| 2005 |
Jan
(385) |
Feb
(480) |
Mar
(636) |
Apr
(544) |
May
(679) |
Jun
(625) |
Jul
(810) |
Aug
(838) |
Sep
(634) |
Oct
(521) |
Nov
(965) |
Dec
(543) |
| 2006 |
Jan
(494) |
Feb
(431) |
Mar
(546) |
Apr
(411) |
May
(406) |
Jun
(322) |
Jul
(256) |
Aug
(401) |
Sep
(345) |
Oct
(542) |
Nov
(308) |
Dec
(481) |
| 2007 |
Jan
(427) |
Feb
(326) |
Mar
(367) |
Apr
(255) |
May
(244) |
Jun
(204) |
Jul
(223) |
Aug
(231) |
Sep
(354) |
Oct
(374) |
Nov
(497) |
Dec
(362) |
| 2008 |
Jan
(322) |
Feb
(482) |
Mar
(658) |
Apr
(422) |
May
(476) |
Jun
(396) |
Jul
(455) |
Aug
(267) |
Sep
(280) |
Oct
(253) |
Nov
(232) |
Dec
(304) |
| 2009 |
Jan
(486) |
Feb
(470) |
Mar
(458) |
Apr
(423) |
May
(696) |
Jun
(461) |
Jul
(551) |
Aug
(575) |
Sep
(134) |
Oct
(110) |
Nov
(157) |
Dec
(102) |
| 2010 |
Jan
(226) |
Feb
(86) |
Mar
(147) |
Apr
(117) |
May
(107) |
Jun
(203) |
Jul
(193) |
Aug
(238) |
Sep
(300) |
Oct
(246) |
Nov
(23) |
Dec
(75) |
| 2011 |
Jan
(133) |
Feb
(195) |
Mar
(315) |
Apr
(200) |
May
(267) |
Jun
(293) |
Jul
(353) |
Aug
(237) |
Sep
(278) |
Oct
(611) |
Nov
(274) |
Dec
(260) |
| 2012 |
Jan
(303) |
Feb
(391) |
Mar
(417) |
Apr
(441) |
May
(488) |
Jun
(655) |
Jul
(590) |
Aug
(610) |
Sep
(526) |
Oct
(478) |
Nov
(359) |
Dec
(372) |
| 2013 |
Jan
(467) |
Feb
(226) |
Mar
(391) |
Apr
(281) |
May
(299) |
Jun
(252) |
Jul
(311) |
Aug
(352) |
Sep
(481) |
Oct
(571) |
Nov
(222) |
Dec
(231) |
| 2014 |
Jan
(185) |
Feb
(329) |
Mar
(245) |
Apr
(238) |
May
(281) |
Jun
(399) |
Jul
(382) |
Aug
(500) |
Sep
(579) |
Oct
(435) |
Nov
(487) |
Dec
(256) |
| 2015 |
Jan
(338) |
Feb
(357) |
Mar
(330) |
Apr
(294) |
May
(191) |
Jun
(108) |
Jul
(142) |
Aug
(261) |
Sep
(190) |
Oct
(54) |
Nov
(83) |
Dec
(22) |
| 2016 |
Jan
(49) |
Feb
(89) |
Mar
(33) |
Apr
(50) |
May
(27) |
Jun
(34) |
Jul
(53) |
Aug
(53) |
Sep
(98) |
Oct
(206) |
Nov
(93) |
Dec
(53) |
| 2017 |
Jan
(65) |
Feb
(82) |
Mar
(102) |
Apr
(86) |
May
(187) |
Jun
(67) |
Jul
(23) |
Aug
(93) |
Sep
(65) |
Oct
(45) |
Nov
(35) |
Dec
(17) |
| 2018 |
Jan
(26) |
Feb
(35) |
Mar
(38) |
Apr
(32) |
May
(8) |
Jun
(43) |
Jul
(27) |
Aug
(30) |
Sep
(43) |
Oct
(42) |
Nov
(38) |
Dec
(67) |
| 2019 |
Jan
(32) |
Feb
(37) |
Mar
(53) |
Apr
(64) |
May
(49) |
Jun
(18) |
Jul
(14) |
Aug
(53) |
Sep
(25) |
Oct
(30) |
Nov
(49) |
Dec
(31) |
| 2020 |
Jan
(87) |
Feb
(45) |
Mar
(37) |
Apr
(51) |
May
(99) |
Jun
(36) |
Jul
(11) |
Aug
(14) |
Sep
(20) |
Oct
(24) |
Nov
(40) |
Dec
(23) |
| 2021 |
Jan
(14) |
Feb
(53) |
Mar
(85) |
Apr
(15) |
May
(19) |
Jun
(3) |
Jul
(14) |
Aug
(1) |
Sep
(57) |
Oct
(73) |
Nov
(56) |
Dec
(22) |
| 2022 |
Jan
(3) |
Feb
(22) |
Mar
(6) |
Apr
(55) |
May
(46) |
Jun
(39) |
Jul
(15) |
Aug
(9) |
Sep
(11) |
Oct
(34) |
Nov
(20) |
Dec
(36) |
| 2023 |
Jan
(79) |
Feb
(41) |
Mar
(99) |
Apr
(169) |
May
(48) |
Jun
(16) |
Jul
(16) |
Aug
(57) |
Sep
(19) |
Oct
|
Nov
|
Dec
|
| S | M | T | W | T | F | S |
|---|---|---|---|---|---|---|
|
|
|
|
|
|
|
1
(1) |
|
2
(19) |
3
(17) |
4
(15) |
5
(20) |
6
(29) |
7
(13) |
8
(16) |
|
9
(20) |
10
(5) |
11
(10) |
12
(17) |
13
(17) |
14
(22) |
15
(8) |
|
16
(4) |
17
(15) |
18
(7) |
19
(14) |
20
(16) |
21
(18) |
22
(9) |
|
23
(2) |
24
(12) |
25
(3) |
26
(3) |
27
(20) |
28
(9) |
29
(4) |
|
30
(3) |
31
(4) |
|
|
|
|
|
|
From: <sv...@va...> - 2012-12-22 15:01:16
|
florian 2012-12-22 15:01:04 +0000 (Sat, 22 Dec 2012)
New Revision: 2613
Log:
s390: Reduce the size of an s390_insn from 48 bytes to 32 bytes by
- adding one level of indirection for CDAS and DFP binops
- rearranging and tweaking the variant for helper calls
- using seperate insns kinds for signed and unsigned multiplication
and division.
Add an assert to make sure the size stays at 32 bytes.
Modified files:
trunk/priv/host_s390_defs.c
trunk/priv/host_s390_defs.h
Modified: trunk/priv/host_s390_defs.h (+35 -23)
===================================================================
--- trunk/priv/host_s390_defs.h 2012-12-22 14:50:41 +00:00 (rev 2612)
+++ trunk/priv/host_s390_defs.h 2012-12-22 15:01:04 +00:00 (rev 2613)
@@ -121,8 +121,10 @@
S390_INSN_COND_MOVE, /* conditonal "move" to register */
S390_INSN_LOAD_IMMEDIATE,
S390_INSN_ALU,
- S390_INSN_MUL, /* n-bit operands; 2n-bit result */
- S390_INSN_DIV, /* 2n-bit dividend; n-bit divisor; n-bit quot/rem */
+ S390_INSN_SMUL, /* signed multiply; n-bit operands; 2n-bit result */
+ S390_INSN_UMUL, /* unsigned multiply; n-bit operands; 2n-bit result */
+ S390_INSN_SDIV, /* signed division; 2n-bit / n-bit -> n-bit quot/rem */
+ S390_INSN_UDIV, /* unsigned division; 2n-bit / n-bit -> n-bit quot/rem */
S390_INSN_DIVS, /* n-bit dividend; n-bit divisor; n-bit quot/rem */
S390_INSN_CLZ, /* count left-most zeroes */
S390_INSN_UNOP,
@@ -344,7 +346,33 @@
}
+/* The details of a CDAS insn. Carved out to keep the size of
+ s390_insn low */
typedef struct {
+ HReg op1_high;
+ HReg op1_low;
+ s390_amode *op2;
+ HReg op3_high;
+ HReg op3_low;
+ HReg old_mem_high;
+ HReg old_mem_low;
+ HReg scratch;
+} s390_cdas;
+
+/* The details of a binary DFP insn. Carved out to keep the size of
+ s390_insn low */
+typedef struct {
+ s390_dfp_binop_t tag;
+ s390_dfp_round_t rounding_mode;
+ HReg dst_hi; /* 128-bit result high part; 64-bit result */
+ HReg dst_lo; /* 128-bit result low part */
+ HReg op2_hi; /* 128-bit operand high part; 64-bit opnd 1 */
+ HReg op2_lo; /* 128-bit operand low part */
+ HReg op3_hi; /* 128-bit operand high part; 64-bit opnd 2 */
+ HReg op3_lo; /* 128-bit operand low part */
+} s390_dfp_binop;
+
+typedef struct {
s390_insn_tag tag;
/* Usually, this is the size of the result of an operation.
Exceptions are:
@@ -380,13 +408,11 @@
s390_opnd_RMI op2;
} alu;
struct {
- Bool signed_multiply;
HReg dst_hi; /* r10 */
HReg dst_lo; /* also op1 r11 */
s390_opnd_RMI op2;
} mul;
struct {
- Bool signed_divide;
HReg op1_hi; /* also remainder r10 */
HReg op1_lo; /* also quotient r11 */
s390_opnd_RMI op2;
@@ -426,14 +452,7 @@
HReg old_mem;
} cas;
struct {
- HReg op1_high;
- HReg op1_low;
- s390_amode *op2;
- HReg op3_high;
- HReg op3_low;
- HReg old_mem_high;
- HReg old_mem_low;
- HReg scratch;
+ s390_cdas *details;
} cdas;
/* Pseudo-insn for representing a helper call.
TARGET is the absolute address of the helper function
@@ -442,10 +461,10 @@
i.e. in registers r2, r3, r4, r5, and r6, with argument #0 being
passed in r2 and so forth. */
struct {
- s390_cc_t cond;
+ s390_cc_t cond : 16;
+ UInt num_args : 16;
+ HReg dst; /* if not INVALID_HREG, put return value here */
Addr64 target;
- UInt num_args;
- HReg dst; /* if not INVALID_HREG, put return value here */
const HChar *name; /* callee's name (for debugging) */
} helper_call;
@@ -507,14 +526,7 @@
HReg op2_lo; /* 128-bit operand low part */
} bfp_compare;
struct {
- s390_dfp_binop_t tag;
- HReg dst_hi; /* 128-bit result high part; 64-bit result */
- HReg dst_lo; /* 128-bit result low part */
- HReg op2_hi; /* 128-bit operand high part; 64-bit opnd 1 */
- HReg op2_lo; /* 128-bit operand low part */
- HReg op3_hi; /* 128-bit operand high part; 64-bit opnd 2 */
- HReg op3_lo; /* 128-bit operand low part */
- s390_dfp_round_t rounding_mode;
+ s390_dfp_binop *details;
} dfp_binop;
struct {
s390_dfp_conv_t tag;
Modified: trunk/priv/host_s390_defs.c (+132 -104)
===================================================================
--- trunk/priv/host_s390_defs.c 2012-12-22 14:50:41 +00:00 (rev 2612)
+++ trunk/priv/host_s390_defs.c 2012-12-22 15:01:04 +00:00 (rev 2613)
@@ -563,14 +563,16 @@
s390_opnd_RMI_get_reg_usage(u, insn->variant.alu.op2);
break;
- case S390_INSN_MUL:
+ case S390_INSN_SMUL:
+ case S390_INSN_UMUL:
addHRegUse(u, HRmRead, insn->variant.mul.dst_lo); /* op1 */
addHRegUse(u, HRmWrite, insn->variant.mul.dst_lo);
addHRegUse(u, HRmWrite, insn->variant.mul.dst_hi);
s390_opnd_RMI_get_reg_usage(u, insn->variant.mul.op2);
break;
- case S390_INSN_DIV:
+ case S390_INSN_SDIV:
+ case S390_INSN_UDIV:
addHRegUse(u, HRmRead, insn->variant.div.op1_lo);
addHRegUse(u, HRmRead, insn->variant.div.op1_hi);
addHRegUse(u, HRmWrite, insn->variant.div.op1_lo);
@@ -611,16 +613,19 @@
addHRegUse(u, HRmWrite, insn->variant.cas.old_mem);
break;
- case S390_INSN_CDAS:
- addHRegUse(u, HRmRead, insn->variant.cdas.op1_high);
- addHRegUse(u, HRmRead, insn->variant.cdas.op1_low);
- s390_amode_get_reg_usage(u, insn->variant.cas.op2);
- addHRegUse(u, HRmRead, insn->variant.cdas.op3_high);
- addHRegUse(u, HRmRead, insn->variant.cdas.op3_low);
- addHRegUse(u, HRmWrite, insn->variant.cdas.old_mem_high);
- addHRegUse(u, HRmWrite, insn->variant.cdas.old_mem_low);
- addHRegUse(u, HRmWrite, insn->variant.cdas.scratch);
+ case S390_INSN_CDAS: {
+ s390_cdas *cdas = insn->variant.cdas.details;
+
+ addHRegUse(u, HRmRead, cdas->op1_high);
+ addHRegUse(u, HRmRead, cdas->op1_low);
+ s390_amode_get_reg_usage(u, cdas->op2);
+ addHRegUse(u, HRmRead, cdas->op3_high);
+ addHRegUse(u, HRmRead, cdas->op3_low);
+ addHRegUse(u, HRmWrite, cdas->old_mem_high);
+ addHRegUse(u, HRmWrite, cdas->old_mem_low);
+ addHRegUse(u, HRmWrite, cdas->scratch);
break;
+ }
case S390_INSN_COMPARE:
addHRegUse(u, HRmRead, insn->variant.compare.src1);
@@ -703,16 +708,19 @@
addHRegUse(u, HRmRead, insn->variant.bfp_convert.op_lo);
break;
- case S390_INSN_DFP_BINOP:
- addHRegUse(u, HRmWrite, insn->variant.dfp_binop.dst_hi);
- addHRegUse(u, HRmRead, insn->variant.dfp_binop.op2_hi); /* left */
- addHRegUse(u, HRmRead, insn->variant.dfp_binop.op3_hi); /* right */
+ case S390_INSN_DFP_BINOP: {
+ s390_dfp_binop *dfp_binop = insn->variant.dfp_binop.details;
+
+ addHRegUse(u, HRmWrite, dfp_binop->dst_hi);
+ addHRegUse(u, HRmRead, dfp_binop->op2_hi); /* left */
+ addHRegUse(u, HRmRead, dfp_binop->op3_hi); /* right */
if (insn->size == 16) {
- addHRegUse(u, HRmWrite, insn->variant.dfp_binop.dst_lo);
- addHRegUse(u, HRmRead, insn->variant.dfp_binop.op2_lo); /* left */
- addHRegUse(u, HRmRead, insn->variant.dfp_binop.op3_lo); /* right */
+ addHRegUse(u, HRmWrite, dfp_binop->dst_lo);
+ addHRegUse(u, HRmRead, dfp_binop->op2_lo); /* left */
+ addHRegUse(u, HRmRead, dfp_binop->op3_lo); /* right */
}
break;
+ }
case S390_INSN_DFP_COMPARE:
addHRegUse(u, HRmWrite, insn->variant.dfp_compare.dst);
@@ -837,13 +845,15 @@
s390_opnd_RMI_map_regs(m, &insn->variant.alu.op2);
break;
- case S390_INSN_MUL:
+ case S390_INSN_SMUL:
+ case S390_INSN_UMUL:
insn->variant.mul.dst_hi = lookupHRegRemap(m, insn->variant.mul.dst_hi);
insn->variant.mul.dst_lo = lookupHRegRemap(m, insn->variant.mul.dst_lo);
s390_opnd_RMI_map_regs(m, &insn->variant.mul.op2);
break;
- case S390_INSN_DIV:
+ case S390_INSN_SDIV:
+ case S390_INSN_UDIV:
insn->variant.div.op1_hi = lookupHRegRemap(m, insn->variant.div.op1_hi);
insn->variant.div.op1_lo = lookupHRegRemap(m, insn->variant.div.op1_lo);
s390_opnd_RMI_map_regs(m, &insn->variant.div.op2);
@@ -881,16 +891,19 @@
insn->variant.cas.old_mem = lookupHRegRemap(m, insn->variant.cas.old_mem);
break;
- case S390_INSN_CDAS:
- insn->variant.cdas.op1_high = lookupHRegRemap(m, insn->variant.cdas.op1_high);
- insn->variant.cdas.op1_low = lookupHRegRemap(m, insn->variant.cdas.op1_low);
- s390_amode_map_regs(m, insn->variant.cdas.op2);
- insn->variant.cdas.op3_high = lookupHRegRemap(m, insn->variant.cdas.op3_high);
- insn->variant.cdas.op3_low = lookupHRegRemap(m, insn->variant.cdas.op3_low);
- insn->variant.cdas.old_mem_high = lookupHRegRemap(m, insn->variant.cdas.old_mem_high);
- insn->variant.cdas.old_mem_low = lookupHRegRemap(m, insn->variant.cdas.old_mem_low);
- insn->variant.cdas.scratch = lookupHRegRemap(m, insn->variant.cdas.scratch);
+ case S390_INSN_CDAS: {
+ s390_cdas *cdas = insn->variant.cdas.details;
+
+ cdas->op1_high = lookupHRegRemap(m, cdas->op1_high);
+ cdas->op1_low = lookupHRegRemap(m, cdas->op1_low);
+ s390_amode_map_regs(m, cdas->op2);
+ cdas->op3_high = lookupHRegRemap(m, cdas->op3_high);
+ cdas->op3_low = lookupHRegRemap(m, cdas->op3_low);
+ cdas->old_mem_high = lookupHRegRemap(m, cdas->old_mem_high);
+ cdas->old_mem_low = lookupHRegRemap(m, cdas->old_mem_low);
+ cdas->scratch = lookupHRegRemap(m, cdas->scratch);
break;
+ }
case S390_INSN_COMPARE:
insn->variant.compare.src1 = lookupHRegRemap(m, insn->variant.compare.src1);
@@ -971,22 +984,19 @@
lookupHRegRemap(m, insn->variant.bfp_convert.op_lo);
break;
- case S390_INSN_DFP_BINOP:
- insn->variant.dfp_binop.dst_hi =
- lookupHRegRemap(m, insn->variant.dfp_binop.dst_hi);
- insn->variant.dfp_binop.op2_hi =
- lookupHRegRemap(m, insn->variant.dfp_binop.op2_hi);
- insn->variant.dfp_binop.op3_hi =
- lookupHRegRemap(m, insn->variant.dfp_binop.op3_hi);
+ case S390_INSN_DFP_BINOP: {
+ s390_dfp_binop *dfp_binop = insn->variant.dfp_binop.details;
+
+ dfp_binop->dst_hi = lookupHRegRemap(m, dfp_binop->dst_hi);
+ dfp_binop->op2_hi = lookupHRegRemap(m, dfp_binop->op2_hi);
+ dfp_binop->op3_hi = lookupHRegRemap(m, dfp_binop->op3_hi);
if (insn->size == 16) {
- insn->variant.dfp_binop.dst_lo =
- lookupHRegRemap(m, insn->variant.dfp_binop.dst_lo);
- insn->variant.dfp_binop.op2_lo =
- lookupHRegRemap(m, insn->variant.dfp_binop.op2_lo);
- insn->variant.dfp_binop.op3_lo =
- lookupHRegRemap(m, insn->variant.dfp_binop.op3_lo);
+ dfp_binop->dst_lo = lookupHRegRemap(m, dfp_binop->dst_lo);
+ dfp_binop->op2_lo = lookupHRegRemap(m, dfp_binop->op2_lo);
+ dfp_binop->op3_lo = lookupHRegRemap(m, dfp_binop->op3_lo);
}
break;
+ }
case S390_INSN_DFP_COMPARE:
insn->variant.dfp_compare.dst =
@@ -4828,12 +4838,11 @@
vassert(! hregIsVirtual(dst_hi));
vassert(! hregIsVirtual(dst_lo));
- insn->tag = S390_INSN_MUL;
+ insn->tag = signed_multiply ? S390_INSN_SMUL : S390_INSN_UMUL;
insn->size = size;
insn->variant.mul.dst_hi = dst_hi;
insn->variant.mul.dst_lo = dst_lo;
insn->variant.mul.op2 = op2;
- insn->variant.mul.signed_multiply = signed_multiply;
return insn;
}
@@ -4849,12 +4858,11 @@
vassert(! hregIsVirtual(op1_hi));
vassert(! hregIsVirtual(op1_lo));
- insn->tag = S390_INSN_DIV;
+ insn->tag = signed_divide ? S390_INSN_SDIV : S390_INSN_UDIV;
insn->size = size;
insn->variant.div.op1_hi = op1_hi;
insn->variant.div.op1_lo = op1_lo;
insn->variant.div.op2 = op2;
- insn->variant.div.signed_divide = signed_divide;
return insn;
}
@@ -4967,6 +4975,7 @@
HReg scratch)
{
s390_insn *insn = LibVEX_Alloc(sizeof(s390_insn));
+ s390_cdas *cdas = LibVEX_Alloc(sizeof(s390_cdas));
vassert(size == 4 || size == 8);
vassert(op2->x == 0);
@@ -4974,15 +4983,17 @@
insn->tag = S390_INSN_CDAS;
insn->size = size;
- insn->variant.cdas.op1_high = op1_high;
- insn->variant.cdas.op1_low = op1_low;
- insn->variant.cdas.op2 = op2;
- insn->variant.cdas.op3_high = op3_high;
- insn->variant.cdas.op3_low = op3_low;
- insn->variant.cdas.old_mem_high = old_mem_high;
- insn->variant.cdas.old_mem_low = old_mem_low;
- insn->variant.cdas.scratch = scratch;
+ insn->variant.cdas.details = cdas;
+ cdas->op1_high = op1_high;
+ cdas->op1_low = op1_low;
+ cdas->op2 = op2;
+ cdas->op3_high = op3_high;
+ cdas->op3_low = op3_low;
+ cdas->old_mem_high = old_mem_high;
+ cdas->old_mem_low = old_mem_low;
+ cdas->scratch = scratch;
+
return insn;
}
@@ -5259,20 +5270,23 @@
HReg op3, s390_dfp_round_t rounding_mode)
{
s390_insn *insn = LibVEX_Alloc(sizeof(s390_insn));
+ s390_dfp_binop *dfp_binop = LibVEX_Alloc(sizeof(s390_dfp_binop));
vassert(size == 8);
insn->tag = S390_INSN_DFP_BINOP;
insn->size = size;
- insn->variant.dfp_binop.tag = tag;
- insn->variant.dfp_binop.dst_hi = dst;
- insn->variant.dfp_binop.op2_hi = op2;
- insn->variant.dfp_binop.op3_hi = op3;
- insn->variant.dfp_binop.dst_lo = INVALID_HREG;
- insn->variant.dfp_binop.op2_lo = INVALID_HREG;
- insn->variant.dfp_binop.op3_lo = INVALID_HREG;
- insn->variant.dfp_binop.rounding_mode = rounding_mode;
+ insn->variant.dfp_binop.details = dfp_binop;
+ dfp_binop->tag = tag;
+ dfp_binop->dst_hi = dst;
+ dfp_binop->op2_hi = op2;
+ dfp_binop->op3_hi = op3;
+ dfp_binop->dst_lo = INVALID_HREG;
+ dfp_binop->op2_lo = INVALID_HREG;
+ dfp_binop->op3_lo = INVALID_HREG;
+ dfp_binop->rounding_mode = rounding_mode;
+
return insn;
}
@@ -5323,24 +5337,26 @@
HReg op3_lo, s390_dfp_round_t rounding_mode)
{
s390_insn *insn = LibVEX_Alloc(sizeof(s390_insn));
+ s390_dfp_binop *dfp_binop = LibVEX_Alloc(sizeof(s390_dfp_binop));
vassert(size == 16);
vassert(is_valid_fp128_regpair(dst_hi, dst_lo));
vassert(is_valid_fp128_regpair(op2_hi, op2_lo));
vassert(is_valid_fp128_regpair(op3_hi, op3_lo));
-
insn->tag = S390_INSN_DFP_BINOP;
insn->size = size;
- insn->variant.dfp_binop.tag = tag;
- insn->variant.dfp_binop.dst_hi = dst_hi;
- insn->variant.dfp_binop.dst_lo = dst_lo;
- insn->variant.dfp_binop.op2_hi = op2_hi;
- insn->variant.dfp_binop.op2_lo = op2_lo;
- insn->variant.dfp_binop.op3_hi = op3_hi;
- insn->variant.dfp_binop.op3_lo = op3_lo;
- insn->variant.dfp_binop.rounding_mode = rounding_mode;
+ insn->variant.dfp_binop.details = dfp_binop;
+ dfp_binop->tag = tag;
+ dfp_binop->dst_hi = dst_hi;
+ dfp_binop->dst_lo = dst_lo;
+ dfp_binop->op2_hi = op2_hi;
+ dfp_binop->op2_lo = op2_lo;
+ dfp_binop->op3_hi = op3_hi;
+ dfp_binop->op3_lo = op3_lo;
+ dfp_binop->rounding_mode = rounding_mode;
+
return insn;
}
@@ -5804,8 +5820,9 @@
&insn->variant.alu.op2);
break;
- case S390_INSN_MUL:
- if (insn->variant.mul.signed_multiply) {
+ case S390_INSN_SMUL:
+ case S390_INSN_UMUL:
+ if (insn->tag == S390_INSN_SMUL) {
op = "v-muls";
} else {
op = "v-mulu";
@@ -5814,8 +5831,9 @@
&insn->variant.mul.op2);
break;
- case S390_INSN_DIV:
- if (insn->variant.div.signed_divide) {
+ case S390_INSN_SDIV:
+ case S390_INSN_UDIV:
+ if (insn->tag == S390_INSN_SDIV) {
op = "v-divs";
} else {
op = "v-divu";
@@ -5874,13 +5892,14 @@
insn->variant.cas.old_mem);
break;
- case S390_INSN_CDAS:
+ case S390_INSN_CDAS: {
+ s390_cdas *cdas = insn->variant.cdas.details;
+
s390_sprintf(buf, "%M %R,%R,%A,%R,%R,%R,%R", "v-cdas",
- insn->variant.cdas.op1_high, insn->variant.cdas.op1_low,
- insn->variant.cdas.op2, insn->variant.cdas.op3_high,
- insn->variant.cdas.op3_low, insn->variant.cdas.old_mem_high,
- insn->variant.cdas.old_mem_low);
+ cdas->op1_high, cdas->op1_low, cdas->op2, cdas->op3_high,
+ cdas->op3_low, cdas->old_mem_high, cdas->old_mem_low);
break;
+ }
case S390_INSN_COMPARE:
if (insn->variant.compare.signed_comparison) {
@@ -5990,19 +6009,20 @@
insn->variant.bfp_convert.op_hi);
break;
- case S390_INSN_DFP_BINOP:
- switch (insn->variant.dfp_binop.tag) {
+ case S390_INSN_DFP_BINOP: {
+ s390_dfp_binop *dfp_binop = insn->variant.dfp_binop.details;
+
+ switch (dfp_binop->tag) {
case S390_DFP_ADD: op = "v-dadd"; break;
case S390_DFP_SUB: op = "v-dsub"; break;
case S390_DFP_MUL: op = "v-dmul"; break;
case S390_DFP_DIV: op = "v-ddiv"; break;
default: goto fail;
}
- s390_sprintf(buf, "%M %R,%R,%R", op,
- insn->variant.dfp_binop.dst_hi,
- insn->variant.dfp_binop.op2_hi,
- insn->variant.dfp_binop.op3_hi);
+ s390_sprintf(buf, "%M %R,%R,%R", op, dfp_binop->dst_hi,
+ dfp_binop->op2_hi, dfp_binop->op3_hi);
break;
+ }
case S390_INSN_DFP_COMPARE:
s390_sprintf(buf, "%M %R,%R,%R", "v-dcmp", insn->variant.dfp_compare.dst,
@@ -7242,15 +7262,16 @@
UChar r1, r1p1, r3, /*r3p1,*/ b, old_high, old_low, scratch;
Int d;
s390_amode *am;
+ s390_cdas *cdas = insn->variant.cdas.details;
- r1 = hregNumber(insn->variant.cdas.op1_high); /* expected value */
- r1p1 = hregNumber(insn->variant.cdas.op1_low); /* expected value */
- r3 = hregNumber(insn->variant.cdas.op3_high);
- /* r3p1 = hregNumber(insn->variant.cdas.op3_low); */ /* unused */
- old_high = hregNumber(insn->variant.cdas.old_mem_high);
- old_low = hregNumber(insn->variant.cdas.old_mem_low);
- scratch = hregNumber(insn->variant.cdas.scratch);
- am = insn->variant.cdas.op2;
+ r1 = hregNumber(cdas->op1_high); /* expected value */
+ r1p1 = hregNumber(cdas->op1_low); /* expected value */
+ r3 = hregNumber(cdas->op3_high);
+ /* r3p1 = hregNumber(cdas->op3_low); */ /* unused */
+ old_high = hregNumber(cdas->old_mem_high);
+ old_low = hregNumber(cdas->old_mem_low);
+ scratch = hregNumber(cdas->scratch);
+ am = cdas->op2;
b = hregNumber(am->b);
d = am->d;
@@ -7421,7 +7442,7 @@
r1 = hregNumber(insn->variant.mul.dst_hi);
op2 = insn->variant.mul.op2;
- signed_multiply = insn->variant.mul.signed_multiply;
+ signed_multiply = insn->tag == S390_INSN_SMUL;
switch (op2.tag) {
case S390_OPND_REG: {
@@ -7535,7 +7556,7 @@
r1 = hregNumber(insn->variant.div.op1_hi);
op2 = insn->variant.div.op2;
- signed_divide = insn->variant.div.signed_divide;
+ signed_divide = insn->tag == S390_INSN_SDIV;
switch (op2.tag) {
case S390_OPND_REG: {
@@ -8150,14 +8171,16 @@
static UChar *
s390_insn_dfp_binop_emit(UChar *buf, const s390_insn *insn)
{
- UInt r1 = hregNumber(insn->variant.dfp_binop.dst_hi);
- UInt r2 = hregNumber(insn->variant.dfp_binop.op2_hi);
- UInt r3 = hregNumber(insn->variant.dfp_binop.op3_hi);
- UInt m4 = hregNumber(insn->variant.dfp_binop.rounding_mode);
+ s390_dfp_binop *dfp_binop = insn->variant.dfp_binop.details;
+ UInt r1 = hregNumber(dfp_binop->dst_hi);
+ UInt r2 = hregNumber(dfp_binop->op2_hi);
+ UInt r3 = hregNumber(dfp_binop->op3_hi);
+ UInt m4 = hregNumber(dfp_binop->rounding_mode);
+
switch (insn->size) {
case 8:
- switch (insn->variant.dfp_binop.tag) {
+ switch (dfp_binop->tag) {
case S390_DFP_ADD: return s390_emit_ADTRA(buf, r3, m4, r1, r2); break;
case S390_DFP_SUB: return s390_emit_SDTRA(buf, r3, m4, r1, r2); break;
case S390_DFP_MUL: return s390_emit_MDTRA(buf, r3, m4, r1, r2); break;
@@ -8167,7 +8190,7 @@
break;
case 16:
- switch (insn->variant.dfp_binop.tag) {
+ switch (dfp_binop->tag) {
case S390_DFP_ADD: return s390_emit_AXTRA(buf, r3, m4, r1, r2);
case S390_DFP_SUB: return s390_emit_SXTRA(buf, r3, m4, r1, r2);
case S390_DFP_MUL: return s390_emit_MXTRA(buf, r3, m4, r1, r2);
@@ -8737,6 +8760,9 @@
{
UChar *end;
+ /* Used to be 48 bytes. Make sure it stays low */
+ vassert(sizeof(s390_insn) == 32);
+
switch (insn->tag) {
case S390_INSN_LOAD:
end = s390_insn_load_emit(buf, insn);
@@ -8762,11 +8788,13 @@
end = s390_insn_alu_emit(buf, insn);
break;
- case S390_INSN_MUL:
+ case S390_INSN_SMUL:
+ case S390_INSN_UMUL:
end = s390_insn_mul_emit(buf, insn);
break;
- case S390_INSN_DIV:
+ case S390_INSN_SDIV:
+ case S390_INSN_UDIV:
end = s390_insn_div_emit(buf, insn);
break;
|
|
From: Florian K. <br...@ac...> - 2012-12-22 14:52:45
|
On 12/22/2012 07:09 AM, Maran Pakkirisamy wrote:
>
> On 12/22/2012 02:35 AM, sv...@va... wrote:
>> +/* The result of a Iop_CmpDxx operation is a condition code. It is
>> + encoded using the values defined in type IRCmpDxxResult.
>> + Before we can store the condition code into the guest state (or do
>> + anything else with it for that matter) we need to convert it to
>> + the encoding that s390 uses. This is what this function does. */
>> +static IRExpr *
>> +convert_vex_dfpcc_to_s390(IRTemp vex_cc)
>> +{
>> + /* The VEX encodings for IRCmpDxxResult and IRCmpFxxResult are the
>> + same. currently. */
>> + return convert_vex_dfpcc_to_s390(vex_cc);
>> +}
>> +
>>
>
> convert_vex_bfpcc_to_s390(vex_cc);
>
>
> is supposed to be returned.
Urgh.. Yes, of course. Fixed in VEX r2612.
I guess we're not testing this :)
Florian
|
|
From: <sv...@va...> - 2012-12-22 14:50:55
|
florian 2012-12-22 14:50:41 +0000 (Sat, 22 Dec 2012)
New Revision: 2612
Log:
s390: Fix a silly mistake causing an infinite loop.
Spotted by Maran Pakkirisamy (ma...@li...).
Modified files:
trunk/priv/guest_s390_toIR.c
Modified: trunk/priv/guest_s390_toIR.c (+1 -1)
===================================================================
--- trunk/priv/guest_s390_toIR.c 2012-12-22 02:28:25 +00:00 (rev 2611)
+++ trunk/priv/guest_s390_toIR.c 2012-12-22 14:50:41 +00:00 (rev 2612)
@@ -1677,7 +1677,7 @@
{
/* The VEX encodings for IRCmpDxxResult and IRCmpFxxResult are the
same. currently. */
- return convert_vex_dfpcc_to_s390(vex_cc);
+ return convert_vex_bfpcc_to_s390(vex_cc);
}
|
|
From: Maran P. <ma...@li...> - 2012-12-22 12:40:27
|
On 12/22/2012 02:35 AM, sv...@va... wrote:
> +/* The result of a Iop_CmpDxx operation is a condition code. It is
> + encoded using the values defined in type IRCmpDxxResult.
> + Before we can store the condition code into the guest state (or do
> + anything else with it for that matter) we need to convert it to
> + the encoding that s390 uses. This is what this function does. */
> +static IRExpr *
> +convert_vex_dfpcc_to_s390(IRTemp vex_cc)
> +{
> + /* The VEX encodings for IRCmpDxxResult and IRCmpFxxResult are the
> + same. currently. */
> + return convert_vex_dfpcc_to_s390(vex_cc);
> +}
> +
>
convert_vex_bfpcc_to_s390(vex_cc);
is supposed to be returned.
|
|
From: Philippe W. <phi...@sk...> - 2012-12-22 04:55:44
|
valgrind revision: 13195 VEX revision: 2611 C compiler: gcc (GCC) 4.6.3 20120306 (Red Hat 4.6.3-2) Assembler: GNU assembler version 2.21.53.0.1-6.fc16 20110716 C library: GNU C Library development release version 2.14.90 uname -mrs: Linux 3.3.1-3.fc16.ppc64 ppc64 Vendor version: Fedora release 16 (Verne) Nightly build on gcc110 ( Fedora release 16 (Verne), ppc64 ) Started at 2012-12-21 20:00:41 PST Ended at 2012-12-21 20:53:56 PST Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 542 tests, 10 stderr failures, 5 stdout failures, 1 stderrB failure, 1 stdoutB failure, 2 post failures == gdbserver_tests/mcmain_pic (stdout) gdbserver_tests/mcmain_pic (stderr) gdbserver_tests/mcmain_pic (stdoutB) gdbserver_tests/mcmain_pic (stderrB) memcheck/tests/linux/getregset (stdout) memcheck/tests/linux/getregset (stderr) memcheck/tests/supp_unknown (stderr) memcheck/tests/varinfo6 (stderr) memcheck/tests/vbit-test/vbit-test (stderr) memcheck/tests/wrap8 (stdout) memcheck/tests/wrap8 (stderr) massif/tests/big-alloc (post) massif/tests/deep-D (post) none/tests/ppc32/test_dfp2 (stdout) none/tests/ppc32/test_dfp2 (stderr) none/tests/ppc64/test_dfp2 (stdout) none/tests/ppc64/test_dfp2 (stderr) helgrind/tests/tc18_semabuse (stderr) helgrind/tests/tc20_verifywrap (stderr) |
|
From: Christian B. <bor...@de...> - 2012-12-22 03:13:47
|
valgrind revision: 13195 VEX revision: 2611 C compiler: gcc (SUSE Linux) 4.3.4 [gcc-4_3-branch revision 152973] Assembler: GNU assembler (GNU Binutils; SUSE Linux Enterprise 11) 2.21.1 C library: GNU C Library stable release version 2.11.3 (20110527) uname -mrs: Linux 3.0.42-0.7-default s390x Vendor version: Welcome to SUSE Linux Enterprise Server 11 SP2 (s390x) - Kernel %r (%t). Nightly build on sless390 ( SUSE Linux Enterprise Server 11 SP1 gcc 4.3.4 on z196 (s390x) ) Started at 2012-12-22 03:45:01 CET Ended at 2012-12-22 04:13:33 CET Results differ from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... done Regression test results follow == 616 tests, 0 stderr failures, 0 stdout failures, 0 stderrB failures, 0 stdoutB failures, 0 post failures == ================================================= == Results from 24 hours ago == ================================================= Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... done Regression test results follow == 615 tests, 0 stderr failures, 0 stdout failures, 0 stderrB failures, 0 stdoutB failures, 0 post failures == ================================================= == Difference between 24 hours ago and now == ================================================= *** old.short Sat Dec 22 03:59:25 2012 --- new.short Sat Dec 22 04:13:33 2012 *************** *** 8,10 **** ! == 615 tests, 0 stderr failures, 0 stdout failures, 0 stderrB failures, 0 stdoutB failures, 0 post failures == --- 8,10 ---- ! == 616 tests, 0 stderr failures, 0 stdout failures, 0 stderrB failures, 0 stdoutB failures, 0 post failures == |
|
From: Christian B. <bor...@de...> - 2012-12-22 03:08:42
|
valgrind revision: 13195 VEX revision: 2611 C compiler: gcc (GCC) 4.6.1 20110908 (Red Hat 4.6.1-9bb4) Assembler: GNU assembler version 2.21.51.0.6-6bb6.fc15 20110118 C library: GNU C Library stable release version 2.14.1 uname -mrs: Linux 3.6.8-57.x.20121204-s390xperformance s390x Vendor version: unknown Nightly build on fedora390 ( Fedora 15 with devel libc/toolchain on z196 (s390x) ) Started at 2012-12-22 03:45:01 CET Ended at 2012-12-22 04:08:45 CET Results differ from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 617 tests, 2 stderr failures, 0 stdout failures, 6 stderrB failures, 0 stdoutB failures, 0 post failures == gdbserver_tests/mcbreak (stderrB) gdbserver_tests/mcclean_after_fork (stderrB) gdbserver_tests/mcleak (stderrB) gdbserver_tests/mcmain_pic (stderrB) gdbserver_tests/mcvabits (stderrB) gdbserver_tests/mssnapshot (stderrB) helgrind/tests/tc18_semabuse (stderr) helgrind/tests/tc20_verifywrap (stderr) ================================================= == Results from 24 hours ago == ================================================= Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 616 tests, 2 stderr failures, 0 stdout failures, 6 stderrB failures, 0 stdoutB failures, 0 post failures == gdbserver_tests/mcbreak (stderrB) gdbserver_tests/mcclean_after_fork (stderrB) gdbserver_tests/mcleak (stderrB) gdbserver_tests/mcmain_pic (stderrB) gdbserver_tests/mcvabits (stderrB) gdbserver_tests/mssnapshot (stderrB) helgrind/tests/tc18_semabuse (stderr) helgrind/tests/tc20_verifywrap (stderr) ================================================= == Difference between 24 hours ago and now == ================================================= *** old.short Sat Dec 22 03:56:57 2012 --- new.short Sat Dec 22 04:08:45 2012 *************** *** 8,10 **** ! == 616 tests, 2 stderr failures, 0 stdout failures, 6 stderrB failures, 0 stdoutB failures, 0 post failures == gdbserver_tests/mcbreak (stderrB) --- 8,10 ---- ! == 617 tests, 2 stderr failures, 0 stdout failures, 6 stderrB failures, 0 stdoutB failures, 0 post failures == gdbserver_tests/mcbreak (stderrB) |
|
From: <sv...@va...> - 2012-12-22 02:28:41
|
florian 2012-12-22 02:28:25 +0000 (Sat, 22 Dec 2012)
New Revision: 2611
Log:
s390: Generalise S390_INSN_GADD which only worked on the guest
state to S390_INSN_MADD which works for any memory location
addressable with base reg + 20-bit displacement.
Modified files:
trunk/priv/host_s390_defs.c
trunk/priv/host_s390_defs.h
trunk/priv/host_s390_isel.c
Modified: trunk/priv/host_s390_defs.h (+5 -4)
===================================================================
--- trunk/priv/host_s390_defs.h 2012-12-22 02:09:40 +00:00 (rev 2610)
+++ trunk/priv/host_s390_defs.h 2012-12-22 02:28:25 +00:00 (rev 2611)
@@ -142,7 +142,7 @@
S390_INSN_DFP_CONVERT,
S390_INSN_MFENCE,
S390_INSN_MZERO, /* Assign zero to a memory location */
- S390_INSN_GADD, /* Add a value to a guest register */
+ S390_INSN_MADD, /* Add a value to a memory location */
S390_INSN_SET_FPC_BFPRM, /* Set the bfp rounding mode in the FPC */
S390_INSN_SET_FPC_DFPRM, /* Set the dfp rounding mode in the FPC */
/* The following 5 insns are mandated by translation chaining */
@@ -537,10 +537,10 @@
s390_amode *dst;
} mzero;
struct {
- UInt offset;
+ s390_amode *dst;
UChar delta;
ULong value; /* for debugging only */
- } gadd;
+ } madd;
struct {
HReg mode;
} set_fpc_bfprm;
@@ -655,7 +655,8 @@
s390_dfp_round_t);
s390_insn *s390_insn_mfence(void);
s390_insn *s390_insn_mzero(UChar size, s390_amode *dst);
-s390_insn *s390_insn_gadd(UChar size, UInt offset, UChar delta, ULong value);
+s390_insn *s390_insn_madd(UChar size, s390_amode *dst, UChar delta,
+ ULong value);
s390_insn *s390_insn_set_fpc_bfprm(UChar size, HReg mode);
s390_insn *s390_insn_set_fpc_dfprm(UChar size, HReg mode);
Modified: trunk/priv/host_s390_defs.c (+35 -18)
===================================================================
--- trunk/priv/host_s390_defs.c 2012-12-22 02:09:40 +00:00 (rev 2610)
+++ trunk/priv/host_s390_defs.c 2012-12-22 02:28:25 +00:00 (rev 2611)
@@ -737,8 +737,11 @@
s390_amode_get_reg_usage(u, insn->variant.mzero.dst);
break;
+ case S390_INSN_MADD:
+ s390_amode_get_reg_usage(u, insn->variant.madd.dst);
+ break;
+
case S390_INSN_MFENCE:
- case S390_INSN_GADD:
break;
case S390_INSN_SET_FPC_BFPRM:
@@ -1017,8 +1020,11 @@
s390_amode_map_regs(m, insn->variant.mzero.dst);
break;
+ case S390_INSN_MADD:
+ s390_amode_map_regs(m, insn->variant.madd.dst);
+ break;
+
case S390_INSN_MFENCE:
- case S390_INSN_GADD:
break;
case S390_INSN_SET_FPC_BFPRM:
@@ -5444,15 +5450,21 @@
s390_insn *
-s390_insn_gadd(UChar size, UInt offset, UChar delta, ULong value)
+s390_insn_madd(UChar size, s390_amode *dst, UChar delta, ULong value)
{
s390_insn *insn = LibVEX_Alloc(sizeof(s390_insn));
- insn->tag = S390_INSN_GADD;
+ vassert(size == 4 || size == 8);
+
+ /* This insn will be mapped to an ASI or AGSI so we can only allow base
+ register plus 12-bit / 20-bit displacement. */
+ vassert(dst->tag == S390_AMODE_B12 || dst->tag == S390_AMODE_B20);
+
+ insn->tag = S390_INSN_MADD;
insn->size = size;
- insn->variant.gadd.offset = offset;
- insn->variant.gadd.delta = delta;
- insn->variant.gadd.value = value;
+ insn->variant.madd.dst = dst;
+ insn->variant.madd.delta = delta;
+ insn->variant.madd.value = value;
return insn;
}
@@ -6018,11 +6030,11 @@
s390_sprintf(buf, "%M %A", "v-mzero", insn->variant.mzero.dst);
break;
- case S390_INSN_GADD:
- s390_sprintf(buf, "%M %G += %I (= %I)", "v-gadd",
- insn->variant.gadd.offset,
- (Long)(Char)insn->variant.gadd.delta,
- insn->variant.gadd.value);
+ case S390_INSN_MADD:
+ s390_sprintf(buf, "%M %A += %I (= %I)", "v-madd",
+ insn->variant.madd.dst,
+ (Long)(Char)insn->variant.madd.delta,
+ insn->variant.madd.value);
break;
case S390_INSN_SET_FPC_BFPRM:
@@ -8237,11 +8249,16 @@
static UChar *
-s390_insn_gadd_emit(UChar *buf, const s390_insn *insn)
+s390_insn_madd_emit(UChar *buf, const s390_insn *insn)
{
- return s390_emit_AGSI(buf, insn->variant.gadd.delta,
- S390_REGNO_GUEST_STATE_POINTER,
- DISP20(insn->variant.gadd.offset));
+ s390_amode *am = insn->variant.madd.dst;
+
+ if (insn->size == 4) {
+ return s390_emit_ASI(buf, insn->variant.madd.delta, am->b,
+ DISP20(am->d));
+ }
+
+ return s390_emit_AGSI(buf, insn->variant.madd.delta, am->b, DISP20(am->d));
}
@@ -8829,8 +8846,8 @@
end = s390_insn_mzero_emit(buf, insn);
break;
- case S390_INSN_GADD:
- end = s390_insn_gadd_emit(buf, insn);
+ case S390_INSN_MADD:
+ end = s390_insn_madd_emit(buf, insn);
break;
case S390_INSN_SET_FPC_BFPRM:
Modified: trunk/priv/host_s390_isel.c (+5 -5)
===================================================================
--- trunk/priv/host_s390_isel.c 2012-12-22 02:09:40 +00:00 (rev 2610)
+++ trunk/priv/host_s390_isel.c 2012-12-22 02:28:25 +00:00 (rev 2611)
@@ -2912,6 +2912,7 @@
case Ity_I16:
case Ity_I32:
case Ity_I64:
+ /* fixs390: We could check for INSN_MADD here. */
if (am->tag == S390_AMODE_B12 &&
s390_expr_is_const_zero(stmt->Ist.Store.data)) {
addInstr(env, s390_insn_mzero(sizeofIRType(tyd), am));
@@ -3020,7 +3021,8 @@
difference = new_value - old_value;
if (s390_host_has_gie && ulong_fits_signed_8bit(difference)) {
- addInstr(env, s390_insn_gadd(sizeofIRType(tyd), offset,
+ am = s390_amode_for_guest_state(offset);
+ addInstr(env, s390_insn_madd(sizeofIRType(tyd), am,
(difference & 0xFF), new_value));
return;
}
@@ -3029,13 +3031,11 @@
Use R0 as a scratch reg. */
if ((old_value >> 32) == (new_value >> 32)) {
HReg r0 = make_gpr(0);
- HReg gsp = make_gpr(S390_REGNO_GUEST_STATE_POINTER);
- s390_amode *gam;
- gam = s390_amode_b12(offset + 4, gsp);
+ am = s390_amode_for_guest_state(offset + 4);
addInstr(env, s390_insn_load_immediate(4, r0,
new_value & 0xFFFFFFFF));
- addInstr(env, s390_insn_store(4, gam, r0));
+ addInstr(env, s390_insn_store(4, am, r0));
return;
}
|
|
From: <sv...@va...> - 2012-12-22 02:09:54
|
florian 2012-12-22 02:09:40 +0000 (Sat, 22 Dec 2012)
New Revision: 2610
Log:
s390: Fix an assert.
Modified files:
trunk/priv/host_s390_defs.c
Modified: trunk/priv/host_s390_defs.c (+1 -1)
===================================================================
--- trunk/priv/host_s390_defs.c 2012-12-21 21:43:00 +00:00 (rev 2609)
+++ trunk/priv/host_s390_defs.c 2012-12-22 02:09:40 +00:00 (rev 2610)
@@ -5296,7 +5296,7 @@
{
s390_insn *insn = LibVEX_Alloc(sizeof(s390_insn));
- vassert(size == 8);
+ vassert(size == 4 || size == 8);
insn->tag = S390_INSN_DFP_CONVERT;
insn->size = size;
|