|
18 | 18 | #include "gen/abi-generic.h" |
19 | 19 | #include "gen/abi-arm.h" |
20 | 20 |
|
21 | | -namespace { |
22 | | -struct CompositeToArray32 : ABIRewrite { |
23 | | - LLValue *get(Type *dty, LLValue *v) override { |
24 | | - Logger::println("rewriting i32 array -> as %s", dty->toChars()); |
25 | | - LLValue *lval = DtoRawAlloca(v->getType(), 0); |
26 | | - DtoStore(v, lval); |
27 | | - |
28 | | - LLType *pTy = getPtrToType(DtoType(dty)); |
29 | | - return DtoLoad(DtoBitCast(lval, pTy), "get-result"); |
30 | | - } |
31 | | - |
32 | | - LLValue *put(DValue *dv) override { |
33 | | - Type *dty = dv->getType(); |
34 | | - Logger::println("rewriting %s -> as i32 array", dty->toChars()); |
35 | | - LLType *t = type(dty, nullptr); |
36 | | - return DtoLoad(DtoBitCast(dv->getRVal(), getPtrToType(t))); |
37 | | - } |
38 | | - |
39 | | - LLType *type(Type *t, LLType *) override { |
40 | | - // An i32 array that will hold Type 't' |
41 | | - size_t sz = (t->size() + 3) / 4; |
42 | | - return LLArrayType::get(LLIntegerType::get(gIR->context(), 32), sz); |
43 | | - } |
44 | | -}; |
45 | | -} |
46 | | - |
47 | 21 | struct ArmTargetABI : TargetABI { |
48 | 22 | HFAToArray hfaToArray; |
49 | 23 | CompositeToArray32 compositeToArray32; |
| 24 | + CompositeToArray64 compositeToArray64; |
50 | 25 | IntegerRewrite integerRewrite; |
51 | 26 |
|
52 | 27 | bool returnInArg(TypeFunction *tf) override { |
@@ -134,9 +109,12 @@ struct ArmTargetABI : TargetABI { |
134 | 109 | // non-HFA and messes up register selection |
135 | 110 | if (isHFA((TypeStruct *)ty, &arg.ltype)) { |
136 | 111 | arg.rewrite = &hfaToArray; |
137 | | - } else { |
| 112 | + } else if (DtoAlignment(ty) <= 4) { |
138 | 113 | arg.rewrite = &compositeToArray32; |
139 | 114 | arg.ltype = compositeToArray32.type(arg.type, arg.ltype); |
| 115 | + } else { |
| 116 | + arg.rewrite = &compositeToArray64; |
| 117 | + arg.ltype = compositeToArray64.type(arg.type, arg.ltype); |
140 | 118 | } |
141 | 119 | } |
142 | 120 | } |
|
0 commit comments