Add a DynRex recipe type for x86, decreasing the number of recipes (#1298)
This patch adds a third mode for templates: REX inference is requestable at template instantiation time. This reduces the number of recipes by removing rex()/nonrex() redundancy for many instructions.
This commit is contained in:
@@ -15,7 +15,7 @@ ebb1:
|
||||
; sameln: function %br_icmp(i64 [%rdi]) fast {
|
||||
; nextln: ebb0(v0: i64):
|
||||
; nextln: [RexOp1pu_id#b8] v1 = iconst.i64 0
|
||||
; nextln: [RexOp1icscc#8039] v2 = icmp eq v0, v1
|
||||
; nextln: [DynRexOp1icscc#8039] v2 = icmp eq v0, v1
|
||||
; nextln: [RexOp1t8jccb#75] brnz v2, ebb1
|
||||
; nextln: [Op1jmpb#eb] jump ebb1
|
||||
; nextln:
|
||||
@@ -37,7 +37,7 @@ ebb1(v2: i64):
|
||||
; sameln: function %br_icmp_ebb_args(i64 [%rdi]) fast {
|
||||
; nextln: ebb0(v0: i64):
|
||||
; nextln: [RexOp1pu_id#b8] v1 = iconst.i64 0
|
||||
; nextln: [RexOp1icscc#8039] v3 = icmp eq v0, v1
|
||||
; nextln: [DynRexOp1icscc#8039] v3 = icmp eq v0, v1
|
||||
; nextln: [RexOp1t8jccb#75] brnz v3, ebb1(v0)
|
||||
; nextln: [Op1jmpb#eb] jump ebb1(v0)
|
||||
; nextln:
|
||||
|
||||
@@ -21,95 +21,95 @@ function u0:2691(i32 [%rdi], i32 [%rsi], i64 vmctx [%r14]) -> i64 uext [%rax] ba
|
||||
@0005 [-] fallthrough ebb3(v0, v1)
|
||||
|
||||
ebb3(v8: i32 [%rdi], v19: i32 [%rsi]):
|
||||
@0005 [RexOp1ldDisp8#808b,%rax] v7 = load.i64 v2+48
|
||||
@0005 [RexOp1rcmp_ib#f083,%rflags] v91 = ifcmp_imm v7, 0
|
||||
@0005 [trapif#00] trapif ne v91, interrupt
|
||||
[Op1umr#89,%rax] v105 = copy v8
|
||||
@000b [Op1r_ib#83,%rax] v10 = iadd_imm v105, 1
|
||||
v80 -> v10
|
||||
@0010 [Op1umr#89,%rcx] v92 = uextend.i64 v8
|
||||
@0010 [RexOp1ld#808b,%rdx] v93 = load.i64 notrap aligned readonly v2
|
||||
v95 -> v93
|
||||
@0010 [Op2ldWithIndex#4be,%rcx] v12 = sload8_complex.i32 v93+v92
|
||||
[Op1umr#89,%rbx] v106 = copy v12
|
||||
@0017 [Op1r_ib#40c1,%rbx] v14 = ishl_imm v106, 24
|
||||
@001a [Op1r_ib#70c1,%rbx] v16 = sshr_imm v14, 24
|
||||
[Op1umr#89,%rdi] v107 = copy v16
|
||||
@001f [Op1r_ib#83,%rdi] v18 = iadd_imm v107, 32
|
||||
[RexOp1umr#89,%r8] v108 = copy v19
|
||||
@0026 [RexOp1r_ib#83,%r8] v21 = iadd_imm v108, 1
|
||||
v82 -> v21
|
||||
@002b [Op1umr#89,%rsi] v94 = uextend.i64 v19
|
||||
@002b [Op2ldWithIndex#4be,%rdx] v23 = sload8_complex.i32 v93+v94
|
||||
v55 -> v23
|
||||
[Op1umr#89,%rsi] v109 = copy v23
|
||||
@0032 [Op1r_ib#40c1,%rsi] v25 = ishl_imm v109, 24
|
||||
@0035 [Op1r_ib#70c1,%rsi] v27 = sshr_imm v25, 24
|
||||
v69 -> v27
|
||||
[RexOp1umr#89,%r9] v110 = copy v27
|
||||
@003a [RexOp1r_ib#83,%r9] v29 = iadd_imm v110, 32
|
||||
v68 -> v29
|
||||
@0042 [Op1r_ib#83,%rcx] v31 = iadd_imm v12, -65
|
||||
@0045 [Op1r_ib#40c1,%rcx] v33 = ishl_imm v31, 24
|
||||
@0048 [Op1r_ib#70c1,%rcx] v35 = sshr_imm v33, 24
|
||||
@004c [Op1r_id#4081,%rcx] v37 = band_imm v35, 255
|
||||
[Op1rcmp_ib#7083,%rflags] v97 = ifcmp_imm v37, 26
|
||||
@0050 [Op1brib#70] brif sge v97, ebb6
|
||||
@0050 [-] fallthrough ebb10
|
||||
@0005 [RexOp1ldDisp8#808b,%rax] v7 = load.i64 v2+48
|
||||
@0005 [DynRexOp1rcmp_ib#f083,%rflags] v91 = ifcmp_imm v7, 0
|
||||
@0005 [trapif#00] trapif ne v91, interrupt
|
||||
[DynRexOp1umr#89,%rax] v105 = copy v8
|
||||
@000b [DynRexOp1r_ib#83,%rax] v10 = iadd_imm v105, 1
|
||||
v80 -> v10
|
||||
@0010 [Op1umr#89,%rcx] v92 = uextend.i64 v8
|
||||
@0010 [RexOp1ld#808b,%rdx] v93 = load.i64 notrap aligned readonly v2
|
||||
v95 -> v93
|
||||
@0010 [Op2ldWithIndex#4be,%rcx] v12 = sload8_complex.i32 v93+v92
|
||||
[DynRexOp1umr#89,%rbx] v106 = copy v12
|
||||
@0017 [DynRexOp1r_ib#40c1,%rbx] v14 = ishl_imm v106, 24
|
||||
@001a [DynRexOp1r_ib#70c1,%rbx] v16 = sshr_imm v14, 24
|
||||
[DynRexOp1umr#89,%rdi] v107 = copy v16
|
||||
@001f [DynRexOp1r_ib#83,%rdi] v18 = iadd_imm v107, 32
|
||||
[DynRexOp1umr#89,%r8] v108 = copy v19
|
||||
@0026 [DynRexOp1r_ib#83,%r8] v21 = iadd_imm v108, 1
|
||||
v82 -> v21
|
||||
@002b [Op1umr#89,%rsi] v94 = uextend.i64 v19
|
||||
@002b [Op2ldWithIndex#4be,%rdx] v23 = sload8_complex.i32 v93+v94
|
||||
v55 -> v23
|
||||
[DynRexOp1umr#89,%rsi] v109 = copy v23
|
||||
@0032 [DynRexOp1r_ib#40c1,%rsi] v25 = ishl_imm v109, 24
|
||||
@0035 [DynRexOp1r_ib#70c1,%rsi] v27 = sshr_imm v25, 24
|
||||
v69 -> v27
|
||||
[DynRexOp1umr#89,%r9] v110 = copy v27
|
||||
@003a [DynRexOp1r_ib#83,%r9] v29 = iadd_imm v110, 32
|
||||
v68 -> v29
|
||||
@0042 [DynRexOp1r_ib#83,%rcx] v31 = iadd_imm v12, -65
|
||||
@0045 [DynRexOp1r_ib#40c1,%rcx] v33 = ishl_imm v31, 24
|
||||
@0048 [DynRexOp1r_ib#70c1,%rcx] v35 = sshr_imm v33, 24
|
||||
@004c [DynRexOp1r_id#4081,%rcx] v37 = band_imm v35, 255
|
||||
[DynRexOp1rcmp_ib#7083,%rflags] v97 = ifcmp_imm v37, 26
|
||||
@0050 [Op1brib#70] brif sge v97, ebb6
|
||||
@0050 [-] fallthrough ebb10
|
||||
|
||||
ebb10:
|
||||
[Op1umr#89,%rcx] v101 = copy v18
|
||||
[DynRexOp1umr#89,%rcx] v101 = copy v18
|
||||
@0054 [Op1jmpb#eb] jump ebb5(v18, v101)
|
||||
|
||||
ebb6:
|
||||
[Op1umr#89,%rcx] v102 = copy.i32 v16
|
||||
[DynRexOp1umr#89,%rcx] v102 = copy.i32 v16
|
||||
@0059 [RexOp1rmov#89] regmove v102, %rcx -> %rdi
|
||||
@0059 [RexOp1rmov#89] regmove.i32 v16, %rbx -> %rcx
|
||||
@0059 [-] fallthrough ebb5(v102, v16)
|
||||
|
||||
ebb5(v41: i32 [%rdi], v84: i32 [%rcx]):
|
||||
v83 -> v84
|
||||
@005d [Op1r_id#4081,%rdi] v43 = band_imm v41, 255
|
||||
@0062 [Op1r_ib#40c1,%rdi] v45 = ishl_imm v43, 24
|
||||
@005d [DynRexOp1r_id#4081,%rdi] v43 = band_imm v41, 255
|
||||
@0062 [DynRexOp1r_ib#40c1,%rdi] v45 = ishl_imm v43, 24
|
||||
v52 -> v45
|
||||
@0065 [RexOp1rmov#89] regmove v45, %rdi -> %rbx
|
||||
@0065 [Op1r_ib#70c1,%rbx] v47 = sshr_imm v45, 24
|
||||
@0065 [DynRexOp1r_ib#70c1,%rbx] v47 = sshr_imm v45, 24
|
||||
v54 -> v47
|
||||
@0068 [RexOp1rmov#89] regmove v47, %rbx -> %rdi
|
||||
@0068 [Op1icscc_ib#7083,%rbx] v49 = icmp_imm ne v47, 0
|
||||
@0068 [DynRexOp1icscc_ib#7083,%rbx] v49 = icmp_imm ne v47, 0
|
||||
@0068 [RexOp2urm_noflags#4b6,%r10] v50 = bint.i32 v49
|
||||
@0076 [Op1r_ib#83,%rdx] v57 = iadd_imm.i32 v23, -65
|
||||
@0079 [Op1r_ib#40c1,%rdx] v59 = ishl_imm v57, 24
|
||||
@007c [Op1r_ib#70c1,%rdx] v61 = sshr_imm v59, 24
|
||||
@0080 [Op1r_id#4081,%rdx] v63 = band_imm v61, 255
|
||||
[Op1rcmp_ib#7083,%rflags] v98 = ifcmp_imm v63, 26
|
||||
@0076 [DynRexOp1r_ib#83,%rdx] v57 = iadd_imm.i32 v23, -65
|
||||
@0079 [DynRexOp1r_ib#40c1,%rdx] v59 = ishl_imm v57, 24
|
||||
@007c [DynRexOp1r_ib#70c1,%rdx] v61 = sshr_imm v59, 24
|
||||
@0080 [DynRexOp1r_id#4081,%rdx] v63 = band_imm v61, 255
|
||||
[DynRexOp1rcmp_ib#7083,%rflags] v98 = ifcmp_imm v63, 26
|
||||
@0084 [RexOp1rmov#89] regmove v47, %rdi -> %rbx
|
||||
@0084 [Op1brib#70] brif sge v98, ebb8
|
||||
@0084 [-] fallthrough ebb11
|
||||
|
||||
ebb11:
|
||||
[RexOp1umr#89,%rdx] v103 = copy.i32 v29
|
||||
[DynRexOp1umr#89,%rdx] v103 = copy.i32 v29
|
||||
@0088 [Op1jmpb#eb] jump ebb7(v29, v10, v21, v103)
|
||||
|
||||
ebb8:
|
||||
[Op1umr#89,%rdx] v104 = copy.i32 v27
|
||||
[DynRexOp1umr#89,%rdx] v104 = copy.i32 v27
|
||||
@008d [RexOp1rmov#89] regmove v104, %rdx -> %r9
|
||||
@008d [RexOp1rmov#89] regmove.i32 v27, %rsi -> %rdx
|
||||
@008d [-] fallthrough ebb7(v104, v10, v21, v27)
|
||||
|
||||
ebb7(v67: i32 [%r9], v79: i32 [%rax], v81: i32 [%r8], v87: i32 [%rdx]):
|
||||
@0091 [RexOp1r_id#4081,%r9] v71 = band_imm v67, 255
|
||||
@0094 [RexOp1r_ib#40c1,%r9] v73 = ishl_imm v71, 24
|
||||
@0097 [RexOp1r_ib#70c1,%r9] v75 = sshr_imm v73, 24
|
||||
@0098 [RexOp1icscc#39,%rbx] v76 = icmp.i32 eq v47, v75
|
||||
@0098 [Op2urm_noflags_abcd#4b6,%rbx] v77 = bint.i32 v76
|
||||
@0099 [RexOp1rr#21,%r10] v78 = band.i32 v50, v77
|
||||
@009a [RexOp1tjccb#74] brz v78, ebb9
|
||||
@009a [-] fallthrough ebb12
|
||||
@0091 [DynRexOp1r_id#4081,%r9] v71 = band_imm v67, 255
|
||||
@0094 [DynRexOp1r_ib#40c1,%r9] v73 = ishl_imm v71, 24
|
||||
@0097 [DynRexOp1r_ib#70c1,%r9] v75 = sshr_imm v73, 24
|
||||
@0098 [DynRexOp1icscc#39,%rbx] v76 = icmp.i32 eq v47, v75
|
||||
@0098 [Op2urm_noflags_abcd#4b6,%rbx] v77 = bint.i32 v76
|
||||
@0099 [DynRexOp1rr#21,%r10] v78 = band.i32 v50, v77
|
||||
@009a [DynRexOp1tjccb#74] brz v78, ebb9
|
||||
@009a [-] fallthrough ebb12
|
||||
|
||||
ebb12:
|
||||
[RexOp1umr#89,%rcx] v99 = copy v81
|
||||
[Op1umr#89,%rdx] v100 = copy v79
|
||||
[DynRexOp1umr#89,%rcx] v99 = copy v81
|
||||
[DynRexOp1umr#89,%rdx] v100 = copy v79
|
||||
@00a4 [RexOp1rmov#89] regmove v100, %rdx -> %rdi
|
||||
@00a4 [RexOp1rmov#89] regmove v99, %rcx -> %rsi
|
||||
@00a4 [Op1jmpd#e9] jump ebb3(v100, v99); bin: e9 ffffff2d
|
||||
@@ -118,9 +118,9 @@ function u0:2691(i32 [%rdi], i32 [%rsi], i64 vmctx [%r14]) -> i64 uext [%rax] ba
|
||||
@00a7 [-] fallthrough ebb4
|
||||
|
||||
ebb4:
|
||||
@00ad [Op1r_id#4081,%rcx] v86 = band_imm.i32 v84, 255
|
||||
@00b3 [Op1r_id#4081,%rdx] v89 = band_imm.i32 v87, 255
|
||||
@00b4 [Op1rr#29,%rcx] v90 = isub v86, v89
|
||||
@00ad [DynRexOp1r_id#4081,%rcx] v86 = band_imm.i32 v84, 255
|
||||
@00b3 [DynRexOp1r_id#4081,%rdx] v89 = band_imm.i32 v87, 255
|
||||
@00b4 [DynRexOp1rr#29,%rcx] v90 = isub v86, v89
|
||||
@00b5 [-] fallthrough ebb2(v90)
|
||||
|
||||
ebb2(v5: i32 [%rcx]):
|
||||
|
||||
@@ -4,7 +4,7 @@ target x86_64
|
||||
|
||||
function %test_multiple_uses(i32 [%rdi]) -> i32 {
|
||||
ebb0(v0: i32 [%rdi]):
|
||||
[Op1rcmp_ib#7083,%rflags] v3 = ifcmp_imm v0, 0
|
||||
[DynRexOp1rcmp_ib#7083,%rflags] v3 = ifcmp_imm v0, 0
|
||||
[Op2seti_abcd#490,%rax] v1 = trueif eq v3
|
||||
[RexOp2urm_noflags#4b6,%rax] v2 = bint.i32 v1
|
||||
[Op1brib#70] brif eq v3, ebb1
|
||||
|
||||
@@ -5,9 +5,9 @@ target i686
|
||||
|
||||
function %br_icmp(i32, i32) -> i32 {
|
||||
ebb0(v0: i32, v1: i32):
|
||||
[Op1icscc#39,%rdx] v2 = icmp slt v0, v1
|
||||
[Op1t8jccd_long#85] brnz v2, ebb1
|
||||
[Op1jmpb#eb] jump ebb2
|
||||
[DynRexOp1icscc#39,%rdx] v2 = icmp slt v0, v1
|
||||
[Op1t8jccd_long#85] brnz v2, ebb1
|
||||
[Op1jmpb#eb] jump ebb2
|
||||
|
||||
ebb2:
|
||||
[Op1ret#c3] return v1
|
||||
@@ -35,9 +35,9 @@ ebb1:
|
||||
|
||||
function %br_icmp_inverse(i32, i32) -> i32 {
|
||||
ebb0(v0: i32, v1: i32):
|
||||
[Op1icscc#39,%rdx] v2 = icmp slt v0, v1
|
||||
[Op1t8jccd_long#84] brz v2, ebb1
|
||||
[Op1jmpb#eb] jump ebb2
|
||||
[DynRexOp1icscc#39,%rdx] v2 = icmp slt v0, v1
|
||||
[Op1t8jccd_long#84] brz v2, ebb1
|
||||
[Op1jmpb#eb] jump ebb2
|
||||
|
||||
ebb2:
|
||||
[Op1ret#c3] return v1
|
||||
@@ -65,9 +65,9 @@ ebb1:
|
||||
|
||||
function %br_icmp_imm(i32, i32) -> i32 {
|
||||
ebb0(v0: i32, v1: i32):
|
||||
[Op1icscc_ib#7083] v2 = icmp_imm slt v0, 2
|
||||
[Op1t8jccd_long#84] brz v2, ebb1
|
||||
[Op1jmpb#eb] jump ebb2
|
||||
[DynRexOp1icscc_ib#7083] v2 = icmp_imm slt v0, 2
|
||||
[Op1t8jccd_long#84] brz v2, ebb1
|
||||
[Op1jmpb#eb] jump ebb2
|
||||
|
||||
ebb2:
|
||||
[Op1ret#c3] return v1
|
||||
|
||||
@@ -3,7 +3,7 @@ target x86_64
|
||||
|
||||
function %dual_loads(i64, i64) -> i64 {
|
||||
ebb0(v0: i64, v1: i64):
|
||||
[RexOp1rr#8001] v3 = iadd v0, v1
|
||||
[DynRexOp1rr#8001] v3 = iadd v0, v1
|
||||
v4 = load.i64 v3
|
||||
v5 = uload8.i64 v3
|
||||
v6 = sload8.i64 v3
|
||||
@@ -29,7 +29,7 @@ ebb0(v0: i64, v1: i64):
|
||||
|
||||
function %dual_loads2(i64, i64) -> i64 {
|
||||
ebb0(v0: i64, v1: i64):
|
||||
[RexOp1rr#8001] v3 = iadd v0, v1
|
||||
[DynRexOp1rr#8001] v3 = iadd v0, v1
|
||||
v4 = load.i64 v3+1
|
||||
v5 = uload8.i64 v3+1
|
||||
v6 = sload8.i64 v3+1
|
||||
@@ -55,7 +55,7 @@ ebb0(v0: i64, v1: i64):
|
||||
|
||||
function %dual_stores(i64, i64, i64) {
|
||||
ebb0(v0: i64, v1: i64, v2: i64):
|
||||
[RexOp1rr#8001] v3 = iadd v0, v1
|
||||
[DynRexOp1rr#8001] v3 = iadd v0, v1
|
||||
[RexOp1st#8089] store.i64 v2, v3
|
||||
[RexOp1st#88] istore8.i64 v2, v3
|
||||
[RexMp1st#189] istore16.i64 v2, v3
|
||||
@@ -75,7 +75,7 @@ ebb0(v0: i64, v1: i64, v2: i64):
|
||||
|
||||
function %dual_stores2(i64, i64, i64) {
|
||||
ebb0(v0: i64, v1: i64, v2: i64):
|
||||
[RexOp1rr#8001] v3 = iadd v0, v1
|
||||
[DynRexOp1rr#8001] v3 = iadd v0, v1
|
||||
[RexOp1stDisp8#8089] store.i64 v2, v3+1
|
||||
[RexOp1stDisp8#88] istore8.i64 v2, v3+1
|
||||
[RexMp1stDisp8#189] istore16.i64 v2, v3+1
|
||||
|
||||
@@ -8,7 +8,7 @@ function %pr227(i32 [%rdi], i32 [%rsi], i32 [%rdx], i32 [%rcx], i64 vmctx [%r8])
|
||||
ebb0(v0: i32, v1: i32, v2: i32, v3: i32, v4: i64):
|
||||
[RexOp1pu_id#b8] v5 = iconst.i32 0
|
||||
[RexOp1pu_id#b8] v6 = iconst.i32 0
|
||||
[RexOp1tjccb#74] brz v6, ebb10
|
||||
[DynRexOp1tjccb#74] brz v6, ebb10
|
||||
[Op1jmpb#eb] jump ebb3(v5, v5, v5, v5, v5, v5, v0, v1, v2, v3)
|
||||
|
||||
ebb3(v15: i32, v17: i32, v25: i32, v31: i32, v40: i32, v47: i32, v54: i32, v61: i32, v68: i32, v75: i32):
|
||||
@@ -16,33 +16,33 @@ function %pr227(i32 [%rdi], i32 [%rsi], i32 [%rdx], i32 [%rcx], i64 vmctx [%r8])
|
||||
|
||||
ebb6:
|
||||
[RexOp1pu_id#b8] v8 = iconst.i32 0
|
||||
[RexOp1tjccb#75] brnz v8, ebb5
|
||||
[DynRexOp1tjccb#75] brnz v8, ebb5
|
||||
[Op1jmpb#eb] jump ebb20
|
||||
|
||||
ebb20:
|
||||
[RexOp1pu_id#b8] v9 = iconst.i32 0
|
||||
[RexOp1pu_id#b8] v11 = iconst.i32 0
|
||||
[RexOp1icscc#39] v12 = icmp.i32 eq v15, v11
|
||||
[DynRexOp1icscc#39] v12 = icmp.i32 eq v15, v11
|
||||
[RexOp2urm_noflags#4b6] v13 = bint.i32 v12
|
||||
[RexOp1rr#21] v14 = band v9, v13
|
||||
[RexOp1tjccb#75] brnz v14, ebb6
|
||||
[DynRexOp1rr#21] v14 = band v9, v13
|
||||
[DynRexOp1tjccb#75] brnz v14, ebb6
|
||||
[Op1jmpb#eb] jump ebb7
|
||||
|
||||
ebb7:
|
||||
[RexOp1tjccb#74] brz.i32 v17, ebb8
|
||||
[DynRexOp1tjccb#74] brz.i32 v17, ebb8
|
||||
[Op1jmpb#eb] jump ebb17
|
||||
|
||||
ebb17:
|
||||
[RexOp1pu_id#b8] v18 = iconst.i32 0
|
||||
[RexOp1tjccb#74] brz v18, ebb9
|
||||
[DynRexOp1tjccb#74] brz v18, ebb9
|
||||
[Op1jmpb#eb] jump ebb16
|
||||
|
||||
ebb16:
|
||||
[RexOp1pu_id#b8] v21 = iconst.i32 0
|
||||
[RexOp1umr#89] v79 = uextend.i64 v5
|
||||
[RexOp1r_ib#8083] v80 = iadd_imm.i64 v4, 0
|
||||
[DynRexOp1r_ib#8083] v80 = iadd_imm.i64 v4, 0
|
||||
[RexOp1ld#808b] v81 = load.i64 v80
|
||||
[RexOp1rr#8001] v22 = iadd v81, v79
|
||||
[DynRexOp1rr#8001] v22 = iadd v81, v79
|
||||
[RexMp1st#189] istore16 v21, v22
|
||||
[Op1jmpb#eb] jump ebb9
|
||||
|
||||
@@ -52,8 +52,8 @@ function %pr227(i32 [%rdi], i32 [%rsi], i32 [%rdx], i32 [%rcx], i64 vmctx [%r8])
|
||||
ebb8:
|
||||
[RexOp1pu_id#b8] v27 = iconst.i32 3
|
||||
[RexOp1pu_id#b8] v28 = iconst.i32 4
|
||||
[RexOp1rr#09] v35 = bor.i32 v31, v13
|
||||
[RexOp1tjccb#75] brnz v35, ebb15(v27)
|
||||
[DynRexOp1rr#09] v35 = bor.i32 v31, v13
|
||||
[DynRexOp1tjccb#75] brnz v35, ebb15(v27)
|
||||
[Op1jmpb#eb] jump ebb15(v28)
|
||||
|
||||
ebb15(v36: i32):
|
||||
@@ -71,24 +71,24 @@ function %pr227(i32 [%rdi], i32 [%rsi], i32 [%rdx], i32 [%rcx], i64 vmctx [%r8])
|
||||
|
||||
ebb2(v7: i32, v45: i32, v52: i32, v59: i32, v66: i32, v73: i32):
|
||||
[RexOp1pu_id#b8] v44 = iconst.i32 0
|
||||
[RexOp1tjccb#74] brz v44, ebb12
|
||||
[DynRexOp1tjccb#74] brz v44, ebb12
|
||||
[Op1jmpb#eb] jump ebb18
|
||||
|
||||
ebb18:
|
||||
[RexOp1pu_id#b8] v50 = iconst.i32 11
|
||||
[RexOp1tjccb#74] brz v50, ebb14
|
||||
[DynRexOp1tjccb#74] brz v50, ebb14
|
||||
[Op1jmpb#eb] jump ebb19
|
||||
|
||||
ebb19:
|
||||
[RexOp1umr#89] v82 = uextend.i64 v52
|
||||
[RexOp1r_ib#8083] v83 = iadd_imm.i64 v4, 0
|
||||
[DynRexOp1r_ib#8083] v83 = iadd_imm.i64 v4, 0
|
||||
[RexOp1ld#808b] v84 = load.i64 v83
|
||||
[RexOp1rr#8001] v57 = iadd v84, v82
|
||||
[DynRexOp1rr#8001] v57 = iadd v84, v82
|
||||
[RexOp1ld#8b] v58 = load.i32 v57
|
||||
[RexOp1umr#89] v85 = uextend.i64 v58
|
||||
[RexOp1r_ib#8083] v86 = iadd_imm.i64 v4, 0
|
||||
[DynRexOp1r_ib#8083] v86 = iadd_imm.i64 v4, 0
|
||||
[RexOp1ld#808b] v87 = load.i64 v86
|
||||
[RexOp1rr#8001] v64 = iadd v87, v85
|
||||
[DynRexOp1rr#8001] v64 = iadd v87, v85
|
||||
[RexOp1st#88] istore8 v59, v64
|
||||
[RexOp1pu_id#b8] v65 = iconst.i32 0
|
||||
[Op1jmpb#eb] jump ebb13(v65)
|
||||
@@ -98,9 +98,9 @@ function %pr227(i32 [%rdi], i32 [%rsi], i32 [%rdx], i32 [%rcx], i64 vmctx [%r8])
|
||||
|
||||
ebb13(v51: i32):
|
||||
[RexOp1umr#89] v88 = uextend.i64 v45
|
||||
[RexOp1r_ib#8083] v89 = iadd_imm.i64 v4, 0
|
||||
[DynRexOp1r_ib#8083] v89 = iadd_imm.i64 v4, 0
|
||||
[RexOp1ld#808b] v90 = load.i64 v89
|
||||
[RexOp1rr#8001] v71 = iadd v90, v88
|
||||
[DynRexOp1rr#8001] v71 = iadd v90, v88
|
||||
[RexOp1st#89] store v51, v71
|
||||
[Op1jmpb#eb] jump ebb12
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ target i686
|
||||
; Simple, correct use of CPU flags.
|
||||
function %simple(i32) -> i32 {
|
||||
ebb0(v0: i32):
|
||||
[Op1rcmp#39] v1 = ifcmp v0, v0
|
||||
[DynRexOp1rcmp#39] v1 = ifcmp v0, v0
|
||||
[Op2seti_abcd#490] v2 = trueif ugt v1
|
||||
[Op2urm_noflags_abcd#4b6] v3 = bint.i32 v2
|
||||
[Op1ret#c3] return v3
|
||||
@@ -13,7 +13,7 @@ function %simple(i32) -> i32 {
|
||||
; Overlapping flag values of different types.
|
||||
function %overlap(i32, f32) -> i32 {
|
||||
ebb0(v0: i32, v1: f32):
|
||||
[Op1rcmp#39] v2 = ifcmp v0, v0
|
||||
[DynRexOp1rcmp#39] v2 = ifcmp v0, v0
|
||||
[Op2fcmp#42e] v3 = ffcmp v1, v1
|
||||
[Op2setf_abcd#490] v4 = trueff gt v3 ; error: conflicting live CPU flags: v2 and v3
|
||||
[Op2seti_abcd#490] v5 = trueif ugt v2
|
||||
@@ -25,8 +25,8 @@ function %overlap(i32, f32) -> i32 {
|
||||
; CPU flags clobbered by arithmetic.
|
||||
function %clobbered(i32) -> i32 {
|
||||
ebb0(v0: i32):
|
||||
[Op1rcmp#39] v1 = ifcmp v0, v0
|
||||
[Op1rr#01] v2 = iadd v0, v0 ; error: encoding clobbers live CPU flags in v1
|
||||
[DynRexOp1rcmp#39] v1 = ifcmp v0, v0
|
||||
[DynRexOp1rr#01] v2 = iadd v0, v0 ; error: encoding clobbers live CPU flags in v1
|
||||
[Op2seti_abcd#490] v3 = trueif ugt v1
|
||||
[Op2urm_noflags_abcd#4b6] v4 = bint.i32 v3
|
||||
[Op1ret#c3] return v4
|
||||
@@ -35,7 +35,7 @@ function %clobbered(i32) -> i32 {
|
||||
; CPU flags not clobbered by load.
|
||||
function %live_across_load(i32) -> i32 {
|
||||
ebb0(v0: i32):
|
||||
[Op1rcmp#39] v1 = ifcmp v0, v0
|
||||
[DynRexOp1rcmp#39] v1 = ifcmp v0, v0
|
||||
[Op1ld#8b] v2 = load.i32 v0
|
||||
[Op2seti_abcd#490] v3 = trueif ugt v1
|
||||
[Op2urm_noflags_abcd#4b6] v4 = bint.i32 v3
|
||||
@@ -45,7 +45,7 @@ function %live_across_load(i32) -> i32 {
|
||||
; Correct use of CPU flags across EBB.
|
||||
function %live_across_ebb(i32) -> i32 {
|
||||
ebb0(v0: i32):
|
||||
[Op1rcmp#39] v1 = ifcmp v0, v0
|
||||
[DynRexOp1rcmp#39] v1 = ifcmp v0, v0
|
||||
[Op1jmpb#eb] jump ebb1
|
||||
ebb1:
|
||||
[Op2seti_abcd#490] v2 = trueif ugt v1
|
||||
@@ -61,14 +61,14 @@ function %live_across_ebb_backwards(i32) -> i32 {
|
||||
[Op2urm_noflags_abcd#4b6] v3 = bint.i32 v2
|
||||
[Op1ret#c3] return v3
|
||||
ebb2:
|
||||
[Op1rcmp#39] v1 = ifcmp v0, v0
|
||||
[DynRexOp1rcmp#39] v1 = ifcmp v0, v0
|
||||
[Op1jmpb#eb] jump ebb1
|
||||
}
|
||||
|
||||
; Flags live into loop.
|
||||
function %live_into_loop(i32) -> i32 {
|
||||
ebb0(v0: i32):
|
||||
[Op1rcmp#39] v1 = ifcmp v0, v0
|
||||
[DynRexOp1rcmp#39] v1 = ifcmp v0, v0
|
||||
[Op1jmpb#eb] jump ebb1
|
||||
ebb1:
|
||||
[Op2seti_abcd#490] v2 = trueif ugt v1
|
||||
|
||||
Reference in New Issue
Block a user