Matt Arsenault | 6689abe | 2016-05-05 20:07:37 +0000 | [diff] [blame] | 1 | ; RUN: llc -march=amdgcn -mcpu=verde -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s |
Matt Arsenault | 7aad8fd | 2017-01-24 22:02:15 +0000 | [diff] [blame] | 2 | ; RUN: llc -march=amdgcn -mcpu=tonga -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s |
Matt Arsenault | 6689abe | 2016-05-05 20:07:37 +0000 | [diff] [blame] | 3 | ; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s |
Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 4 | |
Tom Stellard | 79243d9 | 2014-10-01 17:15:17 +0000 | [diff] [blame] | 5 | ;FUNC-LABEL: {{^}}test1: |
Marek Olsak | 37cd4d0 | 2015-02-03 21:53:27 +0000 | [diff] [blame] | 6 | ;EG: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} |
Matt Arsenault | 4413878 | 2013-10-11 21:03:41 +0000 | [diff] [blame] | 7 | |
Alexander Timofeev | 982aee6 | 2017-07-04 17:32:00 +0000 | [diff] [blame] | 8 | ;SI: s_add_i32 s[[REG:[0-9]+]], {{s[0-9]+, s[0-9]+}} |
| 9 | ;SI: v_mov_b32_e32 v[[REG]], s[[REG]] |
| 10 | ;SI: buffer_store_dword v[[REG]], |
Matt Arsenault | 3dbeefa | 2017-03-21 21:39:51 +0000 | [diff] [blame] | 11 | define amdgpu_kernel void @test1(i32 addrspace(1)* %out, i32 addrspace(1)* %in) { |
David Blaikie | 79e6c74 | 2015-02-27 19:29:02 +0000 | [diff] [blame] | 12 | %b_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1 |
David Blaikie | a79ac14 | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 13 | %a = load i32, i32 addrspace(1)* %in |
| 14 | %b = load i32, i32 addrspace(1)* %b_ptr |
Matt Arsenault | 4413878 | 2013-10-11 21:03:41 +0000 | [diff] [blame] | 15 | %result = add i32 %a, %b |
| 16 | store i32 %result, i32 addrspace(1)* %out |
| 17 | ret void |
| 18 | } |
| 19 | |
Tom Stellard | 79243d9 | 2014-10-01 17:15:17 +0000 | [diff] [blame] | 20 | ;FUNC-LABEL: {{^}}test2: |
Marek Olsak | 37cd4d0 | 2015-02-03 21:53:27 +0000 | [diff] [blame] | 21 | ;EG: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} |
| 22 | ;EG: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} |
Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 23 | |
Alexander Timofeev | 982aee6 | 2017-07-04 17:32:00 +0000 | [diff] [blame] | 24 | ;SI: s_add_i32 s{{[0-9]+, s[0-9]+, s[0-9]+}} |
| 25 | ;SI: s_add_i32 s{{[0-9]+, s[0-9]+, s[0-9]+}} |
Tom Stellard | 043795e | 2013-06-20 21:55:30 +0000 | [diff] [blame] | 26 | |
Matt Arsenault | 3dbeefa | 2017-03-21 21:39:51 +0000 | [diff] [blame] | 27 | define amdgpu_kernel void @test2(<2 x i32> addrspace(1)* %out, <2 x i32> addrspace(1)* %in) { |
David Blaikie | 79e6c74 | 2015-02-27 19:29:02 +0000 | [diff] [blame] | 28 | %b_ptr = getelementptr <2 x i32>, <2 x i32> addrspace(1)* %in, i32 1 |
David Blaikie | a79ac14 | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 29 | %a = load <2 x i32>, <2 x i32> addrspace(1)* %in |
| 30 | %b = load <2 x i32>, <2 x i32> addrspace(1)* %b_ptr |
Tom Stellard | 043795e | 2013-06-20 21:55:30 +0000 | [diff] [blame] | 31 | %result = add <2 x i32> %a, %b |
| 32 | store <2 x i32> %result, <2 x i32> addrspace(1)* %out |
| 33 | ret void |
| 34 | } |
| 35 | |
Tom Stellard | 79243d9 | 2014-10-01 17:15:17 +0000 | [diff] [blame] | 36 | ;FUNC-LABEL: {{^}}test4: |
Marek Olsak | 37cd4d0 | 2015-02-03 21:53:27 +0000 | [diff] [blame] | 37 | ;EG: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} |
| 38 | ;EG: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} |
| 39 | ;EG: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} |
| 40 | ;EG: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} |
Tom Stellard | 043795e | 2013-06-20 21:55:30 +0000 | [diff] [blame] | 41 | |
Alexander Timofeev | 982aee6 | 2017-07-04 17:32:00 +0000 | [diff] [blame] | 42 | ;SI: s_add_i32 s{{[0-9]+, s[0-9]+, s[0-9]+}} |
| 43 | ;SI: s_add_i32 s{{[0-9]+, s[0-9]+, s[0-9]+}} |
| 44 | ;SI: s_add_i32 s{{[0-9]+, s[0-9]+, s[0-9]+}} |
| 45 | ;SI: s_add_i32 s{{[0-9]+, s[0-9]+, s[0-9]+}} |
Tom Stellard | 043795e | 2013-06-20 21:55:30 +0000 | [diff] [blame] | 46 | |
Matt Arsenault | 3dbeefa | 2017-03-21 21:39:51 +0000 | [diff] [blame] | 47 | define amdgpu_kernel void @test4(<4 x i32> addrspace(1)* %out, <4 x i32> addrspace(1)* %in) { |
David Blaikie | 79e6c74 | 2015-02-27 19:29:02 +0000 | [diff] [blame] | 48 | %b_ptr = getelementptr <4 x i32>, <4 x i32> addrspace(1)* %in, i32 1 |
David Blaikie | a79ac14 | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 49 | %a = load <4 x i32>, <4 x i32> addrspace(1)* %in |
| 50 | %b = load <4 x i32>, <4 x i32> addrspace(1)* %b_ptr |
Tom Stellard | 75aadc2 | 2012-12-11 21:25:42 +0000 | [diff] [blame] | 51 | %result = add <4 x i32> %a, %b |
| 52 | store <4 x i32> %result, <4 x i32> addrspace(1)* %out |
| 53 | ret void |
| 54 | } |
Tom Stellard | 967bf58 | 2014-02-13 23:34:15 +0000 | [diff] [blame] | 55 | |
Tom Stellard | 79243d9 | 2014-10-01 17:15:17 +0000 | [diff] [blame] | 56 | ; FUNC-LABEL: {{^}}test8: |
Marek Olsak | 37cd4d0 | 2015-02-03 21:53:27 +0000 | [diff] [blame] | 57 | ; EG: ADD_INT |
| 58 | ; EG: ADD_INT |
| 59 | ; EG: ADD_INT |
| 60 | ; EG: ADD_INT |
| 61 | ; EG: ADD_INT |
| 62 | ; EG: ADD_INT |
| 63 | ; EG: ADD_INT |
| 64 | ; EG: ADD_INT |
Jan Vesely | 808fff5 | 2015-04-30 17:15:56 +0000 | [diff] [blame] | 65 | |
Marek Olsak | 37cd4d0 | 2015-02-03 21:53:27 +0000 | [diff] [blame] | 66 | ; SI: s_add_i32 |
| 67 | ; SI: s_add_i32 |
| 68 | ; SI: s_add_i32 |
| 69 | ; SI: s_add_i32 |
| 70 | ; SI: s_add_i32 |
| 71 | ; SI: s_add_i32 |
| 72 | ; SI: s_add_i32 |
| 73 | ; SI: s_add_i32 |
Matt Arsenault | 3dbeefa | 2017-03-21 21:39:51 +0000 | [diff] [blame] | 74 | define amdgpu_kernel void @test8(<8 x i32> addrspace(1)* %out, <8 x i32> %a, <8 x i32> %b) { |
Tom Stellard | 967bf58 | 2014-02-13 23:34:15 +0000 | [diff] [blame] | 75 | entry: |
| 76 | %0 = add <8 x i32> %a, %b |
| 77 | store <8 x i32> %0, <8 x i32> addrspace(1)* %out |
| 78 | ret void |
| 79 | } |
Tom Stellard | 1f15bff | 2014-02-25 21:36:18 +0000 | [diff] [blame] | 80 | |
Tom Stellard | 79243d9 | 2014-10-01 17:15:17 +0000 | [diff] [blame] | 81 | ; FUNC-LABEL: {{^}}test16: |
Marek Olsak | 37cd4d0 | 2015-02-03 21:53:27 +0000 | [diff] [blame] | 82 | ; EG: ADD_INT |
| 83 | ; EG: ADD_INT |
| 84 | ; EG: ADD_INT |
| 85 | ; EG: ADD_INT |
| 86 | ; EG: ADD_INT |
| 87 | ; EG: ADD_INT |
| 88 | ; EG: ADD_INT |
| 89 | ; EG: ADD_INT |
| 90 | ; EG: ADD_INT |
| 91 | ; EG: ADD_INT |
| 92 | ; EG: ADD_INT |
| 93 | ; EG: ADD_INT |
| 94 | ; EG: ADD_INT |
| 95 | ; EG: ADD_INT |
| 96 | ; EG: ADD_INT |
| 97 | ; EG: ADD_INT |
Jan Vesely | 808fff5 | 2015-04-30 17:15:56 +0000 | [diff] [blame] | 98 | |
Marek Olsak | 37cd4d0 | 2015-02-03 21:53:27 +0000 | [diff] [blame] | 99 | ; SI: s_add_i32 |
| 100 | ; SI: s_add_i32 |
| 101 | ; SI: s_add_i32 |
| 102 | ; SI: s_add_i32 |
| 103 | ; SI: s_add_i32 |
| 104 | ; SI: s_add_i32 |
| 105 | ; SI: s_add_i32 |
| 106 | ; SI: s_add_i32 |
| 107 | ; SI: s_add_i32 |
| 108 | ; SI: s_add_i32 |
| 109 | ; SI: s_add_i32 |
| 110 | ; SI: s_add_i32 |
| 111 | ; SI: s_add_i32 |
| 112 | ; SI: s_add_i32 |
| 113 | ; SI: s_add_i32 |
| 114 | ; SI: s_add_i32 |
Matt Arsenault | 3dbeefa | 2017-03-21 21:39:51 +0000 | [diff] [blame] | 115 | define amdgpu_kernel void @test16(<16 x i32> addrspace(1)* %out, <16 x i32> %a, <16 x i32> %b) { |
Tom Stellard | d61a1c3 | 2014-02-28 21:36:37 +0000 | [diff] [blame] | 116 | entry: |
| 117 | %0 = add <16 x i32> %a, %b |
| 118 | store <16 x i32> %0, <16 x i32> addrspace(1)* %out |
| 119 | ret void |
| 120 | } |
| 121 | |
Tom Stellard | 79243d9 | 2014-10-01 17:15:17 +0000 | [diff] [blame] | 122 | ; FUNC-LABEL: {{^}}add64: |
Marek Olsak | 37cd4d0 | 2015-02-03 21:53:27 +0000 | [diff] [blame] | 123 | ; SI: s_add_u32 |
| 124 | ; SI: s_addc_u32 |
Jan Vesely | 808fff5 | 2015-04-30 17:15:56 +0000 | [diff] [blame] | 125 | |
Matt Arsenault | 327bb5a | 2016-07-01 22:47:50 +0000 | [diff] [blame] | 126 | ; EG: MEM_RAT_CACHELESS STORE_RAW [[LO:T[0-9]+\.XY]] |
| 127 | ; EG-DAG: ADD_INT {{[* ]*}} |
Jan Vesely | 808fff5 | 2015-04-30 17:15:56 +0000 | [diff] [blame] | 128 | ; EG-DAG: ADDC_UINT |
| 129 | ; EG-DAG: ADD_INT |
Matt Arsenault | 327bb5a | 2016-07-01 22:47:50 +0000 | [diff] [blame] | 130 | ; EG-DAG: ADD_INT {{[* ]*}} |
Jan Vesely | 808fff5 | 2015-04-30 17:15:56 +0000 | [diff] [blame] | 131 | ; EG-NOT: SUB |
Matt Arsenault | 3dbeefa | 2017-03-21 21:39:51 +0000 | [diff] [blame] | 132 | define amdgpu_kernel void @add64(i64 addrspace(1)* %out, i64 %a, i64 %b) { |
Tom Stellard | 1f15bff | 2014-02-25 21:36:18 +0000 | [diff] [blame] | 133 | entry: |
| 134 | %0 = add i64 %a, %b |
| 135 | store i64 %0, i64 addrspace(1)* %out |
| 136 | ret void |
| 137 | } |
Tom Stellard | e28859f | 2014-03-07 20:12:39 +0000 | [diff] [blame] | 138 | |
Tom Stellard | 326d6ec | 2014-11-05 14:50:53 +0000 | [diff] [blame] | 139 | ; The v_addc_u32 and v_add_i32 instruction can't read SGPRs, because they |
Tom Stellard | e28859f | 2014-03-07 20:12:39 +0000 | [diff] [blame] | 140 | ; use VCC. The test is designed so that %a will be stored in an SGPR and |
| 141 | ; %0 will be stored in a VGPR, so the comiler will be forced to copy %a |
| 142 | ; to a VGPR before doing the add. |
| 143 | |
Tom Stellard | 79243d9 | 2014-10-01 17:15:17 +0000 | [diff] [blame] | 144 | ; FUNC-LABEL: {{^}}add64_sgpr_vgpr: |
Marek Olsak | 37cd4d0 | 2015-02-03 21:53:27 +0000 | [diff] [blame] | 145 | ; SI-NOT: v_addc_u32_e32 s |
Jan Vesely | 808fff5 | 2015-04-30 17:15:56 +0000 | [diff] [blame] | 146 | |
Matt Arsenault | 327bb5a | 2016-07-01 22:47:50 +0000 | [diff] [blame] | 147 | ; EG: MEM_RAT_CACHELESS STORE_RAW [[LO:T[0-9]+\.XY]] |
| 148 | ; EG-DAG: ADD_INT {{[* ]*}} |
Jan Vesely | 808fff5 | 2015-04-30 17:15:56 +0000 | [diff] [blame] | 149 | ; EG-DAG: ADDC_UINT |
| 150 | ; EG-DAG: ADD_INT |
Matt Arsenault | 327bb5a | 2016-07-01 22:47:50 +0000 | [diff] [blame] | 151 | ; EG-DAG: ADD_INT {{[* ]*}} |
Jan Vesely | 808fff5 | 2015-04-30 17:15:56 +0000 | [diff] [blame] | 152 | ; EG-NOT: SUB |
Matt Arsenault | 3dbeefa | 2017-03-21 21:39:51 +0000 | [diff] [blame] | 153 | define amdgpu_kernel void @add64_sgpr_vgpr(i64 addrspace(1)* %out, i64 %a, i64 addrspace(1)* %in) { |
Tom Stellard | e28859f | 2014-03-07 20:12:39 +0000 | [diff] [blame] | 154 | entry: |
David Blaikie | a79ac14 | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 155 | %0 = load i64, i64 addrspace(1)* %in |
Tom Stellard | e28859f | 2014-03-07 20:12:39 +0000 | [diff] [blame] | 156 | %1 = add i64 %a, %0 |
| 157 | store i64 %1, i64 addrspace(1)* %out |
| 158 | ret void |
| 159 | } |
Tom Stellard | 73b98ed | 2014-05-15 14:41:54 +0000 | [diff] [blame] | 160 | |
Tom Stellard | 744b99b | 2014-09-24 01:33:28 +0000 | [diff] [blame] | 161 | ; Test i64 add inside a branch. |
Tom Stellard | 79243d9 | 2014-10-01 17:15:17 +0000 | [diff] [blame] | 162 | ; FUNC-LABEL: {{^}}add64_in_branch: |
Marek Olsak | 37cd4d0 | 2015-02-03 21:53:27 +0000 | [diff] [blame] | 163 | ; SI: s_add_u32 |
| 164 | ; SI: s_addc_u32 |
Jan Vesely | 808fff5 | 2015-04-30 17:15:56 +0000 | [diff] [blame] | 165 | |
Matt Arsenault | 327bb5a | 2016-07-01 22:47:50 +0000 | [diff] [blame] | 166 | ; EG: MEM_RAT_CACHELESS STORE_RAW [[LO:T[0-9]+\.XY]] |
| 167 | ; EG-DAG: ADD_INT {{[* ]*}} |
Jan Vesely | 808fff5 | 2015-04-30 17:15:56 +0000 | [diff] [blame] | 168 | ; EG-DAG: ADDC_UINT |
| 169 | ; EG-DAG: ADD_INT |
Matt Arsenault | 327bb5a | 2016-07-01 22:47:50 +0000 | [diff] [blame] | 170 | ; EG-DAG: ADD_INT {{[* ]*}} |
Jan Vesely | 808fff5 | 2015-04-30 17:15:56 +0000 | [diff] [blame] | 171 | ; EG-NOT: SUB |
Matt Arsenault | 3dbeefa | 2017-03-21 21:39:51 +0000 | [diff] [blame] | 172 | define amdgpu_kernel void @add64_in_branch(i64 addrspace(1)* %out, i64 addrspace(1)* %in, i64 %a, i64 %b, i64 %c) { |
Tom Stellard | 73b98ed | 2014-05-15 14:41:54 +0000 | [diff] [blame] | 173 | entry: |
| 174 | %0 = icmp eq i64 %a, 0 |
| 175 | br i1 %0, label %if, label %else |
| 176 | |
| 177 | if: |
David Blaikie | a79ac14 | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 178 | %1 = load i64, i64 addrspace(1)* %in |
Tom Stellard | 73b98ed | 2014-05-15 14:41:54 +0000 | [diff] [blame] | 179 | br label %endif |
| 180 | |
| 181 | else: |
| 182 | %2 = add i64 %a, %b |
| 183 | br label %endif |
| 184 | |
| 185 | endif: |
| 186 | %3 = phi i64 [%1, %if], [%2, %else] |
| 187 | store i64 %3, i64 addrspace(1)* %out |
| 188 | ret void |
| 189 | } |