const LLT v2s64 = LLT::vector(2, 64);
for (auto BinOp : {G_ADD, G_SUB, G_MUL, G_AND, G_OR, G_XOR}) {
- for (auto Ty : {s32, s64, v2s32, v4s32, v2s64})
+ // These operations naturally get the right answer when used on
+ // GPR32, even if the actual type is narrower.
+ for (auto Ty : {s1, s8, s16, s32, s64, v2s32, v4s32, v2s64})
setAction({BinOp, Ty}, Legal);
-
- for (auto Ty : {s8, s16})
- setAction({BinOp, Ty}, WidenScalar);
}
for (auto BinOp : {G_SHL, G_LSHR, G_ASHR, G_SDIV, G_UDIV})
bb.0.entry:
liveins: %x0, %x1, %x2, %x3
; CHECK-LABEL: name: test_scalar_add_small
- ; CHECK-DAG: [[LHS:%.*]](32) = G_ANYEXT { s32, s8 } %0
- ; CHECK-DAG: [[RHS:%.*]](32) = G_ANYEXT { s32, s8 } %1
- ; CHECK: [[RES:%.*]](32) = G_ADD s32 [[LHS]], [[RHS]]
- ; CHECK: %2(8) = G_TRUNC { s8, s32 } [[RES]]
+ ; CHECK: [[RES:%.*]](8) = G_ADD s8 %0, %1
%0(8) = G_TRUNC { s8, s64 } %x0
%1(8) = G_TRUNC { s8, s64 } %x1
bb.0.entry:
liveins: %x0, %x1, %x2, %x3
; CHECK-LABEL: name: test_scalar_and_small
- ; CHECK-DAG: [[LHS:%.*]](32) = G_ANYEXT { s32, s8 } %0
- ; CHECK-DAG: [[RHS:%.*]](32) = G_ANYEXT { s32, s8 } %1
- ; CHECK: [[RES:%.*]](32) = G_AND s32 [[LHS]], [[RHS]]
- ; CHECK: %2(8) = G_TRUNC { s8, s32 } [[RES]]
+ ; CHECK: [[RES:%.*]](8) = G_AND s8 %0, %1
%0(8) = G_TRUNC { s8, s32 } %x0
%1(8) = G_TRUNC { s8, s32 } %x1
bb.0.entry:
liveins: %x0, %x1, %x2, %x3
; CHECK-LABEL: name: test_scalar_mul_small
- ; CHECK-DAG: [[LHS:%.*]](32) = G_ANYEXT { s32, s8 } %0
- ; CHECK-DAG: [[RHS:%.*]](32) = G_ANYEXT { s32, s8 } %1
- ; CHECK: [[RES:%.*]](32) = G_MUL s32 [[LHS]], [[RHS]]
- ; CHECK: %2(8) = G_TRUNC { s8, s32 } [[RES]]
+ ; CHECK: [[RES:%.*]](8) = G_MUL s8 %0, %1
%0(8) = G_TRUNC { s8, s64 } %x0
%1(8) = G_TRUNC { s8, s64 } %x1
bb.0.entry:
liveins: %x0, %x1, %x2, %x3
; CHECK-LABEL: name: test_scalar_or_small
- ; CHECK-DAG: [[LHS:%.*]](32) = G_ANYEXT { s32, s8 } %0
- ; CHECK-DAG: [[RHS:%.*]](32) = G_ANYEXT { s32, s8 } %1
- ; CHECK: [[RES:%.*]](32) = G_OR s32 [[LHS]], [[RHS]]
- ; CHECK: %2(8) = G_TRUNC { s8, s32 } [[RES]]
+ ; CHECK: %2(8) = G_OR s8 %0, %1
%0(8) = G_TRUNC { s8, s64 } %x0
%1(8) = G_TRUNC { s8, s64 } %x1
bb.0.entry:
liveins: %x0, %x1, %x2, %x3
; CHECK-LABEL: name: test_scalar_sub_small
- ; CHECK-DAG: [[LHS:%.*]](32) = G_ANYEXT { s32, s8 } %0
- ; CHECK-DAG: [[RHS:%.*]](32) = G_ANYEXT { s32, s8 } %1
- ; CHECK: [[RES:%.*]](32) = G_SUB s32 [[LHS]], [[RHS]]
- ; CHECK: %2(8) = G_TRUNC { s8, s32 } [[RES]]
+ ; CHECK: [[RES:%.*]](8) = G_SUB s8 %0, %1
%0(8) = G_TRUNC { s8, s64 } %x0
%1(8) = G_TRUNC { s8, s64 } %x1
bb.0.entry:
liveins: %x0, %x1, %x2, %x3
; CHECK-LABEL: name: test_scalar_xor_small
- ; CHECK-DAG: [[LHS:%.*]](32) = G_ANYEXT { s32, s8 } %0
- ; CHECK-DAG: [[RHS:%.*]](32) = G_ANYEXT { s32, s8 } %1
- ; CHECK: [[RES:%.*]](32) = G_XOR s32 [[LHS]], [[RHS]]
- ; CHECK: %2(8) = G_TRUNC { s8, s32 } [[RES]]
+ ; CHECK: %2(8) = G_XOR s8 %0, %1
%0(8) = G_TRUNC { s8, s64 } %x0
%1(8) = G_TRUNC { s8, s64 } %x1