if (X.Sgn == Signed) {
V6_vmpyh = HVC.HST.getIntrinsicId(Hexagon::V6_vmpyhv);
} else if (Y.Sgn == Signed) {
+ // In vmpyhus the second operand is unsigned
V6_vmpyh = HVC.HST.getIntrinsicId(Hexagon::V6_vmpyhus);
} else {
V6_vmpyh = HVC.HST.getIntrinsicId(Hexagon::V6_vmpyuhv);
// i16*i16 -> i32 / interleaved
Value *P =
- HVC.createHvxIntrinsic(Builder, V6_vmpyh, HvxP32Ty, {X.Val, Y.Val});
+ HVC.createHvxIntrinsic(Builder, V6_vmpyh, HvxP32Ty, {Y.Val, X.Val});
// Deinterleave
return HVC.vdeal(Builder, HVC.sublo(Builder, P), HVC.subhi(Builder, P));
}
; V60-LABEL: mulhs16:
; V60: // %bb.0:
; V60-NEXT: {
-; V60-NEXT: v1:0.w = vmpy(v0.h,v1.h)
+; V60-NEXT: v1:0.w = vmpy(v1.h,v0.h)
; V60-NEXT: }
; V60-NEXT: {
; V60-NEXT: r7 = #-4
; V65-LABEL: mulhs16:
; V65: // %bb.0:
; V65-NEXT: {
-; V65-NEXT: v1:0.w = vmpy(v0.h,v1.h)
+; V65-NEXT: v1:0.w = vmpy(v1.h,v0.h)
; V65-NEXT: }
; V65-NEXT: {
; V65-NEXT: r7 = #-4
; V69-LABEL: mulhs16:
; V69: // %bb.0:
; V69-NEXT: {
-; V69-NEXT: v1:0.w = vmpy(v0.h,v1.h)
+; V69-NEXT: v1:0.w = vmpy(v1.h,v0.h)
; V69-NEXT: }
; V69-NEXT: {
; V69-NEXT: r7 = #-4
; V60-LABEL: mulhu16:
; V60: // %bb.0:
; V60-NEXT: {
-; V60-NEXT: v1:0.uw = vmpy(v0.uh,v1.uh)
+; V60-NEXT: v1:0.uw = vmpy(v1.uh,v0.uh)
; V60-NEXT: }
; V60-NEXT: {
; V60-NEXT: r7 = #-4
; V65-LABEL: mulhu16:
; V65: // %bb.0:
; V65-NEXT: {
-; V65-NEXT: v1:0.uw = vmpy(v0.uh,v1.uh)
+; V65-NEXT: v1:0.uw = vmpy(v1.uh,v0.uh)
; V65-NEXT: }
; V65-NEXT: {
; V65-NEXT: r7 = #-4
; CHECK-LABEL: f2:
; CHECK: // %bb.0: // %b0
; CHECK-NEXT: {
-; CHECK-NEXT: v0 = vmem(r0+#0)
+; CHECK-NEXT: v0 = vmem(r1+#0)
; CHECK-NEXT: }
; CHECK-NEXT: {
; CHECK-NEXT: r7 = #-4
; CHECK-NEXT: r3 = #15
; CHECK-NEXT: }
; CHECK-NEXT: {
-; CHECK-NEXT: v1 = vmem(r1+#0)
+; CHECK-NEXT: v1 = vmem(r0+#0)
; CHECK-NEXT: }
; CHECK-NEXT: {
; CHECK-NEXT: v1:0.w = vmpy(v0.h,v1.h)