Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 ; Tests various aspects of i1 related lowering. | |
| 2 | |
| 3 ; RUN: %llvm2ice -O2 --verbose none %s \ | |
| 4 ; RUN: | llvm-mc -triple=i686-none-nacl -x86-asm-syntax=intel -filetype=obj \ | |
| 5 ; RUN: | llvm-objdump -d --symbolize -x86-asm-syntax=intel - | FileCheck %s | |
| 6 ; RUN: %llvm2ice -Om1 --verbose none %s \ | |
| 7 ; RUN: | llvm-mc -triple=i686-none-nacl -x86-asm-syntax=intel -filetype=obj \ | |
| 8 ; RUN: | llvm-objdump -d --symbolize -x86-asm-syntax=intel - | FileCheck %s | |
| 9 ; RUN: %llvm2ice --verbose none %s | FileCheck --check-prefix=ERRORS %s | |
| 10 ; RUN: %llvm2iceinsts %s | %szdiff %s | FileCheck --check-prefix=DUMP %s | |
| 11 ; RUN: %llvm2iceinsts --pnacl %s | %szdiff %s \ | |
| 12 ; RUN: | FileCheck --check-prefix=DUMP %s | |
| 13 | |
| 14 ; Test that xor with true uses immediate 1, not -1. | |
| 15 define internal i32 @testXorTrue(i32 %arg) { | |
| 16 entry: | |
| 17 %arg_i1 = trunc i32 %arg to i1 | |
| 18 %result_i1 = xor i1 %arg_i1, true | |
| 19 %result = zext i1 %result_i1 to i32 | |
| 20 ret i32 %result | |
| 21 } | |
| 22 ; CHECK-LABEL: testXorTrue | |
| 23 ; CHECK: xor {{.*}}, 1 | |
| 24 | |
| 25 ; Test that trunc to i1 masks correctly. | |
| 26 define internal i32 @testTrunc(i32 %arg) { | |
| 27 entry: | |
| 28 %arg_i1 = trunc i32 %arg to i1 | |
| 29 %result = zext i1 %arg_i1 to i32 | |
| 30 ret i32 %result | |
| 31 } | |
| 32 ; CHECK-LABEL: testTrunc | |
| 33 ; CHECK: and {{.*}}, 1 | |
| 34 | |
| 35 ; Test zext to i8. | |
| 36 define internal i32 @testZextI8(i32 %arg) { | |
| 37 entry: | |
| 38 %arg_i1 = trunc i32 %arg to i1 | |
| 39 %result_i8 = zext i1 %arg_i1 to i8 | |
| 40 %result = zext i8 %result_i8 to i32 | |
| 41 ret i32 %result | |
| 42 } | |
| 43 ; CHECK-LABEL: testZextI8 | |
| 44 ; match the trunc instruction | |
| 45 ; CHECK: and {{.*}}, 1 | |
| 46 ; match the zext i1 instruction | |
| 47 ; CHECK: movzx | |
| 48 ; CHECK: and {{.*}}, 1 | |
| 49 | |
| 50 ; Test zext to i16. | |
| 51 define internal i32 @testZextI16(i32 %arg) { | |
| 52 entry: | |
| 53 %arg_i1 = trunc i32 %arg to i1 | |
| 54 %result_i16 = zext i1 %arg_i1 to i16 | |
| 55 %result = zext i16 %result_i16 to i32 | |
| 56 ret i32 %result | |
| 57 } | |
| 58 ; CHECK-LABEL: testZextI16 | |
| 59 ; match the trunc instruction | |
| 60 ; CHECK: and {{.*}}, 1 | |
| 61 ; match the zext i1 instruction | |
| 62 ; CHECK: movzx | |
| 63 ; CHECK: and {{.*}}, 1 | |
| 64 | |
| 65 ; Test zext to i32. | |
| 66 define internal i32 @testZextI32(i32 %arg) { | |
| 67 entry: | |
| 68 %arg_i1 = trunc i32 %arg to i1 | |
| 69 %result_i32 = zext i1 %arg_i1 to i32 | |
| 70 ret i32 %result_i32 | |
| 71 } | |
| 72 ; CHECK-LABEL: testZextI32 | |
| 73 ; match the trunc instruction | |
| 74 ; CHECK: and {{.*}}, 1 | |
| 75 ; match the zext i1 instruction | |
| 76 ; CHECK: movzx | |
| 77 ; CHECK: and {{.*}}, 1 | |
| 78 | |
| 79 ; Test zext to i64. | |
| 80 define internal i64 @testZextI64(i32 %arg) { | |
| 81 entry: | |
| 82 %arg_i1 = trunc i32 %arg to i1 | |
| 83 %result_i64 = zext i1 %arg_i1 to i64 | |
| 84 ret i64 %result_i64 | |
| 85 } | |
| 86 ; CHECK-LABEL: testZextI64 | |
| 87 ; match the trunc instruction | |
| 88 ; CHECK: and {{.*}}, 1 | |
| 89 ; match the zext i1 instruction | |
| 90 ; CHECK: movzx | |
| 91 ; CHECK: and {{.*}}, 1 | |
| 92 ; CHECK: mov {{.*}}, 0 | |
| 93 | |
| 94 ; Test sext to i8. | |
| 95 define internal i32 @testSextI8(i32 %arg) { | |
| 96 entry: | |
| 97 %arg_i1 = trunc i32 %arg to i1 | |
| 98 %result_i8 = sext i1 %arg_i1 to i8 | |
| 99 %result = sext i8 %result_i8 to i32 | |
| 100 ret i32 %result | |
| 101 } | |
| 102 ; CHECK-LABEL: testSextI8 | |
| 103 ; match the trunc instruction | |
| 104 ; CHECK: and {{.*}}, 1 | |
| 105 ; match the sext i1 instruction | |
| 106 ; CHECK: shl [[REG:.*]], 7 | |
| 107 ; CHECK-NEXT: sar [[REG]], 7 | |
| 108 | |
| 109 ; Test sext to i16. | |
| 110 define internal i32 @testSextI16(i32 %arg) { | |
| 111 entry: | |
| 112 %arg_i1 = trunc i32 %arg to i1 | |
| 113 %result_i16 = sext i1 %arg_i1 to i16 | |
| 114 %result = sext i16 %result_i16 to i32 | |
| 115 ret i32 %result | |
| 116 } | |
| 117 ; CHECK-LABEL: testSextI16 | |
| 118 ; match the trunc instruction | |
| 119 ; CHECK: and {{.*}}, 1 | |
| 120 ; match the sext i1 instruction | |
| 121 ; CHECK: movzx [[REG:.*]], | |
| 122 ; CHECK-NEXT: shl [[REG]], 15 | |
| 123 ; CHECK-NEXT: sar [[REG]], 15 | |
| 124 | |
| 125 ; Test sext to i32. | |
| 126 define internal i32 @testSextI32(i32 %arg) { | |
| 127 entry: | |
| 128 %arg_i1 = trunc i32 %arg to i1 | |
| 129 %result_i32 = sext i1 %arg_i1 to i32 | |
| 130 ret i32 %result_i32 | |
| 131 } | |
| 132 ; CHECK-LABEL: testSextI32 | |
| 133 ; match the trunc instruction | |
| 134 ; CHECK: and {{.*}}, 1 | |
| 135 ; match the sext i1 instruction | |
| 136 ; CHECK: movzx [[REG:.*]], | |
| 137 ; CHECK-NEXT: shl [[REG]], 31 | |
| 138 ; CHECK-NEXT: sar [[REG]], 31 | |
| 139 | |
| 140 ; Test sext to i64. | |
| 141 define internal i64 @testSextI64(i32 %arg) { | |
| 142 entry: | |
| 143 %arg_i1 = trunc i32 %arg to i1 | |
| 144 %result_i64 = sext i1 %arg_i1 to i64 | |
| 145 ret i64 %result_i64 | |
| 146 } | |
| 147 ; CHECK-LABEL: testSextI64 | |
| 148 ; match the trunc instruction | |
| 149 ; CHECK: and {{.*}}, 1 | |
| 150 ; match the sext i1 instruction | |
| 151 ; CHECK: movzx [[REG:.*]], | |
| 152 ; CHECK-NEXT: shl [[REG]], 31 | |
| 153 ; CHECK-NEXT: sar [[REG]], 31 | |
| 154 | |
| 155 ; Test fptosi float to i1. | |
| 156 define internal i32 @testFptosiFloat(float %arg) { | |
| 157 entry: | |
| 158 %arg_i1 = fptosi float %arg to i1 | |
| 159 %result = sext i1 %arg_i1 to i32 | |
| 160 ret i32 %result | |
| 161 } | |
| 162 ; CHECK-LABEL: testFptosiFloat | |
| 163 ; CHECK: cvtss2si | |
|
jvoung (off chromium)
2014/09/08 18:06:38
cvtt now?
Jim Stichnoth
2014/09/08 18:17:44
Done.
| |
| 164 ; CHECK: and {{.*}}, 1 | |
| 165 ; CHECK: movzx [[REG:.*]], | |
| 166 ; CHECK-NEXT: shl [[REG]], 31 | |
| 167 ; CHECK-NEXT: sar [[REG]], 31 | |
| 168 | |
| 169 ; Test fptosi double to i1. | |
| 170 define internal i32 @testFptosiDouble(double %arg) { | |
| 171 entry: | |
| 172 %arg_i1 = fptosi double %arg to i1 | |
| 173 %result = sext i1 %arg_i1 to i32 | |
| 174 ret i32 %result | |
| 175 } | |
| 176 ; CHECK-LABEL: testFptosiDouble | |
| 177 ; CHECK: cvtsd2si | |
|
jvoung (off chromium)
2014/09/08 18:06:38
cvtt?
Jim Stichnoth
2014/09/08 18:17:44
Done.
| |
| 178 ; CHECK: and {{.*}}, 1 | |
| 179 ; CHECK: movzx [[REG:.*]], | |
| 180 ; CHECK-NEXT: shl [[REG]], 31 | |
| 181 ; CHECK-NEXT: sar [[REG]], 31 | |
| 182 | |
| 183 ; ERRORS-NOT: ICE translation error | |
| 184 ; DUMP-NOT: SZ | |
| OLD | NEW |