From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 48) id 907343858D39; Tue, 16 Apr 2024 21:54:17 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 907343858D39 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1713304457; bh=ySkHkrNORkXmEpsrlKqbBvIV6TF78gIedQGnjsA+9N4=; h=From:To:Subject:Date:From; b=nQPdge7eqDLqXfiBduJRAtDHi00ZEqYSL2gvEZ+uvZVS+kDgsrOlN6vG3nFsbCJ9+ HuInfWkK7UippR0L9j2zZGO8if0XpINPoS+ntpHPFlt6TL1APh4LJ6g9Yf/vs0XZhp QcbgQmVz9hi8S8L2CVJDiNmhtXe+a+0+thjSJe8Y= From: "wojciech_mula at poczta dot onet.pl" To: gcc-bugs@gcc.gnu.org Subject: [Bug c++/114747] New: [RISC-V RVV] Wrong SEW set for mixed-size intrinsics Date: Tue, 16 Apr 2024 21:54:17 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: new X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: c++ X-Bugzilla-Version: 13.2.0 X-Bugzilla-Keywords: X-Bugzilla-Severity: normal X-Bugzilla-Who: wojciech_mula at poczta dot onet.pl X-Bugzilla-Status: UNCONFIRMED X-Bugzilla-Resolution: X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: bug_id short_desc product version bug_status bug_severity priority component assigned_to reporter target_milestone Message-ID: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 List-Id: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D114747 Bug ID: 114747 Summary: [RISC-V RVV] Wrong SEW set for mixed-size intrinsics Product: gcc Version: 13.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: wojciech_mula at poczta dot onet.pl Target Milestone: --- This is a distilled procedure from simdutf project: --- #include #include #include size_t convert_latin1_to_utf16le(const char *src, size_t len, char16_t *dst= ) { char16_t *beg =3D dst; for (size_t vl; len > 0; len -=3D vl, src +=3D vl, dst +=3D vl) { vl =3D __riscv_vsetvl_e8m4(len); vuint8m4_t v =3D __riscv_vle8_v_u8m4((uint8_t*)src, vl); __riscv_vse16_v_u16m8((uint16_t*)dst, __riscv_vzext_vf2_u16m8(v, vl), v= l); } return dst - beg; } --- When compiled with gcc 13.2.0 with flags "-march=3Drv64gcv -O2" it sets a w= rong SEW: --- convert_latin1_to_utf16le(char const*, unsigned long, char16_t*): beq a1,zero,.L4 mv a4,a2 .L3: vsetvli a5,a1,e8,m4,ta,ma # set SEW=3D8 vle8.v v8,0(a0) slli a3,a5,1 vzext.vf2 v24,v8 # illegal instruction, as SEW/2 < 8 sub a1,a1,a5 vse16.v v24,0(a4) add a0,a0,a5 add a4,a4,a3 bne a1,zero,.L3 sub a0,a4,a2 srai a0,a0,1 ret .L4: li a0,0 ret --- The trunk available on godbold.org (riscv64-unknown-linux-gnu-g++ 14.0.1 20240415) emits vsetvli with e16 argument, which seems to be fine.=