| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 | |
| ; RUN: llc < %s -mtriple=nvptx64 | FileCheck %s | |
| ; RUN: llc < %s -mtriple=nvptx | FileCheck %s | |
| ; RUN: %if ptxas-ptr32 %{ llc < %s -mtriple=nvptx -verify-machineinstrs | %ptxas-verify %} | |
| ; RUN: %if ptxas %{ llc < %s -mtriple=nvptx64 -verify-machineinstrs | %ptxas-verify %} | |
| target triple = "nvptx64-nvidia-cuda" | |
| %struct.A = type { i8, i16 } | |
| %struct.char2 = type { i8, i8 } | |
| %struct.char4 = type { i8, i8, i8, i8 } | |
| %struct.short2 = type { i16, i16 } | |
| %struct.short4 = type { i16, i16, i16, i16 } | |
| %struct.int2 = type { i32, i32 } | |
| %struct.int4 = type { i32, i32, i32, i32 } | |
| %struct.longlong2 = type { i64, i64 } | |
| %struct.float2 = type { float, float } | |
| %struct.float4 = type { float, float, float, float } | |
| %struct.double2 = type { double, double } | |
| define void @st_param_i8_i16() { | |
| ; CHECK-LABEL: st_param_i8_i16( | |
| ; CHECK: { | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: { // callseq 0, 0 | |
| ; CHECK-NEXT: .param .align 2 .b8 param0[4]; | |
| ; CHECK-NEXT: st.param.b16 [param0+2], 2; | |
| ; CHECK-NEXT: st.param.b8 [param0], 1; | |
| ; CHECK-NEXT: call.uni call_i8_i16, (param0); | |
| ; CHECK-NEXT: } // callseq 0 | |
| ; CHECK-NEXT: ret; | |
| call void @call_i8_i16(%struct.A { i8 1, i16 2 }) | |
| ret void | |
| } | |
| define void @st_param_i32() { | |
| ; CHECK-LABEL: st_param_i32( | |
| ; CHECK: { | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: { // callseq 1, 0 | |
| ; CHECK-NEXT: .param .b32 param0; | |
| ; CHECK-NEXT: st.param.b32 [param0], 3; | |
| ; CHECK-NEXT: call.uni call_i32, (param0); | |
| ; CHECK-NEXT: } // callseq 1 | |
| ; CHECK-NEXT: ret; | |
| call void @call_i32(i32 3) | |
| ret void | |
| } | |
| define void @st_param_i64() { | |
| ; CHECK-LABEL: st_param_i64( | |
| ; CHECK: { | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: { // callseq 2, 0 | |
| ; CHECK-NEXT: .param .b64 param0; | |
| ; CHECK-NEXT: st.param.b64 [param0], 4; | |
| ; CHECK-NEXT: call.uni call_i64, (param0); | |
| ; CHECK-NEXT: } // callseq 2 | |
| ; CHECK-NEXT: ret; | |
| call void @call_i64(i64 4) | |
| ret void | |
| } | |
| define void @st_param_f32() { | |
| ; CHECK-LABEL: st_param_f32( | |
| ; CHECK: { | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: { // callseq 3, 0 | |
| ; CHECK-NEXT: .param .b32 param0; | |
| ; CHECK-NEXT: st.param.b32 [param0], 1084227584; | |
| ; CHECK-NEXT: call.uni call_f32, (param0); | |
| ; CHECK-NEXT: } // callseq 3 | |
| ; CHECK-NEXT: ret; | |
| call void @call_f32(float 5.0) | |
| ret void | |
| } | |
| define void @st_param_f64() { | |
| ; CHECK-LABEL: st_param_f64( | |
| ; CHECK: { | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: { // callseq 4, 0 | |
| ; CHECK-NEXT: .param .b64 param0; | |
| ; CHECK-NEXT: st.param.b64 [param0], 4618441417868443648; | |
| ; CHECK-NEXT: call.uni call_f64, (param0); | |
| ; CHECK-NEXT: } // callseq 4 | |
| ; CHECK-NEXT: ret; | |
| call void @call_f64(double 6.0) | |
| ret void | |
| } | |
| declare void @call_i8_i16(%struct.A) | |
| declare void @call_i32(i32) | |
| declare void @call_i64(i64) | |
| declare void @call_f32(float) | |
| declare void @call_f64(double) | |
| define void @st_param_v2_i8_ii() { | |
| ; CHECK-LABEL: st_param_v2_i8_ii( | |
| ; CHECK: { | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: { // callseq 5, 0 | |
| ; CHECK-NEXT: .param .align 2 .b8 param0[2]; | |
| ; CHECK-NEXT: st.param.v2.b8 [param0], {1, 2}; | |
| ; CHECK-NEXT: call.uni call_v2_i8, (param0); | |
| ; CHECK-NEXT: } // callseq 5 | |
| ; CHECK-NEXT: ret; | |
| call void @call_v2_i8(%struct.char2 { i8 1, i8 2 }) | |
| ret void | |
| } | |
| define void @st_param_v2_i8_ir(i8 %val) { | |
| ; CHECK-LABEL: st_param_v2_i8_ir( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b16 %rs<2>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b8 %rs1, [st_param_v2_i8_ir_param_0]; | |
| ; CHECK-NEXT: { // callseq 6, 0 | |
| ; CHECK-NEXT: .param .align 2 .b8 param0[2]; | |
| ; CHECK-NEXT: st.param.v2.b8 [param0], {1, %rs1}; | |
| ; CHECK-NEXT: call.uni call_v2_i8, (param0); | |
| ; CHECK-NEXT: } // callseq 6 | |
| ; CHECK-NEXT: ret; | |
| %struct.ir0 = insertvalue %struct.char2 poison, i8 1, 0 | |
| %struct.ir1 = insertvalue %struct.char2 %struct.ir0, i8 %val, 1 | |
| call void @call_v2_i8(%struct.char2 %struct.ir1) | |
| ret void | |
| } | |
| define void @st_param_v2_i8_ri(i8 %val) { | |
| ; CHECK-LABEL: st_param_v2_i8_ri( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b16 %rs<2>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b8 %rs1, [st_param_v2_i8_ri_param_0]; | |
| ; CHECK-NEXT: { // callseq 7, 0 | |
| ; CHECK-NEXT: .param .align 2 .b8 param0[2]; | |
| ; CHECK-NEXT: st.param.v2.b8 [param0], {%rs1, 2}; | |
| ; CHECK-NEXT: call.uni call_v2_i8, (param0); | |
| ; CHECK-NEXT: } // callseq 7 | |
| ; CHECK-NEXT: ret; | |
| %struct.ri0 = insertvalue %struct.char2 poison, i8 %val, 0 | |
| %struct.ri1 = insertvalue %struct.char2 %struct.ri0, i8 2, 1 | |
| call void @call_v2_i8(%struct.char2 %struct.ri1) | |
| ret void | |
| } | |
| define void @st_param_v2_i16_ii() { | |
| ; CHECK-LABEL: st_param_v2_i16_ii( | |
| ; CHECK: { | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: { // callseq 8, 0 | |
| ; CHECK-NEXT: .param .align 4 .b8 param0[4]; | |
| ; CHECK-NEXT: st.param.b32 [param0], 131073; | |
| ; CHECK-NEXT: call.uni call_v2_i16, (param0); | |
| ; CHECK-NEXT: } // callseq 8 | |
| ; CHECK-NEXT: ret; | |
| call void @call_v2_i16(%struct.short2 { i16 1, i16 2 }) | |
| ret void | |
| } | |
| define void @st_param_v2_i16_ir(i16 %val) { | |
| ; CHECK-LABEL: st_param_v2_i16_ir( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b16 %rs<2>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b16 %rs1, [st_param_v2_i16_ir_param_0]; | |
| ; CHECK-NEXT: { // callseq 9, 0 | |
| ; CHECK-NEXT: .param .align 4 .b8 param0[4]; | |
| ; CHECK-NEXT: st.param.v2.b16 [param0], {1, %rs1}; | |
| ; CHECK-NEXT: call.uni call_v2_i16, (param0); | |
| ; CHECK-NEXT: } // callseq 9 | |
| ; CHECK-NEXT: ret; | |
| %struct.ir0 = insertvalue %struct.short2 poison, i16 1, 0 | |
| %struct.ir1 = insertvalue %struct.short2 %struct.ir0, i16 %val, 1 | |
| call void @call_v2_i16(%struct.short2 %struct.ir1) | |
| ret void | |
| } | |
| define void @st_param_v2_i16_ri(i16 %val) { | |
| ; CHECK-LABEL: st_param_v2_i16_ri( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b16 %rs<2>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b16 %rs1, [st_param_v2_i16_ri_param_0]; | |
| ; CHECK-NEXT: { // callseq 10, 0 | |
| ; CHECK-NEXT: .param .align 4 .b8 param0[4]; | |
| ; CHECK-NEXT: st.param.v2.b16 [param0], {%rs1, 2}; | |
| ; CHECK-NEXT: call.uni call_v2_i16, (param0); | |
| ; CHECK-NEXT: } // callseq 10 | |
| ; CHECK-NEXT: ret; | |
| %struct.ri0 = insertvalue %struct.short2 poison, i16 %val, 0 | |
| %struct.ri1 = insertvalue %struct.short2 %struct.ri0, i16 2, 1 | |
| call void @call_v2_i16(%struct.short2 %struct.ri1) | |
| ret void | |
| } | |
| define void @st_param_v2_i32_ii() { | |
| ; CHECK-LABEL: st_param_v2_i32_ii( | |
| ; CHECK: { | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: { // callseq 11, 0 | |
| ; CHECK-NEXT: .param .align 8 .b8 param0[8]; | |
| ; CHECK-NEXT: st.param.v2.b32 [param0], {1, 2}; | |
| ; CHECK-NEXT: call.uni call_v2_i32, (param0); | |
| ; CHECK-NEXT: } // callseq 11 | |
| ; CHECK-NEXT: ret; | |
| call void @call_v2_i32(%struct.int2 { i32 1, i32 2 }) | |
| ret void | |
| } | |
| define void @st_param_v2_i32_ir(i32 %val) { | |
| ; CHECK-LABEL: st_param_v2_i32_ir( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<2>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v2_i32_ir_param_0]; | |
| ; CHECK-NEXT: { // callseq 12, 0 | |
| ; CHECK-NEXT: .param .align 8 .b8 param0[8]; | |
| ; CHECK-NEXT: st.param.v2.b32 [param0], {1, %r1}; | |
| ; CHECK-NEXT: call.uni call_v2_i32, (param0); | |
| ; CHECK-NEXT: } // callseq 12 | |
| ; CHECK-NEXT: ret; | |
| %struct.ir0 = insertvalue %struct.int2 poison, i32 1, 0 | |
| %struct.ir1 = insertvalue %struct.int2 %struct.ir0, i32 %val, 1 | |
| call void @call_v2_i32(%struct.int2 %struct.ir1) | |
| ret void | |
| } | |
| define void @st_param_v2_i32_ri(i32 %val) { | |
| ; CHECK-LABEL: st_param_v2_i32_ri( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<2>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v2_i32_ri_param_0]; | |
| ; CHECK-NEXT: { // callseq 13, 0 | |
| ; CHECK-NEXT: .param .align 8 .b8 param0[8]; | |
| ; CHECK-NEXT: st.param.v2.b32 [param0], {%r1, 2}; | |
| ; CHECK-NEXT: call.uni call_v2_i32, (param0); | |
| ; CHECK-NEXT: } // callseq 13 | |
| ; CHECK-NEXT: ret; | |
| %struct.ri0 = insertvalue %struct.int2 poison, i32 %val, 0 | |
| %struct.ri1 = insertvalue %struct.int2 %struct.ri0, i32 2, 1 | |
| call void @call_v2_i32(%struct.int2 %struct.ri1) | |
| ret void | |
| } | |
| define void @st_param_v2_i64_ii() { | |
| ; CHECK-LABEL: st_param_v2_i64_ii( | |
| ; CHECK: { | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: { // callseq 14, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v2.b64 [param0], {1, 2}; | |
| ; CHECK-NEXT: call.uni call_v2_i64, (param0); | |
| ; CHECK-NEXT: } // callseq 14 | |
| ; CHECK-NEXT: ret; | |
| call void @call_v2_i64(%struct.longlong2 { i64 1, i64 2 }) | |
| ret void | |
| } | |
| define void @st_param_v2_i64_ir(i64 %val) { | |
| ; CHECK-LABEL: st_param_v2_i64_ir( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b64 %rd<2>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b64 %rd1, [st_param_v2_i64_ir_param_0]; | |
| ; CHECK-NEXT: { // callseq 15, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v2.b64 [param0], {1, %rd1}; | |
| ; CHECK-NEXT: call.uni call_v2_i64, (param0); | |
| ; CHECK-NEXT: } // callseq 15 | |
| ; CHECK-NEXT: ret; | |
| %struct.ir0 = insertvalue %struct.longlong2 poison, i64 1, 0 | |
| %struct.ir1 = insertvalue %struct.longlong2 %struct.ir0, i64 %val, 1 | |
| call void @call_v2_i64(%struct.longlong2 %struct.ir1) | |
| ret void | |
| } | |
| define void @st_param_v2_i64_ri(i64 %val) { | |
| ; CHECK-LABEL: st_param_v2_i64_ri( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b64 %rd<2>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b64 %rd1, [st_param_v2_i64_ri_param_0]; | |
| ; CHECK-NEXT: { // callseq 16, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v2.b64 [param0], {%rd1, 2}; | |
| ; CHECK-NEXT: call.uni call_v2_i64, (param0); | |
| ; CHECK-NEXT: } // callseq 16 | |
| ; CHECK-NEXT: ret; | |
| %struct.ri0 = insertvalue %struct.longlong2 poison, i64 %val, 0 | |
| %struct.ri1 = insertvalue %struct.longlong2 %struct.ri0, i64 2, 1 | |
| call void @call_v2_i64(%struct.longlong2 %struct.ri1) | |
| ret void | |
| } | |
| define void @st_param_v2_f32_ii(float %val) { | |
| ; CHECK-LABEL: st_param_v2_f32_ii( | |
| ; CHECK: { | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: { // callseq 17, 0 | |
| ; CHECK-NEXT: .param .align 8 .b8 param0[8]; | |
| ; CHECK-NEXT: st.param.v2.b32 [param0], {0f3F800000, 0f40000000}; | |
| ; CHECK-NEXT: call.uni call_v2_f32, (param0); | |
| ; CHECK-NEXT: } // callseq 17 | |
| ; CHECK-NEXT: ret; | |
| call void @call_v2_f32(%struct.float2 { float 1.0, float 2.0 }) | |
| ret void | |
| } | |
| define void @st_param_v2_f32_ir(float %val) { | |
| ; CHECK-LABEL: st_param_v2_f32_ir( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<2>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v2_f32_ir_param_0]; | |
| ; CHECK-NEXT: { // callseq 18, 0 | |
| ; CHECK-NEXT: .param .align 8 .b8 param0[8]; | |
| ; CHECK-NEXT: st.param.v2.b32 [param0], {0f3F800000, %r1}; | |
| ; CHECK-NEXT: call.uni call_v2_f32, (param0); | |
| ; CHECK-NEXT: } // callseq 18 | |
| ; CHECK-NEXT: ret; | |
| %struct.ir0 = insertvalue %struct.float2 poison, float 1.0, 0 | |
| %struct.ir1 = insertvalue %struct.float2 %struct.ir0, float %val, 1 | |
| call void @call_v2_f32(%struct.float2 %struct.ir1) | |
| ret void | |
| } | |
| define void @st_param_v2_f32_ri(float %val) { | |
| ; CHECK-LABEL: st_param_v2_f32_ri( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<2>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v2_f32_ri_param_0]; | |
| ; CHECK-NEXT: { // callseq 19, 0 | |
| ; CHECK-NEXT: .param .align 8 .b8 param0[8]; | |
| ; CHECK-NEXT: st.param.v2.b32 [param0], {%r1, 0f40000000}; | |
| ; CHECK-NEXT: call.uni call_v2_f32, (param0); | |
| ; CHECK-NEXT: } // callseq 19 | |
| ; CHECK-NEXT: ret; | |
| %struct.ri0 = insertvalue %struct.float2 poison, float %val, 0 | |
| %struct.ri1 = insertvalue %struct.float2 %struct.ri0, float 2.0, 1 | |
| call void @call_v2_f32(%struct.float2 %struct.ri1) | |
| ret void | |
| } | |
| define void @st_param_v2_f64_ii(double %val) { | |
| ; CHECK-LABEL: st_param_v2_f64_ii( | |
| ; CHECK: { | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: { // callseq 20, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v2.b64 [param0], {0d3FF0000000000000, 0d4000000000000000}; | |
| ; CHECK-NEXT: call.uni call_v2_f64, (param0); | |
| ; CHECK-NEXT: } // callseq 20 | |
| ; CHECK-NEXT: ret; | |
| call void @call_v2_f64(%struct.double2 { double 1.0, double 2.0 }) | |
| ret void | |
| } | |
| define void @st_param_v2_f64_ir(double %val) { | |
| ; CHECK-LABEL: st_param_v2_f64_ir( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b64 %rd<2>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b64 %rd1, [st_param_v2_f64_ir_param_0]; | |
| ; CHECK-NEXT: { // callseq 21, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v2.b64 [param0], {0d3FF0000000000000, %rd1}; | |
| ; CHECK-NEXT: call.uni call_v2_f64, (param0); | |
| ; CHECK-NEXT: } // callseq 21 | |
| ; CHECK-NEXT: ret; | |
| %struct.ir0 = insertvalue %struct.double2 poison, double 1.0, 0 | |
| %struct.ir1 = insertvalue %struct.double2 %struct.ir0, double %val, 1 | |
| call void @call_v2_f64(%struct.double2 %struct.ir1) | |
| ret void | |
| } | |
| define void @st_param_v2_f64_ri(double %val) { | |
| ; CHECK-LABEL: st_param_v2_f64_ri( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b64 %rd<2>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b64 %rd1, [st_param_v2_f64_ri_param_0]; | |
| ; CHECK-NEXT: { // callseq 22, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v2.b64 [param0], {%rd1, 0d4000000000000000}; | |
| ; CHECK-NEXT: call.uni call_v2_f64, (param0); | |
| ; CHECK-NEXT: } // callseq 22 | |
| ; CHECK-NEXT: ret; | |
| %struct.ri0 = insertvalue %struct.double2 poison, double %val, 0 | |
| %struct.ri1 = insertvalue %struct.double2 %struct.ri0, double 2.0, 1 | |
| call void @call_v2_f64(%struct.double2 %struct.ri1) | |
| ret void | |
| } | |
| declare void @call_v2_i8(%struct.char2 alignstack(2)) | |
| declare void @call_v2_i16(%struct.short2 alignstack(4)) | |
| declare void @call_v2_i32(%struct.int2 alignstack(8)) | |
| declare void @call_v2_i64(%struct.longlong2 alignstack(16)) | |
| declare void @call_v2_f32(%struct.float2 alignstack(8)) | |
| declare void @call_v2_f64(%struct.double2 alignstack(16)) | |
| define void @st_param_v4_i8_iiii() { | |
| ; CHECK-LABEL: st_param_v4_i8_iiii( | |
| ; CHECK: { | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: { // callseq 23, 0 | |
| ; CHECK-NEXT: .param .align 4 .b8 param0[4]; | |
| ; CHECK-NEXT: st.param.b32 [param0], 67305985; | |
| ; CHECK-NEXT: call.uni call_v4_i8, (param0); | |
| ; CHECK-NEXT: } // callseq 23 | |
| ; CHECK-NEXT: ret; | |
| call void @call_v4_i8(%struct.char4 { i8 1, i8 2, i8 3, i8 4 }) | |
| ret void | |
| } | |
| define void @st_param_v4_i8_irrr(i8 %b, i8 %c, i8 %d) { | |
| ; CHECK-LABEL: st_param_v4_i8_irrr( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<7>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b8 %r1, [st_param_v4_i8_irrr_param_2]; | |
| ; CHECK-NEXT: ld.param.b8 %r2, [st_param_v4_i8_irrr_param_1]; | |
| ; CHECK-NEXT: prmt.b32 %r3, %r2, %r1, 0x3340U; | |
| ; CHECK-NEXT: ld.param.b8 %r4, [st_param_v4_i8_irrr_param_0]; | |
| ; CHECK-NEXT: prmt.b32 %r5, 1, %r4, 0x3340U; | |
| ; CHECK-NEXT: prmt.b32 %r6, %r5, %r3, 0x5410U; | |
| ; CHECK-NEXT: { // callseq 24, 0 | |
| ; CHECK-NEXT: .param .align 4 .b8 param0[4]; | |
| ; CHECK-NEXT: st.param.b32 [param0], %r6; | |
| ; CHECK-NEXT: call.uni call_v4_i8, (param0); | |
| ; CHECK-NEXT: } // callseq 24 | |
| ; CHECK-NEXT: ret; | |
| %struct.irrr0 = insertvalue %struct.char4 poison, i8 1, 0 | |
| %struct.irrr1 = insertvalue %struct.char4 %struct.irrr0, i8 %b, 1 | |
| %struct.irrr2 = insertvalue %struct.char4 %struct.irrr1, i8 %c, 2 | |
| %struct.irrr3 = insertvalue %struct.char4 %struct.irrr2, i8 %d, 3 | |
| call void @call_v4_i8(%struct.char4 %struct.irrr3) | |
| ret void | |
| } | |
| define void @st_param_v4_i8_rirr(i8 %a, i8 %c, i8 %d) { | |
| ; CHECK-LABEL: st_param_v4_i8_rirr( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<7>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b8 %r1, [st_param_v4_i8_rirr_param_2]; | |
| ; CHECK-NEXT: ld.param.b8 %r2, [st_param_v4_i8_rirr_param_1]; | |
| ; CHECK-NEXT: prmt.b32 %r3, %r2, %r1, 0x3340U; | |
| ; CHECK-NEXT: ld.param.b8 %r4, [st_param_v4_i8_rirr_param_0]; | |
| ; CHECK-NEXT: prmt.b32 %r5, %r4, 2, 0x3340U; | |
| ; CHECK-NEXT: prmt.b32 %r6, %r5, %r3, 0x5410U; | |
| ; CHECK-NEXT: { // callseq 25, 0 | |
| ; CHECK-NEXT: .param .align 4 .b8 param0[4]; | |
| ; CHECK-NEXT: st.param.b32 [param0], %r6; | |
| ; CHECK-NEXT: call.uni call_v4_i8, (param0); | |
| ; CHECK-NEXT: } // callseq 25 | |
| ; CHECK-NEXT: ret; | |
| %struct.rirr0 = insertvalue %struct.char4 poison, i8 %a, 0 | |
| %struct.rirr1 = insertvalue %struct.char4 %struct.rirr0, i8 2, 1 | |
| %struct.rirr2 = insertvalue %struct.char4 %struct.rirr1, i8 %c, 2 | |
| %struct.rirr3 = insertvalue %struct.char4 %struct.rirr2, i8 %d, 3 | |
| call void @call_v4_i8(%struct.char4 %struct.rirr3) | |
| ret void | |
| } | |
| define void @st_param_v4_i8_rrir(i8 %a, i8 %b, i8 %d) { | |
| ; CHECK-LABEL: st_param_v4_i8_rrir( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<7>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b8 %r1, [st_param_v4_i8_rrir_param_1]; | |
| ; CHECK-NEXT: ld.param.b8 %r2, [st_param_v4_i8_rrir_param_0]; | |
| ; CHECK-NEXT: prmt.b32 %r3, %r2, %r1, 0x3340U; | |
| ; CHECK-NEXT: ld.param.b8 %r4, [st_param_v4_i8_rrir_param_2]; | |
| ; CHECK-NEXT: prmt.b32 %r5, 3, %r4, 0x3340U; | |
| ; CHECK-NEXT: prmt.b32 %r6, %r3, %r5, 0x5410U; | |
| ; CHECK-NEXT: { // callseq 26, 0 | |
| ; CHECK-NEXT: .param .align 4 .b8 param0[4]; | |
| ; CHECK-NEXT: st.param.b32 [param0], %r6; | |
| ; CHECK-NEXT: call.uni call_v4_i8, (param0); | |
| ; CHECK-NEXT: } // callseq 26 | |
| ; CHECK-NEXT: ret; | |
| %struct.rrir0 = insertvalue %struct.char4 poison, i8 %a, 0 | |
| %struct.rrir1 = insertvalue %struct.char4 %struct.rrir0, i8 %b, 1 | |
| %struct.rrir2 = insertvalue %struct.char4 %struct.rrir1, i8 3, 2 | |
| %struct.rrir3 = insertvalue %struct.char4 %struct.rrir2, i8 %d, 3 | |
| call void @call_v4_i8(%struct.char4 %struct.rrir3) | |
| ret void | |
| } | |
| define void @st_param_v4_i8_rrri(i8 %a, i8 %b, i8 %c) { | |
| ; CHECK-LABEL: st_param_v4_i8_rrri( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<7>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b8 %r1, [st_param_v4_i8_rrri_param_1]; | |
| ; CHECK-NEXT: ld.param.b8 %r2, [st_param_v4_i8_rrri_param_0]; | |
| ; CHECK-NEXT: prmt.b32 %r3, %r2, %r1, 0x3340U; | |
| ; CHECK-NEXT: ld.param.b8 %r4, [st_param_v4_i8_rrri_param_2]; | |
| ; CHECK-NEXT: prmt.b32 %r5, %r4, 4, 0x3340U; | |
| ; CHECK-NEXT: prmt.b32 %r6, %r3, %r5, 0x5410U; | |
| ; CHECK-NEXT: { // callseq 27, 0 | |
| ; CHECK-NEXT: .param .align 4 .b8 param0[4]; | |
| ; CHECK-NEXT: st.param.b32 [param0], %r6; | |
| ; CHECK-NEXT: call.uni call_v4_i8, (param0); | |
| ; CHECK-NEXT: } // callseq 27 | |
| ; CHECK-NEXT: ret; | |
| %struct.rrri0 = insertvalue %struct.char4 poison, i8 %a, 0 | |
| %struct.rrri1 = insertvalue %struct.char4 %struct.rrri0, i8 %b, 1 | |
| %struct.rrri2 = insertvalue %struct.char4 %struct.rrri1, i8 %c, 2 | |
| %struct.rrri3 = insertvalue %struct.char4 %struct.rrri2, i8 4, 3 | |
| call void @call_v4_i8(%struct.char4 %struct.rrri3) | |
| ret void | |
| } | |
| define void @st_param_v4_i8_iirr(i8 %c, i8 %d) { | |
| ; CHECK-LABEL: st_param_v4_i8_iirr( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<5>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b8 %r1, [st_param_v4_i8_iirr_param_1]; | |
| ; CHECK-NEXT: ld.param.b8 %r2, [st_param_v4_i8_iirr_param_0]; | |
| ; CHECK-NEXT: prmt.b32 %r3, %r2, %r1, 0x3340U; | |
| ; CHECK-NEXT: prmt.b32 %r4, 513, %r3, 0x5410U; | |
| ; CHECK-NEXT: { // callseq 28, 0 | |
| ; CHECK-NEXT: .param .align 4 .b8 param0[4]; | |
| ; CHECK-NEXT: st.param.b32 [param0], %r4; | |
| ; CHECK-NEXT: call.uni call_v4_i8, (param0); | |
| ; CHECK-NEXT: } // callseq 28 | |
| ; CHECK-NEXT: ret; | |
| %struct.iirr0 = insertvalue %struct.char4 poison, i8 1, 0 | |
| %struct.iirr1 = insertvalue %struct.char4 %struct.iirr0, i8 2, 1 | |
| %struct.iirr2 = insertvalue %struct.char4 %struct.iirr1, i8 %c, 2 | |
| %struct.iirr3 = insertvalue %struct.char4 %struct.iirr2, i8 %d, 3 | |
| call void @call_v4_i8(%struct.char4 %struct.iirr3) | |
| ret void | |
| } | |
| define void @st_param_v4_i8_irir(i8 %b, i8 %d) { | |
| ; CHECK-LABEL: st_param_v4_i8_irir( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<6>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b8 %r1, [st_param_v4_i8_irir_param_1]; | |
| ; CHECK-NEXT: prmt.b32 %r2, 3, %r1, 0x3340U; | |
| ; CHECK-NEXT: ld.param.b8 %r3, [st_param_v4_i8_irir_param_0]; | |
| ; CHECK-NEXT: prmt.b32 %r4, 1, %r3, 0x3340U; | |
| ; CHECK-NEXT: prmt.b32 %r5, %r4, %r2, 0x5410U; | |
| ; CHECK-NEXT: { // callseq 29, 0 | |
| ; CHECK-NEXT: .param .align 4 .b8 param0[4]; | |
| ; CHECK-NEXT: st.param.b32 [param0], %r5; | |
| ; CHECK-NEXT: call.uni call_v4_i8, (param0); | |
| ; CHECK-NEXT: } // callseq 29 | |
| ; CHECK-NEXT: ret; | |
| %struct.irir0 = insertvalue %struct.char4 poison, i8 1, 0 | |
| %struct.irir1 = insertvalue %struct.char4 %struct.irir0, i8 %b, 1 | |
| %struct.irir2 = insertvalue %struct.char4 %struct.irir1, i8 3, 2 | |
| %struct.irir3 = insertvalue %struct.char4 %struct.irir2, i8 %d, 3 | |
| call void @call_v4_i8(%struct.char4 %struct.irir3) | |
| ret void | |
| } | |
| define void @st_param_v4_i8_irri(i8 %b, i8 %c) { | |
| ; CHECK-LABEL: st_param_v4_i8_irri( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<6>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b8 %r1, [st_param_v4_i8_irri_param_1]; | |
| ; CHECK-NEXT: prmt.b32 %r2, %r1, 4, 0x3340U; | |
| ; CHECK-NEXT: ld.param.b8 %r3, [st_param_v4_i8_irri_param_0]; | |
| ; CHECK-NEXT: prmt.b32 %r4, 1, %r3, 0x3340U; | |
| ; CHECK-NEXT: prmt.b32 %r5, %r4, %r2, 0x5410U; | |
| ; CHECK-NEXT: { // callseq 30, 0 | |
| ; CHECK-NEXT: .param .align 4 .b8 param0[4]; | |
| ; CHECK-NEXT: st.param.b32 [param0], %r5; | |
| ; CHECK-NEXT: call.uni call_v4_i8, (param0); | |
| ; CHECK-NEXT: } // callseq 30 | |
| ; CHECK-NEXT: ret; | |
| %struct.irri0 = insertvalue %struct.char4 poison, i8 1, 0 | |
| %struct.irri1 = insertvalue %struct.char4 %struct.irri0, i8 %b, 1 | |
| %struct.irri2 = insertvalue %struct.char4 %struct.irri1, i8 %c, 2 | |
| %struct.irri3 = insertvalue %struct.char4 %struct.irri2, i8 4, 3 | |
| call void @call_v4_i8(%struct.char4 %struct.irri3) | |
| ret void | |
| } | |
| define void @st_param_v4_i8_riir(i8 %a, i8 %d) { | |
| ; CHECK-LABEL: st_param_v4_i8_riir( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<6>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b8 %r1, [st_param_v4_i8_riir_param_1]; | |
| ; CHECK-NEXT: prmt.b32 %r2, 3, %r1, 0x3340U; | |
| ; CHECK-NEXT: ld.param.b8 %r3, [st_param_v4_i8_riir_param_0]; | |
| ; CHECK-NEXT: prmt.b32 %r4, %r3, 2, 0x3340U; | |
| ; CHECK-NEXT: prmt.b32 %r5, %r4, %r2, 0x5410U; | |
| ; CHECK-NEXT: { // callseq 31, 0 | |
| ; CHECK-NEXT: .param .align 4 .b8 param0[4]; | |
| ; CHECK-NEXT: st.param.b32 [param0], %r5; | |
| ; CHECK-NEXT: call.uni call_v4_i8, (param0); | |
| ; CHECK-NEXT: } // callseq 31 | |
| ; CHECK-NEXT: ret; | |
| %struct.riir0 = insertvalue %struct.char4 poison, i8 %a, 0 | |
| %struct.riir1 = insertvalue %struct.char4 %struct.riir0, i8 2, 1 | |
| %struct.riir2 = insertvalue %struct.char4 %struct.riir1, i8 3, 2 | |
| %struct.riir3 = insertvalue %struct.char4 %struct.riir2, i8 %d, 3 | |
| call void @call_v4_i8(%struct.char4 %struct.riir3) | |
| ret void | |
| } | |
| define void @st_param_v4_i8_riri(i8 %a, i8 %c) { | |
| ; CHECK-LABEL: st_param_v4_i8_riri( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<6>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b8 %r1, [st_param_v4_i8_riri_param_1]; | |
| ; CHECK-NEXT: prmt.b32 %r2, %r1, 4, 0x3340U; | |
| ; CHECK-NEXT: ld.param.b8 %r3, [st_param_v4_i8_riri_param_0]; | |
| ; CHECK-NEXT: prmt.b32 %r4, %r3, 2, 0x3340U; | |
| ; CHECK-NEXT: prmt.b32 %r5, %r4, %r2, 0x5410U; | |
| ; CHECK-NEXT: { // callseq 32, 0 | |
| ; CHECK-NEXT: .param .align 4 .b8 param0[4]; | |
| ; CHECK-NEXT: st.param.b32 [param0], %r5; | |
| ; CHECK-NEXT: call.uni call_v4_i8, (param0); | |
| ; CHECK-NEXT: } // callseq 32 | |
| ; CHECK-NEXT: ret; | |
| %struct.riri0 = insertvalue %struct.char4 poison, i8 %a, 0 | |
| %struct.riri1 = insertvalue %struct.char4 %struct.riri0, i8 2, 1 | |
| %struct.riri2 = insertvalue %struct.char4 %struct.riri1, i8 %c, 2 | |
| %struct.riri3 = insertvalue %struct.char4 %struct.riri2, i8 4, 3 | |
| call void @call_v4_i8(%struct.char4 %struct.riri3) | |
| ret void | |
| } | |
| define void @st_param_v4_i8_rrii(i8 %a, i8 %b) { | |
| ; CHECK-LABEL: st_param_v4_i8_rrii( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<5>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b8 %r1, [st_param_v4_i8_rrii_param_1]; | |
| ; CHECK-NEXT: ld.param.b8 %r2, [st_param_v4_i8_rrii_param_0]; | |
| ; CHECK-NEXT: prmt.b32 %r3, %r2, %r1, 0x3340U; | |
| ; CHECK-NEXT: prmt.b32 %r4, %r3, 1027, 0x5410U; | |
| ; CHECK-NEXT: { // callseq 33, 0 | |
| ; CHECK-NEXT: .param .align 4 .b8 param0[4]; | |
| ; CHECK-NEXT: st.param.b32 [param0], %r4; | |
| ; CHECK-NEXT: call.uni call_v4_i8, (param0); | |
| ; CHECK-NEXT: } // callseq 33 | |
| ; CHECK-NEXT: ret; | |
| %struct.rrii0 = insertvalue %struct.char4 poison, i8 %a, 0 | |
| %struct.rrii1 = insertvalue %struct.char4 %struct.rrii0, i8 %b, 1 | |
| %struct.rrii2 = insertvalue %struct.char4 %struct.rrii1, i8 3, 2 | |
| %struct.rrii3 = insertvalue %struct.char4 %struct.rrii2, i8 4, 3 | |
| call void @call_v4_i8(%struct.char4 %struct.rrii3) | |
| ret void | |
| } | |
| define void @st_param_v4_i8_iiir(i8 %d) { | |
| ; CHECK-LABEL: st_param_v4_i8_iiir( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<4>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: { // callseq 34, 0 | |
| ; CHECK-NEXT: .param .align 4 .b8 param0[4]; | |
| ; CHECK-NEXT: ld.param.b8 %r1, [st_param_v4_i8_iiir_param_0]; | |
| ; CHECK-NEXT: prmt.b32 %r2, 3, %r1, 0x3340U; | |
| ; CHECK-NEXT: prmt.b32 %r3, 513, %r2, 0x5410U; | |
| ; CHECK-NEXT: st.param.b32 [param0], %r3; | |
| ; CHECK-NEXT: call.uni call_v4_i8, (param0); | |
| ; CHECK-NEXT: } // callseq 34 | |
| ; CHECK-NEXT: ret; | |
| %struct.iiir0 = insertvalue %struct.char4 poison, i8 1, 0 | |
| %struct.iiir1 = insertvalue %struct.char4 %struct.iiir0, i8 2, 1 | |
| %struct.iiir2 = insertvalue %struct.char4 %struct.iiir1, i8 3, 2 | |
| %struct.iiir3 = insertvalue %struct.char4 %struct.iiir2, i8 %d, 3 | |
| call void @call_v4_i8(%struct.char4 %struct.iiir3) | |
| ret void | |
| } | |
| define void @st_param_v4_i8_iiri(i8 %c) { | |
| ; CHECK-LABEL: st_param_v4_i8_iiri( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<4>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: { // callseq 35, 0 | |
| ; CHECK-NEXT: .param .align 4 .b8 param0[4]; | |
| ; CHECK-NEXT: ld.param.b8 %r1, [st_param_v4_i8_iiri_param_0]; | |
| ; CHECK-NEXT: prmt.b32 %r2, %r1, 4, 0x3340U; | |
| ; CHECK-NEXT: prmt.b32 %r3, 513, %r2, 0x5410U; | |
| ; CHECK-NEXT: st.param.b32 [param0], %r3; | |
| ; CHECK-NEXT: call.uni call_v4_i8, (param0); | |
| ; CHECK-NEXT: } // callseq 35 | |
| ; CHECK-NEXT: ret; | |
| %struct.iiri0 = insertvalue %struct.char4 poison, i8 1, 0 | |
| %struct.iiri1 = insertvalue %struct.char4 %struct.iiri0, i8 2, 1 | |
| %struct.iiri2 = insertvalue %struct.char4 %struct.iiri1, i8 %c, 2 | |
| %struct.iiri3 = insertvalue %struct.char4 %struct.iiri2, i8 4, 3 | |
| call void @call_v4_i8(%struct.char4 %struct.iiri3) | |
| ret void | |
| } | |
| define void @st_param_v4_i8_irii(i8 %b) { | |
| ; CHECK-LABEL: st_param_v4_i8_irii( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<4>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: { // callseq 36, 0 | |
| ; CHECK-NEXT: .param .align 4 .b8 param0[4]; | |
| ; CHECK-NEXT: ld.param.b8 %r1, [st_param_v4_i8_irii_param_0]; | |
| ; CHECK-NEXT: prmt.b32 %r2, 1, %r1, 0x3340U; | |
| ; CHECK-NEXT: prmt.b32 %r3, %r2, 1027, 0x5410U; | |
| ; CHECK-NEXT: st.param.b32 [param0], %r3; | |
| ; CHECK-NEXT: call.uni call_v4_i8, (param0); | |
| ; CHECK-NEXT: } // callseq 36 | |
| ; CHECK-NEXT: ret; | |
| %struct.irii0 = insertvalue %struct.char4 poison, i8 1, 0 | |
| %struct.irii1 = insertvalue %struct.char4 %struct.irii0, i8 %b, 1 | |
| %struct.irii2 = insertvalue %struct.char4 %struct.irii1, i8 3, 2 | |
| %struct.irii3 = insertvalue %struct.char4 %struct.irii2, i8 4, 3 | |
| call void @call_v4_i8(%struct.char4 %struct.irii3) | |
| ret void | |
| } | |
| define void @st_param_v4_i8_riii(i8 %a) { | |
| ; CHECK-LABEL: st_param_v4_i8_riii( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<4>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: { // callseq 37, 0 | |
| ; CHECK-NEXT: .param .align 4 .b8 param0[4]; | |
| ; CHECK-NEXT: ld.param.b8 %r1, [st_param_v4_i8_riii_param_0]; | |
| ; CHECK-NEXT: prmt.b32 %r2, %r1, 2, 0x3340U; | |
| ; CHECK-NEXT: prmt.b32 %r3, %r2, 1027, 0x5410U; | |
| ; CHECK-NEXT: st.param.b32 [param0], %r3; | |
| ; CHECK-NEXT: call.uni call_v4_i8, (param0); | |
| ; CHECK-NEXT: } // callseq 37 | |
| ; CHECK-NEXT: ret; | |
| %struct.riii0 = insertvalue %struct.char4 poison, i8 %a, 0 | |
| %struct.riii1 = insertvalue %struct.char4 %struct.riii0, i8 2, 1 | |
| %struct.riii2 = insertvalue %struct.char4 %struct.riii1, i8 3, 2 | |
| %struct.riii3 = insertvalue %struct.char4 %struct.riii2, i8 4, 3 | |
| call void @call_v4_i8(%struct.char4 %struct.riii3) | |
| ret void | |
| } | |
| define void @st_param_v4_i16_iiii() { | |
| ; CHECK-LABEL: st_param_v4_i16_iiii( | |
| ; CHECK: { | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: { // callseq 38, 0 | |
| ; CHECK-NEXT: .param .align 8 .b8 param0[8]; | |
| ; CHECK-NEXT: st.param.v2.b32 [param0], {131073, 262147}; | |
| ; CHECK-NEXT: call.uni call_v4_i16, (param0); | |
| ; CHECK-NEXT: } // callseq 38 | |
| ; CHECK-NEXT: ret; | |
| call void @call_v4_i16(%struct.short4 { i16 1, i16 2, i16 3, i16 4 }) | |
| ret void | |
| } | |
| define void @st_param_v4_i16_irrr(i16 %b, i16 %c, i16 %d) { | |
| ; CHECK-LABEL: st_param_v4_i16_irrr( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b16 %rs<4>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b16 %rs1, [st_param_v4_i16_irrr_param_0]; | |
| ; CHECK-NEXT: ld.param.b16 %rs2, [st_param_v4_i16_irrr_param_1]; | |
| ; CHECK-NEXT: ld.param.b16 %rs3, [st_param_v4_i16_irrr_param_2]; | |
| ; CHECK-NEXT: { // callseq 39, 0 | |
| ; CHECK-NEXT: .param .align 8 .b8 param0[8]; | |
| ; CHECK-NEXT: st.param.v4.b16 [param0], {1, %rs1, %rs2, %rs3}; | |
| ; CHECK-NEXT: call.uni call_v4_i16, (param0); | |
| ; CHECK-NEXT: } // callseq 39 | |
| ; CHECK-NEXT: ret; | |
| %struct.irrr0 = insertvalue %struct.short4 poison, i16 1, 0 | |
| %struct.irrr1 = insertvalue %struct.short4 %struct.irrr0, i16 %b, 1 | |
| %struct.irrr2 = insertvalue %struct.short4 %struct.irrr1, i16 %c, 2 | |
| %struct.irrr3 = insertvalue %struct.short4 %struct.irrr2, i16 %d, 3 | |
| call void @call_v4_i16(%struct.short4 %struct.irrr3) | |
| ret void | |
| } | |
| define void @st_param_v4_i16_rirr(i16 %a, i16 %c, i16 %d) { | |
| ; CHECK-LABEL: st_param_v4_i16_rirr( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b16 %rs<4>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b16 %rs1, [st_param_v4_i16_rirr_param_0]; | |
| ; CHECK-NEXT: ld.param.b16 %rs2, [st_param_v4_i16_rirr_param_1]; | |
| ; CHECK-NEXT: ld.param.b16 %rs3, [st_param_v4_i16_rirr_param_2]; | |
| ; CHECK-NEXT: { // callseq 40, 0 | |
| ; CHECK-NEXT: .param .align 8 .b8 param0[8]; | |
| ; CHECK-NEXT: st.param.v4.b16 [param0], {%rs1, 2, %rs2, %rs3}; | |
| ; CHECK-NEXT: call.uni call_v4_i16, (param0); | |
| ; CHECK-NEXT: } // callseq 40 | |
| ; CHECK-NEXT: ret; | |
| %struct.rirr0 = insertvalue %struct.short4 poison, i16 %a, 0 | |
| %struct.rirr1 = insertvalue %struct.short4 %struct.rirr0, i16 2, 1 | |
| %struct.rirr2 = insertvalue %struct.short4 %struct.rirr1, i16 %c, 2 | |
| %struct.rirr3 = insertvalue %struct.short4 %struct.rirr2, i16 %d, 3 | |
| call void @call_v4_i16(%struct.short4 %struct.rirr3) | |
| ret void | |
| } | |
| define void @st_param_v4_i16_rrir(i16 %a, i16 %b, i16 %d) { | |
| ; CHECK-LABEL: st_param_v4_i16_rrir( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b16 %rs<4>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b16 %rs1, [st_param_v4_i16_rrir_param_0]; | |
| ; CHECK-NEXT: ld.param.b16 %rs2, [st_param_v4_i16_rrir_param_1]; | |
| ; CHECK-NEXT: ld.param.b16 %rs3, [st_param_v4_i16_rrir_param_2]; | |
| ; CHECK-NEXT: { // callseq 41, 0 | |
| ; CHECK-NEXT: .param .align 8 .b8 param0[8]; | |
| ; CHECK-NEXT: st.param.v4.b16 [param0], {%rs1, %rs2, 3, %rs3}; | |
| ; CHECK-NEXT: call.uni call_v4_i16, (param0); | |
| ; CHECK-NEXT: } // callseq 41 | |
| ; CHECK-NEXT: ret; | |
| %struct.rrir0 = insertvalue %struct.short4 poison, i16 %a, 0 | |
| %struct.rrir1 = insertvalue %struct.short4 %struct.rrir0, i16 %b, 1 | |
| %struct.rrir2 = insertvalue %struct.short4 %struct.rrir1, i16 3, 2 | |
| %struct.rrir3 = insertvalue %struct.short4 %struct.rrir2, i16 %d, 3 | |
| call void @call_v4_i16(%struct.short4 %struct.rrir3) | |
| ret void | |
| } | |
| define void @st_param_v4_i16_rrri(i16 %a, i16 %b, i16 %c) { | |
| ; CHECK-LABEL: st_param_v4_i16_rrri( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b16 %rs<4>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b16 %rs1, [st_param_v4_i16_rrri_param_0]; | |
| ; CHECK-NEXT: ld.param.b16 %rs2, [st_param_v4_i16_rrri_param_1]; | |
| ; CHECK-NEXT: ld.param.b16 %rs3, [st_param_v4_i16_rrri_param_2]; | |
| ; CHECK-NEXT: { // callseq 42, 0 | |
| ; CHECK-NEXT: .param .align 8 .b8 param0[8]; | |
| ; CHECK-NEXT: st.param.v4.b16 [param0], {%rs1, %rs2, %rs3, 4}; | |
| ; CHECK-NEXT: call.uni call_v4_i16, (param0); | |
| ; CHECK-NEXT: } // callseq 42 | |
| ; CHECK-NEXT: ret; | |
| %struct.rrri0 = insertvalue %struct.short4 poison, i16 %a, 0 | |
| %struct.rrri1 = insertvalue %struct.short4 %struct.rrri0, i16 %b, 1 | |
| %struct.rrri2 = insertvalue %struct.short4 %struct.rrri1, i16 %c, 2 | |
| %struct.rrri3 = insertvalue %struct.short4 %struct.rrri2, i16 4, 3 | |
| call void @call_v4_i16(%struct.short4 %struct.rrri3) | |
| ret void | |
| } | |
| define void @st_param_v4_i16_iirr(i16 %c, i16 %d) { | |
| ; CHECK-LABEL: st_param_v4_i16_iirr( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b16 %rs<3>; | |
| ; CHECK-NEXT: .reg .b32 %r<2>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b16 %rs1, [st_param_v4_i16_iirr_param_0]; | |
| ; CHECK-NEXT: ld.param.b16 %rs2, [st_param_v4_i16_iirr_param_1]; | |
| ; CHECK-NEXT: mov.b32 %r1, {%rs1, %rs2}; | |
| ; CHECK-NEXT: { // callseq 43, 0 | |
| ; CHECK-NEXT: .param .align 8 .b8 param0[8]; | |
| ; CHECK-NEXT: st.param.v2.b32 [param0], {131073, %r1}; | |
| ; CHECK-NEXT: call.uni call_v4_i16, (param0); | |
| ; CHECK-NEXT: } // callseq 43 | |
| ; CHECK-NEXT: ret; | |
| %struct.iirr0 = insertvalue %struct.short4 poison, i16 1, 0 | |
| %struct.iirr1 = insertvalue %struct.short4 %struct.iirr0, i16 2, 1 | |
| %struct.iirr2 = insertvalue %struct.short4 %struct.iirr1, i16 %c, 2 | |
| %struct.iirr3 = insertvalue %struct.short4 %struct.iirr2, i16 %d, 3 | |
| call void @call_v4_i16(%struct.short4 %struct.iirr3) | |
| ret void | |
| } | |
| define void @st_param_v4_i16_irir(i16 %b, i16 %d) { | |
| ; CHECK-LABEL: st_param_v4_i16_irir( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b16 %rs<3>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b16 %rs1, [st_param_v4_i16_irir_param_0]; | |
| ; CHECK-NEXT: ld.param.b16 %rs2, [st_param_v4_i16_irir_param_1]; | |
| ; CHECK-NEXT: { // callseq 44, 0 | |
| ; CHECK-NEXT: .param .align 8 .b8 param0[8]; | |
| ; CHECK-NEXT: st.param.v4.b16 [param0], {1, %rs1, 3, %rs2}; | |
| ; CHECK-NEXT: call.uni call_v4_i16, (param0); | |
| ; CHECK-NEXT: } // callseq 44 | |
| ; CHECK-NEXT: ret; | |
| %struct.irir0 = insertvalue %struct.short4 poison, i16 1, 0 | |
| %struct.irir1 = insertvalue %struct.short4 %struct.irir0, i16 %b, 1 | |
| %struct.irir2 = insertvalue %struct.short4 %struct.irir1, i16 3, 2 | |
| %struct.irir3 = insertvalue %struct.short4 %struct.irir2, i16 %d, 3 | |
| call void @call_v4_i16(%struct.short4 %struct.irir3) | |
| ret void | |
| } | |
| define void @st_param_v4_i16_irri(i16 %b, i16 %c) { | |
| ; CHECK-LABEL: st_param_v4_i16_irri( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b16 %rs<3>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b16 %rs1, [st_param_v4_i16_irri_param_0]; | |
| ; CHECK-NEXT: ld.param.b16 %rs2, [st_param_v4_i16_irri_param_1]; | |
| ; CHECK-NEXT: { // callseq 45, 0 | |
| ; CHECK-NEXT: .param .align 8 .b8 param0[8]; | |
| ; CHECK-NEXT: st.param.v4.b16 [param0], {1, %rs1, %rs2, 4}; | |
| ; CHECK-NEXT: call.uni call_v4_i16, (param0); | |
| ; CHECK-NEXT: } // callseq 45 | |
| ; CHECK-NEXT: ret; | |
| %struct.irri0 = insertvalue %struct.short4 poison, i16 1, 0 | |
| %struct.irri1 = insertvalue %struct.short4 %struct.irri0, i16 %b, 1 | |
| %struct.irri2 = insertvalue %struct.short4 %struct.irri1, i16 %c, 2 | |
| %struct.irri3 = insertvalue %struct.short4 %struct.irri2, i16 4, 3 | |
| call void @call_v4_i16(%struct.short4 %struct.irri3) | |
| ret void | |
| } | |
| define void @st_param_v4_i16_riir(i16 %a, i16 %d) { | |
| ; CHECK-LABEL: st_param_v4_i16_riir( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b16 %rs<3>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b16 %rs1, [st_param_v4_i16_riir_param_0]; | |
| ; CHECK-NEXT: ld.param.b16 %rs2, [st_param_v4_i16_riir_param_1]; | |
| ; CHECK-NEXT: { // callseq 46, 0 | |
| ; CHECK-NEXT: .param .align 8 .b8 param0[8]; | |
| ; CHECK-NEXT: st.param.v4.b16 [param0], {%rs1, 2, 3, %rs2}; | |
| ; CHECK-NEXT: call.uni call_v4_i16, (param0); | |
| ; CHECK-NEXT: } // callseq 46 | |
| ; CHECK-NEXT: ret; | |
| %struct.riir0 = insertvalue %struct.short4 poison, i16 %a, 0 | |
| %struct.riir1 = insertvalue %struct.short4 %struct.riir0, i16 2, 1 | |
| %struct.riir2 = insertvalue %struct.short4 %struct.riir1, i16 3, 2 | |
| %struct.riir3 = insertvalue %struct.short4 %struct.riir2, i16 %d, 3 | |
| call void @call_v4_i16(%struct.short4 %struct.riir3) | |
| ret void | |
| } | |
| define void @st_param_v4_i16_riri(i16 %a, i16 %c) { | |
| ; CHECK-LABEL: st_param_v4_i16_riri( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b16 %rs<3>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b16 %rs1, [st_param_v4_i16_riri_param_0]; | |
| ; CHECK-NEXT: ld.param.b16 %rs2, [st_param_v4_i16_riri_param_1]; | |
| ; CHECK-NEXT: { // callseq 47, 0 | |
| ; CHECK-NEXT: .param .align 8 .b8 param0[8]; | |
| ; CHECK-NEXT: st.param.v4.b16 [param0], {%rs1, 2, %rs2, 4}; | |
| ; CHECK-NEXT: call.uni call_v4_i16, (param0); | |
| ; CHECK-NEXT: } // callseq 47 | |
| ; CHECK-NEXT: ret; | |
| %struct.riri0 = insertvalue %struct.short4 poison, i16 %a, 0 | |
| %struct.riri1 = insertvalue %struct.short4 %struct.riri0, i16 2, 1 | |
| %struct.riri2 = insertvalue %struct.short4 %struct.riri1, i16 %c, 2 | |
| %struct.riri3 = insertvalue %struct.short4 %struct.riri2, i16 4, 3 | |
| call void @call_v4_i16(%struct.short4 %struct.riri3) | |
| ret void | |
| } | |
| define void @st_param_v4_i16_rrii(i16 %a, i16 %b) { | |
| ; CHECK-LABEL: st_param_v4_i16_rrii( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b16 %rs<3>; | |
| ; CHECK-NEXT: .reg .b32 %r<2>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b16 %rs1, [st_param_v4_i16_rrii_param_0]; | |
| ; CHECK-NEXT: ld.param.b16 %rs2, [st_param_v4_i16_rrii_param_1]; | |
| ; CHECK-NEXT: mov.b32 %r1, {%rs1, %rs2}; | |
| ; CHECK-NEXT: { // callseq 48, 0 | |
| ; CHECK-NEXT: .param .align 8 .b8 param0[8]; | |
| ; CHECK-NEXT: st.param.v2.b32 [param0], {%r1, 262147}; | |
| ; CHECK-NEXT: call.uni call_v4_i16, (param0); | |
| ; CHECK-NEXT: } // callseq 48 | |
| ; CHECK-NEXT: ret; | |
| %struct.rrii0 = insertvalue %struct.short4 poison, i16 %a, 0 | |
| %struct.rrii1 = insertvalue %struct.short4 %struct.rrii0, i16 %b, 1 | |
| %struct.rrii2 = insertvalue %struct.short4 %struct.rrii1, i16 3, 2 | |
| %struct.rrii3 = insertvalue %struct.short4 %struct.rrii2, i16 4, 3 | |
| call void @call_v4_i16(%struct.short4 %struct.rrii3) | |
| ret void | |
| } | |
| define void @st_param_v4_i16_iiir(i16 %d) { | |
| ; CHECK-LABEL: st_param_v4_i16_iiir( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b16 %rs<3>; | |
| ; CHECK-NEXT: .reg .b32 %r<2>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b16 %rs1, [st_param_v4_i16_iiir_param_0]; | |
| ; CHECK-NEXT: mov.b16 %rs2, 3; | |
| ; CHECK-NEXT: mov.b32 %r1, {%rs2, %rs1}; | |
| ; CHECK-NEXT: { // callseq 49, 0 | |
| ; CHECK-NEXT: .param .align 8 .b8 param0[8]; | |
| ; CHECK-NEXT: st.param.v2.b32 [param0], {131073, %r1}; | |
| ; CHECK-NEXT: call.uni call_v4_i16, (param0); | |
| ; CHECK-NEXT: } // callseq 49 | |
| ; CHECK-NEXT: ret; | |
| %struct.iiir0 = insertvalue %struct.short4 poison, i16 1, 0 | |
| %struct.iiir1 = insertvalue %struct.short4 %struct.iiir0, i16 2, 1 | |
| %struct.iiir2 = insertvalue %struct.short4 %struct.iiir1, i16 3, 2 | |
| %struct.iiir3 = insertvalue %struct.short4 %struct.iiir2, i16 %d, 3 | |
| call void @call_v4_i16(%struct.short4 %struct.iiir3) | |
| ret void | |
| } | |
| define void @st_param_v4_i16_iiri(i16 %c) { | |
| ; CHECK-LABEL: st_param_v4_i16_iiri( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b16 %rs<3>; | |
| ; CHECK-NEXT: .reg .b32 %r<2>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b16 %rs1, [st_param_v4_i16_iiri_param_0]; | |
| ; CHECK-NEXT: mov.b16 %rs2, 4; | |
| ; CHECK-NEXT: mov.b32 %r1, {%rs1, %rs2}; | |
| ; CHECK-NEXT: { // callseq 50, 0 | |
| ; CHECK-NEXT: .param .align 8 .b8 param0[8]; | |
| ; CHECK-NEXT: st.param.v2.b32 [param0], {131073, %r1}; | |
| ; CHECK-NEXT: call.uni call_v4_i16, (param0); | |
| ; CHECK-NEXT: } // callseq 50 | |
| ; CHECK-NEXT: ret; | |
| %struct.iiri0 = insertvalue %struct.short4 poison, i16 1, 0 | |
| %struct.iiri1 = insertvalue %struct.short4 %struct.iiri0, i16 2, 1 | |
| %struct.iiri2 = insertvalue %struct.short4 %struct.iiri1, i16 %c, 2 | |
| %struct.iiri3 = insertvalue %struct.short4 %struct.iiri2, i16 4, 3 | |
| call void @call_v4_i16(%struct.short4 %struct.iiri3) | |
| ret void | |
| } | |
| define void @st_param_v4_i16_irii(i16 %b) { | |
| ; CHECK-LABEL: st_param_v4_i16_irii( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b16 %rs<3>; | |
| ; CHECK-NEXT: .reg .b32 %r<2>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b16 %rs1, [st_param_v4_i16_irii_param_0]; | |
| ; CHECK-NEXT: mov.b16 %rs2, 1; | |
| ; CHECK-NEXT: mov.b32 %r1, {%rs2, %rs1}; | |
| ; CHECK-NEXT: { // callseq 51, 0 | |
| ; CHECK-NEXT: .param .align 8 .b8 param0[8]; | |
| ; CHECK-NEXT: st.param.v2.b32 [param0], {%r1, 262147}; | |
| ; CHECK-NEXT: call.uni call_v4_i16, (param0); | |
| ; CHECK-NEXT: } // callseq 51 | |
| ; CHECK-NEXT: ret; | |
| %struct.irii0 = insertvalue %struct.short4 poison, i16 1, 0 | |
| %struct.irii1 = insertvalue %struct.short4 %struct.irii0, i16 %b, 1 | |
| %struct.irii2 = insertvalue %struct.short4 %struct.irii1, i16 3, 2 | |
| %struct.irii3 = insertvalue %struct.short4 %struct.irii2, i16 4, 3 | |
| call void @call_v4_i16(%struct.short4 %struct.irii3) | |
| ret void | |
| } | |
| define void @st_param_v4_i16_riii(i16 %a) { | |
| ; CHECK-LABEL: st_param_v4_i16_riii( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b16 %rs<3>; | |
| ; CHECK-NEXT: .reg .b32 %r<2>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b16 %rs1, [st_param_v4_i16_riii_param_0]; | |
| ; CHECK-NEXT: mov.b16 %rs2, 2; | |
| ; CHECK-NEXT: mov.b32 %r1, {%rs1, %rs2}; | |
| ; CHECK-NEXT: { // callseq 52, 0 | |
| ; CHECK-NEXT: .param .align 8 .b8 param0[8]; | |
| ; CHECK-NEXT: st.param.v2.b32 [param0], {%r1, 262147}; | |
| ; CHECK-NEXT: call.uni call_v4_i16, (param0); | |
| ; CHECK-NEXT: } // callseq 52 | |
| ; CHECK-NEXT: ret; | |
| %struct.riii0 = insertvalue %struct.short4 poison, i16 %a, 0 | |
| %struct.riii1 = insertvalue %struct.short4 %struct.riii0, i16 2, 1 | |
| %struct.riii2 = insertvalue %struct.short4 %struct.riii1, i16 3, 2 | |
| %struct.riii3 = insertvalue %struct.short4 %struct.riii2, i16 4, 3 | |
| call void @call_v4_i16(%struct.short4 %struct.riii3) | |
| ret void | |
| } | |
| define void @st_param_v4_i32_iiii() { | |
| ; CHECK-LABEL: st_param_v4_i32_iiii( | |
| ; CHECK: { | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: { // callseq 53, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {1, 2, 3, 4}; | |
| ; CHECK-NEXT: call.uni call_v4_i32, (param0); | |
| ; CHECK-NEXT: } // callseq 53 | |
| ; CHECK-NEXT: ret; | |
| call void @call_v4_i32(%struct.int4 { i32 1, i32 2, i32 3, i32 4 }) | |
| ret void | |
| } | |
| define void @st_param_v4_i32_irrr(i32 %b, i32 %c, i32 %d) { | |
| ; CHECK-LABEL: st_param_v4_i32_irrr( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<4>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v4_i32_irrr_param_0]; | |
| ; CHECK-NEXT: ld.param.b32 %r2, [st_param_v4_i32_irrr_param_1]; | |
| ; CHECK-NEXT: ld.param.b32 %r3, [st_param_v4_i32_irrr_param_2]; | |
| ; CHECK-NEXT: { // callseq 54, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {1, %r1, %r2, %r3}; | |
| ; CHECK-NEXT: call.uni call_v4_i32, (param0); | |
| ; CHECK-NEXT: } // callseq 54 | |
| ; CHECK-NEXT: ret; | |
| %struct.irrr0 = insertvalue %struct.int4 poison, i32 1, 0 | |
| %struct.irrr1 = insertvalue %struct.int4 %struct.irrr0, i32 %b, 1 | |
| %struct.irrr2 = insertvalue %struct.int4 %struct.irrr1, i32 %c, 2 | |
| %struct.irrr3 = insertvalue %struct.int4 %struct.irrr2, i32 %d, 3 | |
| call void @call_v4_i32(%struct.int4 %struct.irrr3) | |
| ret void | |
| } | |
| define void @st_param_v4_i32_rirr(i32 %a, i32 %c, i32 %d) { | |
| ; CHECK-LABEL: st_param_v4_i32_rirr( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<4>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v4_i32_rirr_param_0]; | |
| ; CHECK-NEXT: ld.param.b32 %r2, [st_param_v4_i32_rirr_param_1]; | |
| ; CHECK-NEXT: ld.param.b32 %r3, [st_param_v4_i32_rirr_param_2]; | |
| ; CHECK-NEXT: { // callseq 55, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {%r1, 2, %r2, %r3}; | |
| ; CHECK-NEXT: call.uni call_v4_i32, (param0); | |
| ; CHECK-NEXT: } // callseq 55 | |
| ; CHECK-NEXT: ret; | |
| %struct.rirr0 = insertvalue %struct.int4 poison, i32 %a, 0 | |
| %struct.rirr1 = insertvalue %struct.int4 %struct.rirr0, i32 2, 1 | |
| %struct.rirr2 = insertvalue %struct.int4 %struct.rirr1, i32 %c, 2 | |
| %struct.rirr3 = insertvalue %struct.int4 %struct.rirr2, i32 %d, 3 | |
| call void @call_v4_i32(%struct.int4 %struct.rirr3) | |
| ret void | |
| } | |
| define void @st_param_v4_i32_rrir(i32 %a, i32 %b, i32 %d) { | |
| ; CHECK-LABEL: st_param_v4_i32_rrir( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<4>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v4_i32_rrir_param_0]; | |
| ; CHECK-NEXT: ld.param.b32 %r2, [st_param_v4_i32_rrir_param_1]; | |
| ; CHECK-NEXT: ld.param.b32 %r3, [st_param_v4_i32_rrir_param_2]; | |
| ; CHECK-NEXT: { // callseq 56, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {%r1, %r2, 3, %r3}; | |
| ; CHECK-NEXT: call.uni call_v4_i32, (param0); | |
| ; CHECK-NEXT: } // callseq 56 | |
| ; CHECK-NEXT: ret; | |
| %struct.rrir0 = insertvalue %struct.int4 poison, i32 %a, 0 | |
| %struct.rrir1 = insertvalue %struct.int4 %struct.rrir0, i32 %b, 1 | |
| %struct.rrir2 = insertvalue %struct.int4 %struct.rrir1, i32 3, 2 | |
| %struct.rrir3 = insertvalue %struct.int4 %struct.rrir2, i32 %d, 3 | |
| call void @call_v4_i32(%struct.int4 %struct.rrir3) | |
| ret void | |
| } | |
| define void @st_param_v4_i32_rrri(i32 %a, i32 %b, i32 %c) { | |
| ; CHECK-LABEL: st_param_v4_i32_rrri( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<4>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v4_i32_rrri_param_0]; | |
| ; CHECK-NEXT: ld.param.b32 %r2, [st_param_v4_i32_rrri_param_1]; | |
| ; CHECK-NEXT: ld.param.b32 %r3, [st_param_v4_i32_rrri_param_2]; | |
| ; CHECK-NEXT: { // callseq 57, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {%r1, %r2, %r3, 4}; | |
| ; CHECK-NEXT: call.uni call_v4_i32, (param0); | |
| ; CHECK-NEXT: } // callseq 57 | |
| ; CHECK-NEXT: ret; | |
| %struct.rrri0 = insertvalue %struct.int4 poison, i32 %a, 0 | |
| %struct.rrri1 = insertvalue %struct.int4 %struct.rrri0, i32 %b, 1 | |
| %struct.rrri2 = insertvalue %struct.int4 %struct.rrri1, i32 %c, 2 | |
| %struct.rrri3 = insertvalue %struct.int4 %struct.rrri2, i32 4, 3 | |
| call void @call_v4_i32(%struct.int4 %struct.rrri3) | |
| ret void | |
| } | |
| define void @st_param_v4_i32_iirr(i32 %c, i32 %d) { | |
| ; CHECK-LABEL: st_param_v4_i32_iirr( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<3>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v4_i32_iirr_param_0]; | |
| ; CHECK-NEXT: ld.param.b32 %r2, [st_param_v4_i32_iirr_param_1]; | |
| ; CHECK-NEXT: { // callseq 58, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {1, 2, %r1, %r2}; | |
| ; CHECK-NEXT: call.uni call_v4_i32, (param0); | |
| ; CHECK-NEXT: } // callseq 58 | |
| ; CHECK-NEXT: ret; | |
| %struct.iirr0 = insertvalue %struct.int4 poison, i32 1, 0 | |
| %struct.iirr1 = insertvalue %struct.int4 %struct.iirr0, i32 2, 1 | |
| %struct.iirr2 = insertvalue %struct.int4 %struct.iirr1, i32 %c, 2 | |
| %struct.iirr3 = insertvalue %struct.int4 %struct.iirr2, i32 %d, 3 | |
| call void @call_v4_i32(%struct.int4 %struct.iirr3) | |
| ret void | |
| } | |
| define void @st_param_v4_i32_irir(i32 %b, i32 %d) { | |
| ; CHECK-LABEL: st_param_v4_i32_irir( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<3>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v4_i32_irir_param_0]; | |
| ; CHECK-NEXT: ld.param.b32 %r2, [st_param_v4_i32_irir_param_1]; | |
| ; CHECK-NEXT: { // callseq 59, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {1, %r1, 3, %r2}; | |
| ; CHECK-NEXT: call.uni call_v4_i32, (param0); | |
| ; CHECK-NEXT: } // callseq 59 | |
| ; CHECK-NEXT: ret; | |
| %struct.irir0 = insertvalue %struct.int4 poison, i32 1, 0 | |
| %struct.irir1 = insertvalue %struct.int4 %struct.irir0, i32 %b, 1 | |
| %struct.irir2 = insertvalue %struct.int4 %struct.irir1, i32 3, 2 | |
| %struct.irir3 = insertvalue %struct.int4 %struct.irir2, i32 %d, 3 | |
| call void @call_v4_i32(%struct.int4 %struct.irir3) | |
| ret void | |
| } | |
| define void @st_param_v4_i32_irri(i32 %b, i32 %c) { | |
| ; CHECK-LABEL: st_param_v4_i32_irri( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<3>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v4_i32_irri_param_0]; | |
| ; CHECK-NEXT: ld.param.b32 %r2, [st_param_v4_i32_irri_param_1]; | |
| ; CHECK-NEXT: { // callseq 60, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {1, %r1, %r2, 4}; | |
| ; CHECK-NEXT: call.uni call_v4_i32, (param0); | |
| ; CHECK-NEXT: } // callseq 60 | |
| ; CHECK-NEXT: ret; | |
| %struct.irri0 = insertvalue %struct.int4 poison, i32 1, 0 | |
| %struct.irri1 = insertvalue %struct.int4 %struct.irri0, i32 %b, 1 | |
| %struct.irri2 = insertvalue %struct.int4 %struct.irri1, i32 %c, 2 | |
| %struct.irri3 = insertvalue %struct.int4 %struct.irri2, i32 4, 3 | |
| call void @call_v4_i32(%struct.int4 %struct.irri3) | |
| ret void | |
| } | |
| define void @st_param_v4_i32_riir(i32 %a, i32 %d) { | |
| ; CHECK-LABEL: st_param_v4_i32_riir( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<3>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v4_i32_riir_param_0]; | |
| ; CHECK-NEXT: ld.param.b32 %r2, [st_param_v4_i32_riir_param_1]; | |
| ; CHECK-NEXT: { // callseq 61, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {%r1, 2, 3, %r2}; | |
| ; CHECK-NEXT: call.uni call_v4_i32, (param0); | |
| ; CHECK-NEXT: } // callseq 61 | |
| ; CHECK-NEXT: ret; | |
| %struct.riir0 = insertvalue %struct.int4 poison, i32 %a, 0 | |
| %struct.riir1 = insertvalue %struct.int4 %struct.riir0, i32 2, 1 | |
| %struct.riir2 = insertvalue %struct.int4 %struct.riir1, i32 3, 2 | |
| %struct.riir3 = insertvalue %struct.int4 %struct.riir2, i32 %d, 3 | |
| call void @call_v4_i32(%struct.int4 %struct.riir3) | |
| ret void | |
| } | |
| define void @st_param_v4_i32_riri(i32 %a, i32 %c) { | |
| ; CHECK-LABEL: st_param_v4_i32_riri( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<3>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v4_i32_riri_param_0]; | |
| ; CHECK-NEXT: ld.param.b32 %r2, [st_param_v4_i32_riri_param_1]; | |
| ; CHECK-NEXT: { // callseq 62, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {%r1, 2, %r2, 4}; | |
| ; CHECK-NEXT: call.uni call_v4_i32, (param0); | |
| ; CHECK-NEXT: } // callseq 62 | |
| ; CHECK-NEXT: ret; | |
| %struct.riri0 = insertvalue %struct.int4 poison, i32 %a, 0 | |
| %struct.riri1 = insertvalue %struct.int4 %struct.riri0, i32 2, 1 | |
| %struct.riri2 = insertvalue %struct.int4 %struct.riri1, i32 %c, 2 | |
| %struct.riri3 = insertvalue %struct.int4 %struct.riri2, i32 4, 3 | |
| call void @call_v4_i32(%struct.int4 %struct.riri3) | |
| ret void | |
| } | |
| define void @st_param_v4_i32_rrii(i32 %a, i32 %b) { | |
| ; CHECK-LABEL: st_param_v4_i32_rrii( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<3>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v4_i32_rrii_param_0]; | |
| ; CHECK-NEXT: ld.param.b32 %r2, [st_param_v4_i32_rrii_param_1]; | |
| ; CHECK-NEXT: { // callseq 63, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {%r1, %r2, 3, 4}; | |
| ; CHECK-NEXT: call.uni call_v4_i32, (param0); | |
| ; CHECK-NEXT: } // callseq 63 | |
| ; CHECK-NEXT: ret; | |
| %struct.rrii0 = insertvalue %struct.int4 poison, i32 %a, 0 | |
| %struct.rrii1 = insertvalue %struct.int4 %struct.rrii0, i32 %b, 1 | |
| %struct.rrii2 = insertvalue %struct.int4 %struct.rrii1, i32 3, 2 | |
| %struct.rrii3 = insertvalue %struct.int4 %struct.rrii2, i32 4, 3 | |
| call void @call_v4_i32(%struct.int4 %struct.rrii3) | |
| ret void | |
| } | |
| define void @st_param_v4_i32_iiir(i32 %d) { | |
| ; CHECK-LABEL: st_param_v4_i32_iiir( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<2>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v4_i32_iiir_param_0]; | |
| ; CHECK-NEXT: { // callseq 64, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {1, 2, 3, %r1}; | |
| ; CHECK-NEXT: call.uni call_v4_i32, (param0); | |
| ; CHECK-NEXT: } // callseq 64 | |
| ; CHECK-NEXT: ret; | |
| %struct.iiir0 = insertvalue %struct.int4 poison, i32 1, 0 | |
| %struct.iiir1 = insertvalue %struct.int4 %struct.iiir0, i32 2, 1 | |
| %struct.iiir2 = insertvalue %struct.int4 %struct.iiir1, i32 3, 2 | |
| %struct.iiir3 = insertvalue %struct.int4 %struct.iiir2, i32 %d, 3 | |
| call void @call_v4_i32(%struct.int4 %struct.iiir3) | |
| ret void | |
| } | |
| define void @st_param_v4_i32_iiri(i32 %c) { | |
| ; CHECK-LABEL: st_param_v4_i32_iiri( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<2>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v4_i32_iiri_param_0]; | |
| ; CHECK-NEXT: { // callseq 65, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {1, 2, %r1, 4}; | |
| ; CHECK-NEXT: call.uni call_v4_i32, (param0); | |
| ; CHECK-NEXT: } // callseq 65 | |
| ; CHECK-NEXT: ret; | |
| %struct.iiri0 = insertvalue %struct.int4 poison, i32 1, 0 | |
| %struct.iiri1 = insertvalue %struct.int4 %struct.iiri0, i32 2, 1 | |
| %struct.iiri2 = insertvalue %struct.int4 %struct.iiri1, i32 %c, 2 | |
| %struct.iiri3 = insertvalue %struct.int4 %struct.iiri2, i32 4, 3 | |
| call void @call_v4_i32(%struct.int4 %struct.iiri3) | |
| ret void | |
| } | |
| define void @st_param_v4_i32_irii(i32 %b) { | |
| ; CHECK-LABEL: st_param_v4_i32_irii( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<2>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v4_i32_irii_param_0]; | |
| ; CHECK-NEXT: { // callseq 66, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {1, %r1, 3, 4}; | |
| ; CHECK-NEXT: call.uni call_v4_i32, (param0); | |
| ; CHECK-NEXT: } // callseq 66 | |
| ; CHECK-NEXT: ret; | |
| %struct.irii0 = insertvalue %struct.int4 poison, i32 1, 0 | |
| %struct.irii1 = insertvalue %struct.int4 %struct.irii0, i32 %b, 1 | |
| %struct.irii2 = insertvalue %struct.int4 %struct.irii1, i32 3, 2 | |
| %struct.irii3 = insertvalue %struct.int4 %struct.irii2, i32 4, 3 | |
| call void @call_v4_i32(%struct.int4 %struct.irii3) | |
| ret void | |
| } | |
| define void @st_param_v4_i32_riii(i32 %a) { | |
| ; CHECK-LABEL: st_param_v4_i32_riii( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<2>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v4_i32_riii_param_0]; | |
| ; CHECK-NEXT: { // callseq 67, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {%r1, 2, 3, 4}; | |
| ; CHECK-NEXT: call.uni call_v4_i32, (param0); | |
| ; CHECK-NEXT: } // callseq 67 | |
| ; CHECK-NEXT: ret; | |
| %struct.riii0 = insertvalue %struct.int4 poison, i32 %a, 0 | |
| %struct.riii1 = insertvalue %struct.int4 %struct.riii0, i32 2, 1 | |
| %struct.riii2 = insertvalue %struct.int4 %struct.riii1, i32 3, 2 | |
| %struct.riii3 = insertvalue %struct.int4 %struct.riii2, i32 4, 3 | |
| call void @call_v4_i32(%struct.int4 %struct.riii3) | |
| ret void | |
| } | |
| define void @st_param_v4_f32_iiii() { | |
| ; CHECK-LABEL: st_param_v4_f32_iiii( | |
| ; CHECK: { | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: { // callseq 68, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {0f3F800000, 0f40000000, 0f40400000, 0f40800000}; | |
| ; CHECK-NEXT: call.uni call_v4_f32, (param0); | |
| ; CHECK-NEXT: } // callseq 68 | |
| ; CHECK-NEXT: ret; | |
| call void @call_v4_f32(%struct.float4 { float 1.0, float 2.0, float 3.0, float 4.0 }) | |
| ret void | |
| } | |
| define void @st_param_v4_f32_irrr(float %b, float %c, float %d) { | |
| ; CHECK-LABEL: st_param_v4_f32_irrr( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<4>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v4_f32_irrr_param_0]; | |
| ; CHECK-NEXT: ld.param.b32 %r2, [st_param_v4_f32_irrr_param_1]; | |
| ; CHECK-NEXT: ld.param.b32 %r3, [st_param_v4_f32_irrr_param_2]; | |
| ; CHECK-NEXT: { // callseq 69, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {0f3F800000, %r1, %r2, %r3}; | |
| ; CHECK-NEXT: call.uni call_v4_f32, (param0); | |
| ; CHECK-NEXT: } // callseq 69 | |
| ; CHECK-NEXT: ret; | |
| %struct.irrr0 = insertvalue %struct.float4 poison, float 1.0, 0 | |
| %struct.irrr1 = insertvalue %struct.float4 %struct.irrr0, float %b, 1 | |
| %struct.irrr2 = insertvalue %struct.float4 %struct.irrr1, float %c, 2 | |
| %struct.irrr3 = insertvalue %struct.float4 %struct.irrr2, float %d, 3 | |
| call void @call_v4_f32(%struct.float4 %struct.irrr3) | |
| ret void | |
| } | |
| define void @st_param_v4_f32_rirr(float %a, float %c, float %d) { | |
| ; CHECK-LABEL: st_param_v4_f32_rirr( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<4>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v4_f32_rirr_param_0]; | |
| ; CHECK-NEXT: ld.param.b32 %r2, [st_param_v4_f32_rirr_param_1]; | |
| ; CHECK-NEXT: ld.param.b32 %r3, [st_param_v4_f32_rirr_param_2]; | |
| ; CHECK-NEXT: { // callseq 70, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {%r1, 0f40000000, %r2, %r3}; | |
| ; CHECK-NEXT: call.uni call_v4_f32, (param0); | |
| ; CHECK-NEXT: } // callseq 70 | |
| ; CHECK-NEXT: ret; | |
| %struct.rirr0 = insertvalue %struct.float4 poison, float %a, 0 | |
| %struct.rirr1 = insertvalue %struct.float4 %struct.rirr0, float 2.0, 1 | |
| %struct.rirr2 = insertvalue %struct.float4 %struct.rirr1, float %c, 2 | |
| %struct.rirr3 = insertvalue %struct.float4 %struct.rirr2, float %d, 3 | |
| call void @call_v4_f32(%struct.float4 %struct.rirr3) | |
| ret void | |
| } | |
| define void @st_param_v4_f32_rrir(float %a, float %b, float %d) { | |
| ; CHECK-LABEL: st_param_v4_f32_rrir( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<4>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v4_f32_rrir_param_0]; | |
| ; CHECK-NEXT: ld.param.b32 %r2, [st_param_v4_f32_rrir_param_1]; | |
| ; CHECK-NEXT: ld.param.b32 %r3, [st_param_v4_f32_rrir_param_2]; | |
| ; CHECK-NEXT: { // callseq 71, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {%r1, %r2, 0f40400000, %r3}; | |
| ; CHECK-NEXT: call.uni call_v4_f32, (param0); | |
| ; CHECK-NEXT: } // callseq 71 | |
| ; CHECK-NEXT: ret; | |
| %struct.rrir0 = insertvalue %struct.float4 poison, float %a, 0 | |
| %struct.rrir1 = insertvalue %struct.float4 %struct.rrir0, float %b, 1 | |
| %struct.rrir2 = insertvalue %struct.float4 %struct.rrir1, float 3.0, 2 | |
| %struct.rrir3 = insertvalue %struct.float4 %struct.rrir2, float %d, 3 | |
| call void @call_v4_f32(%struct.float4 %struct.rrir3) | |
| ret void | |
| } | |
| define void @st_param_v4_f32_rrri(float %a, float %b, float %c) { | |
| ; CHECK-LABEL: st_param_v4_f32_rrri( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<4>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v4_f32_rrri_param_0]; | |
| ; CHECK-NEXT: ld.param.b32 %r2, [st_param_v4_f32_rrri_param_1]; | |
| ; CHECK-NEXT: ld.param.b32 %r3, [st_param_v4_f32_rrri_param_2]; | |
| ; CHECK-NEXT: { // callseq 72, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {%r1, %r2, %r3, 0f40800000}; | |
| ; CHECK-NEXT: call.uni call_v4_f32, (param0); | |
| ; CHECK-NEXT: } // callseq 72 | |
| ; CHECK-NEXT: ret; | |
| %struct.rrri0 = insertvalue %struct.float4 poison, float %a, 0 | |
| %struct.rrri1 = insertvalue %struct.float4 %struct.rrri0, float %b, 1 | |
| %struct.rrri2 = insertvalue %struct.float4 %struct.rrri1, float %c, 2 | |
| %struct.rrri3 = insertvalue %struct.float4 %struct.rrri2, float 4.0, 3 | |
| call void @call_v4_f32(%struct.float4 %struct.rrri3) | |
| ret void | |
| } | |
| define void @st_param_v4_f32_iirr(float %c, float %d) { | |
| ; CHECK-LABEL: st_param_v4_f32_iirr( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<3>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v4_f32_iirr_param_0]; | |
| ; CHECK-NEXT: ld.param.b32 %r2, [st_param_v4_f32_iirr_param_1]; | |
| ; CHECK-NEXT: { // callseq 73, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {0f3F800000, 0f40000000, %r1, %r2}; | |
| ; CHECK-NEXT: call.uni call_v4_f32, (param0); | |
| ; CHECK-NEXT: } // callseq 73 | |
| ; CHECK-NEXT: ret; | |
| %struct.iirr0 = insertvalue %struct.float4 poison, float 1.0, 0 | |
| %struct.iirr1 = insertvalue %struct.float4 %struct.iirr0, float 2.0, 1 | |
| %struct.iirr2 = insertvalue %struct.float4 %struct.iirr1, float %c, 2 | |
| %struct.iirr3 = insertvalue %struct.float4 %struct.iirr2, float %d, 3 | |
| call void @call_v4_f32(%struct.float4 %struct.iirr3) | |
| ret void | |
| } | |
| define void @st_param_v4_f32_irir(float %b, float %d) { | |
| ; CHECK-LABEL: st_param_v4_f32_irir( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<3>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v4_f32_irir_param_0]; | |
| ; CHECK-NEXT: ld.param.b32 %r2, [st_param_v4_f32_irir_param_1]; | |
| ; CHECK-NEXT: { // callseq 74, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {0f3F800000, %r1, 0f40400000, %r2}; | |
| ; CHECK-NEXT: call.uni call_v4_f32, (param0); | |
| ; CHECK-NEXT: } // callseq 74 | |
| ; CHECK-NEXT: ret; | |
| %struct.irir0 = insertvalue %struct.float4 poison, float 1.0, 0 | |
| %struct.irir1 = insertvalue %struct.float4 %struct.irir0, float %b, 1 | |
| %struct.irir2 = insertvalue %struct.float4 %struct.irir1, float 3.0, 2 | |
| %struct.irir3 = insertvalue %struct.float4 %struct.irir2, float %d, 3 | |
| call void @call_v4_f32(%struct.float4 %struct.irir3) | |
| ret void | |
| } | |
| define void @st_param_v4_f32_irri(float %b, float %c) { | |
| ; CHECK-LABEL: st_param_v4_f32_irri( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<3>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v4_f32_irri_param_0]; | |
| ; CHECK-NEXT: ld.param.b32 %r2, [st_param_v4_f32_irri_param_1]; | |
| ; CHECK-NEXT: { // callseq 75, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {0f3F800000, %r1, %r2, 0f40800000}; | |
| ; CHECK-NEXT: call.uni call_v4_f32, (param0); | |
| ; CHECK-NEXT: } // callseq 75 | |
| ; CHECK-NEXT: ret; | |
| %struct.irri0 = insertvalue %struct.float4 poison, float 1.0, 0 | |
| %struct.irri1 = insertvalue %struct.float4 %struct.irri0, float %b, 1 | |
| %struct.irri2 = insertvalue %struct.float4 %struct.irri1, float %c, 2 | |
| %struct.irri3 = insertvalue %struct.float4 %struct.irri2, float 4.0, 3 | |
| call void @call_v4_f32(%struct.float4 %struct.irri3) | |
| ret void | |
| } | |
| define void @st_param_v4_f32_riir(float %a, float %d) { | |
| ; CHECK-LABEL: st_param_v4_f32_riir( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<3>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v4_f32_riir_param_0]; | |
| ; CHECK-NEXT: ld.param.b32 %r2, [st_param_v4_f32_riir_param_1]; | |
| ; CHECK-NEXT: { // callseq 76, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {%r1, 0f40000000, 0f40400000, %r2}; | |
| ; CHECK-NEXT: call.uni call_v4_f32, (param0); | |
| ; CHECK-NEXT: } // callseq 76 | |
| ; CHECK-NEXT: ret; | |
| %struct.riir0 = insertvalue %struct.float4 poison, float %a, 0 | |
| %struct.riir1 = insertvalue %struct.float4 %struct.riir0, float 2.0, 1 | |
| %struct.riir2 = insertvalue %struct.float4 %struct.riir1, float 3.0, 2 | |
| %struct.riir3 = insertvalue %struct.float4 %struct.riir2, float %d, 3 | |
| call void @call_v4_f32(%struct.float4 %struct.riir3) | |
| ret void | |
| } | |
| define void @st_param_v4_f32_riri(float %a, float %c) { | |
| ; CHECK-LABEL: st_param_v4_f32_riri( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<3>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v4_f32_riri_param_0]; | |
| ; CHECK-NEXT: ld.param.b32 %r2, [st_param_v4_f32_riri_param_1]; | |
| ; CHECK-NEXT: { // callseq 77, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {%r1, 0f40000000, %r2, 0f40800000}; | |
| ; CHECK-NEXT: call.uni call_v4_f32, (param0); | |
| ; CHECK-NEXT: } // callseq 77 | |
| ; CHECK-NEXT: ret; | |
| %struct.riri0 = insertvalue %struct.float4 poison, float %a, 0 | |
| %struct.riri1 = insertvalue %struct.float4 %struct.riri0, float 2.0, 1 | |
| %struct.riri2 = insertvalue %struct.float4 %struct.riri1, float %c, 2 | |
| %struct.riri3 = insertvalue %struct.float4 %struct.riri2, float 4.0, 3 | |
| call void @call_v4_f32(%struct.float4 %struct.riri3) | |
| ret void | |
| } | |
| define void @st_param_v4_f32_rrii(float %a, float %b) { | |
| ; CHECK-LABEL: st_param_v4_f32_rrii( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<3>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v4_f32_rrii_param_0]; | |
| ; CHECK-NEXT: ld.param.b32 %r2, [st_param_v4_f32_rrii_param_1]; | |
| ; CHECK-NEXT: { // callseq 78, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {%r1, %r2, 0f40400000, 0f40800000}; | |
| ; CHECK-NEXT: call.uni call_v4_f32, (param0); | |
| ; CHECK-NEXT: } // callseq 78 | |
| ; CHECK-NEXT: ret; | |
| %struct.rrii0 = insertvalue %struct.float4 poison, float %a, 0 | |
| %struct.rrii1 = insertvalue %struct.float4 %struct.rrii0, float %b, 1 | |
| %struct.rrii2 = insertvalue %struct.float4 %struct.rrii1, float 3.0, 2 | |
| %struct.rrii3 = insertvalue %struct.float4 %struct.rrii2, float 4.0, 3 | |
| call void @call_v4_f32(%struct.float4 %struct.rrii3) | |
| ret void | |
| } | |
| define void @st_param_v4_f32_iiir(float %d) { | |
| ; CHECK-LABEL: st_param_v4_f32_iiir( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<2>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v4_f32_iiir_param_0]; | |
| ; CHECK-NEXT: { // callseq 79, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {0f3F800000, 0f40000000, 0f40400000, %r1}; | |
| ; CHECK-NEXT: call.uni call_v4_f32, (param0); | |
| ; CHECK-NEXT: } // callseq 79 | |
| ; CHECK-NEXT: ret; | |
| %struct.iiir0 = insertvalue %struct.float4 poison, float 1.0, 0 | |
| %struct.iiir1 = insertvalue %struct.float4 %struct.iiir0, float 2.0, 1 | |
| %struct.iiir2 = insertvalue %struct.float4 %struct.iiir1, float 3.0, 2 | |
| %struct.iiir3 = insertvalue %struct.float4 %struct.iiir2, float %d, 3 | |
| call void @call_v4_f32(%struct.float4 %struct.iiir3) | |
| ret void | |
| } | |
| define void @st_param_v4_f32_iiri(float %c) { | |
| ; CHECK-LABEL: st_param_v4_f32_iiri( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<2>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v4_f32_iiri_param_0]; | |
| ; CHECK-NEXT: { // callseq 80, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {0f3F800000, 0f40000000, %r1, 0f40800000}; | |
| ; CHECK-NEXT: call.uni call_v4_f32, (param0); | |
| ; CHECK-NEXT: } // callseq 80 | |
| ; CHECK-NEXT: ret; | |
| %struct.iiri0 = insertvalue %struct.float4 poison, float 1.0, 0 | |
| %struct.iiri1 = insertvalue %struct.float4 %struct.iiri0, float 2.0, 1 | |
| %struct.iiri2 = insertvalue %struct.float4 %struct.iiri1, float %c, 2 | |
| %struct.iiri3 = insertvalue %struct.float4 %struct.iiri2, float 4.0, 3 | |
| call void @call_v4_f32(%struct.float4 %struct.iiri3) | |
| ret void | |
| } | |
| define void @st_param_v4_f32_irii(float %b) { | |
| ; CHECK-LABEL: st_param_v4_f32_irii( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<2>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v4_f32_irii_param_0]; | |
| ; CHECK-NEXT: { // callseq 81, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {0f3F800000, %r1, 0f40400000, 0f40800000}; | |
| ; CHECK-NEXT: call.uni call_v4_f32, (param0); | |
| ; CHECK-NEXT: } // callseq 81 | |
| ; CHECK-NEXT: ret; | |
| %struct.irii0 = insertvalue %struct.float4 poison, float 1.0, 0 | |
| %struct.irii1 = insertvalue %struct.float4 %struct.irii0, float %b, 1 | |
| %struct.irii2 = insertvalue %struct.float4 %struct.irii1, float 3.0, 2 | |
| %struct.irii3 = insertvalue %struct.float4 %struct.irii2, float 4.0, 3 | |
| call void @call_v4_f32(%struct.float4 %struct.irii3) | |
| ret void | |
| } | |
| define void @st_param_v4_f32_riii(float %a) { | |
| ; CHECK-LABEL: st_param_v4_f32_riii( | |
| ; CHECK: { | |
| ; CHECK-NEXT: .reg .b32 %r<2>; | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: ld.param.b32 %r1, [st_param_v4_f32_riii_param_0]; | |
| ; CHECK-NEXT: { // callseq 82, 0 | |
| ; CHECK-NEXT: .param .align 16 .b8 param0[16]; | |
| ; CHECK-NEXT: st.param.v4.b32 [param0], {%r1, 0f40000000, 0f40400000, 0f40800000}; | |
| ; CHECK-NEXT: call.uni call_v4_f32, (param0); | |
| ; CHECK-NEXT: } // callseq 82 | |
| ; CHECK-NEXT: ret; | |
| %struct.riii0 = insertvalue %struct.float4 poison, float %a, 0 | |
| %struct.riii1 = insertvalue %struct.float4 %struct.riii0, float 2.0, 1 | |
| %struct.riii2 = insertvalue %struct.float4 %struct.riii1, float 3.0, 2 | |
| %struct.riii3 = insertvalue %struct.float4 %struct.riii2, float 4.0, 3 | |
| call void @call_v4_f32(%struct.float4 %struct.riii3) | |
| ret void | |
| } | |
| declare void @call_v4_i8(%struct.char4 alignstack(4)) | |
| declare void @call_v4_i16(%struct.short4 alignstack(8)) | |
| declare void @call_v4_i32(%struct.int4 alignstack(16)) | |
| declare void @call_v4_f32(%struct.float4 alignstack(16)) | |
| define void @st_param_bfloat() { | |
| ; CHECK-LABEL: st_param_bfloat( | |
| ; CHECK: { | |
| ; CHECK-EMPTY: | |
| ; CHECK-NEXT: // %bb.0: | |
| ; CHECK-NEXT: { // callseq 83, 0 | |
| ; CHECK-NEXT: .param .align 2 .b8 param0[2]; | |
| ; CHECK-NEXT: st.param.b16 [param0], 0x4100; | |
| ; CHECK-NEXT: call.uni call_bfloat, (param0); | |
| ; CHECK-NEXT: } // callseq 83 | |
| ; CHECK-NEXT: ret; | |
| %five = bitcast i16 16640 to bfloat | |
| call void @call_bfloat(bfloat %five) | |
| ret void | |
| } | |
| declare void @call_bfloat(bfloat) |