1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc -mtriple=x86_64-unknown-unknown -force-split-store < %s | FileCheck %s 3 4 define void @int32_float_pair(i32 %tmp1, float %tmp2, i64* %ref.tmp) { 5 ; CHECK-LABEL: int32_float_pair: 6 ; CHECK: # %bb.0: 7 ; CHECK-NEXT: movl %edi, (%rsi) 8 ; CHECK-NEXT: movss %xmm0, 4(%rsi) 9 ; CHECK-NEXT: retq 10 %t0 = bitcast float %tmp2 to i32 11 %t1 = zext i32 %t0 to i64 12 %t2 = shl nuw i64 %t1, 32 13 %t3 = zext i32 %tmp1 to i64 14 %t4 = or i64 %t2, %t3 15 store i64 %t4, i64* %ref.tmp, align 8 16 ret void 17 } 18 19 define void @float_int32_pair(float %tmp1, i32 %tmp2, i64* %ref.tmp) { 20 ; CHECK-LABEL: float_int32_pair: 21 ; CHECK: # %bb.0: 22 ; CHECK-NEXT: movss %xmm0, (%rsi) 23 ; CHECK-NEXT: movl %edi, 4(%rsi) 24 ; CHECK-NEXT: retq 25 %t0 = bitcast float %tmp1 to i32 26 %t1 = zext i32 %tmp2 to i64 27 %t2 = shl nuw i64 %t1, 32 28 %t3 = zext i32 %t0 to i64 29 %t4 = or i64 %t2, %t3 30 store i64 %t4, i64* %ref.tmp, align 8 31 ret void 32 } 33 34 define void @int16_float_pair(i16 signext %tmp1, float %tmp2, i64* %ref.tmp) { 35 ; CHECK-LABEL: int16_float_pair: 36 ; CHECK: # %bb.0: 37 ; CHECK-NEXT: movzwl %di, %eax 38 ; CHECK-NEXT: movl %eax, (%rsi) 39 ; CHECK-NEXT: movss %xmm0, 4(%rsi) 40 ; CHECK-NEXT: retq 41 %t0 = bitcast float %tmp2 to i32 42 %t1 = zext i32 %t0 to i64 43 %t2 = shl nuw i64 %t1, 32 44 %t3 = zext i16 %tmp1 to i64 45 %t4 = or i64 %t2, %t3 46 store i64 %t4, i64* %ref.tmp, align 8 47 ret void 48 } 49 50 define void @int8_float_pair(i8 signext %tmp1, float %tmp2, i64* %ref.tmp) { 51 ; CHECK-LABEL: int8_float_pair: 52 ; CHECK: # %bb.0: 53 ; CHECK-NEXT: movzbl %dil, %eax 54 ; CHECK-NEXT: movl %eax, (%rsi) 55 ; CHECK-NEXT: movss %xmm0, 4(%rsi) 56 ; CHECK-NEXT: retq 57 %t0 = bitcast float %tmp2 to i32 58 %t1 = zext i32 %t0 to i64 59 %t2 = shl nuw i64 %t1, 32 60 %t3 = zext i8 %tmp1 to i64 61 %t4 = or i64 %t2, %t3 62 store i64 %t4, i64* %ref.tmp, align 8 63 ret void 64 } 65 66 define void @int32_int32_pair(i32 %tmp1, i32 %tmp2, i64* %ref.tmp) { 67 ; CHECK-LABEL: int32_int32_pair: 68 ; CHECK: # %bb.0: 69 ; CHECK-NEXT: movl %edi, (%rdx) 70 ; CHECK-NEXT: movl %esi, 4(%rdx) 71 ; CHECK-NEXT: retq 72 %t1 = zext i32 %tmp2 to i64 73 %t2 = shl nuw i64 %t1, 32 74 %t3 = zext i32 %tmp1 to i64 75 %t4 = or i64 %t2, %t3 76 store i64 %t4, i64* %ref.tmp, align 8 77 ret void 78 } 79 80 define void @int16_int16_pair(i16 signext %tmp1, i16 signext %tmp2, i32* %ref.tmp) { 81 ; CHECK-LABEL: int16_int16_pair: 82 ; CHECK: # %bb.0: 83 ; CHECK-NEXT: movw %di, (%rdx) 84 ; CHECK-NEXT: movw %si, 2(%rdx) 85 ; CHECK-NEXT: retq 86 %t1 = zext i16 %tmp2 to i32 87 %t2 = shl nuw i32 %t1, 16 88 %t3 = zext i16 %tmp1 to i32 89 %t4 = or i32 %t2, %t3 90 store i32 %t4, i32* %ref.tmp, align 4 91 ret void 92 } 93 94 define void @int8_int8_pair(i8 signext %tmp1, i8 signext %tmp2, i16* %ref.tmp) { 95 ; CHECK-LABEL: int8_int8_pair: 96 ; CHECK: # %bb.0: 97 ; CHECK-NEXT: movb %dil, (%rdx) 98 ; CHECK-NEXT: movb %sil, 1(%rdx) 99 ; CHECK-NEXT: retq 100 %t1 = zext i8 %tmp2 to i16 101 %t2 = shl nuw i16 %t1, 8 102 %t3 = zext i8 %tmp1 to i16 103 %t4 = or i16 %t2, %t3 104 store i16 %t4, i16* %ref.tmp, align 2 105 ret void 106 } 107 108 define void @int31_int31_pair(i31 %tmp1, i31 %tmp2, i64* %ref.tmp) { 109 ; CHECK-LABEL: int31_int31_pair: 110 ; CHECK: # %bb.0: 111 ; CHECK-NEXT: andl $2147483647, %edi # imm = 0x7FFFFFFF 112 ; CHECK-NEXT: movl %edi, (%rdx) 113 ; CHECK-NEXT: andl $2147483647, %esi # imm = 0x7FFFFFFF 114 ; CHECK-NEXT: movl %esi, 4(%rdx) 115 ; CHECK-NEXT: retq 116 %t1 = zext i31 %tmp2 to i64 117 %t2 = shl nuw i64 %t1, 32 118 %t3 = zext i31 %tmp1 to i64 119 %t4 = or i64 %t2, %t3 120 store i64 %t4, i64* %ref.tmp, align 8 121 ret void 122 } 123 124 define void @int31_int17_pair(i31 %tmp1, i17 %tmp2, i64* %ref.tmp) { 125 ; CHECK-LABEL: int31_int17_pair: 126 ; CHECK: # %bb.0: 127 ; CHECK-NEXT: andl $2147483647, %edi # imm = 0x7FFFFFFF 128 ; CHECK-NEXT: movl %edi, (%rdx) 129 ; CHECK-NEXT: andl $131071, %esi # imm = 0x1FFFF 130 ; CHECK-NEXT: movl %esi, 4(%rdx) 131 ; CHECK-NEXT: retq 132 %t1 = zext i17 %tmp2 to i64 133 %t2 = shl nuw i64 %t1, 32 134 %t3 = zext i31 %tmp1 to i64 135 %t4 = or i64 %t2, %t3 136 store i64 %t4, i64* %ref.tmp, align 8 137 ret void 138 } 139 140 define void @int7_int3_pair(i7 signext %tmp1, i3 signext %tmp2, i16* %ref.tmp) { 141 ; CHECK-LABEL: int7_int3_pair: 142 ; CHECK: # %bb.0: 143 ; CHECK-NEXT: andb $127, %dil 144 ; CHECK-NEXT: movb %dil, (%rdx) 145 ; CHECK-NEXT: andb $7, %sil 146 ; CHECK-NEXT: movb %sil, 1(%rdx) 147 ; CHECK-NEXT: retq 148 %t1 = zext i3 %tmp2 to i16 149 %t2 = shl nuw i16 %t1, 8 150 %t3 = zext i7 %tmp1 to i16 151 %t4 = or i16 %t2, %t3 152 store i16 %t4, i16* %ref.tmp, align 2 153 ret void 154 } 155 156 define void @int24_int24_pair(i24 signext %tmp1, i24 signext %tmp2, i48* %ref.tmp) { 157 ; CHECK-LABEL: int24_int24_pair: 158 ; CHECK: # %bb.0: 159 ; CHECK-NEXT: movw %di, (%rdx) 160 ; CHECK-NEXT: shrl $16, %edi 161 ; CHECK-NEXT: movb %dil, 2(%rdx) 162 ; CHECK-NEXT: movw %si, 4(%rdx) 163 ; CHECK-NEXT: shrl $16, %esi 164 ; CHECK-NEXT: movb %sil, 6(%rdx) 165 ; CHECK-NEXT: retq 166 %t1 = zext i24 %tmp2 to i48 167 %t2 = shl nuw i48 %t1, 24 168 %t3 = zext i24 %tmp1 to i48 169 %t4 = or i48 %t2, %t3 170 store i48 %t4, i48* %ref.tmp, align 2 171 ret void 172 } 173 174 ; getTypeSizeInBits(i12) != getTypeStoreSizeInBits(i12), so store split doesn't kick in. 175 176 define void @int12_int12_pair(i12 signext %tmp1, i12 signext %tmp2, i24* %ref.tmp) { 177 ; CHECK-LABEL: int12_int12_pair: 178 ; CHECK: # %bb.0: 179 ; CHECK-NEXT: movl %esi, %eax 180 ; CHECK-NEXT: shll $12, %eax 181 ; CHECK-NEXT: andl $4095, %edi # imm = 0xFFF 182 ; CHECK-NEXT: orl %eax, %edi 183 ; CHECK-NEXT: shrl $4, %esi 184 ; CHECK-NEXT: movb %sil, 2(%rdx) 185 ; CHECK-NEXT: movw %di, (%rdx) 186 ; CHECK-NEXT: retq 187 %t1 = zext i12 %tmp2 to i24 188 %t2 = shl nuw i24 %t1, 12 189 %t3 = zext i12 %tmp1 to i24 190 %t4 = or i24 %t2, %t3 191 store i24 %t4, i24* %ref.tmp, align 2 192 ret void 193 } 194 195 ; getTypeSizeInBits(i14) != getTypeStoreSizeInBits(i14), so store split doesn't kick in. 196 197 define void @int7_int7_pair(i7 signext %tmp1, i7 signext %tmp2, i14* %ref.tmp) { 198 ; CHECK-LABEL: int7_int7_pair: 199 ; CHECK: # %bb.0: 200 ; CHECK-NEXT: shll $7, %esi 201 ; CHECK-NEXT: andl $127, %edi 202 ; CHECK-NEXT: orl %esi, %edi 203 ; CHECK-NEXT: andl $16383, %edi # imm = 0x3FFF 204 ; CHECK-NEXT: movw %di, (%rdx) 205 ; CHECK-NEXT: retq 206 %t1 = zext i7 %tmp2 to i14 207 %t2 = shl nuw i14 %t1, 7 208 %t3 = zext i7 %tmp1 to i14 209 %t4 = or i14 %t2, %t3 210 store i14 %t4, i14* %ref.tmp, align 2 211 ret void 212 } 213 214 ; getTypeSizeInBits(i2) != getTypeStoreSizeInBits(i2), so store split doesn't kick in. 215 216 define void @int1_int1_pair(i1 signext %tmp1, i1 signext %tmp2, i2* %ref.tmp) { 217 ; CHECK-LABEL: int1_int1_pair: 218 ; CHECK: # %bb.0: 219 ; CHECK-NEXT: addb %sil, %sil 220 ; CHECK-NEXT: andb $1, %dil 221 ; CHECK-NEXT: orb %sil, %dil 222 ; CHECK-NEXT: andb $3, %dil 223 ; CHECK-NEXT: movb %dil, (%rdx) 224 ; CHECK-NEXT: retq 225 %t1 = zext i1 %tmp2 to i2 226 %t2 = shl nuw i2 %t1, 1 227 %t3 = zext i1 %tmp1 to i2 228 %t4 = or i2 %t2, %t3 229 store i2 %t4, i2* %ref.tmp, align 1 230 ret void 231 } 232 233 define void @mbb_int32_float_pair(i32 %tmp1, float %tmp2, i64* %ref.tmp) { 234 ; CHECK-LABEL: mbb_int32_float_pair: 235 ; CHECK: # %bb.0: # %entry 236 ; CHECK-NEXT: movl %edi, (%rsi) 237 ; CHECK-NEXT: movss %xmm0, 4(%rsi) 238 ; CHECK-NEXT: retq 239 entry: 240 %t0 = bitcast float %tmp2 to i32 241 br label %next 242 next: 243 %t1 = zext i32 %t0 to i64 244 %t2 = shl nuw i64 %t1, 32 245 %t3 = zext i32 %tmp1 to i64 246 %t4 = or i64 %t2, %t3 247 store i64 %t4, i64* %ref.tmp, align 8 248 ret void 249 } 250 251 define void @mbb_int32_float_multi_stores(i32 %tmp1, float %tmp2, i64* %ref.tmp, i64* %ref.tmp1, i1 %cmp) { 252 ; CHECK-LABEL: mbb_int32_float_multi_stores: 253 ; CHECK: # %bb.0: # %entry 254 ; CHECK-NEXT: movl %edi, (%rsi) 255 ; CHECK-NEXT: movss %xmm0, 4(%rsi) 256 ; CHECK-NEXT: testb $1, %cl 257 ; CHECK-NEXT: je .LBB15_2 258 ; CHECK-NEXT: # %bb.1: # %bb2 259 ; CHECK-NEXT: movl %edi, (%rdx) 260 ; CHECK-NEXT: movss %xmm0, 4(%rdx) 261 ; CHECK-NEXT: .LBB15_2: # %exitbb 262 ; CHECK-NEXT: retq 263 entry: 264 %t0 = bitcast float %tmp2 to i32 265 br label %bb1 266 bb1: 267 %t1 = zext i32 %t0 to i64 268 %t2 = shl nuw i64 %t1, 32 269 %t3 = zext i32 %tmp1 to i64 270 %t4 = or i64 %t2, %t3 271 store i64 %t4, i64* %ref.tmp, align 8 272 br i1 %cmp, label %bb2, label %exitbb 273 bb2: 274 store i64 %t4, i64* %ref.tmp1, align 8 275 br label %exitbb 276 exitbb: 277 ret void 278 } 279