@@ -233,8 +233,8 @@ static void get_vec_element_ptr_i64(TCGContext *tcg_ctx, TCGv_ptr ptr, uint8_t r
233233#define gen_gvec_mov (tcg_ctx , v1 , v2 ) \
234234 tcg_gen_gvec_mov(tcg_ctx, 0, vec_full_reg_offset(v1), vec_full_reg_offset(v2), 16, \
235235 16)
236- #define gen_gvec_dup64i (tcg_ctx , v1 , c ) \
237- tcg_gen_gvec_dup64i (tcg_ctx, vec_full_reg_offset(v1), 16, 16, c)
236+ #define gen_gvec_dup_imm (tcg_ctx , es , v1 , c ) \
237+ tcg_gen_gvec_dup_imm (tcg_ctx, es, vec_full_reg_offset(v1), 16, 16, c);
238238#define gen_gvec_fn_2 (tcg_ctx , fn , es , v1 , v2 ) \
239239 tcg_gen_gvec_##fn(tcg_ctx, es, vec_full_reg_offset(v1), vec_full_reg_offset(v2), \
240240 16, 16)
@@ -318,31 +318,6 @@ static void gen_gvec128_4_i64(TCGContext *tcg_ctx, gen_gvec128_4_i64_fn fn, uint
318318 tcg_temp_free_i64 (tcg_ctx , cl );
319319}
320320
321- static void gen_gvec_dupi (TCGContext * tcg_ctx , uint8_t es , uint8_t reg , uint64_t c )
322- {
323- switch (es ) {
324- case ES_8 :
325- tcg_gen_gvec_dup8i (tcg_ctx , vec_full_reg_offset (reg ), 16 , 16 , c );
326- break ;
327- case ES_16 :
328- tcg_gen_gvec_dup16i (tcg_ctx , vec_full_reg_offset (reg ), 16 , 16 , c );
329- break ;
330- case ES_32 :
331- tcg_gen_gvec_dup32i (tcg_ctx , vec_full_reg_offset (reg ), 16 , 16 , c );
332- break ;
333- case ES_64 :
334- gen_gvec_dup64i (tcg_ctx , reg , c );
335- break ;
336- default :
337- g_assert_not_reached ();
338- }
339- }
340-
341- static void zero_vec (TCGContext * tcg_ctx , uint8_t reg )
342- {
343- tcg_gen_gvec_dup8i (tcg_ctx , vec_full_reg_offset (reg ), 16 , 16 , 0 );
344- }
345-
346321static void gen_addi2_i64 (TCGContext * tcg_ctx , TCGv_i64 dl , TCGv_i64 dh , TCGv_i64 al , TCGv_i64 ah ,
347322 uint64_t b )
348323{
@@ -400,8 +375,8 @@ static DisasJumpType op_vgbm(DisasContext *s, DisasOps *o)
400375 * Masks for both 64 bit elements of the vector are the same.
401376 * Trust tcg to produce a good constant loading.
402377 */
403- gen_gvec_dup64i (tcg_ctx , get_field (s , v1 ),
404- generate_byte_mask (i2 & 0xff ));
378+ gen_gvec_dup_imm (tcg_ctx , ES_64 , get_field (s , v1 ),
379+ generate_byte_mask (i2 & 0xff ));
405380 } else {
406381 TCGv_i64 t = tcg_temp_new_i64 (tcg_ctx );
407382
@@ -437,7 +412,7 @@ static DisasJumpType op_vgm(DisasContext *s, DisasOps *o)
437412 }
438413 }
439414
440- gen_gvec_dupi (tcg_ctx , es , get_field (s , v1 ), mask );
415+ gen_gvec_dup_imm (tcg_ctx , es , get_field (s , v1 ), mask );
441416 return DISAS_NEXT ;
442417}
443418
@@ -598,7 +573,7 @@ static DisasJumpType op_vllez(DisasContext *s, DisasOps *o)
598573
599574 t = tcg_temp_new_i64 (tcg_ctx );
600575 tcg_gen_qemu_ld_i64 (tcg_ctx , t , o -> addr1 , get_mem_index (s ), MO_TE | es );
601- zero_vec (tcg_ctx , get_field (s , v1 ));
576+ gen_gvec_dup_imm (tcg_ctx , es , get_field (s , v1 ), 0 );
602577 write_vec_element_i64 (tcg_ctx , t , get_field (s , v1 ), enr , es );
603578 tcg_temp_free_i64 (tcg_ctx , t );
604579 return DISAS_NEXT ;
@@ -917,7 +892,7 @@ static DisasJumpType op_vrepi(DisasContext *s, DisasOps *o)
917892 return DISAS_NORETURN ;
918893 }
919894
920- gen_gvec_dupi (tcg_ctx , es , get_field (s , v1 ), data );
895+ gen_gvec_dup_imm (tcg_ctx , es , get_field (s , v1 ), data );
921896 return DISAS_NEXT ;
922897}
923898
@@ -1414,7 +1389,7 @@ static DisasJumpType op_vcksm(DisasContext *s, DisasOps *o)
14141389 read_vec_element_i32 (tcg_ctx , tmp , get_field (s , v2 ), i , ES_32 );
14151390 tcg_gen_add2_i32 (tcg_ctx , tmp , sum , sum , sum , tmp , tmp );
14161391 }
1417- zero_vec (tcg_ctx , get_field (s , v1 ));
1392+ gen_gvec_dup_imm (tcg_ctx , ES_32 , get_field (s , v1 ), 0 );
14181393 write_vec_element_i32 (tcg_ctx , sum , get_field (s , v1 ), 1 , ES_32 );
14191394
14201395 tcg_temp_free_i32 (tcg_ctx , tmp );
@@ -1910,65 +1885,6 @@ static DisasJumpType op_vpopct(DisasContext *s, DisasOps *o)
19101885 return DISAS_NEXT ;
19111886}
19121887
1913- static void gen_rll_i32 (TCGContext * tcg_ctx , TCGv_i32 d , TCGv_i32 a , TCGv_i32 b )
1914- {
1915- TCGv_i32 t0 = tcg_temp_new_i32 (tcg_ctx );
1916-
1917- tcg_gen_andi_i32 (tcg_ctx , t0 , b , 31 );
1918- tcg_gen_rotl_i32 (tcg_ctx , d , a , t0 );
1919- tcg_temp_free_i32 (tcg_ctx , t0 );
1920- }
1921-
1922- static void gen_rll_i64 (TCGContext * tcg_ctx , TCGv_i64 d , TCGv_i64 a , TCGv_i64 b )
1923- {
1924- TCGv_i64 t0 = tcg_temp_new_i64 (tcg_ctx );
1925-
1926- tcg_gen_andi_i64 (tcg_ctx , t0 , b , 63 );
1927- tcg_gen_rotl_i64 (tcg_ctx , d , a , t0 );
1928- tcg_temp_free_i64 (tcg_ctx , t0 );
1929- }
1930-
1931- static DisasJumpType op_verllv (DisasContext * s , DisasOps * o )
1932- {
1933- TCGContext * tcg_ctx = s -> uc -> tcg_ctx ;
1934- const uint8_t es = get_field (s , m4 );
1935- static const GVecGen3 g [4 ] = {
1936- { .fno = gen_helper_gvec_verllv8 , },
1937- { .fno = gen_helper_gvec_verllv16 , },
1938- { .fni4 = gen_rll_i32 , },
1939- { .fni8 = gen_rll_i64 , },
1940- };
1941-
1942- if (es > ES_64 ) {
1943- gen_program_exception (s , PGM_SPECIFICATION );
1944- return DISAS_NORETURN ;
1945- }
1946-
1947- gen_gvec_3 (tcg_ctx , get_field (s , v1 ), get_field (s , v2 ),
1948- get_field (s , v3 ), & g [es ]);
1949- return DISAS_NEXT ;
1950- }
1951-
1952- static DisasJumpType op_verll (DisasContext * s , DisasOps * o )
1953- {
1954- TCGContext * tcg_ctx = s -> uc -> tcg_ctx ;
1955- const uint8_t es = get_field (s , m4 );
1956- static const GVecGen2s g [4 ] = {
1957- { .fno = gen_helper_gvec_verll8 , },
1958- { .fno = gen_helper_gvec_verll16 , },
1959- { .fni4 = gen_rll_i32 , },
1960- { .fni8 = gen_rll_i64 , },
1961- };
1962-
1963- if (es > ES_64 ) {
1964- gen_program_exception (s , PGM_SPECIFICATION );
1965- return DISAS_NORETURN ;
1966- }
1967- gen_gvec_2s (tcg_ctx , get_field (s , v1 ), get_field (s , v3 ), o -> addr1 ,
1968- & g [es ]);
1969- return DISAS_NEXT ;
1970- }
1971-
19721888static void gen_rim_i32 (TCGContext * tcg_ctx , TCGv_i32 d , TCGv_i32 a , TCGv_i32 b , int32_t c )
19731889{
19741890 TCGv_i32 t = tcg_temp_new_i32 (tcg_ctx );
@@ -2035,6 +1951,9 @@ static DisasJumpType op_vesv(DisasContext *s, DisasOps *o)
20351951 case 0x70 :
20361952 gen_gvec_fn_3 (tcg_ctx , shlv , es , v1 , v2 , v3 );
20371953 break ;
1954+ case 0x73 :
1955+ gen_gvec_fn_3 (tcg_ctx , rotlv , es , v1 , v2 , v3 );
1956+ break ;
20381957 case 0x7a :
20391958 gen_gvec_fn_3 (tcg_ctx , sarv , es , v1 , v2 , v3 );
20401959 break ;
@@ -2067,6 +1986,9 @@ static DisasJumpType op_ves(DisasContext *s, DisasOps *o)
20671986 case 0x30 :
20681987 gen_gvec_fn_2i (tcg_ctx , shli , es , v1 , v3 , d2 );
20691988 break ;
1989+ case 0x33 :
1990+ gen_gvec_fn_2i (tcg_ctx , rotli , es , v1 , v3 , d2 );
1991+ break ;
20701992 case 0x3a :
20711993 gen_gvec_fn_2i (tcg_ctx , sari , es , v1 , v3 , d2 );
20721994 break ;
@@ -2084,6 +2006,9 @@ static DisasJumpType op_ves(DisasContext *s, DisasOps *o)
20842006 case 0x30 :
20852007 gen_gvec_fn_2s (tcg_ctx , shls , es , v1 , v3 , shift );
20862008 break ;
2009+ case 0x33 :
2010+ gen_gvec_fn_2s (tcg_ctx , rotls , es , v1 , v3 , shift );
2011+ break ;
20872012 case 0x3a :
20882013 gen_gvec_fn_2s (tcg_ctx , sars , es , v1 , v3 , shift );
20892014 break ;
0 commit comments