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
(14) |
2
(16) |
3
(13) |
4
(3) |
|
5
(18) |
6
(1) |
7
(6) |
8
(2) |
9
(16) |
10
(19) |
11
(14) |
|
12
(1) |
13
(6) |
14
(20) |
15
(26) |
16
(18) |
17
(15) |
18
(16) |
|
19
(7) |
20
(8) |
21
(19) |
22
(19) |
23
(21) |
24
(15) |
25
(15) |
|
26
(11) |
27
(17) |
28
(21) |
29
(14) |
|
|
|
|
From: <sv...@va...> - 2012-02-04 17:21:16
|
Author: florian
Date: 2012-02-04 17:16:40 +0000 (Sat, 04 Feb 2012)
New Revision: 12368
Log:
Add testcases for TR, TRE, TRTT, TROT, TRTO insns.
Fixes #273114. Patch by Divya Vyas (div...@li...).
Added:
trunk/none/tests/s390x/table.h
trunk/none/tests/s390x/tr.c
trunk/none/tests/s390x/tr.stderr.exp
trunk/none/tests/s390x/tr.stdout.exp
trunk/none/tests/s390x/tr.vgtest
trunk/none/tests/s390x/tre.c
trunk/none/tests/s390x/tre.stderr.exp
trunk/none/tests/s390x/tre.stdout.exp
trunk/none/tests/s390x/tre.vgtest
trunk/none/tests/s390x/trot.c
trunk/none/tests/s390x/trot.stderr.exp
trunk/none/tests/s390x/trot.stdout.exp
trunk/none/tests/s390x/trot.vgtest
trunk/none/tests/s390x/trto.c
trunk/none/tests/s390x/trto.stderr.exp
trunk/none/tests/s390x/trto.stdout.exp
trunk/none/tests/s390x/trto.vgtest
trunk/none/tests/s390x/trtt.c
trunk/none/tests/s390x/trtt.stderr.exp
trunk/none/tests/s390x/trtt.stdout.exp
trunk/none/tests/s390x/trtt.vgtest
Modified:
trunk/NEWS
trunk/none/tests/s390x/
trunk/none/tests/s390x/Makefile.am
trunk/none/tests/s390x/troo.c
Modified: trunk/NEWS
===================================================================
--- trunk/NEWS 2012-02-04 14:40:44 UTC (rev 12367)
+++ trunk/NEWS 2012-02-04 17:16:40 UTC (rev 12368)
@@ -40,6 +40,7 @@
247386 make perf does not run all performance tests
270796 s390x: Removed broken support for the TS insn
271438 Fix configure for proper SSE4.2 detection
+273114 s390x: Support TR, TRE, TROO, TROT, TRTO, and TRTT instructions
276993 fix mremap 'no thrash checks'
281482 valgrind's memcheck incorrect byte allocation count in realloc() for silly argument
282230 group allocator for small fixed size, use it for MC_Chunk/SEc vbit
Property changes on: trunk/none/tests/s390x
___________________________________________________________________
Name: svn:ignore
- .deps
add
add_EI
add_GE
and
and_EI
clc
clcle
cvb
cvd
div
ex_clone
ex_sig
flogr
icm
insert
insert_EI
lam_stam
lpr
Makefile
Makefile.in
mul
mul_GE
mvst
or
or_EI
srst
sub
sub_EI
tcxb
xc
xor
xor_EI
stck
stcke
stckf
op_exception
fgx
condloadstore
fold_And16
stfle
op00
cksm
clcl
mvcl
troo
+ .deps
add
add_EI
add_GE
allexec
and
and_EI
clc
clcle
cvb
cvd
div
ex_clone
ex_sig
flogr
icm
insert
insert_EI
lam_stam
lpr
Makefile
Makefile.in
mul
mul_GE
mvst
or
or_EI
srst
sub
sub_EI
tcxb
xc
xor
xor_EI
stck
stcke
stckf
op_exception
fgx
condloadstore
fold_And16
stfle
op00
cksm
clcl
mvcl
troo
trot
trto
trtt
tr
tre
Modified: trunk/none/tests/s390x/Makefile.am
===================================================================
--- trunk/none/tests/s390x/Makefile.am 2012-02-04 14:40:44 UTC (rev 12367)
+++ trunk/none/tests/s390x/Makefile.am 2012-02-04 17:16:40 UTC (rev 12368)
@@ -5,7 +5,8 @@
INSN_TESTS = clc clcle cvb cvd icm lpr tcxb lam_stam xc mvst add sub mul \
and or xor insert div srst fold_And16 flogr sub_EI add_EI \
and_EI or_EI xor_EI insert_EI mul_GE add_GE condloadstore \
- op_exception fgx stck stckf stcke stfle cksm mvcl clcl troo
+ op_exception fgx stck stckf stcke stfle cksm mvcl clcl troo \
+ trto trot trtt tr tre
check_PROGRAMS = $(INSN_TESTS) \
allexec \
@@ -21,13 +22,13 @@
ex_clone.stdout.exp ex_clone.stderr.exp ex_clone.vgtest \
op00.stderr.exp1 op00.stderr.exp2 op00.vgtest \
test.h opcodes.h add.h and.h div.h insert.h \
- mul.h or.h sub.h test.h xor.h
+ mul.h or.h sub.h test.h xor.h table.h
AM_CFLAGS += @FLAG_M64@
AM_CXXFLAGS += @FLAG_M64@
AM_CCASFLAGS += @FLAG_M64@
-allexec_CFLAGS = $(AM_CFLAGS) @FLAG_W_NO_NONNULL@
+allexec_CFLAGS = $(AM_CFLAGS) @FLAG_W_NO_NONNULL@
ex_clone_LDFLAGS = -lpthread
tcxb_CFLAGS = $(AM_CFLAGS) -std=gnu99
Added: trunk/none/tests/s390x/table.h
===================================================================
--- trunk/none/tests/s390x/table.h (rev 0)
+++ trunk/none/tests/s390x/table.h 2012-02-04 17:16:40 UTC (rev 12368)
@@ -0,0 +1,75 @@
+char touppercase[256] =
+{
+
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+ 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
+ 0x30, 0x31, 0x32/*50*/, 0x33, 0x34, 0x35, 0x36, 0x37,
+ 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
+ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
+ 0x50/*80*/, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
+ 0x60, 0x41/*97*/, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
+ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
+ 0x80, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
+ 0xC8, 0xC9, 0x8A, 0x8B, 0xAC, 0xAD, 0xAE, 0x8F,
+ 0x90, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
+ 0xD8, 0xD9, 0x9A, 0x9B, 0x9E, 0x9D, 0x9E, 0x9F,
+ 0xA0, 0xA1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
+ 0xE8, 0xE9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
+ 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
+ 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
+ 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
+ 0xC8, 0xC9, 0xCA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
+ 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
+ 0xD8, 0xD9, 0xDA, 0xFB, 0xFC, 0xFD, 0xFE, 0xDF,
+ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
+ 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
+ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
+ 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
+
+};
+
+char tolowercase[256] =
+{
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+ 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
+ 0x30, 0x31, 0x32/*50*/, 0x33, 0x34, 0x35, 0x36, 0x37,
+ 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
+ 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
+ 0x70/*80*/, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
+ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
+ 0x70, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+ 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+ 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9C, 0x9F,
+ 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
+ 0xA8, 0xA9, 0xAA, 0xAB, 0x8C, 0x8D, 0x8E, 0xAF,
+ 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
+ 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
+ 0xC0, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+ 0x88, 0x89, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
+ 0xD0, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+ 0x98, 0x99, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
+ 0xE0, 0xE1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
+ 0xA8, 0xA9, 0xEA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
+ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
+ 0xF8, 0xF9, 0xFA, 0xDB, 0xDC, 0xDD, 0xDE, 0xFF
+};
+
+
Added: trunk/none/tests/s390x/tr.c
===================================================================
--- trunk/none/tests/s390x/tr.c (rev 0)
+++ trunk/none/tests/s390x/tr.c 2012-02-04 17:16:40 UTC (rev 12368)
@@ -0,0 +1,56 @@
+#include<stdio.h>
+#include<stdlib.h>
+#include<asm/types.h>
+#include<stdint.h>
+#include<string.h>
+#include "table.h"
+
+uint8_t buff[40];
+
+void tr(uint8_t *codepage, uint8_t *addr, uint64_t len)
+{
+ asm volatile(
+ " larl 1,1f\n"
+ "1: tr 0(1,%0),0(%2)\n"
+ " ex %1,0(1)"
+ : "+&a" (addr), "+d" (len)
+ : "a" (codepage) : "cc", "memory", "1");
+}
+
+void run_test(void *tran_table, void *srcaddr, uint64_t len)
+{
+ int i;
+
+ tr(tran_table, buff, len);
+ printf("the translated string is ");
+ for (i = 0; i < len; i++) {
+ printf("%c", buff[i]);
+ }
+ printf("\n");
+}
+
+int main()
+{
+ /* Test 1: length = 0 */
+ run_test((char *)&touppercase, &buff, 0);
+ run_test((char *)&touppercase, &buff, 0);
+
+ /* Test 2 : length > 0 */
+ memset(buff, 'a', 1);
+ run_test((char *)&touppercase, &buff, 1);
+
+ memcpy(buff, "abcdefgh", 8);
+ run_test((char *)&touppercase, &buff, 3);
+ run_test((char *)&touppercase, &buff, 3);
+ run_test((char *)&touppercase, &buff, 8);
+
+ memcpy(buff, "ABCDEFGH", 8);
+ run_test((char *)&tolowercase, &buff, 3);
+ run_test((char *)&tolowercase, &buff, 3);
+ run_test((char *)&tolowercase, &buff, 8);
+
+ memcpy(buff, "0123456789", 9);
+ run_test((char *)&touppercase, &buff, 9);
+ run_test((char *)&tolowercase, &buff, 9);
+ return 0;
+}
Added: trunk/none/tests/s390x/tr.stderr.exp
===================================================================
--- trunk/none/tests/s390x/tr.stderr.exp (rev 0)
+++ trunk/none/tests/s390x/tr.stderr.exp 2012-02-04 17:16:40 UTC (rev 12368)
@@ -0,0 +1,2 @@
+
+
Added: trunk/none/tests/s390x/tr.stdout.exp
===================================================================
--- trunk/none/tests/s390x/tr.stdout.exp (rev 0)
+++ trunk/none/tests/s390x/tr.stdout.exp 2012-02-04 17:16:40 UTC (rev 12368)
@@ -0,0 +1,11 @@
+the translated string is
+the translated string is
+the translated string is A
+the translated string is ABC
+the translated string is ABC
+the translated string is ABCDEFGH
+the translated string is abc
+the translated string is abc
+the translated string is abcdefgh
+the translated string is 012345678
+the translated string is 012345678
Added: trunk/none/tests/s390x/tr.vgtest
===================================================================
--- trunk/none/tests/s390x/tr.vgtest (rev 0)
+++ trunk/none/tests/s390x/tr.vgtest 2012-02-04 17:16:40 UTC (rev 12368)
@@ -0,0 +1 @@
+prog: tr
Added: trunk/none/tests/s390x/tre.c
===================================================================
--- trunk/none/tests/s390x/tre.c (rev 0)
+++ trunk/none/tests/s390x/tre.c 2012-02-04 17:16:40 UTC (rev 12368)
@@ -0,0 +1,94 @@
+#include<stdio.h>
+#include<stdlib.h>
+#include<stdint.h>
+#include<inttypes.h>
+#include<string.h>
+#include "table.h"
+
+/* Register contents after executing an TRE insn */
+typedef struct {
+ uint64_t addr;
+ uint64_t len;
+ uint64_t tabaddr;
+ uint8_t testbyte;
+ uint64_t cc;
+} tre_regs;
+
+uint8_t buff[40];
+
+tre_regs tre(uint8_t *codepage, uint8_t *addr, uint64_t len, uint8_t test_byte)
+{
+ int cc;
+ tre_regs regs;
+
+ register uint64_t param asm("0") = test_byte;
+ register uint64_t a2 asm ("4") = (uint64_t)codepage;
+ register uint64_t a1 asm ("2") = (uint64_t)addr;
+ register uint64_t l1 asm ("3") = len;
+
+ asm volatile(
+ " tre %1,%2\n"
+ " ipm %0\n"
+ " srl %0,28\n"
+ :"=d"(cc),"+&d"(a1)
+ :"d"(a2),"d"(param),"d"(l1),"d"(test_byte): "memory" );
+
+ regs.addr = a1;
+ regs.len = l1;
+ regs.tabaddr = a2;
+ regs.testbyte = param;
+ regs.cc = cc;
+
+ return regs;
+}
+
+void run_test(void *tran_table, void *srcaddr, uint64_t len, uint8_t test)
+{
+ tre_regs regs;
+ int i;
+
+ regs = tre(tran_table, buff, len, test);
+
+ if ((uint64_t)tran_table != regs.tabaddr)
+ printf("translation table address changed\n");
+ if (test != regs.testbyte)
+ printf("test byte changed\n");
+ if ((uint64_t)srcaddr + (len - regs.len) != regs.addr)
+ printf("source address/length not updated properly\n");
+
+ printf("Resulting cc is %"PRIu64" and the string is ", regs.cc);
+ for ( i = 0; i < len; i++) {
+ printf("%c", buff[i]);
+ }
+
+ printf("\n");
+}
+
+int main()
+{
+
+ /* Test 1: length = 0 */
+ run_test(NULL, NULL, 0, 0x0);
+ run_test((char *)&touppercase, &buff, 0, 0x0);
+ run_test((char *)&touppercase, &buff, 0, 'b');
+
+ /* Test 2 : length > 0 */
+ memset(buff, 'a', 1);
+ run_test((char *)&touppercase, &buff, 1, 'a'); //cc = 1
+ run_test((char *)&touppercase, &buff, 1, 'b');
+
+ memcpy(buff, "abcdefgh", 8);
+ run_test((char *)&touppercase, &buff, 3, 'a'); //cc = 1
+ run_test((char *)&touppercase, &buff, 3, 'f'); //cc = 0
+ run_test((char *)&touppercase, &buff, 8, 'l'); //cc = 0
+
+ memcpy(buff, "ABCDEFGH", 8);
+ run_test((char *)&tolowercase, &buff, 3, 'A'); // cc = 1
+ run_test((char *)&tolowercase, &buff, 3, 'C'); // cc = 0
+ run_test((char *)&tolowercase, &buff, 8, 0x0); // cc = 0
+
+ memcpy(buff, "01234567", 8);
+ run_test((char *)&touppercase, &buff, 8, 'A');
+ run_test((char *)&tolowercase, &buff, 8, 'A');
+ return 0;
+}
Added: trunk/none/tests/s390x/tre.stderr.exp
===================================================================
--- trunk/none/tests/s390x/tre.stderr.exp (rev 0)
+++ trunk/none/tests/s390x/tre.stderr.exp 2012-02-04 17:16:40 UTC (rev 12368)
@@ -0,0 +1,2 @@
+
+
Added: trunk/none/tests/s390x/tre.stdout.exp
===================================================================
--- trunk/none/tests/s390x/tre.stdout.exp (rev 0)
+++ trunk/none/tests/s390x/tre.stdout.exp 2012-02-04 17:16:40 UTC (rev 12368)
@@ -0,0 +1,14 @@
+source address/length not updated properly
+Resulting cc is 0 and the string is
+Resulting cc is 0 and the string is
+Resulting cc is 0 and the string is
+Resulting cc is 1 and the string is a
+Resulting cc is 0 and the string is A
+Resulting cc is 1 and the string is abc
+Resulting cc is 0 and the string is ABC
+Resulting cc is 0 and the string is ABCDEFGH
+Resulting cc is 1 and the string is ABC
+Resulting cc is 1 and the string is abC
+Resulting cc is 0 and the string is abcdefgh
+Resulting cc is 0 and the string is 01234567
+Resulting cc is 0 and the string is 01234567
Added: trunk/none/tests/s390x/tre.vgtest
===================================================================
--- trunk/none/tests/s390x/tre.vgtest (rev 0)
+++ trunk/none/tests/s390x/tre.vgtest 2012-02-04 17:16:40 UTC (rev 12368)
@@ -0,0 +1 @@
+prog: tre
Modified: trunk/none/tests/s390x/troo.c
===================================================================
--- trunk/none/tests/s390x/troo.c 2012-02-04 14:40:44 UTC (rev 12367)
+++ trunk/none/tests/s390x/troo.c 2012-02-04 17:16:40 UTC (rev 12368)
@@ -5,12 +5,12 @@
/* Register contents after executing an TROO insn */
typedef struct {
- uint64_t srcaddr;
- uint64_t len;
- uint64_t desaddr;
- uint64_t tabaddr;
- uint8_t testbyte;
- uint64_t cc;
+ uint64_t srcaddr;
+ uint64_t len;
+ uint64_t desaddr;
+ uint64_t tabaddr;
+ uint8_t testbyte;
+ uint64_t cc;
} troo_regs;
uint8_t tran_table[20] = {
Added: trunk/none/tests/s390x/trot.c
===================================================================
--- trunk/none/tests/s390x/trot.c (rev 0)
+++ trunk/none/tests/s390x/trot.c 2012-02-04 17:16:40 UTC (rev 12368)
@@ -0,0 +1,132 @@
+#include<stdio.h>
+#include<stdint.h>
+#include<string.h>
+#include<assert.h>
+
+/* Register contents after executing an TROT insn */
+typedef struct {
+ uint64_t srcaddr;
+ uint64_t len;
+ uint64_t desaddr;
+ uint64_t tabaddr;
+ uint16_t testbyte;
+ uint64_t cc;
+} trot_regs;
+
+uint16_t tran_table[40] = {
+ 0xaaaa,0xbbbb,0xcccc,0xccdd,0xffff,0xdada,0xbcbc,0xabab,0xcaca,0xeaea,
+ 0xbbbb,0xeeee
+};
+
+uint8_t src[40] = {
+ 0x01,0x03,0x04,0x02,0x07,0x08,0x06,0x02,0x05,0x09
+};
+
+uint16_t des[40];
+
+trot_regs tr(uint8_t *addr, uint16_t *codepage, uint16_t *dest, uint64_t len,
+ uint16_t test)
+{
+ trot_regs regs;
+ register uint64_t test_byte asm("0") = test;
+ register uint64_t length asm("3") = len;
+ register uint64_t srcaddr asm("4") = (uint64_t)addr;
+ register uint64_t codepage2 asm("1") = (uint64_t)codepage;
+ register uint64_t desaddr asm("2") = (uint64_t)dest;
+ register uint64_t cc asm("5");
+
+ cc = 2; /* cc result will never be 2 */
+ asm volatile(
+ " trot %1,%2\n"
+ " ipm %0\n"
+ " srl %0,28\n"
+ : "=d"(cc),"+&d"(desaddr)
+ : "d" (srcaddr),"d"(test_byte),"d" (codepage2),"d"(length)
+ : "memory" );
+
+ regs.srcaddr = srcaddr;
+ regs.len = length;
+ regs.desaddr = desaddr;
+ regs.tabaddr = codepage2;
+ regs.testbyte = test_byte;
+ regs.cc = cc;
+ return regs;
+}
+
+int run_test(void *srcaddr, void *tableaddr, void *desaddr, uint64_t len,
+ uint16_t testbyte)
+{
+ trot_regs regs;
+ int i;
+
+ assert(len <= sizeof src);
+
+ if ((testbyte & 0xffff) != testbyte)
+ printf("testbyte should be 2 byte only\n");
+
+ regs = tr(srcaddr, tableaddr, desaddr, len, testbyte);
+
+ if ((uint64_t)tableaddr != regs.tabaddr)
+ printf("translation table address changed\n");
+ if ((uint64_t)srcaddr + (len - regs.len) != regs.srcaddr)
+ printf("source address/length not updated properly\n");
+ if ((uint64_t)desaddr + 2*(len - regs.len) != regs.desaddr)
+ printf("destination address/length not updated properly\n");
+ if (regs.cc == 0 && regs.len != 0)
+ printf("length is not zero but cc is zero\n");
+ printf("%u bytes translated\n", (unsigned)(len - regs.len));
+ printf("the translated values is");
+ for (i = 0; i < len; i++) {
+ printf(" %hx", des[i]);
+ }
+ printf("\n");
+
+ return regs.cc;
+}
+
+
+int main()
+{
+ int cc;
+
+ assert(sizeof des >= sizeof src);
+
+ /* Test 1 : len == 0 */
+ cc = run_test(NULL, NULL, NULL, 0, 0x0);
+ if (cc != 0)
+ printf("cc not updated properly:%d", cc);
+
+ cc = run_test(&src, &tran_table, &des, 0, 0x0);
+ if (cc != 0)
+ printf("cc not updated properly:%d",cc);
+
+ cc = run_test(&src, &tran_table, &des, 0, 0xcaca);
+ if (cc != 0)
+ printf("cc not updated properly:%d",cc);
+
+ /* Test 2 : len > 0, testbyte not matching */
+ cc = run_test(&src, &tran_table, &des, 3, 0xeeee);
+ if (cc != 0)
+ printf("cc not updated properly:%d",cc);
+
+ cc = run_test(&src, &tran_table, &des, 10, 0xeeee);
+ if (cc != 0)
+ printf("cc not updated properly:%d",cc);
+
+ memset((uint16_t *)&des, 0, 10);
+
+ /* Test 3 : len > 0 , testbyte matching */
+ cc = run_test(&src, &tran_table, &des, 5, 0xffff);
+ if (cc != 1)
+ printf("cc not updated properly:%d",cc);
+
+ cc = run_test(&src, &tran_table, &des, 5, 0xcccc);
+ if (cc != 1)
+ printf("cc not updated properly:%d",cc);
+
+ cc = run_test(&src, &tran_table, &des, 10, 0xeaea);
+ if (cc != 1)
+ printf("cc not updated properly:%d",cc);
+
+ return 0;
+}
Added: trunk/none/tests/s390x/trot.stderr.exp
===================================================================
--- trunk/none/tests/s390x/trot.stderr.exp (rev 0)
+++ trunk/none/tests/s390x/trot.stderr.exp 2012-02-04 17:16:40 UTC (rev 12368)
@@ -0,0 +1,2 @@
+
+
Added: trunk/none/tests/s390x/trot.stdout.exp
===================================================================
--- trunk/none/tests/s390x/trot.stdout.exp (rev 0)
+++ trunk/none/tests/s390x/trot.stdout.exp 2012-02-04 17:16:40 UTC (rev 12368)
@@ -0,0 +1,16 @@
+0 bytes translated
+the translated values is
+0 bytes translated
+the translated values is
+0 bytes translated
+the translated values is
+3 bytes translated
+the translated values is bbbb ccdd ffff
+10 bytes translated
+the translated values is bbbb ccdd ffff cccc abab caca bcbc cccc dada eaea
+2 bytes translated
+the translated values is bbbb ccdd 0 0 0
+3 bytes translated
+the translated values is bbbb ccdd ffff 0 0
+9 bytes translated
+the translated values is bbbb ccdd ffff cccc abab caca bcbc cccc dada eaea
Added: trunk/none/tests/s390x/trot.vgtest
===================================================================
--- trunk/none/tests/s390x/trot.vgtest (rev 0)
+++ trunk/none/tests/s390x/trot.vgtest 2012-02-04 17:16:40 UTC (rev 12368)
@@ -0,0 +1 @@
+prog: trot
Added: trunk/none/tests/s390x/trto.c
===================================================================
--- trunk/none/tests/s390x/trto.c (rev 0)
+++ trunk/none/tests/s390x/trto.c 2012-02-04 17:16:40 UTC (rev 12368)
@@ -0,0 +1,130 @@
+#include<stdio.h>
+#include<stdint.h>
+#include<assert.h>
+#include<string.h>
+
+/* Register contents after executing an TRTO insn */
+typedef struct {
+ uint64_t srcaddr;
+ uint64_t len;
+ uint64_t desaddr;
+ uint64_t tabaddr;
+ uint8_t testbyte;
+ uint64_t cc;
+} trto_regs;
+
+uint8_t tran_table[40] = {
+ 0xaa,0xbb,0xcc,0xdd,0xff,0xdd,0xbc,0xab,0xca,0xea,0xbb,0xee
+};
+
+int16_t src[40] = {
+ 0x2,0x03,0x04,0x02,0x07,0x08,0x06,0x02,0x05,0x09
+};
+
+uint8_t des[20];
+
+trto_regs tr(uint16_t *addr, uint16_t *codepage, uint8_t *dest, uint64_t len,
+ uint8_t test)
+{
+ trto_regs regs;
+ register uint64_t test_byte asm("0") = test;
+ register uint64_t length asm("3") = len;
+ register uint64_t srcaddr asm("4") = (uint64_t)addr;
+ register uint64_t codepage2 asm("1") = (uint64_t)codepage;
+ register uint64_t desaddr asm("2") = (uint64_t)dest;
+ register uint64_t cc asm("5");
+
+ cc = 2; /* cc result will never be 2 */
+ asm volatile(
+ " trto %1,%2\n"
+ " ipm %0\n"
+ " srl %0,28\n"
+ : "=d"(cc),"+&d"(desaddr)
+ : "d" (srcaddr),"d"(test_byte),"d" (codepage2),"d"(length)
+ : "memory" );
+
+ regs.srcaddr = srcaddr;
+ regs.len = length;
+ regs.desaddr = desaddr;
+ regs.tabaddr = codepage2;
+ regs.testbyte = test_byte;
+ regs.cc = cc;
+ return regs;
+}
+
+int run_test(void *srcaddr, void *tableaddr, void *desaddr, uint64_t len,
+ uint8_t testbyte)
+{
+ trto_regs regs;
+ int i;
+
+ assert(len <= sizeof src);
+
+ if ((testbyte & 0xffff) != testbyte)
+ printf("testbyte should be 1 byte only\n");
+
+ regs = tr(srcaddr, tableaddr, desaddr, len, testbyte);
+
+ if ((uint64_t)tableaddr != regs.tabaddr)
+ printf("translation table address changed\n");
+ if ((uint64_t)srcaddr + (len - regs.len) != regs.srcaddr)
+ printf("source address/length not updated properly\n");
+ if ((uint64_t)desaddr + ((len - regs.len)/2) != regs.desaddr)
+ printf("destination address/length not updated properly\n");
+ if (regs.cc == 0 && regs.len != 0)
+ printf("length is not zero but cc is zero\n");
+ printf("%u bytes translated\n", ((unsigned)(len - regs.len)/2));
+ printf("the translated values is");
+ for (i = 0; i < len/2; i++) {
+ printf(" %x", des[i]);
+ }
+ printf("\n");
+
+ return regs.cc;
+}
+
+int main()
+{
+ int cc;
+
+ assert(sizeof des <= sizeof src);
+
+ /* Test 1 : len == 0 */
+ cc = run_test(NULL, NULL, NULL, 0, 0x0);
+ if (cc != 0)
+ printf("cc not updated properly:%d", cc);
+
+ cc = run_test(&src, &tran_table, &des, 0, 0x0);
+ if (cc != 0)
+ printf("cc not updated properly:%d",cc);
+
+ cc = run_test(&src, &tran_table, &des, 0, 0xca);
+ if (cc != 0)
+ printf("cc not updated properly:%d",cc);
+
+ /* Test 2 : len > 0, testbyte not matching */
+ cc = run_test(&src, &tran_table, &des, 12, 0xee);
+ if (cc != 0)
+ printf("cc not updated properly:%d",cc);
+
+ cc = run_test(&src, &tran_table, &des, 20, 0x00);
+ if (cc != 0)
+ printf("cc not updated properly:%d",cc);
+
+ memset((uint16_t *)&des, 0, 10);
+
+ /* Test 3 : len > 0 , testbyte matching */
+ cc = run_test(&src, &tran_table, &des, 12, 0xff);
+ if (cc != 1)
+ printf("cc not updated properly:%d",cc);
+
+ cc = run_test(&src, &tran_table, &des, 12, 0xcc);
+ if (cc != 1)
+ printf("cc not updated properly:%d",cc);
+
+ cc = run_test(&src, &tran_table, &des, 20, 0xea);
+ if (cc != 1)
+ printf("cc not updated properly:%d",cc);
+
+ return 0;
+}
Added: trunk/none/tests/s390x/trto.stderr.exp
===================================================================
--- trunk/none/tests/s390x/trto.stderr.exp (rev 0)
+++ trunk/none/tests/s390x/trto.stderr.exp 2012-02-04 17:16:40 UTC (rev 12368)
@@ -0,0 +1,2 @@
+
+
Added: trunk/none/tests/s390x/trto.stdout.exp
===================================================================
--- trunk/none/tests/s390x/trto.stdout.exp (rev 0)
+++ trunk/none/tests/s390x/trto.stdout.exp 2012-02-04 17:16:40 UTC (rev 12368)
@@ -0,0 +1,16 @@
+0 bytes translated
+the translated values is
+0 bytes translated
+the translated values is
+0 bytes translated
+the translated values is
+6 bytes translated
+the translated values is cc dd ff cc ab ca
+10 bytes translated
+the translated values is cc dd ff cc ab ca bc cc dd ea
+2 bytes translated
+the translated values is cc dd 0 0 0 0
+0 bytes translated
+the translated values is cc dd 0 0 0 0
+9 bytes translated
+the translated values is cc dd ff cc ab ca bc cc dd 0
Added: trunk/none/tests/s390x/trto.vgtest
===================================================================
--- trunk/none/tests/s390x/trto.vgtest (rev 0)
+++ trunk/none/tests/s390x/trto.vgtest 2012-02-04 17:16:40 UTC (rev 12368)
@@ -0,0 +1 @@
+prog: trto
Added: trunk/none/tests/s390x/trtt.c
===================================================================
--- trunk/none/tests/s390x/trtt.c (rev 0)
+++ trunk/none/tests/s390x/trtt.c 2012-02-04 17:16:40 UTC (rev 12368)
@@ -0,0 +1,133 @@
+#include<stdio.h>
+#include<stdint.h>
+#include<string.h>
+#include<assert.h>
+
+/* Register contents after executing an TRTT insn */
+typedef struct {
+ uint64_t srcaddr;
+ uint64_t len;
+ uint64_t desaddr;
+ uint64_t tabaddr;
+ uint16_t testbyte;
+ uint64_t cc;
+} trtt_regs;
+
+uint16_t tran_table[40] = {
+ 0xaaaa,0xcccc,0xcccc,0xdddd,0xffff,0xdada,0xbcbc,0xabab,0xcaca,0xeaea,
+ 0xbbbb,0xeeee
+};
+
+uint16_t src[40] = {
+ 0x4,0x03,0x04,0x02,0x07,0x08,0x06,0x02,0x05,0x09,0xa
+};
+
+uint16_t des[20];
+
+trtt_regs tr(uint16_t *addr, uint16_t *codepage, uint16_t *dest, uint64_t len,
+ uint16_t test)
+{
+ trtt_regs regs;
+ register uint64_t test_byte asm("0") = test;
+ register uint64_t length asm("3") = len;
+ register uint64_t srcaddr asm("4") = (uint64_t)addr;
+ register uint64_t codepage2 asm("1") = (uint64_t)codepage;
+ register uint64_t desaddr asm("2") = (uint64_t)dest;
+ register uint64_t cc asm("5");
+
+ cc = 2; /* cc result will never be 2 */
+ asm volatile(
+ " trtt %1,%2\n"
+ " ipm %0\n"
+ " srl %0,28\n"
+ : "=d"(cc),"+d"(desaddr),"+d"(srcaddr)
+ : "d"(test_byte),"d" (codepage2),"d"(length)
+ : "memory" );
+
+ regs.srcaddr = srcaddr;
+ regs.len = length;
+ regs.desaddr = desaddr;
+ regs.tabaddr = codepage2;
+ regs.testbyte = test_byte;
+ regs.cc = cc;
+
+ return regs;
+}
+
+int run_test(void *srcaddr, void *tableaddr, void *desaddr, uint64_t len,
+ uint16_t testbyte)
+{
+ trtt_regs regs;
+ int i;
+
+ assert(len <= sizeof src);
+
+ if ((testbyte & 0xffff) != testbyte)
+ printf("testbyte should be 2 byte only\n");
+
+ regs = tr(srcaddr, tableaddr, desaddr, len, testbyte);
+
+ if ((uint64_t)tableaddr != regs.tabaddr)
+ printf("translation table address changed\n");
+ if ((uint64_t)srcaddr + (len - regs.len) != regs.srcaddr)
+ printf("source address/length not updated properly\n");
+ if ((uint64_t)desaddr + (len - regs.len) != regs.desaddr)
+ printf("destination address/length not updated properly\n");
+ if (regs.cc == 0 && regs.len != 0)
+ printf("length is not zero but cc is zero\n");
+ printf("%u bytes translated\n", ((unsigned)(len - regs.len))/2);
+ printf("the translated values is");
+ for (i = 0; i < len/2; i++) {
+ printf(" %hx", des[i]);
+ }
+ printf("\n");
+
+ return regs.cc;
+}
+
+
+int main()
+{
+ int cc;
+
+ assert(sizeof des <= sizeof src);
+
+ /* Test 1 : len == 0 */
+ cc = run_test(NULL, NULL, NULL, 0, 0x0);
+ if (cc != 0)
+ printf("cc not updated properly:%d", cc);
+
+ cc = run_test(&src, &tran_table, &des, 0, 0x0);
+ if (cc != 0)
+ printf("cc not updated properly:%d",cc);
+
+ cc = run_test(&src, &tran_table, &des, 0, 0xcaca);
+ if (cc != 0)
+ printf("cc not updated properly:%d",cc);
+
+ /* Test 2 : len > 0, testbyte not matching */
+ cc = run_test(&src, &tran_table, &des, 4, 0xdada);
+ if (cc != 0)
+ printf("cc not updated properly:%d",cc);
+
+ cc = run_test(&src, &tran_table, &des, 10, 0x00);
+ if (cc != 0)
+ printf("cc not updated properly:%d",cc);
+
+ memset((uint16_t *)&des, 0, 10);
+
+ /* Test 3 : len > 0 , testbyte matching */
+ cc = run_test(&src, &tran_table, &des, 10, 0xffff);
+ if (cc != 1)
+ printf("cc not updated properly:%d",cc);
+
+ cc = run_test(&src, &tran_table, &des, 10, 0xcccc);
+ if (cc != 1)
+ printf("cc not updated properly:%d",cc);
+
+ cc = run_test(&src, &tran_table, &des, 20, 0xeaea);
+ if (cc != 1)
+ printf("cc not updated properly:%d",cc);
+
+ return 0;
+}
Added: trunk/none/tests/s390x/trtt.stderr.exp
===================================================================
--- trunk/none/tests/s390x/trtt.stderr.exp (rev 0)
+++ trunk/none/tests/s390x/trtt.stderr.exp 2012-02-04 17:16:40 UTC (rev 12368)
@@ -0,0 +1,2 @@
+
+
Added: trunk/none/tests/s390x/trtt.stdout.exp
===================================================================
--- trunk/none/tests/s390x/trtt.stdout.exp (rev 0)
+++ trunk/none/tests/s390x/trtt.stdout.exp 2012-02-04 17:16:40 UTC (rev 12368)
@@ -0,0 +1,16 @@
+0 bytes translated
+the translated values is
+0 bytes translated
+the translated values is
+0 bytes translated
+the translated values is
+2 bytes translated
+the translated values is ffff dddd
+5 bytes translated
+the translated values is ffff dddd ffff cccc abab
+0 bytes translated
+the translated values is 0 0 0 0 0
+3 bytes translated
+the translated values is ffff dddd ffff 0 0
+9 bytes translated
+the translated values is ffff dddd ffff cccc abab caca bcbc cccc dada 0
Added: trunk/none/tests/s390x/trtt.vgtest
===================================================================
--- trunk/none/tests/s390x/trtt.vgtest (rev 0)
+++ trunk/none/tests/s390x/trtt.vgtest 2012-02-04 17:16:40 UTC (rev 12368)
@@ -0,0 +1 @@
+prog: trtt
|
|
From: <sv...@va...> - 2012-02-04 17:11:42
|
Author: florian
Date: 2012-02-04 17:07:07 +0000 (Sat, 04 Feb 2012)
New Revision: 2245
Log:
Implement TR, TRE, TRTT, TROT, TRTO insns.
These are the VEX bits for fixing #273114.
Patch by Divya Vyas (div...@li...).
Modified:
trunk/priv/guest_s390_toIR.c
Modified: trunk/priv/guest_s390_toIR.c
===================================================================
--- trunk/priv/guest_s390_toIR.c 2012-01-29 02:19:43 UTC (rev 2244)
+++ trunk/priv/guest_s390_toIR.c 2012-02-04 17:07:07 UTC (rev 2245)
@@ -10894,7 +10894,226 @@
return "troo";
}
+static HChar *
+s390_irgen_TRTO(UChar m3, UChar r1, UChar r2)
+{
+ IRTemp src_addr, des_addr, tab_addr, src_len, test_byte;
+ src_addr = newTemp(Ity_I64);
+ des_addr = newTemp(Ity_I64);
+ tab_addr = newTemp(Ity_I64);
+ test_byte = newTemp(Ity_I8);
+ src_len = newTemp(Ity_I64);
+ assign(src_addr, get_gpr_dw0(r2));
+ assign(des_addr, get_gpr_dw0(r1));
+ assign(tab_addr, get_gpr_dw0(1));
+ assign(src_len, get_gpr_dw0(r1+1));
+ assign(test_byte, get_gpr_b7(0));
+
+ IRTemp op = newTemp(Ity_I16);
+ IRTemp op1 = newTemp(Ity_I8);
+ IRTemp result = newTemp(Ity_I64);
+
+ /* End of source string? We're done; proceed to next insn */
+ s390_cc_set(0);
+ if_condition_goto(binop(Iop_CmpEQ64, mkexpr(src_len), mkU64(0)),
+ guest_IA_next_instr);
+
+ /* Load character from source string, index translation table and
+ store translated character in op1. */
+ assign(op, load(Ity_I16, mkexpr(src_addr)));
+
+ assign(result, binop(Iop_Add64, unop(Iop_16Uto64, mkexpr(op)),
+ mkexpr(tab_addr)));
+
+ assign(op1, load(Ity_I8, mkexpr(result)));
+
+ if (! s390_host_has_etf2 || (m3 & 0x1) == 0) {
+ s390_cc_set(1);
+ if_condition_goto(binop(Iop_CmpEQ8, mkexpr(op1), mkexpr(test_byte)),
+ guest_IA_next_instr);
+ }
+ store(get_gpr_dw0(r1), mkexpr(op1));
+
+ put_gpr_dw0(r2, binop(Iop_Add64, mkexpr(src_addr), mkU64(2)));
+ put_gpr_dw0(r1, binop(Iop_Add64, mkexpr(des_addr), mkU64(1)));
+ put_gpr_dw0(r1+1, binop(Iop_Sub64, mkexpr(src_len), mkU64(2)));
+
+ always_goto_and_chase(guest_IA_curr_instr);
+
+ return "trto";
+}
+
+static HChar *
+s390_irgen_TROT(UChar m3, UChar r1, UChar r2)
+{
+ IRTemp src_addr, des_addr, tab_addr, src_len, test_byte;
+ src_addr = newTemp(Ity_I64);
+ des_addr = newTemp(Ity_I64);
+ tab_addr = newTemp(Ity_I64);
+ test_byte = newTemp(Ity_I16);
+ src_len = newTemp(Ity_I64);
+
+ assign(src_addr, get_gpr_dw0(r2));
+ assign(des_addr, get_gpr_dw0(r1));
+ assign(tab_addr, get_gpr_dw0(1));
+ assign(src_len, get_gpr_dw0(r1+1));
+ assign(test_byte, get_gpr_hw3(0));
+
+ IRTemp op = newTemp(Ity_I8);
+ IRTemp op1 = newTemp(Ity_I16);
+ IRTemp result = newTemp(Ity_I64);
+
+ /* End of source string? We're done; proceed to next insn */
+ s390_cc_set(0);
+ if_condition_goto(binop(Iop_CmpEQ64, mkexpr(src_len), mkU64(0)),
+ guest_IA_next_instr);
+
+ /* Load character from source string, index translation table and
+ store translated character in op1. */
+ assign(op, binop(Iop_Shl8, load(Ity_I8, mkexpr(src_addr)), mkU8(1)));
+
+ assign(result, binop(Iop_Add64, unop(Iop_8Uto64, mkexpr(op)),
+ mkexpr(tab_addr)));
+ assign(op1, load(Ity_I16, mkexpr(result)));
+
+ if (! s390_host_has_etf2 || (m3 & 0x1) == 0) {
+ s390_cc_set(1);
+ if_condition_goto(binop(Iop_CmpEQ16, mkexpr(op1), mkexpr(test_byte)),
+ guest_IA_next_instr);
+ }
+ store(get_gpr_dw0(r1), mkexpr(op1));
+
+ put_gpr_dw0(r2, binop(Iop_Add64, mkexpr(src_addr), mkU64(1)));
+ put_gpr_dw0(r1, binop(Iop_Add64, mkexpr(des_addr), mkU64(2)));
+ put_gpr_dw0(r1+1, binop(Iop_Sub64, mkexpr(src_len), mkU64(1)));
+
+ always_goto_and_chase(guest_IA_curr_instr);
+
+ return "trot";
+}
+
+static HChar *
+s390_irgen_TRTT(UChar m3, UChar r1, UChar r2)
+{
+ IRTemp src_addr, des_addr, tab_addr, src_len, test_byte;
+ src_addr = newTemp(Ity_I64);
+ des_addr = newTemp(Ity_I64);
+ tab_addr = newTemp(Ity_I64);
+ test_byte = newTemp(Ity_I16);
+ src_len = newTemp(Ity_I64);
+
+ assign(src_addr, get_gpr_dw0(r2));
+ assign(des_addr, get_gpr_dw0(r1));
+ assign(tab_addr, get_gpr_dw0(1));
+ assign(src_len, get_gpr_dw0(r1+1));
+ assign(test_byte, get_gpr_hw3(0));
+
+ IRTemp op = newTemp(Ity_I16);
+ IRTemp op1 = newTemp(Ity_I16);
+ IRTemp result = newTemp(Ity_I64);
+
+ /* End of source string? We're done; proceed to next insn */
+ s390_cc_set(0);
+ if_condition_goto(binop(Iop_CmpEQ64, mkexpr(src_len), mkU64(0)),
+ guest_IA_next_instr);
+
+ /* Load character from source string, index translation table and
+ store translated character in op1. */
+ assign(op, binop(Iop_Shl16, load(Ity_I16, mkexpr(src_addr)), mkU8(1)));
+
+ assign(result, binop(Iop_Add64, unop(Iop_16Uto64, mkexpr(op)),
+ mkexpr(tab_addr)));
+ assign(op1, load(Ity_I16, mkexpr(result)));
+
+ if (! s390_host_has_etf2 || (m3 & 0x1) == 0) {
+ s390_cc_set(1);
+ if_condition_goto(binop(Iop_CmpEQ16, mkexpr(op1), mkexpr(test_byte)),
+ guest_IA_next_instr);
+ }
+
+ store(get_gpr_dw0(r1), mkexpr(op1));
+
+ put_gpr_dw0(r2, binop(Iop_Add64, mkexpr(src_addr), mkU64(2)));
+ put_gpr_dw0(r1, binop(Iop_Add64, mkexpr(des_addr), mkU64(2)));
+ put_gpr_dw0(r1+1, binop(Iop_Sub64, mkexpr(src_len), mkU64(2)));
+
+ always_goto_and_chase(guest_IA_curr_instr);
+
+ return "trtt";
+}
+
+static HChar *
+s390_irgen_TR(UChar length, IRTemp start1, IRTemp start2)
+{
+ IRTemp op = newTemp(Ity_I8);
+ IRTemp op1 = newTemp(Ity_I8);
+ IRTemp result = newTemp(Ity_I64);
+ IRTemp counter = newTemp(Ity_I64);
+
+ assign(counter, get_counter_dw0());
+
+ assign(op, load(Ity_I8, binop(Iop_Add64, mkexpr(start1), mkexpr(counter))));
+
+ assign(result, binop(Iop_Add64, unop(Iop_8Uto64, mkexpr(op)), mkexpr(start2)));
+
+ assign(op1, load(Ity_I8, mkexpr(result)));
+ store(binop(Iop_Add64, mkexpr(start1), mkexpr(counter)), mkexpr(op1));
+
+ put_counter_dw0(binop(Iop_Add64, mkexpr(counter), mkU64(1)));
+ if_condition_goto(binop(Iop_CmpNE64, mkexpr(counter), mkU64(length)),
+ guest_IA_curr_instr);
+
+ put_counter_dw0(mkU64(0));
+
+ return "tr";
+}
+
+static HChar *
+s390_irgen_TRE(UChar r1,UChar r2)
+{
+ IRTemp src_addr, tab_addr, src_len, test_byte;
+ src_addr = newTemp(Ity_I64);
+ tab_addr = newTemp(Ity_I64);
+ src_len = newTemp(Ity_I64);
+ test_byte = newTemp(Ity_I8);
+
+ assign(src_addr, get_gpr_dw0(r1));
+ assign(src_len, get_gpr_dw0(r1+1));
+ assign(tab_addr, get_gpr_dw0(r2));
+ assign(test_byte, get_gpr_b7(0));
+
+ IRTemp op = newTemp(Ity_I8);
+ IRTemp op1 = newTemp(Ity_I8);
+ IRTemp result = newTemp(Ity_I64);
+
+ /* End of source string? We're done; proceed to next insn */
+ s390_cc_set(0);
+ if_condition_goto(binop(Iop_CmpEQ64, mkexpr(src_len), mkU64(0)),
+ guest_IA_next_instr);
+
+ /* Load character from source string and compare with test byte */
+ assign(op, load(Ity_I8, mkexpr(src_addr)));
+
+ s390_cc_set(1);
+ if_condition_goto(binop(Iop_CmpEQ8, mkexpr(op), mkexpr(test_byte)),
+ guest_IA_next_instr);
+
+ assign(result, binop(Iop_Add64, unop(Iop_8Uto64, mkexpr(op)),
+ mkexpr(tab_addr)));
+
+ assign(op1, load(Ity_I8, mkexpr(result)));
+
+ store(get_gpr_dw0(r1), mkexpr(op1));
+ put_gpr_dw0(r1, binop(Iop_Add64, mkexpr(src_addr), mkU64(1)));
+ put_gpr_dw0(r1+1, binop(Iop_Sub64, mkexpr(src_len), mkU64(1)));
+
+ always_goto(mkU64(guest_IA_curr_instr));
+
+ return "tre";
+}
+
+
/*------------------------------------------------------------*/
/*--- Build IR for special instructions ---*/
/*------------------------------------------------------------*/
@@ -11333,7 +11552,7 @@
goto ok;
case 0xb29d: s390_format_S_RD(s390_irgen_LFPC, ovl.fmt.S.b2, ovl.fmt.S.d2);
goto ok;
- case 0xb2a5: /* TRE */ goto unimplemented;
+ case 0xb2a5: s390_format_RRE_FF(s390_irgen_TRE, ovl.fmt.RRE.r1, ovl.fmt.RRE.r2); goto ok;
case 0xb2a6: /* CU21 */ goto unimplemented;
case 0xb2a7: /* CU12 */ goto unimplemented;
case 0xb2b0: s390_format_S_RD(s390_irgen_STFLE, ovl.fmt.S.b2, ovl.fmt.S.d2);
@@ -11696,9 +11915,12 @@
case 0xb98a: /* CSPG */ goto unimplemented;
case 0xb98d: /* EPSW */ goto unimplemented;
case 0xb98e: /* IDTE */ goto unimplemented;
- case 0xb990: /* TRTT */ goto unimplemented;
- case 0xb991: /* TRTO */ goto unimplemented;
- case 0xb992: /* TROT */ goto unimplemented;
+ case 0xb990: s390_format_RRF_M0RERE(s390_irgen_TRTT, ovl.fmt.RRF3.r3,
+ ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2); goto ok;
+ case 0xb991: s390_format_RRF_M0RERE(s390_irgen_TRTO, ovl.fmt.RRF3.r3,
+ ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2); goto ok;
+ case 0xb992: s390_format_RRF_M0RERE(s390_irgen_TROT, ovl.fmt.RRF3.r3,
+ ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2); goto ok;
case 0xb993: s390_format_RRF_M0RERE(s390_irgen_TROO, ovl.fmt.RRF3.r3,
ovl.fmt.RRF3.r1, ovl.fmt.RRF3.r2); goto ok;
case 0xb994: s390_format_RRE_RR(s390_irgen_LLCR, ovl.fmt.RRE.r1,
@@ -13121,7 +13343,9 @@
case 0xd9ULL: /* MVCK */ goto unimplemented;
case 0xdaULL: /* MVCP */ goto unimplemented;
case 0xdbULL: /* MVCS */ goto unimplemented;
- case 0xdcULL: /* TR */ goto unimplemented;
+ case 0xdcULL: s390_format_SS_L0RDRD(s390_irgen_TR, ovl.fmt.SS.l,
+ ovl.fmt.SS.b1, ovl.fmt.SS.d1,
+ ovl.fmt.SS.b2, ovl.fmt.SS.d2); goto ok;
case 0xddULL: /* TRT */ goto unimplemented;
case 0xdeULL: /* ED */ goto unimplemented;
case 0xdfULL: /* EDMK */ goto unimplemented;
|
|
From: <sv...@va...> - 2012-02-04 14:45:20
|
Author: florian Date: 2012-02-04 14:40:44 +0000 (Sat, 04 Feb 2012) New Revision: 12367 Log: Add z10 EC build. Added: trunk/nightly/conf/z10-ec.conf trunk/nightly/conf/z10-ec.sendmail Added: trunk/nightly/conf/z10-ec.conf =================================================================== --- trunk/nightly/conf/z10-ec.conf (rev 0) +++ trunk/nightly/conf/z10-ec.conf 2012-02-04 14:40:44 UTC (rev 12367) @@ -0,0 +1 @@ +ABT_DETAILS="s390x build on z10-EC" Added: trunk/nightly/conf/z10-ec.sendmail =================================================================== --- trunk/nightly/conf/z10-ec.sendmail (rev 0) +++ trunk/nightly/conf/z10-ec.sendmail 2012-02-04 14:40:44 UTC (rev 12367) @@ -0,0 +1,15 @@ +subject="$1" +summary="$2" +diffs="$3" + +MAILFILE=/opt/tobesent +rm -f $MAILFILE +touch $MAILFILE +echo "Subject: $subject" >> $MAILFILE +echo "To: val...@li..." >> $MAILFILE +echo "Cc: br...@ac..." >> $MAILFILE +echo " " >> $MAILFILE +cat "$summary" >> $MAILFILE +echo " " >> $MAILFILE +cat "$diffs" >> $MAILFILE +/usr/sbin/sendmail -t -i -fb...@ac... < $MAILFILE Property changes on: trunk/nightly/conf/z10-ec.sendmail ___________________________________________________________________ Name: svn:executable + * |