1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2# RUN: llc -mtriple=amdgcn -mcpu=fiji -run-pass=instruction-select -verify-machineinstrs -o - %s | FileCheck -check-prefix=GFX6 %s 3# RUN: llc -mtriple=amdgcn -mcpu=gfx900 -run-pass=instruction-select -verify-machineinstrs -o - %s | FileCheck -check-prefix=GFX6 %s 4# RUN: llc -mtriple=amdgcn -mcpu=gfx1010 -run-pass=instruction-select -verify-machineinstrs -o - %s | FileCheck -check-prefix=GFX10 %s 5# RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -run-pass=instruction-select -verify-machineinstrs -o - %s | FileCheck -check-prefix=GFX11 %s 6 7# Note: 16-bit instructions generally produce a 0 result in the high 16-bits on GFX8 and GFX9 and preserve high 16 bits on GFX10+ 8 9--- 10name: add_s16 11legalized: true 12regBankSelected: true 13tracksRegLiveness: true 14 15body: | 16 bb.0: 17 liveins: $vgpr0, $vgpr1 18 19 ; GFX6-LABEL: name: add_s16 20 ; GFX6: liveins: $vgpr0, $vgpr1 21 ; GFX6-NEXT: {{ $}} 22 ; GFX6-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 23 ; GFX6-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 24 ; GFX6-NEXT: [[V_ADD_U16_e64_:%[0-9]+]]:vgpr_32 = V_ADD_U16_e64 [[COPY]], [[COPY1]], 0, implicit $exec 25 ; GFX6-NEXT: S_ENDPGM 0, implicit [[V_ADD_U16_e64_]] 26 ; 27 ; GFX10-LABEL: name: add_s16 28 ; GFX10: liveins: $vgpr0, $vgpr1 29 ; GFX10-NEXT: {{ $}} 30 ; GFX10-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 31 ; GFX10-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 32 ; GFX10-NEXT: [[V_ADD_NC_U16_e64_:%[0-9]+]]:vgpr_32 = V_ADD_NC_U16_e64 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $exec 33 ; GFX10-NEXT: S_ENDPGM 0, implicit [[V_ADD_NC_U16_e64_]] 34 ; 35 ; GFX11-LABEL: name: add_s16 36 ; GFX11: liveins: $vgpr0, $vgpr1 37 ; GFX11-NEXT: {{ $}} 38 ; GFX11-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 39 ; GFX11-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 40 ; GFX11-NEXT: [[V_ADD_NC_U16_fake16_e64_:%[0-9]+]]:vgpr_32 = V_ADD_NC_U16_fake16_e64 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $exec 41 ; GFX11-NEXT: S_ENDPGM 0, implicit [[V_ADD_NC_U16_fake16_e64_]] 42 %0:vgpr(s32) = COPY $vgpr0 43 %1:vgpr(s32) = COPY $vgpr1 44 %2:vgpr(s16) = G_TRUNC %0 45 %3:vgpr(s16) = G_TRUNC %1 46 %4:vgpr(s16) = G_ADD %2, %3 47 S_ENDPGM 0, implicit %4 48 49... 50 51--- 52name: add_s16_zext_to_s32 53legalized: true 54regBankSelected: true 55tracksRegLiveness: true 56 57body: | 58 bb.0: 59 liveins: $vgpr0, $vgpr1 60 61 ; GFX6-LABEL: name: add_s16_zext_to_s32 62 ; GFX6: liveins: $vgpr0, $vgpr1 63 ; GFX6-NEXT: {{ $}} 64 ; GFX6-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 65 ; GFX6-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 66 ; GFX6-NEXT: [[V_ADD_U16_e64_:%[0-9]+]]:vgpr_32 = V_ADD_U16_e64 [[COPY]], [[COPY1]], 0, implicit $exec 67 ; GFX6-NEXT: S_ENDPGM 0, implicit [[V_ADD_U16_e64_]] 68 ; 69 ; GFX10-LABEL: name: add_s16_zext_to_s32 70 ; GFX10: liveins: $vgpr0, $vgpr1 71 ; GFX10-NEXT: {{ $}} 72 ; GFX10-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 73 ; GFX10-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 74 ; GFX10-NEXT: [[V_ADD_NC_U16_e64_:%[0-9]+]]:vgpr_32 = V_ADD_NC_U16_e64 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $exec 75 ; GFX10-NEXT: [[S_MOV_B32_:%[0-9]+]]:sreg_32 = S_MOV_B32 65535 76 ; GFX10-NEXT: [[V_AND_B32_e64_:%[0-9]+]]:vgpr_32 = V_AND_B32_e64 [[S_MOV_B32_]], [[V_ADD_NC_U16_e64_]], implicit $exec 77 ; GFX10-NEXT: S_ENDPGM 0, implicit [[V_AND_B32_e64_]] 78 ; 79 ; GFX11-LABEL: name: add_s16_zext_to_s32 80 ; GFX11: liveins: $vgpr0, $vgpr1 81 ; GFX11-NEXT: {{ $}} 82 ; GFX11-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 83 ; GFX11-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 84 ; GFX11-NEXT: [[V_ADD_NC_U16_fake16_e64_:%[0-9]+]]:vgpr_32 = V_ADD_NC_U16_fake16_e64 0, [[COPY]], 0, [[COPY1]], 0, 0, implicit $exec 85 ; GFX11-NEXT: [[S_MOV_B32_:%[0-9]+]]:sreg_32 = S_MOV_B32 65535 86 ; GFX11-NEXT: [[V_AND_B32_e64_:%[0-9]+]]:vgpr_32 = V_AND_B32_e64 [[S_MOV_B32_]], [[V_ADD_NC_U16_fake16_e64_]], implicit $exec 87 ; GFX11-NEXT: S_ENDPGM 0, implicit [[V_AND_B32_e64_]] 88 %0:vgpr(s32) = COPY $vgpr0 89 %1:vgpr(s32) = COPY $vgpr1 90 %2:vgpr(s16) = G_TRUNC %0 91 %3:vgpr(s16) = G_TRUNC %1 92 %4:vgpr(s16) = G_ADD %2, %3 93 %5:vgpr(s32) = G_ZEXT %4 94 S_ENDPGM 0, implicit %5 95 96... 97 98--- 99name: add_s16_neg_inline_const_64 100legalized: true 101regBankSelected: true 102tracksRegLiveness: true 103 104body: | 105 bb.0: 106 liveins: $vgpr0 107 108 ; GFX6-LABEL: name: add_s16_neg_inline_const_64 109 ; GFX6: liveins: $vgpr0 110 ; GFX6-NEXT: {{ $}} 111 ; GFX6-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 112 ; GFX6-NEXT: [[V_SUB_U16_e64_:%[0-9]+]]:vgpr_32 = V_SUB_U16_e64 [[COPY]], 64, 0, implicit $exec 113 ; GFX6-NEXT: S_ENDPGM 0, implicit [[V_SUB_U16_e64_]] 114 ; 115 ; GFX10-LABEL: name: add_s16_neg_inline_const_64 116 ; GFX10: liveins: $vgpr0 117 ; GFX10-NEXT: {{ $}} 118 ; GFX10-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 119 ; GFX10-NEXT: [[V_SUB_NC_U16_e64_:%[0-9]+]]:vgpr_32 = V_SUB_NC_U16_e64 0, [[COPY]], 0, 64, 0, 0, implicit $exec 120 ; GFX10-NEXT: S_ENDPGM 0, implicit [[V_SUB_NC_U16_e64_]] 121 ; 122 ; GFX11-LABEL: name: add_s16_neg_inline_const_64 123 ; GFX11: liveins: $vgpr0 124 ; GFX11-NEXT: {{ $}} 125 ; GFX11-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 126 ; GFX11-NEXT: [[V_SUB_NC_U16_fake16_e64_:%[0-9]+]]:vgpr_32 = V_SUB_NC_U16_fake16_e64 0, [[COPY]], 0, 64, 0, 0, implicit $exec 127 ; GFX11-NEXT: S_ENDPGM 0, implicit [[V_SUB_NC_U16_fake16_e64_]] 128 %0:vgpr(s32) = COPY $vgpr0 129 %1:vgpr(s16) = G_TRUNC %0 130 %2:vgpr(s16) = G_CONSTANT i16 -64 131 %3:vgpr(s16) = G_ADD %1, %2 132 S_ENDPGM 0, implicit %3 133 134... 135 136--- 137name: add_s16_neg_inline_const_64_zext_to_s32 138legalized: true 139regBankSelected: true 140tracksRegLiveness: true 141 142body: | 143 bb.0: 144 liveins: $vgpr0 145 146 ; GFX6-LABEL: name: add_s16_neg_inline_const_64_zext_to_s32 147 ; GFX6: liveins: $vgpr0 148 ; GFX6-NEXT: {{ $}} 149 ; GFX6-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 150 ; GFX6-NEXT: [[V_SUB_U16_e64_:%[0-9]+]]:vgpr_32 = V_SUB_U16_e64 [[COPY]], 64, 0, implicit $exec 151 ; GFX6-NEXT: S_ENDPGM 0, implicit [[V_SUB_U16_e64_]] 152 ; 153 ; GFX10-LABEL: name: add_s16_neg_inline_const_64_zext_to_s32 154 ; GFX10: liveins: $vgpr0 155 ; GFX10-NEXT: {{ $}} 156 ; GFX10-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 157 ; GFX10-NEXT: [[V_SUB_NC_U16_e64_:%[0-9]+]]:vgpr_32 = V_SUB_NC_U16_e64 0, [[COPY]], 0, 64, 0, 0, implicit $exec 158 ; GFX10-NEXT: [[S_MOV_B32_:%[0-9]+]]:sreg_32 = S_MOV_B32 65535 159 ; GFX10-NEXT: [[V_AND_B32_e64_:%[0-9]+]]:vgpr_32 = V_AND_B32_e64 [[S_MOV_B32_]], [[V_SUB_NC_U16_e64_]], implicit $exec 160 ; GFX10-NEXT: S_ENDPGM 0, implicit [[V_AND_B32_e64_]] 161 ; 162 ; GFX11-LABEL: name: add_s16_neg_inline_const_64_zext_to_s32 163 ; GFX11: liveins: $vgpr0 164 ; GFX11-NEXT: {{ $}} 165 ; GFX11-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 166 ; GFX11-NEXT: [[V_SUB_NC_U16_fake16_e64_:%[0-9]+]]:vgpr_32 = V_SUB_NC_U16_fake16_e64 0, [[COPY]], 0, 64, 0, 0, implicit $exec 167 ; GFX11-NEXT: [[S_MOV_B32_:%[0-9]+]]:sreg_32 = S_MOV_B32 65535 168 ; GFX11-NEXT: [[V_AND_B32_e64_:%[0-9]+]]:vgpr_32 = V_AND_B32_e64 [[S_MOV_B32_]], [[V_SUB_NC_U16_fake16_e64_]], implicit $exec 169 ; GFX11-NEXT: S_ENDPGM 0, implicit [[V_AND_B32_e64_]] 170 %0:vgpr(s32) = COPY $vgpr0 171 %1:vgpr(s16) = G_TRUNC %0 172 %2:vgpr(s16) = G_CONSTANT i16 -64 173 %3:vgpr(s16) = G_ADD %1, %2 174 %4:vgpr(s32) = G_ZEXT %3 175 S_ENDPGM 0, implicit %4 176 177... 178